从头到尾教你写个简单的贪吃蛇游戏



Win32贪吃蛇游戏

                                                                                                       -YellowLee-20130409


有兴趣的初学者,加入群:75732006  ,一起讨论

完成代码可下载,在我的上传资源中

http://download.csdn.net/detail/yellowvivi/5252306

                                                                          

1,  打开VS 

 

2,  文件-》新建-》项目



3,  新建win32项目

 

 

4,  为了方便以后使用我们先配置一下项目:点击菜单-》项目-》snake属性弹出项目配置框(项目配置只对本项目有效,其他新建或加入的项目无效的)配置4处内容:

1)  项目属性-》常规-》输出目录  改为.\bin  (这样可使得你的exe输出到bin工程目录的bin目录下,往后我们的资源都放入此目录)

2)  项目属性-》常规-》字符集:默认是“使用Unicode字符集”选为”使用多字节字符集” (用Unicode为双字往后字符要加L,使用起来不方便,所以顺便改了)


 

3)  项目属性-》调试-》工作目录 写入.\bin (和输出目录一直,这样往后调试时就会默认去此目录读取资源,否者就会去cpp所在目录读取资源,会造成资源读取失败,这里是很多人出现的问题)


4)  项目属性-》C/C++-》代码生成-》运行时库 默认是“多线程调试 DLL (/MDd)”选为“多线程调试(/MTd)” (这样程序编译时就被调用系统的dll,兼容性好些,但exe会变大,效率会低一点)

 

最后别忘了按确定

这四点配置,一般项目开始都会做,使得后面的开发更方便,解决很多问题

 

 

5, 在解决方案资源管理器,双击打开Snake.cpp文件,里面有很多代码,你别管它(那时创建窗口的代码,其实没那么多,只是考虑到兼容性所以那么多)


 

 

 

6, 找到19行,写入2个函数:Start,Login,分别处理初始化,逻辑更新内容(若你没看到行号,请点击菜单的工具->选项->文本编辑器-> C/C++ ->行号前的勾打上,按下确定)

如下图:


变成


 

 

7、继续在19行加入一些必要的头文件和变量

  如图:


此处内容较多,好好理解一下

 

 

8、找到BOOL InitInstance(HINSTANCEhInstance,intnCmdShow)函数

在此函数内的ShowWindow(hWnd,nCmdShow)前,写入

g_hWnd= hWnd;

Start();


 

9, 找到int APIENTRY_tWinMain(HINSTANCEhInstance,

                     HINSTANCEhPrevInstance,

                     LPTSTR   lpCmdLine,

                     int       nCmdShow)

    函数,找主消息循环(约76行)为了适应游戏需要,需要把循环修改一下

     如图



10、内容完了,下面开始写我们的游戏代码了,本来就几个步骤三五分钟的事情,用图片和名字说明怎么就那么难呢!!?

  回到Start和logic函数,添加场景内容

如图


按下F5运行,怎样看到场景了吧,如果你的窗口太小,看不完场景,调整一下,


这样我们的客户区就能完整显示场景了

 

 

 11,开始运动我们的蛇了,继续在Start函数后面添加蛇身位置节点  

    如图


 

图上有错:55行应为POINT ptSnake = {300,300};     //定义蛇的位置

看到蛇了吧,只有一个节点在图上,郁闷!没事吃吃食物就边长了

 

 

12, 下面开始运动蛇吧

   为了捕获玩家按键,在Start函数前面,就是定义变量的后面(约40行),添加

     int iKey; //记录玩家按下的按键值


然后找到消息处理函数

LRESULT CALLBACK WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)

在switch(message)加多一个case为

     case WM_KEYDOWN:

         iKey = wParam;     //玩家按下按键是捕获按键值

         break;

如图


回到Logic函数,蛇的逻辑如下



具体解析看看代码啦(这里可能比较难懂,好好理解一下),F5运行一下,控制应该没问题了

这里用到timeGetTime()(此函数获取从系统启动到此刻的毫秒数),需添加相应的头文件和lib库

如下

注意:这两句最后添加到最前面

 

 

13,如果蛇吃到自己或出界了,那蛇就死掉

因此我们先判断蛇是否吃到自己先,我们写一个函数判断某一个点是否为蛇身,写到Start函数前吧,叫IsInSnake(),如图


回到logic函数,蛇的逻辑最后,我们写入蛇出界和吃到自己的处理函数(死掉后回到中间,重新开始)


蛇的逻辑先写到这里,下面写食物

 

15,因为食物的位置要经常随机改变,因此我们一个函数改变它

写在start前面吧,方便看,如图:(前面忘了播随机种子,在Start函数内容最前面加入随机种子)


