Windows程序设计 贪吃蛇c
看Windows程序有段时间了,终于动手写东西。贪吃蛇算是一个开始吧,下面的贪吃蛇很简单,也有很多地方需要修改,还有情况没有考虑QAQ 但这不是我的目的了。。。
思路很简单:建个链表储存蛇身节点即可。

#include <windows.h>
#include <time.h> #define ID_TIMER 1
#define TIMERSET 600
char score,temp=;
int flag,tempx,tempy,
foodx,foody,key;//运动方向,食物坐标,标记
bool havebody[][];
bool over = false; struct Snake
{
Snake *next;
int x;
int y;
};
struct Snake *head;
struct Snake *creat()//链表初始化
{
struct Snake *p1,*p2,*p3;
head=(struct Snake*)malloc(sizeof(Snake));
p1=(struct Snake*)malloc(sizeof(Snake));
p2=(struct Snake*)malloc(sizeof(Snake));
p3=(struct Snake*)malloc(sizeof(Snake)); head->x=;head->y=;
head->next=p1;
p1->x=;p1->y=;
p1->next=p2;
p2->x=;p2->y=;
p2->next=p3;
p3->x=;p3->y=;
p3->next=NULL;
return head;
}; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
TCHAR szAppName[] = TEXT("dy");
WNDCLASS wndcls;
wndcls.cbClsExtra = ;
wndcls.cbWndExtra = ;
wndcls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndcls.hCursor = LoadCursor(hInstance, IDC_ARROW);
wndcls.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WndProc;
wndcls.lpszClassName = szAppName;
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls); HWND hwnd = CreateWindow (szAppName, TEXT ("dyww"),
WS_OVERLAPPEDWINDOW,
, ,
, ,
NULL, NULL, hInstance, NULL) ; ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd); MSG msg;
while(GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
} void food(HWND hwnd)//食物
{
foodx = rand() % , foody = rand() %;
while(havebody[foodx][foody])
{
foodx = rand() % , foody = rand() % ;
}
havebody[foodx][foody] = true;
InvalidateRect(hwnd, NULL, TRUE);
} void checkdeath()//检查是否死亡
{
Snake *p= head,*end;
do
{
p=p->next;
}while(p->next!=NULL);
end=p;
if(p->x <||p->x > || p->y < || p->y >)
over=true;
p=head->next;
do
{
if(p->x==end->x&&p->y==end->y){over=true;}
p=p->next;
}while(p->next!=NULL);
}
bool havefood(Snake *p)
{
if(foodx==p->x&&foody==p->y)
return true;
else
return false;
} struct Snake *insert(int x,int y)//插入节点
{
struct Snake *p1,*p;
p=(struct Snake*)malloc(sizeof(Snake));
p1=head;
p->x=head->x;p->y=head->y;
p->next=head->next;
head->x=tempx;head->y=tempy;
head->next=p;
havebody[head->x][head->y]=true;
return head;
}; Snake *mainrun(HWND hwnd)
{
struct Snake *p;
p=head;
int temp=,deadfood=;
tempx=p->x;tempy=p->y;//储存头节点的值
do
{
if(p->next!=NULL){
if(temp==){havebody[p->x][p->y]=false; p->x=p->next->x;p->y=p->next->y;havebody[p->x][p->y]=true;temp++;}
else
{p->x=p->next->x;p->y=p->next->y;havebody[p->x][p->y]=true;}}
p=p->next;
}while(p->next!=NULL);
//havebody[p->x][p->y]=false;
if(flag==) p->x--;
if(flag==) p->y--;
if(flag==) p->x++;
if(flag==) p->y++;
if(havefood(p)) {insert(tempx,tempy);deadfood=;score+=;}
checkdeath();
havebody[p->x][p->y]=true;
InvalidateRect(hwnd, NULL, TRUE);
if(deadfood) food(hwnd);
return head;
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//窗口过程
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR szScore[]=TEXT("GAME OVER 得分:"),
szBuffer[]; int x, y; switch(message)
{
case WM_CREATE://各种初始化
flag=;key=;score=;
srand(time(NULL));
creat();
food(hwnd);
havebody[foodx][foody]=true;
SetTimer(hwnd, ID_TIMER, TIMERSET, NULL);
return ; case WM_TIMER:
mainrun(hwnd);
if(over)
{
KillTimer(hwnd, ID_TIMER);
InvalidateRect(hwnd, NULL, TRUE);
}
else InvalidateRect(hwnd, NULL, TRUE);
return ; case WM_KEYDOWN:
if(over) return ;
switch(wParam)
{
case VK_UP:
if(flag != )
{
flag = ;
mainrun(hwnd);
}
break;
case VK_DOWN:
if(flag != )
{
flag = ;
mainrun(hwnd);
}
break;
case VK_LEFT:
if(flag != )
{
flag = ;
mainrun(hwnd);
}
break;
case VK_RIGHT:
if(flag != )
{
flag = ;
mainrun(hwnd);
}
break;
default:
break;
}
return ; case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
Rectangle(hdc,, , , );
if(over)
{SelectObject(hdc, GetStockObject(RGB(,,)));Rectangle(hdc,, , , );
TextOut(hdc, , , szScore, lstrlen(szScore));
TextOut(hdc, , , szBuffer, wsprintf(szBuffer, TEXT("%4d"), score));
//TextOut(hdc, 198, 190, szBuffer, wsprintf(szBuffer, TEXT("%4d"), temp));
}
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
for(x = ; x <; x++)
for(y = ; y <; y++)
{ if(havebody[x][y])
Rectangle(hdc,x*,y*,(x+)*,(y+)*);
}
EndPaint (hwnd, &ps) ;
return ; case WM_DESTROY:
KillTimer(hwnd, ID_TIMER);
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
Windows程序设计 贪吃蛇c的更多相关文章
- 第一个windows 小游戏 贪吃蛇
最近用dx尝试做了一个小的贪吃蛇游戏,代码放到github上面:https://github.com/nightwolf-chen/MyFreakout 说一下自己实现的过程: 首先,我把蛇这个抽象成 ...
- 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- 小菜学习Winform(一)贪吃蛇2
前言 上一篇<小菜学习Winform(一)贪吃蛇>中实现了简单版的贪吃蛇,在文章末也提到需要优化的地方,比如使用oo.得分模式.速度加快模式和减少界面重绘.因为是优化篇,实现方式上一篇有, ...
- 小菜学习Winform(一)贪吃蛇
前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...
- C++控制台贪吃蛇代码
游戏截图: 以下是3个代码文件: Snake_Class.h文件: #ifndef SNAKE #define SNAKE #include<windows.h> #include< ...
- 一个简单的c# 贪吃蛇程序
一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...
- 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟
简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...
- 转载——C++控制台贪吃蛇代码
游戏截图: 以下是3个代码文件: Snake_Class.h文件: 1 #ifndef SNAKE 2 #define SNAKE 3 4 #include<windows.h> 5 #i ...
随机推荐
- Linux Kernel 'perf_event.c'本地权限提升漏洞
漏洞版本: Linux Kernel 3.11-rc4 漏洞描述: Linux Kernel是一款开源的操作系统 Linux Kernel 'perf_event.c'存在一个安全漏洞,允许本地攻击者 ...
- Microsoft Internet Explorer 远程代码执行漏洞(CVE-2013-3186)(MS13-059)
漏洞版本: Microsoft Internet Explorer 6 - 10 漏洞描述: BUGTRAQ ID: 61663 CVE(CAN) ID: CVE-2013-3186 Windows ...
- Linux Shell编程(25)——I/O 重定向
默认情况下始终有3个"文件"处于打开状态, stdin (键盘), stdout (屏幕), and stderr (错误消息输出到屏幕上). 这3个文件和其他打开的文件都可以被重 ...
- 如何配置jdk和tomcat 转
一.配置JDK1.解压JDK至D:\JDK1.5目录下(楼主可以自由选取目录).2.设置环境变量(右键我得电脑->属性->高级->环境变量),在系统变量中添加一个叫JAVA_HOME ...
- Hadoop的文件读写操作流程
以下主要讲解了Hadoop的文件读写操作流程: 读文件 读文件时内部工作机制参看下图: 客户端通过调用FileSystem对象(对应于HDFS文件系统,调用DistributedFileSystem对 ...
- 社区发现(Community Detection)算法 [转]
作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现 ...
- CBO学习----03--选择率(Selectivity)
第3章 单表选择率(Single Table Selectivity) Selectivity是优化器估算Rows(Cards)的重要依据. /**************************** ...
- UVA - 10785 The Mad Numerologist
题目链接 这个题又犯了省题不清的错误.导致不停 wa.唉. 题目意思是给你一个长度L,然后和一张表相应每一个大写字母的value值.你须要依照一定规则找出长度为L的序列. 注意 序列的value值要 ...
- Hibernate的游离态与持久态转换
在Hibernate中,一个PO可能经过长时间的操作,session已过时关闭,此时PO已经是一个游离态的对象,这时要转换为持久战态,有下面几种方法: 1.session.saveOrUpdate(o ...
- Delphi检查GetElementByID返回值的有效性
Delphi 可以像JavaScript 脚本语言一样使用GetElementByID方法访问网页中指定ID的元素,一般要配合TWebBrowser组件使用.首先使用TWebBrowser浏览网页,然 ...