看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的更多相关文章

  1. 第一个windows 小游戏 贪吃蛇

    最近用dx尝试做了一个小的贪吃蛇游戏,代码放到github上面:https://github.com/nightwolf-chen/MyFreakout 说一下自己实现的过程: 首先,我把蛇这个抽象成 ...

  2. 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)

    C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...

  3. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  4. 小菜学习Winform(一)贪吃蛇2

    前言 上一篇<小菜学习Winform(一)贪吃蛇>中实现了简单版的贪吃蛇,在文章末也提到需要优化的地方,比如使用oo.得分模式.速度加快模式和减少界面重绘.因为是优化篇,实现方式上一篇有, ...

  5. 小菜学习Winform(一)贪吃蛇

    前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...

  6. C++控制台贪吃蛇代码

    游戏截图: 以下是3个代码文件: Snake_Class.h文件: #ifndef SNAKE #define SNAKE #include<windows.h> #include< ...

  7. 一个简单的c# 贪吃蛇程序

    一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...

  8. 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟

    简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...

  9. 转载——C++控制台贪吃蛇代码

    游戏截图: 以下是3个代码文件: Snake_Class.h文件: 1 #ifndef SNAKE 2 #define SNAKE 3 4 #include<windows.h> 5 #i ...

随机推荐

  1. decodeURIComponent

    var s = '%%' try { s = decodeURIComponent(s) } catch(e) { console.log(e) } console.log(s)

  2. Linux Shell编程(10)——引用变量

    当要引用一个变量的值时,一般推荐使用双引号.使用双引号除了变量名前缀($).后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符.用双引号时$仍被当成特殊字符,允许引用一个被双 ...

  3. unity3d Realistic eye shading 真实的眼睛渲染

    先放上效果 人皮都做了,当然要来研究下眼睛,眼睛要比人体皮肤简单一些(实时模拟人皮在此) 一看是不是很复杂 这是眼睛的解构,但是,我们只需要模拟出虹膜巩膜和角膜就能达到相当真实的眼睛 巩膜就是白眼球 ...

  4. HDU 4716 A Computer Graphics Problem 2013年四川省赛题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4716 题目大意不用解释了吧,看案例就能明白 #include<cstdio> #inclu ...

  5. 关于View和VIewController的关系和理解

    之前看过关老师的视频之后就有写关于视图切换的程序,不过那是很久之前了,那时候也不知道什么是View,什么是VIewController,就知道照着写.这次项目的时候,我又碰到了这个问题,我自以为比较能 ...

  6. Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学

    1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 394  Solve ...

  7. Centroid - SGU 134(树的搜索)

    题目大意:给你一个树,树每个点都有一个值, 这个点的的值就等于所有儿子里面点最多的那个儿子,值最小的就叫做重心,求出重心,还有所有等于重心的点,按照升序输出. 分析:就是一个简单的搜索树,求出来最大的 ...

  8. mysql创建数据库(指定编码)

    如下脚本创建数据库yourdbname,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 CO ...

  9. UVA - 10785 The Mad Numerologist

    题目链接 这个题又犯了省题不清的错误.导致不停 wa.唉. 题目意思是给你一个长度L,然后和一张表相应每一个大写字母的value值.你须要依照一定规则找出长度为L的序列. 注意  序列的value值要 ...

  10. 布局重用 include merge ViewStub

    在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...