看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. 中国版 Azure 现提供 Azure Traffic Manager

    Stephen MaloneAzure网络 - DNS和 Traffic Manager高级项目经理 我们非常高兴地宣布,中国版 Azure中现已提供 Azure Traffic Manager.Az ...

  2. 1047 - Neighbor House(简单线性DP)

    题目大意: 给你n个房子,要求把房子染成R,G,B三种的一种颜色, 要求相邻的颜色不能一样. dp[第i个房子][第j种颜色]  转移一下就行了.       #include<cstdio&g ...

  3. JPush三分钟之后的事 fragmentActivity(一)

    JPush是我用过的平台中最快的,比leanCloud短信验证快的多,当然leanCloud正在飞速的成长 另外江宏 是我的偶像啊:http://tech.sina.com.cn/i/2015-01- ...

  4. Linux学习笔记29——IPC状态命令

    一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列.状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法. 二 状态命令 1 ...

  5. Hibernate(四)基本映射

    映射的概念 在上次的博文Hibernate(三)Hibernate 配置文件我们已经讲解了一下 Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里提到的映 ...

  6. TCP HTTP 详细内存分析 & time_wait setsockopt

    http://www.kegel.com/c10k.html#nb.edge http://www.chinasb.org/archives/2012/11/4954.shtml UDP协议:发送进程 ...

  7. arm 及ndk编译

        首页  »   Android android的armeabi跟armeabi-v7a 网友分享于:2014-03-16  浏览:867次 android的armeabi和armeabi-v7 ...

  8. 细谈Java

    重载:相同函数名,不同参数. 重写(覆写):父类和子类之间的,子类重写了父类的方法. java的多态:重载+覆写 1.      Main方法: 是public的,也是static,也是void的,参 ...

  9. ADO.NET对象模型

    ADO.NET建立在NetFramwork一些核心类的基础之上,可以将这些类分为两组:用于包含于管理数据的容器类与用于连接特定数据源的控制类. 容器类是通用的,无论使用什么样的数据源,都可以使用相同的 ...

  10. 用if做了一个简单的猜拳游戏(做的不好还请指点,谢谢!)

    #include "stdio.h" #include "stdlib.h" #include "time.h" //随机函数的头文件 ma ...