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目录
游戏截图