MFC贪吃蛇

1多人贪吃蛇项目描述

1.1功能描述

实现多人对战贪吃蛇,具体实现功能:A.可以选择游戏人数,最多设置4人同时游戏;B.显示玩家得到的分数;C.可以设置游戏的速度;D.能实现最高分的记录

1.2所需技术

1.在对话框中创建窗口;2.双缓冲绘图;3.蛇身移动处理;4.碰撞检测;5.Ini文件操作

2多人贪吃蛇运行流程

3多人贪吃蛇详细设计

3.1贪吃蛇个体类设计

把贪吃蛇单独的设为一个类,其中包含成员变量如下

	BOOL m_bAliveFlg; //蛇当前存活标志
	int	m_iDirect;	//当前蛇先进方向
	int m_iScore;	//分数
	CArray<CPoint,CPoint> m_bufBody;	//蛇身向量

3.2最高分对话框类设计

游戏要记录玩家所玩的最高得分和玩家的姓名。使用ini文件进行记录。最高分对话框分为两种情况,一种是显示当前的最高分,另一种是写入当前的最高分,所以用标志位m_bWriteFlg来区分。

对配置文件的操作用GetPrivateProfileString函数和WritePrivateProfileString函数完成。 具体用法如下所示。

GetPrivateProfileString("HERO","NAME","0",bufTmp,MAX_PATH,".\\HERO.ini");WritePrivateProfileString("HERO","SCORE",strScore,".\\HERO.ini");

3.3贪吃蛇游戏类的设计

3.3.1对话框中创建一个窗体

贪吃蛇游戏类是继承自CWnd类,所以主对话框中OnInitDialog初始化消息时创建一个贪吃蛇游戏类的窗体,如下所示。

m_CSnake.CreateEx( WS_EX_CLIENTEDGE, _T("SNAKEMAP"), NULL, WS_VISIBLE| WS_BORDER | WS_CHILD,CRect( 0, 0, 405, 405 ), this, 256 );//新建一个窗口出来

CWinApp这个类有三个virtual成员函数InitApplication、InitInstance和Run。其中InitInstance是为程序创建和显示窗口所设置的。因此在设计程序时,必须在CWinApp类的基础上派生自己的应用程序类,并对函数InitInstance进行重写。所以在应用程序类注册窗口类。

3.3.2双缓冲绘图

绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:

1、在内存中创建与画布一致的缓冲区

2、在缓冲区画图

3、将缓冲区位图拷贝到当前画布上

4、释放内存缓冲区

CPaintDC dc( this );
    CDC MemDC;//创建与画布一致的缓冲区
MemDC.CreateCompatibleDC( &dc );
CBitmap bmp;
MemDC.SelectObject( &bmp );// 装载背景
MemDC.Rectangle(
					CRect(ysPoint.y*SNAKE_SIZE,
					ysPoint.x*SNAKE_SIZE,
					(ysPoint.y+1)*SNAKE_SIZE,
					(ysPoint.x+1)*SNAKE_SIZE)
					);//在内存中绘图
dc.BitBlt( 0, 0, MAP_RIGHT, MAP_BUTTON, &MemDC,0, 0, SRCCOPY );//将缓冲区位图拷贝到当前画布上

因为游戏类是基于窗口类的,所以所有的绘图消息都可以在OnPaint消息中处理。在OnPaint中,只需要描绘蛇身和食物,后面的逻辑处理与碰撞检测会使用Invalidate()或局部矩形重绘InvalidateRect来产生重绘消息。

3.3.3游戏碰撞检测

只需要判断蛇头的坐标与待判定的坐标是否重合,重合就发生了碰撞,说明该蛇死亡了。

3.3.4蛇身移动处理

方法一:1.得到蛇身数组第一个点的坐标,即蛇头的坐标;2.使蛇头后面的开始的每一个点的坐标等于上一个点的坐标,例如:蛇头下一个点的坐标等于蛇头的坐标。然后重绘。

这里提供另一种方案二:1.首先获得蛇身向量的第一个点的坐标,这里说明下蛇身向量的坐标是与真实绘图相差10倍的。

CPoint ysPoint=m_CSnakeIndv[iCnt].m_bufBody.GetAt(0);     //获取蛇身的第一个点坐标

2.根据蛇的方向,使这个坐标值发生变动。改变的是蛇头的坐标值。

3.判断ysPoint这个坐标是否发生过界或碰撞,如果蛇死亡。

int iSnakeLen = m_CSnakeIndv[iCnt].m_bufBody.GetUpperBound();
				for ( ; iSnakeLen >= 0; iSnakeLen--)
				{
					CPoint pt=m_CSnakeIndv[iCnt].m_bufBody.GetAt(iSnakeLen);//将最后一个赋给pt
					m_CSnakeIndv[iCnt].m_bufBody.RemoveAt(iSnakeLen);       //将移出最后一个
					ReDrawBody(pt);                                //重新绘制pt这点
				}
				m_CSnakeIndv[iCnt].m_bAliveFlg = FALSE;

说明:重绘整个蛇身,这里是取出蛇身的动态数组的最后一个元素,重绘这个点,并把这个点从蛇身数组中移除,以此类推,直到重绘整个蛇身,使死亡了的蛇不在屏幕中显示出来。

如果这个新点没有发生越界或是碰撞,说明游戏可以继续进行下去。

m_CSnakeIndv[iCnt].m_bufBody.InsertAt(0,ysPoint);    //将新点添加到蛇的身体中
				ReDrawBody(ysPoint);           //重绘蛇的身体

