贪吃蛇程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4. 解题步骤
(1)新建工程Snake,在MFC的向导第一步选择Single Document,按Finish结束。 (2)选择ResourceView窗口,打开菜单编辑器,在顶层 菜单上添加一个名为“游戏”的弹出式菜单,该菜单下添
加一个名为“开始”的子菜单,一个名为“结束”的子菜 单,一个名为“简单”的子菜单,一个名为“普通”的子 菜单合一个名为“困难”的子菜单,其ID为
❖ [ ]在特定索引上设置或获取元素
❖ (2)在CSnakeView. Cpp文件,添加3个成员函数 IniAim、IniGame和ReDiaplay:
// 该函数随机产生一个供蛇吃的目标,如果该目标恰巧与蛇身重合,则 重新产生一个
❖ void CSnakeView::IniAim() { int uX, uY; // 目标位置 while (1) { uX=rand ( ) % m_nHeight; uY=rand ( ) % m_nWidth; int uTag = 0; // 0-不与蛇身重合,1-重合 for (int i=0;i <= m_aBody. GetUpperBound ( );i++) { CPoint uPoint = m_aBody. GetAt (i); if (uPoint. x == uX ||uPoint. y == uY ) // 目标与蛇身重合 { uTag = 1; break; } } if (uTag == 0) break; } m_pAim = CPoint (uX, uY); // 产生的目标存放在成员变量中 }
ID_GAME_START, ID_GAME_END ,ID_GAME_EASY ,
ID_GAME_NORMAL 和ID_GAME_DIFFICULTY如图1所示。
•(3)在ClassWizard中为刚才编辑好的菜单添加消息处理函数。 打开ClassWizard,选中Message Maps页。在Class Name中选 择CSnakeView,在Object ID中选择ID_GAME_ START,在 Messages中选择COMMAND,添加消息处理函数,其他的做相 同处理。
❖ (4)在ClassWizard中添加键盘消息处理函数。打开 ClassWizard,选中Message Maps页。在Class Name中选择 CSnakeView,在Object ID中选择CSnakeView,在Messages 中选择WM_KeyDown,添加消息处理函数。
❖ (5)在ClassWizard中定时器消息添加处理函数。打开 ClassWizard,选中Message Maps页。在Class Name 中选择CSnakeView,在Object ID中选择CSnakeView, 在Messages中选择WM_Timer,添加消息处理函数。
•(6)编辑生成的代码,完成程序。
程序清单及详细过程如下:
❖ (1) 选择ClassView窗口,双击CSnakeView类,添 加如下成员变量。并添加头文件:
❖ #include <Afxtempl.h>
❖ class CSnakeView : public CView
{ //此处略去若干行由系统生成的代码
2. 编程要求
❖ (1)画出程序初始样式(方框、蛇身、目标及文字); ❖ (2)允许玩家用菜单项“开始”开始游戏,“结束”结
束游戏;
❖ (3)允许玩家选择游戏难度:“简单”、“普通”、 “困难”;
❖ (4)蛇能自动前进,蛇身显示正确; ❖ (5)用方向键可以改变蛇头方向,并且蛇身在改变方向
处正确弯曲;
};
❖ CArray类的成员 ❖ 构造函数
❖ Carray构造一个空数组 ❖ 属性
1 ❖ GetSize获得此数组中的元素数
❖ GetUpperBound返回最大的有效索引值 ❖ SetSize设置包含在此数组中的元素数 ❖ 操作
❖ FreeExtra释放大于当前上界的未使用的内存 ❖ RemoveAll从此数组移去所有元素 ❖ 元素访问
1.问题描述
❖ 在一个方框内有一条蛇和一个目标,蛇身由 若干小方格组成(游戏开始时,蛇身长度为 4)。蛇自动前进,用光标键可以控制蛇头的 前进方向。蛇头每前进一格,蛇身的最后一 节消失,蛇头改变方向时,蛇身在该点弯曲。 蛇头碰到目标时,玩家得一分,同时蛇身长 度增加一个长度。蛇头碰到四壁或碰到蛇身 时游戏结束。
❖ GetAt返回在给定索引上的值 ❖ SetAt设定一个给定索引的值;数组不允许扩展 ❖ ElementAt返回一个对数组中元素指针的临时参考 ❖ GetData允许对数组中的元素访问。可以为NULL ❖ 扩展数组
❖ SetAtGrow为一个给定索引设置值;如果必要,扩展数组 ❖ Add在数组的末尾添加元素;如果必要,扩展数组 ❖ Append在数组上附加另一个数组;如果必要,扩展数组 ❖ Copy把另一个数组拷贝到数组上;如果必要,扩展数组 ❖ 插入/移去 ❖ InsertAt在指定的索引上插入一个元素(或另一个数组中的所有元素) ❖ RemoveAt在指定的索引上移去一个元素 ❖ 运算符
❖ (6)蛇头碰到目标可以正确计分并显示; ❖ (7)蛇头碰到目标可以正确增加蛇身长度; ❖ (8)正确判断游戏结束(包括蛇头碰到四壁或蛇身); ❖ (9)正确显示计时
3. 要点分析
❖ 蛇的活动区域是由若干个小方格组成的。当这些 小方格呈现灰色时,便表示蛇身。设整个区域由 m×n个方格组成,最左上角的方格坐标为(0, 0)。 蛇是由若干个邻的方格组成的,将这些方格的坐标 依蛇头至蛇尾的次序存入到一个数组中便代表了蛇 身。当蛇在游戏区域中“游动”一格时,所对应的 数组操作应该是,将新的位置坐标插入到数组头部, 同时将数组中最后一个元素删除。这项工作可以用 一个一般的数组来完成,但当进行插入操作时需要 自己移动数组中的元素;也可以使用CArray来完成 这些工作,CArray的成员函数提供了需要的操作, 这样做简单一些。
priva源自文库e:
void ReDisplay(CPoint pPoint);
void IniGame();
void IniAim(); int m_nLeft, m_nTop, m_nWidth, m_nHeight, m_nSize; // 起始坐标,宽/高 度(格 数),每格大小 int m_nDirect; // 当前方向 // 1-右,2-左,3-下,4-上 CPoint m_pAim; // 当前目标坐标 ❖ CArray < CPoint, CPoint > m_aBody; // 蛇身 int m_nGameStatus; // 游戏状态:0-未开始,1-开始 int m_nCount; // 吃掉目标数 int m_nTime, m_nTime1; // 用时间 int m_level; //游戏难度级别
相关文档
最新文档