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 ...
随机推荐
- Xamarin最新crack 包含IOS
Xamarin.Android 4.10.01068 & Xamarin.iOS 1.8.361 28 Comments tweet inShare NEW support f ...
- excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1
编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...
- ie8此加载项无法恢复&网站还原错误问题解决=lr成功打开ie成功录制脚
问题:ie8打开公司数字神经时出现此加载项无法恢复,网站还原错误. 解决方法: 1.管理ie加载项,全部禁用以后问题仍然存在,确定不是加载项问题. 2.重设ie8,工具-internet选项-高级-重 ...
- 基于Processing的数据可视化
虽然数据可视化领域有很多成熟.界面友好.功能强大的软件产品(例如Tableau.VIDI.NodeXL等),但是借助Processing我们可以基于Java语言框架进行丰富多元的可视化编程,熟悉了Pr ...
- Bzoj 2241: [SDOI2011]打地鼠 暴力,枚举,贪心
2241: [SDOI2011]打地鼠 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1022 Solved: 651[Submit][Status ...
- Python中AND-OR的用法
学习Python中的lambda函数的时候,才发现原来Python中的AND和OR还可以有一些别的用法.Python中的布尔逻辑计算的结果并非返回布尔值,而是返回它们相互之间的某一个.文章的部分例子来 ...
- [git] git 的基础功能
有两种方法获得一个 git 仓库:自行初始化,克隆别人已有的仓库 自行初始化 git init 克隆别人已有的库 git clone git@github.com:garrisonz/gitStudy ...
- UCloud EIP 你真的懂得如何使用么? - SegmentFault
UCloud EIP 你真的懂得如何使用么? - SegmentFault UCloud EIP 你真的懂得如何使用么?
- ecshop判断搜索引擎是否为蜘蛛
<?php /** * 判断是否为搜索引擎蜘蛛 * * @access public * @return string */ function is_spider($record = true) ...
- winform 曲线(贝塞尔) 分类: WinForm 2014-12-29 16:52 109人阅读 评论(0) 收藏
<span style="font-size:14px;">//覆盖OnPaint事件</span> <span style="font-s ...