说明:把这个新点添加到蛇身向量中,是插入到第0个位置,原来的蛇身数组里元素每位向后移动一位。

如果新点的位置与食物的位置是重合的。主要进行如下处理。

CPoint pt=m_CSnakeIndv[iCnt].m_bufBody.GetAt(m_CSnakeIndv[iCnt].m_bufBody.GetUpperBound());//将最后一个赋给pt
					m_CSnakeIndv[iCnt].m_bufBody.RemoveAt(m_CSnakeIndv[iCnt].m_bufBody.GetUpperBound());       //将移出最后一个
					ReDrawBody(pt);                                //重新绘制pt这点

说明:得到蛇身数组的最后一个点坐标,把这个点从蛇身数组移除出去,重绘该点。这样,就说明绘图中会移除蛇尾,就是视觉上蛇的移动是蛇头前插入一个元素,蛇尾去除一个元素,这样造成蛇移动的效果。

4.多人贪吃蛇运行结果

源码下载

点击打开链接

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 05:36:16

MFC贪吃蛇的相关文章

小项目特供 贪吃蛇游戏(基于C语言)

C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第二天写了第二版和第三版. 相信C语言写个小游戏或小项目是大多数计算机相关专业的学生都做的事情,但是作为一个数学专业的学生,我们教研室的老师对C语言的要求也就比较低了,大一没有让我们做个小项目实践一次.至今为止用C/C++做过的三个小项目(大作业),一个是外校同学让我帮忙写的学生信息管理系统(天呐,这

数据结构大作业-贪吃蛇

这次数据结构课程我的大作业选择的是贪吃蛇,最初我想了很久到底用什么语言来写贪吃蛇,最后想到java实现图形界面是最方便的,因为JDK里已经有AWT和SWING两个类可以实现图形界面,C语言我会用一个叫easyX的图形库,但是我感觉这个图形库用起来挺麻烦的,c++的话,我还不会用QT,MFC,之类的.这个课程供我们选择的就只有这三门语言,最后我选择了java. 由于我是这学期刚学的java,而且一个星期只有一节java课,一共只学了只有七八周的样子,所以java学的不怎么精,对有些类的理解其实我的

安卓贪吃蛇项目包!!

我在博客上看见很多有关于安卓开发贪吃蛇的博文,但是都不知道他们所用的软件.版本是什么,所以在自己下载的软件上运行的时候总是出不来结果,作为一只安卓课程老师只上了一节课就让我们自己做课程设计的菜鸟来说,这是何其困哪的一件事,安卓什么也不懂,运行环境也是一点也不熟悉.我们老师要求我们用eclipse来运行,有没有人是用这个做过的啊?求帮助!!真的是不会了,找了很多的项目包运行的时候都会出错,永远不会出现贪吃蛇的界面,宝宝真的快疯了.还附上了我所用的软件,有没有好心人解答下这个问题. 本来打算私聊项目

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;    

Java版贪吃蛇(比较完善的版本)

很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了.哈哈. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:http://pan.baidu.com/s/1bnubnzh //Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Gr

UESTC_贪吃蛇 CDOJ 709

相信大家都玩过贪吃蛇游戏吧. 在n×m的迷宫中,有着一条长度不超过9的贪吃蛇,它已经将所有的食物吃光了,现在的目标是移动到出口. 它走的时候不能碰到自己的身体,也不能碰到墙壁.(如果贪吃蛇的长度>3并且下一步要走到自己的尾部,是合法的) 问它能不能走到出口,如果能,最少要移动几步? Input 数据包含多组数据,请读入到文件末尾EOF 每组数据第一行包含两个整数n,m(1≤n,m≤15)代表迷宫的大小. 接下来n行,每行包含一个长度为m的字符串,来表示迷宫. 字符串中仅包含..#.@.1 ~ 9

javascript之【贪吃蛇系列】第一弹:简单的贪吃蛇实现

参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 以上博客是参考,毕竟第一次做,真让自己盲人摸象做不出来. 不过我在其上做了一些改进,界面等效果看起来更好一些. 下图是在Chrome上运行的效果,但是火狐和IE会不兼容,onkeydown事件不能正确调用 这里用了一张图把贪吃蛇制作过程的思想画了出来,画的有点简陋: 下面就是把代码发上来,上边有详细的解释: <html> <head> <title>

游戏开发(一)——控制台 贪吃蛇

贪吃蛇游戏设计中主要需要注意的几点: 1:坐标的定义:定义为左上角为(0,0),向右为x正方向,向下为y正方向 2:蛇的设计, 蛇身:m_body,这里用的是链表(是之前写好的双链表),一个节点就是蛇身的一节 每节蛇身的属性包括x,y坐标:column_x,row_y,x表示在地图上的第几列,y表示在地图上的第几行 蛇有一个属性叫朝向,也就是当前在往上.下.左.右的哪个方向移动:m_forward 蛇的动作有:Turn,转向.转向有个判断,就是不能向相反的方向转,比如本来向上运动,按向下键,是无

《结对-贪吃蛇游戏-开发环境搭建过程》

贪吃蛇开发环境搭建 Python和pygame的安装过程 成员0:2015035107074-孔令辉 成员1:2015035107067-张旭 1.去官网下载python和pygame.(需注意自己电脑是32位的还是64位的,我的是64位的,就下了个64位的) 2.安装pythone 和 pygame. 3.安装完成后,查看环境变量配置情况:计算机->属性->高级系统设置->环境变量->系统变量->Path. 4.在命令提示符中输入:python,验证是否安装成功,若提示是无