F5运行一下,多运行几次,会看到食物出现在不同的位置上

 

 

16,下面让蛇能够吃到食物,其实很简单,判断食物是否在蛇头位置,如果是则添加到食物添加到蛇头,蛇尾不去掉(重点在此,蛇尾不去掉,则蛇增长了),食物继续随机位置

在蛇的逻辑最后加入代码,如下图


好了,主要逻辑都写完了,看起来很多,其实很少内容,我们看一下,所有内容写在一起,从20行到194行,如去除空行和大括号行,其实公约120行代码,如果你每分钟理解1行代码(比较慢的了),那么你2个小时内就能理解完毕,一般来说真正写游戏,内容不会像这样写在一堆,而会用OOP,写成不同的类,此游戏一般会写成4个类,Game,Scene,Snake,Food写个类,分别实现不同的内容,不过逻辑基本一样的,就是把上面的代码分别写到4个文件里面而已,OOP有助于理解和分工。



以下为扩展内容

1, 声音 – 游戏没声音不行,添加声音吧,咱们加入3个声音(背景音乐,吃到食物,死亡)

用MCI播放声音很简单(链接; http://wenku.baidu.com/view/e6530f41336c1eb91a375d21.html)


 

死亡音乐和吃到食物音乐


 

 

2 玩家生命(默认给玩家3条生命,完后退出程序)

在变量定义处,即IsInSnake函数前,加入int iLife = 3;


在蛇逻辑,死亡的地方加入 iLife—等内容


生命数没显示,不清晰加入生命数目吧

在logic函数的绘画内容里面,加入


 

3, 去掉菜单栏

找到ATOM MyRegisterClass(HINSTANCEhInstance)函数,把wcex.lpszMenuName  的值改为NULL

你会发觉底下多了白条,怎么回事呢??原来创建窗口是高度含有菜单高,改一下,去到BOOLInitInstance(HINSTANCEhInstance,intnCmdShow) 函数,找到CreateWindow函数

,顺便改改窗口标题,窗口居中,并改改窗口风格,让玩家不能拉伸窗口,如图


注下释的为原来的内容,对比一下,从而知道windoow的控制风格,位置,大小的参数

 

4,最后美化一个蛇的样子,加入蛇头和,蛇尾

在变量出定义多

在Start函数里,添加读取图片

 

在logic函数里,改掉蛇绘画的方法



 

如何发布游戏给别的朋友玩:

编译运行后,复制bin目录出来就可以了

支持win98,2000,2003,xp,vista,win7,win8等

如果你想弄成安装包形式,把bin压缩时,改掉后面的zip或rar为exe,你会发觉它打包成自解压包了,这和游戏安装包的原理是一样的

 

好了,完了。。。

如果你觉得还不明白,建议你好好补补基础吧

如果你觉得图片不够漂亮,请找美工美化一下

如果你觉得游戏不够有趣,请自己添加内容

如果你觉得。。。。你怎么那么多如果!!!!!!

再给大家游戏的图:

bg.png


白色背景,可能看不到

head.png


snake.png


rear.png


food.png



游戏背景音乐自己找吧,统一放在bin目录

游戏截图





 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
游戏说明:   1、控制键    “回车键”-----新游戏或终止游戏    “5”(数字键区的)----暂停或恢复    方向控制键(数字键区的)    “8、2、4、6”----对应控制“上、下、左、右”移动    “1”-----“左\下”移动    “3”-----“右\下”移动    “7”-----“左\上”移动    “9”-----“右\下”移动   2、地图    蓝色方块----食物(吃到食物后,蛇身长度增加一节)    红色方块----炸弹(吃到炸弹,所得分数会减去当前级别数的2倍)    地图上一次出现2个食物和1个炸弹,被蛇吃掉后会随机位置补充    灰色方块----蛇头    绿色方块----蛇身    暗海洋绿方块----奖品    当玩家吃到的食物或者炸弹达到5个时就会随机出现一次奖品,奖品    上的数字表示吃到奖品后会增加的分数。每个奖品的初始分数是20--50    之间的随机数,当奖品出现后就会开始不断的减少,所以玩家要尽快吃    到才能增加到更多的分数。   3、计分方法    每吃到一个食物,增加的分数等于当前级别的数值;    每吃到一个炸弹,扣掉的分数等于当前级别数值的2倍;    玩家的起始分数等于当前的级别数值的2倍加1    例如 等级为3,则玩家起始分数是7分;每吃到一个食物加3分;    每吃到一个炸弹减6分   4、游戏结束    当总分<=0时会结束游戏;    当蛇头碰到蛇身(但不是蛇尾)时会结束游戏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值