(完整版)mfc贪吃蛇
C语言贪吃蛇全部程序及说明Word版
#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#include <time.h>const int H = 8; //地图的高const int L = 16; //地图的长char GameMap[H][L]; //游戏地图int key; //按键保存int sum = 1, over = 0; //蛇的长度, 游戏结束(自吃或碰墙)int dx[4] = {0, 0, -1, 1}; //左、右、上、下的方向int dy[4] = {-1, 1, 0, 0};struct Snake //蛇的每个节点的数据类型{int x, y; //左边位置int now; //保存当前节点的方向, 0,1,2,3分别为左右上下}Snake[H*L];const char Shead = '@'; //蛇头const char Sbody = '#'; //蛇身const char Sfood = '*'; //食物const char Snode = '.'; //'.'在地图上标示为空void Initial(); //地图的初始化void Create_Food(); //在地图上随机产生食物void Show(); //刷新显示地图void Button(); //取出按键,并判断方向void Move(); //蛇的移动void Check_Border(); //检查蛇头是否越界void Check_Head(int x, int y); //检查蛇头移动后的位置情况int main(){Initial();Show();return 0;}void Initial() //地图的初始化{int i, j;int hx, hy;system("title 贪吃蛇"); //控制台的标题memset(GameMap, '.', sizeof(GameMap)); //初始化地图全部为空'.' system("cls");srand(time(0)); //随机种子hx = rand()%H; //产生蛇头hy = rand()%L;GameMap[hx][hy] = Shead;Snake[0].x = hx; Snake[0].y = hy;Snake[0].now = -1;Create_Food(); //随机产生食物for(i = 0; i < H; i++) //地图显示{for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");getch(); //先接受一个按键,使蛇开始往该方向走Button(); //取出按键,并判断方向}void Create_Food() //在地图上随机产生食物{int fx, fy;while(1){fx = rand()%H;fy = rand()%L;if(GameMap[fx][fy] == '.') //不能出现在蛇所占有的位置{GameMap[fx][fy] = Sfood;break;}}}void Show() //刷新显示地图{int i, j;while(1){_sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图Button(); //先判断按键在移动Move();if(over) //自吃或碰墙即游戏结束{printf("\n**游戏结束**\n");printf("你的得分:%d\n",sum=10*(sum-1));getchar();break;}system("cls"); //清空地图再显示刷新吼的地图for(i = 0; i < H; i++){for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");}}void Button() //取出按键,并判断方向{if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 {while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主key = getch(); //将按键从控制台中取出并保存到key中switch(key){ //左case 75: Snake[0].now = 0;break;//右case 77: Snake[0].now = 1;break;//上case 72: Snake[0].now = 2;break;//下case 80: Snake[0].now = 3;break;}}}void Move() //蛇的移动{int i, x, y;int t = sum; //保存当前蛇的长度//记录当前蛇头的位置,并设置为空,蛇头先移动x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';Snake[0].x = Snake[0].x + dx[ Snake[0].now ];Snake[0].y = Snake[0].y + dy[ Snake[0].now ];Check_Border(); //蛇头是否越界Check_Head(x, y); //蛇头移动后的位置情况,参数为: 蛇头的开始位置if(sum == t) //未吃到食物即蛇身移动哦for(i = 1; i < sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照{if(i == 1) //尾节点设置为空再移动GameMap[ Snake[i].x ][ Snake[i].y ] = '.';if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理{Snake[i].x = x;Snake[i].y = y;Snake[i].now = Snake[0].now;}else //其他蛇身即走到前一个蛇身位置{Snake[i].x = Snake[i+1].x;Snake[i].y = Snake[i+1].y;Snake[i].now = Snake[i+1].now;}GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身}}void Check_Border() //检查蛇头是否越界{if(Snake[0].x < 0 || Snake[0].x >= H|| Snake[0].y < 0 || Snake[0].y >= L)over = 1;}void Check_Head(int x, int y) //检查蛇头移动后的位置情况{if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空GameMap[ Snake[0].x ][ Snake[0].y ] = '@';elseif(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物{GameMap[ Snake[0].x ][ Snake[0].y ] = '@';Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个Snake[sum].y = y;Snake[sum].now = Snake[0].now;GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';sum++;Create_Food(); //食物吃完了马上再产生一个食物}elseover = 1;}。
(完整)数据结构面向对象课程设计MFC贪吃蛇
湖南工业大学课程设计任务书2012 -2013 学年第 2 学期计算机与通信学院(系、部)软件工程专业 1201 班级课程名称:面向对象课程设计设计题目: 贪吃蛇完成期限:自 2013 年 6 月 24 日至 2013 年 6 月 29 日共 1 周指导教师(签字):年月日系(教研室)主任(签字):年月日《面向对象程序设计课程设计》设计说明书基于windows界面应用程序贪吃蛇起止日期: 2013 年 6 月 24 日至 2013 年 6 月 28 日学生姓名汪骁将班级软件工程1201学号12408300126成绩指导教师(签字)计算机与通信学院2013 年 6 月 28 日目录第一章引言1。
1关于题目 (4)1.1。
1题目要求 (4)1.1.2选题背景 (4)1。
2关于编译软件 (4)1。
3关于兼容性 (4)第二章概要设计2。
1软件主要功能设计 (5)2。
1。
1程序结构 (5)2.1.2程序流程 (5)第三章软件实现3.1变量函数及资源的声明 (6)3。
1。
1函数声明 (6)3。
1.2变量声明 (6)3.1。
3资源 (7)3。
2主要功能的实现 (7)3。
2。
1游戏界面 (7)3。
2。
2初始化食物 (7)3。
2。
3开始游戏 (7)3。
2.4游戏设置...................................................... 8第四章解释4。
1个人所分任务详解 ................................................... 8第五章结果与讨论5。
1程序运行 (17)4。
1。
1部分函数与代码 (17)5.2实验总结 (19)第一章引言1.1关于题目1.1.1题目要求利用Microsoft Visual C++制作一个贪吃蛇的小游戏,要求:(1)应用MFC单文档制作(2)能够记录游戏成绩(3)可暂停/继续并在玩家不愿游戏时停止游戏(4)有背景音乐和音效1.1。
(完整word版)C语言最简洁的贪吃蛇源代码
C语言最简洁的贪吃蛇源代码.txt每天早上起床都要看一遍“福布斯”富翁排行榜,如果上面没有我的名字,我就去上班。
谈钱不伤感情,谈感情最他妈伤钱。
我诅咒你一辈子买方便面没有调料包。
#include〈graphics.h>#include<conio。
h〉#include〈dos.h〉#include<bios。
h>#include<stdlib。
h〉#define STATIC 0#define TRUE 1#define FALSE 0#define UP 1#define RIGHT 2#define DOWN 3#define LEFT 4#define VK_LEFT 0x4b00 /*上下左右键的值*/#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x4800#define VK_ESC 0x011bint board[22][22];int snakelength=0;struct snake{public:int x=0;int y=0;int direction;}body[20];snake food;void makefood();/*产生一个食物*/int eatfood(); /*蛇吃掉食物*/void right(); /*上下左右的函数了*/void down();void left();void up();void getdirection(); /*判断蛇的方向*/move(snake *body)/*让蛇动起来*/{int x=body[0].x,y=body[0].y;if(body—>direction==RIGHT&&board[y][x+1]!=1)right();else if(body—>direction==DOWN&&board[y+1][x]!=1)down(); else if(body->direction==LEFT&&board[y][x—1]!=1)left(); else if(body—>direction==UP&&board[y-1][x]!=1)up();return 0;}void print() /*在屏幕上显示蛇*/{int i,j,x=0,y=0;for(i=1;i〈21;i++)for(j=1;j<21;j++)board[i][j]=0;for(i=0;i〈20;i++){x=body[i]。
mfc贪吃蛇课程设计
mfc贪吃蛇课程设计一、课程目标知识目标:1. 让学生掌握MFC编程环境下贪吃蛇游戏的基本原理和开发流程。
2. 让学生了解和掌握C++语言中面向对象编程的基本概念,如类、对象、继承、多态等。
3. 让学生掌握MFC中常用控件的使用,如菜单、按钮、绘图等。
技能目标:1. 培养学生运用MFC编程环境进行简单游戏开发的能力。
2. 培养学生分析问题、解决问题的能力,学会运用面向对象的思维方式进行程序设计。
3. 提高学生的团队协作和沟通能力,通过小组合作完成贪吃蛇游戏的开发。
情感态度价值观目标:1. 培养学生对计算机编程的兴趣和热情,激发学生的创新精神。
2. 培养学生面对挑战和困难时保持积极的态度,勇于尝试和克服困难。
3. 引导学生认识到编程对于培养逻辑思维、解决问题能力的重要性,提高学生的综合素质。
分析课程性质、学生特点和教学要求,本课程目标旨在让学生在掌握MFC编程和面向对象编程的基础上,通过贪吃蛇游戏的开发实践,提高编程技能和解决实际问题的能力。
课程目标具体、可衡量,便于教学设计和评估。
在教学过程中,教师将关注学生的学习成果,及时调整教学策略,以确保学生能够达到预期的学习目标。
二、教学内容1. MFC编程基础:介绍MFC编程环境,重点讲解MFC应用程序框架和常用控件的使用方法,对应教材第3章。
- 窗口创建与消息映射- 菜单、按钮等控件的使用- 图形绘制2. 面向对象编程:回顾C++面向对象编程的基本概念,如类、对象、继承、多态等,对应教材第5章。
- 类的定义与使用- 继承与多态- 抽象类和接口3. 贪吃蛇游戏原理与设计:分析贪吃蛇游戏的规则和设计思路,引导学生运用MFC和面向对象编程进行游戏开发,对应教材第7章。
- 游戏逻辑设计- 游戏对象(如蛇、食物)的表示与实现- 用户交互处理4. 实践项目:将学生分为小组,合作完成贪吃蛇游戏的开发,巩固所学知识,对应教材第8章。
- 程序设计与编码- 团队协作与沟通- 项目进度管理与调试教学内容安排和进度:共4周,每周1次课,每次课2学时。
MFC专业课程设计方案报告贪吃蛇
MFC课程设计汇报MFC实现贪食蛇小游戏1.需求分析,系统功效贪吃蛇游戏需求分析贪吃蛇游戏作为一款经典小游戏,版本多样,娱乐性也很高,适合在闲暇时放松心神。
而且可在多个平台上实现,程序简单易懂,很适合MFC初学者学习制作。
贪吃蛇游戏功效介绍一条蛇在密闭围墙内,在围墙内随机出现一个食物,经过按键盘上四个方向键控制蛇向上接着又出现食物,等候被蛇吃掉,假如蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己身体游戏结束。
而且能够在游戏开始前自由选择游戏难度,游戏过程中可暂停游戏,并有积分系统,且积分每满一定值,蛇运行速度会逐步增加。
2. 分工情况为在设计过程中实现小组组员能力最大化,进行了以下分工:1、张施展:负责前期系统需求分析,系统结构设计,图标设计,界面美化调整工作,和课程设计汇报撰写。
2、张清扬:负责关键程序编写工作,菜单设计及代码编写工作。
3、资料搜集,程序调试共同进行。
3. 程序及系统结构设计贪吃蛇程序设计思绪1、方案讨论贪吃蛇游戏作为一款经典休闲类小游戏,深受同学喜爱,所以我们将贪吃蛇作为此次MFC课程设计题目。
在最初方案中,我们倾向于单文档(SDI)形式设计,但最初尝试全部因缺乏部分文件等情况而失败。
考虑到windows中自带小游戏大多采取对话框形式,为能愈加好和同学们使用习惯相一致,最终决定使用对话框(Dialogue)形式。
2、数据结构在数据结构选择,我们选择了链表,链表含有用多少空间就开多少空间优点,使程序实施更稳定,高效。
游戏控制模块框函数组员贪吃蛇程序整体间调用关系4. 软件测试汇报游戏初始界面菜单栏记分牌操作说明运动区域游戏运行界面游戏结束界面出现问题1、问题:蛇运动区域和边框不匹配,造成蛇运动出边框或未抵达边框而游戏结束。
原因:相关数据不匹配。
处理:重新对程序中矩形框绘制函数数据进行修改,并修改蛇运动边界判定条件。
2、问题:食物出现在边框外,造成游戏无法进行。
原因:控制事物出现随机函数出现问题,随机坐标超出蛇运动区域。
用C和SFML编程实现贪吃蛇小游戏
用C和SFML编程实现贪吃蛇小游戏贪吃蛇是一款经典的小游戏,它的目标是控制一条蛇,通过吃食物不断壮大身体长度,避免碰到自己的身体或者墙壁。
在本文中,我们将使用C语言和SFML库来实现这个有趣的小游戏。
1. 准备工作在开始编程之前,我们需要确保已经安装了C编译器和SFML库。
如果你还没有安装,可以通过官方网站下载并按照指导安装。
2. 创建游戏窗口首先,我们需要创建一个窗口来显示游戏界面。
我们可以使用SFML库提供的函数来实现。
```c#include <SFML/Graphics.h>int main() {int width = 800;int height = 600;sfVideoMode mode = {width, height, 32};sfRenderWindow* window = sfRenderWindow_create(mode, "Snake Game", sfClose, NULL);// 游戏主循环sfRenderWindow_destroy(window);return 0;}```在上述代码中,我们定义了窗口的宽度和高度,并通过`sfVideoMode`结构体创建了一个窗口。
然后,我们可以在游戏主循环中添加游戏逻辑。
3. 处理用户输入在游戏中,蛇的移动由玩家通过键盘控制。
我们需要检测玩家按下的键来确定蛇的移动方向。
```csfEvent event;while (sfRenderWindow_pollEvent(window, &event)) {if (event.type == sfEvtClosed) {sfRenderWindow_close(window);}if (event.type == sfEvtKeyPressed) {// 处理玩家输入}}```通过使用`sfRenderWindow_pollEvent`函数,我们可以实时检测用户的输入事件。
C课程设计贪吃蛇小游戏内附完整源码及附件.doc
温馨提示程序语言:C、C++、C#、Python(红色字体表示本课设使用的程序设计语言)图形功能选项:Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)数据结构:基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(黑体标明表示本课设使用的数据结构)C++语言项:STL库(黑体标明表示使用C++的STL库)编译环境:Windows 7 64位旗舰版(Linux及其他环境请谨慎下载)集成开发环境:Visual C++ 6.0、DEVC++、CodeBlocks、Visual Studio 2015均可通过编译。
(浅蓝色字体表示需要运行修改后的版本,请用户自行选择源代码测试)分多头文件编译:否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考相关文献)内容说明:1、课设题目及预览内容将在第二页开始展示。
2、代码行数:259行3、目录所示内容,本文基本涵盖,如无内容,会在本页进行说明。
4、附录绝对包含用户使用手册及程序完整源代码和详细注释。
5、如需下载其他头文件(例如DirectX需另行配置),本文会在此进行说明。
6、本文撰写内容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位老师或同学批评指正。
上机报告程序实践名称:________________________________学生姓名:________________________________专业:________________________________班级:________________________________学号:________________________________指导教师:________________________________上机成绩:________________________________上机地点:________________________________上机时间:____________年_______月_______日一、上机目的与上机要求(可以有多个目标及要求,对应多个上机内容)1、上机目的(具体的目的,类似于“提出问题”)将理论用于实践,更充分的掌握课本的知识,巩固并加深对课本知识的理解,进一步提高我们的动手编程能力。
贪吃蛇(C语言)
贪吃蛇(C语言)#include#include#include#include#include//蛇头移动方向#define UP 1#define DOWN 2#define LEFT 3#define RIGHT 4〃死亡判定(葱墙或葱自己)#define KISSASS 1#define KISSWALL 2//坐标转化#define POINT(x,y) ((y)*80+(x)+1)// 将(x,y)坐标转化为一个int 类数值#define GETX(x) (((x)-1)%80)// 将int 类数值提取出原先的x#define GETY(y) (((y)-1)/80)// 同理,提取出yHANDLE Console;void Position(int x, int y); // 移动光标到(x,y) //Windows.hvoid DrawMap();// 画墙void ShowText(char *text);//根据字符串的长短智能打印出包围字符串的笑脸void ResetSnake();// 初始化贪吃蛇int RefreshSnake();// 更新蛇的移动void CreatFood();// 生成食物void Draw();//画出蛇身和食物void RefreshScreen();// 屏幕刷新void GameOver(int Type);// 游戏结束条件int Gaming();//代码跑起来char play = 0; ////值为1则继续游戏,值为0游戏退出char pause = 0; //值为1则暂停,值为0游戏继续char direction; // 蛇头方向int snake[500]; //snake[0]为蛇头int body; //蛇身体长度int newbody;//吃完食物新长的蛇身int addHead,deleteTail;//增加蛇头擦去蛇尾,使贪吃蛇动起来int food = 0; // 食物void main()(CONSOLE_CURSOR_INFO CurrInfo = { sizeof(CONSOLE_CURSOR_INFO), 0 };Console = GetStdHandle(STD_OUTPUT_HANDLE);DrawMap();ShowT ext("Copyright reserve by 博元");while(Gaming()){if (play)DrawMap();};return 0;}void Position(int x, int y)// 移动光标到(x,y) //Windows.h{COORD coors = { x, y };SetConsoleCursorPosition(Console, coors);}void DrawMap() // 画墙{int i;for (i = 3; i < 70; i = i + 12){Position(i, 0);printf("===我是墙===");}for (i = 0; i < 25; i = i + 1){Position(0, i);printf("|| ");}for (i = 3; i < 70; i = i + 12){Position(i, 24);printf("============");}for (i = 0; i < 25; i = i + 1){Position(76, i); printf("|| ");void ShowText(char *text) //根据字符串的长短智能打印出包围字符串的笑脸(int i;int strLength = strlen(text); // 得到字符串长度Position(40 - (strLength / 2)-1, 11);printf("%c”, 1);for (i = 0; i < strLength + 2; i++)(printf("%c", 1);}printf("%c", 1);Position(40 - (strLength / 2)-1, 12);printf("%c ", 1);printf(text);printf(" %c", 1);Position(40 - (strLength / 2)-1, 13);printf("%c", 1);for (i = 0; i < strLength + 2; i++)(printf("%c", 1);}printf("%c", 1);}void ResetSnake() //初始化贪吃蛇(int x, y;for (x = 39, y = 0; y < 2; y++)(snake[y] = POINT(x, 7 - y);}body = 2; //设定蛇身初始长度为2newbody = 6;addHead = 0;deleteTail = 0;direction = LEFT;}int RefreshSnake() 〃更新蛇的移动〃返回值为1游戏结束( int x, y;memcpy(snake + 1, snake, sizeof(int)*body);if (!newbody){deleteTail = snake[body];snake[body] = 0;}else{body++;newbody--;}x = GETX(snake[0]);y = GETY(snake[0]);switch (direction) //控制蛇头移动方向{case UP:y -= 1; //蛇头向上移动一格(对应坐标y-1 ) snake[0] = POINT(x, y);break;case DOWN:y += 1;snake[0] = POINT(x, y); break;case LEFT:x -= 1;snake[0] = POINT(x, y); break;case RIGHT:x += 1;snake[0] = POINT(x, y); break;}addHead = snake[0];if (x > 75 || x < 3 ||y > 23 || y < 1) // 检测是否撞墙(GameOver(KISSWALL);return 1;}int i;for (i = 1; i < body; i++)if (snake[0] == snake[i]) // 检测是否撞到自己身体(GameOver(KISSASS);return 1;}if (snake[0] == food)(while (1) //食物的位置不与蛇身重合(food = (rand() % (75 * 23));for (i = 0; snake[i]; i++)if (food == snake[i])// 检测是否吃到食物,吃到则reset食物food = 0;if (food) 〃如果food==0 则重新建立一个食物坐标break;}CreatFood(); // 吃了?再来一个!newbody = (rand() % 6) + 1; // 吃完食物蛇身增长一节}return 0;}void CreatFood() // 生成食物(if (GETX(food) > 75 || GETX(food) < 3 || GETY(food) > 23 || GETY(food) < 1) CreatFood;elsePosition(GETX(food), GETY(food));printf("%c”,4);}void Draw() //画出蛇身和食物(system("cls");int i;for (i = 0; snake[i]; i++)(Position(GETX(snake[i]), GETY(snake[i])); printf("%c”,1);}CreatFood();}void RefreshScreen() // 屏幕刷新(if (deleteTail)(Position(GETX(deleteTail), GETY(deleteTail)); printf("");}if (addHead)(Position(GETX(addHead), GETY(addHead)); printf("%c",1);}addHead = deleteTail = 0;}void GameOver(int Type) // 游戏结束条件(switch (Type)(case KISSASS://? 至ij 自己身体ShowT ext("NOOB !当你以光速绕着一棵树奔跑就会发现自己在葱自己!");break;case KISSWALL://撞墙ShowT ext("NOOB !你有考虑过墙的感受吗");}food = 0;play = 0;memset(snake, 0, sizeof(int) * 500); // 存初始化} int Gaming() // 执行int Keyboardinput;Sleep(60);// 速度if (kbhit())(Keyboardinput = getch();if (Keyboardi nput == 0 || Keyboardinput == 0xE0) (Keyboardinput = getch();switch (Keyboardi nput) // 方向控制(case 72:if (direction != DOWN) direction = UP;break;case 80:if (direction != UP)direction = DOWN;break;case 75:if (direction != RiGHT)direction = LEFT;break;case 77:if (direction != LEFT)direction = RiGHT;break;}}if (Keyboardi nput == '\r') // 暂停(if (!play)(play = 1;if (pause)(Draw();pause = 0;}}else(ShowT ext("不许暂停,继续葱!!");play = 0;pause =1;}}else if (KeyboardI nput == 0x1B) // 退出return 0; } if (play)(if (!food)(srand(clock());food = (rand() % (75 * 23)); ResetSnake();Draw();}else(if (!RefreshSnake())(RefreshScreen();}}}。
经典游戏贪吃蛇代码(c++编写)
经典游戏贪吃蛇代码(c++编写)/* 头文件 */#include#includeusing namespace std;#ifndef SNAKE_H#define SNAKE_Hclass Cmp{friend class Csnake;int rSign; //横坐标int lSign; //竖坐标public://friend bool isDead(const Cmp& cmp); Cmp(int r,int l){setPoint(r,l);}Cmp(){}void setPoint(int r,int l){rSign=r;lSign=l;}Cmp operator-(const Cmp &m)const{return Cmp(rSign - m.rSign,lSign - m.lSign);}Cmp operator+(const Cmp &m)const{return Cmp(rSign + m.rSign,lSign + m.lSign);}};const int maxSize = 5; //初始蛇身长度class Csnake{Cmp firstSign; //蛇头坐标Cmp secondSign;//蛇颈坐标Cmp lastSign; //蛇尾坐标Cmp nextSign; //预备蛇头int row; //列数int line; //行数int count; //蛇身长度vector<vector > snakeMap;//整个游戏界面queue snakeBody; //蛇身public:int GetDirections()const;char getSymbol(const Cmp& c)const //获取指定坐标点上的字符{return snakeMap[c.lSign][c.rSign];}Csnake(int n) //初始化游戏界面大小{if(n<20)line=20+2;else if(n>30)line = 30 + 2;else line=n+2;row=line*3+2;}bool isDead(const Cmp& cmp){return ( getSymbol(cmp)=='c' || cmp.rSign == row-1 || cmp.rSign== 0 || cmp.lSign == line-1 || cmp.lSign == 0 );}void InitInstance(); //初始化游戏界面bool UpdataGame(); //更新游戏界面void ShowGame(); //显示游戏界面};#endif // SNAKE_H====================================== ==============================/* 类的实现及应用*/#include#include#include#include "snake.h"using namespace std;//测试成功void Csnake::InitInstance(){snakeMap.resize(line); // snakeMap[竖坐标][横坐标]for(int i=0;i{snakeMap[i].resize(row);for(int j=0;j{snakeMap[i][j]=' ';}}for(int m=1;m{//初始蛇身snakeMap[line/2][m]='c';//将蛇身坐标压入队列snakeBody.push(Cmp(m,(line/2)));//snakeBody[横坐标][竖坐标]}//链表头尾firstSign=snakeBody.back();secondSign.setPoint(maxSize-1,line/2);}//测试成功int Csnake::GetDirections()const{if(GetKeyState(VK_UP)<0) return 1; //1表示按下上键if(GetKeyState(VK_DOWN)<0) return 2; //2表示按下下键if(GetKeyState(VK_LEFT)<0) return 3; //3表示按下左键if(GetKeyState(VK_RIGHT)<0)return 4; //4表示按下右键return 0;}bool Csnake::UpdataGame(){//-----------------------------------------------//初始化得分0static int score=0;//获取用户按键信息int choice;choice=GetDirections();cout<<"Total score: "<<score</</score<</vector/随机产生食物所在坐标int r,l;//开始初始已经吃食,产生一个食物static bool eatFood=true;//如果吃了一个,才再出现第2个食物if(eatFood){do{//坐标范围限制在(1,1)到(line-2,row-2)对点矩型之间srand(time(0));r=(rand()%(row-2))+1; //横坐标l=(rand()%(line-2))+1;//竖坐标//如果随机产生的坐标不是蛇身,则可行//否则重新产生坐标if(snakeMap[l][r]!='c'){snakeMap[l][r]='*';}}while (snakeMap[l][r]=='c');}switch (choice){case 1://向上//如果蛇头和社颈的横坐标不相同,执行下面操作if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSi gn.rSign,firstSign.lSign-1);//否则,如下在原本方向上继续移动else nextSign=firstSign+(firstSign-secondSign); break;case 2://向下if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSi gn.rSign,firstSign.lSign+1);else nextSign=firstSign+(firstSign-secondSign); break;case 3://向左if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSi gn.rSign-1,firstSign.lSign);else nextSign=firstSign+(firstSign-secondSign);break;case 4://向右if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSi gn.rSign+1,firstSign.lSign);else nextSign=firstSign+(firstSign-secondSign);break;default:nextSign=firstSign+(firstSign-secondSign);}//----------------------------------------------------------if(getSymbol(nextSign)!='*' && !isDead(nextSign)) //如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头{//删除蛇尾lastSign=snakeBody.front();snakeMap[lastSign.lSign][lastSign.rSign]=' ';snakeBody.pop();//更新蛇头secondSign=firstSign;//压入蛇头snakeBody.push(nextSign);firstSign=snakeBody.back();snakeMap[firstSign.lSign][firstSign.rSign]='c';//没有吃食eatFood=false;return true;}//-----吃食-----else if(getSymbol(nextSign)=='*' && !isDead(nextSign)){secondSign=firstSign;snakeMap[nextSign.lSign][nextSign.rSign]='c';//只压入蛇头snakeBody.push(nextSign);firstSign=snakeBody.back();eatFood=true;//加分score+=20;return true;}//-----死亡-----else {cout<<"Dead"<<endl;cout<<"your "<<score<}void Csnake::ShowGame(){for(int i=0;i{for(int j=0;jcout<cout<}Sleep(1);system("cls");}======================================================================/*主函数部分 */#include#include "snake.h"#includeusing namespace std;int main(){Csnake s(20);s.InitInstance();//s.ShowGame();int noDead;do{s.ShowGame();noDead=s.UpdataGame();}while (noDead</endl;cout<<"your>);system("pause");return 0;}。
纯C语言编写贪吃蛇(附源码,无EasyX、MFC)
纯C语⾔编写贪吃蛇(附源码,⽆EasyX、MFC)⼤⼀下学期,我所选的C语⾔⼯程实践是写⼀个贪吃蛇游戏。
那⼏天真的挺肝的,完成本专业的答辩之后就没怎么动过这程序了。
那时候写的贪吃蛇,还有⼀个栈溢出的问题没有解决,是因为当时所学知识有限,还没想到较好的解决⽅法。
现在⼤⼆上学期,在上了好⼏节数据结构之后,对栈有了⼀定的了解,随着对栈的学习,我想出了解决我写的贪吃蛇栈溢出的办法。
其实是前两天刚刚有这个想法,刚刚才测试并实现了,办法可⾏。
现在我加⼊了计算机学院的创新开放实验室,打算做的⼀个项⽬是微信⼩程序。
以后想记录⼀下我的开发过程和⼀些经历,⼜刚刚完善好贪吃蛇的代码,就简单记录⼀下吧。
因为代码⽐较长,先把参考资料写⼀下,想⾃⼰⼿写⼀遍的建议先看参考资料,再看这⾥的代码参考资料源代码/*预处理*/#include <windows.h>#include <stdio.h>#include <conio.h>#include <string.h>#include <time.h>/*宏定义*/#define YES 1#define NO 0//蛇的移动⽅向#define U 1 //上#define D 2 //下#define L 3 //左#define R 4 //右#define RESPEED 250 //蛇的移动速度/*定义节点*/typedef struct SNAKE{int x;int y;struct SNAKE* next;}snake;/*全局变量*/snake* head, * food; //蛇头指针,⾷物指针snake* q; //遍历蛇的时候⽤到的指针/*【以下为所有函数的声明】*/void HideCursor(void); //隐藏光标void color(short int num); //颜⾊函数void StartWindow(void); //开始界⾯int gotoxy(int x, int y); //定位光标位置void creatMap(void); //创建地图void notice(int* score, int* highscore, int* Time, int* LongTime); //提⽰void initsnake(void); //初始化蛇⾝int biteself(unsigned long* sleeptime); //判断是否咬到了⾃⼰int createfood(void); //随机出现⾷物void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime); //结束游戏void pause(int* PauseBegin, int* PauseEnd); //暂停游戏void gamecontrol(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //控制游戏(包含蛇不能穿墙)void snakemove(unsigned long* sleeptime, int* count, int* score, int* status, int* endgamestatus); //蛇移动void gamestart(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime, int* TimeBegin); //游戏初始化void gamecontinue(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //再来⼀局void stop(unsigned long* sleeptime); //蛇停⽌移动void start(unsigned long* sleeptime); //蛇恢复移动void reset(int* count, int* score, int* Time, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //重置多项数据void updatescore(int* score, int* highscore, int* Time, int* LongTime); //更新多项数据int main(void){unsigned long sleeptime = RESPEED;int score = 0, highscore = 0, count = 0; //count是记录吃到⾷物的次数int status, endgamestatus = 0; //游戏结束情况,0未开始游戏前退出,1撞到墙,2咬到⾃⼰,3主动退出游戏,4通关HideCursor();gamestart(&score, &highscore, &endgamestatus, &Time, &LongTime, &TimeBegin);gamecontrol(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &Pa useBegin, &PauseEnd);endgame(&score, &highscore, &endgamestatus, &Time, &LongTime);gamecontinue(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &P auseBegin, &PauseEnd);return 0;}void HideCursor(void) //隐藏光标{CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}void color(short int num){HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));SetConsoleTextAttribute(hConsole, num);}void StartWindow(void){short int i;system("mode con cols=120 lines=30"); //设置窗⼝⼤⼩printf("温馨提⽰:请使⽤键盘操作(⿏标点击可能会导致程序出错)\n");printf("╔═══════════════════════════════════════════════════╗ \n");for (i = 0; i < 26; i++){printf("║ ║ \n");}printf("╚═══════════════════════════════════════════════════╝ \n");gotoxy(23, 2);color(3);printf("贪吃蛇");for (i = 15; ; i--){gotoxy(18, 4);color(i);printf("按任意键加载程序");Sleep(600);if (i == 1){i = 15;}if (kbhit()) //判断是否按键,等待输⼊按键为0,按键为1{break;}}gotoxy(10, 4);printf("1.开始游戏 2.退出游戏");getch();}int gotoxy(int x, int y){HANDLE handle; //定义句柄变量handle,创建⼀个句柄COORD pos; //定义结构体coord (坐标系coord)pos.X = x; //横坐标xpos.Y = y; //纵坐标yhandle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台输出句柄(值为-11)SetConsoleCursorPosition(handle, pos); //移动光标return YES;}void creatMap(void){int i;//地图⼤⼩:长24×宽20printf("■");gotoxy(i, 27);printf("■");}for (i = 7; i < 28; i++) //打印左右边框{gotoxy(2, i);printf("■");gotoxy(50, i);printf("■");}}void notice(int* score, int* highscore, int* Time, int* LongTime){system("title 2018051170 Project:贪吃蛇");gotoxy(4, 4);color(15);printf("得分:%3d 最⾼分:%3d ⽣存:%4ds 最久⽣存:%4ds", *score, *highscore, *Time, *LongTime); gotoxy(60, 7);printf("Author: 2018051170 Project: 贪吃蛇");gotoxy(60, 9);printf("游戏说明:");gotoxy(60, 10);printf("不能穿墙,不能咬到⾃⼰");gotoxy(60, 11);printf("↑↓←→控制蛇的移动");gotoxy(60, 12);printf("ESC:退出游戏空格:暂停游戏");}void initsnake(void){int i;snake* tail;tail = (snake*)malloc(sizeof(snake)); //从蛇尾开始,插头法,以x,y设定开始的位置tail->x = 26;tail->y = 14;tail->next = NULL;for (i = 1; i < 3; i++){head = (snake*)malloc(sizeof(snake));head->next = tail;head->x = 26 - 2 * i;head->y = 14;tail = head;}while (tail != NULL) //从头到为,输出蛇⾝{gotoxy(tail->x, tail->y);if (i == 3){color(2);printf("●");i++;}else if (tail != NULL){color(2);printf("■");}tail = tail->next;}}int biteself(unsigned long* sleeptime){snake* self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y)self = self->next;}return NO;}int createfood(void){snake* food_1;food_1 = (snake*)malloc(sizeof(snake));srand((unsigned)time(NULL)); //产⽣⼀个随机数while ((food_1->x % 2) != 0) //保证其为偶数,使得⾷物能与蛇头对其{food_1->x = rand() % 50; //保证其在墙壁⾥X1 < X < X2if (food_1->x <= 4){food_1->x = food_1->x + 4;}}food_1->y = rand() % 27; //保证其在墙壁⾥Y1 < Y < Y2if (food_1->y < 7){food_1->y = food_1->y + 7;}q = head;while (q != NULL) //判断蛇⾝是否与⾷物重合{if (q->x == food_1->x && q->y == food_1->y){free(food_1);return 1;}if (q->next == NULL){break;}q = q->next;}gotoxy(food_1->x, food_1->y);food = food_1;color(3);printf("★");return 0;}void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime) {color(15);gotoxy(60, 14);if (*endgamestatus == 0){printf("您退出了游戏。
MFC写的贪吃蛇代码
脚把脚教“MFC版贪吃蛇教程”之阳早格格创做写正在前里的话本次贪吃蛇教程主要知识面包罗以下几个圆里1 CView类中的消息赞同2 控件的消息赞同3 鉴于CView类内的简直游戏真止4 数组5 游戏图形的真止用CDC类真止.本版游戏的简直真止是正在CViewl类中真止,所以其余类不必增加所有代码.由于此次贪吃蛇需要MFC的启垦环境,所以挨启VisualC++新修一个MFC AppWizard单文档工程,随意与名一个工程称呼.本次贪吃蛇基础过程与大概思维1 定义蛇类战食物类,初初化贪吃蛇各项成员变量,包罗图像的出目前屏幕的初初位子,少度,以及蛇的止走目标.食物类的定义包罗出现的初初位子,以及食物是可被吃掉的推断.2 用数组初初化少度为3的贪吃蛇,而且默认食物已出现3 正在CView类上使用MFC提供的Windows消息中WM_TIMER消息,使用OnTimer()函数让系统提供一个时钟节拍,革新游戏4 简直游戏真止,包罗蛇碰到自己战围墙皆将使游戏中断,推断吃豆等,其中还包罗根据蛇的少度去举止游戏易度的改变.5 简直键盘游戏支配使用到Windows消息赞同中的WM_KEYDOWN,用OnKeyDown()去赞同玩家的本质支配. ///////////////////////////////////////////////////////////////////////第一部分最先正在已有工程下的“ClassView”中左键CView类增加以下Windows疑息1 WM_KEYDOWN2 WM_RBUTTONDOWN3 WM_TIMER再左键CView类采用“ADD Virtual Funciton”选OnInitialUpdate()OnInitialUpdate()的功能如下:视图窗心真足修坐后第一个被框架调用的函数.框架正在第一次调用OnDraw前会调用OnInitialUpdate,果此OnInitialUpdate是树坐滑动视图的逻辑尺寸战映射模式的最符合的场合.时间上,二者先后程序分歧,构制函数死成本类的对于象,但是不爆收窗心,OnCreate后窗心爆收,而后才是视图的OnInitialUpDate,普遍正在那里对于视图的隐现搞初初化.简朴面,便是ONCREATE不过爆收VIEW的基础结媾战变量而正在OnInitialUpDate()中,主要初初化视图中控件等.对于各个变量举止初初化支配所以咱们要用那个函数去举止贪吃蛇的初初化处事.再者还要增加一个成员函数oninit()举止贪吃蛇中瞅的初初化控件的安排再者是安排游戏的一些控件去统制“游戏启初” “游戏中断” 战“游戏久停”.咱们不妨面打“处事空间”的“ResourceView”举止控件的简直安排,那里咱们正在Menu文献夹中把“IDR_MAINFRAME”中默认的控件局部简略左键其中的题目栏,面打属性,会得到一个菜单栏题目,咱们分别修坐1个菜单栏题目.那里咱们分别修“游戏”.面打而且正在已有控件中的列表中面打属性,举止“菜单名目属性”的树坐.咱们本别修坐的属性“标明”与对于应的ID 有游戏启初 IDM_START游戏久停 IDM_PAUSE游戏继承 IDM_CONTINUE游戏退出 IDM_EXIT此处控件的安排是“可睹即可得”的控件支配乐成树坐ID之后咱们分别左键各项属性举止消息赞同处理函数的死成简直要收支配例子如下1左键“游戏启初”2 面打“类背导修坐”3 正在Message Maps页里,正在要举止消息赞同的控件ID 列表Object IDs中上采用对于应的ID, 那里咱们采用IDM_START,简直真止的环境是CView类,所以咱们必须把“Class name”的默认“CMainFrame”改为“CView类”,而且正在“Messages”典型树坐中,用“COMMAND”树坐为其为下令消息.其余各项也依照共理举止树坐.PS:Windows消息的分类有3种,尺度消息,下令消息,通知消息1 尺度消息除COMMAND除中,所以WM_启头皆是尺度消息2 下令消息便是COMMAND3 通知消息由控件爆收的消息,那类疑息也能以WM_COMMAND典型出现末尾咱们回到本去的ClassView去瞅瞅咱们一共增加的函数所有的函数集中局部有以下正在此处咱们不妨瞅到咱们增加的Windows消息所有的消息赞同函数的声明//////////////////////////////////////////////////////////第二部分简直真止游戏、Step 1最先咱们正在文献启头处分别定义蛇战食物的局部变量struct Snake {int x,y;int len;int direct; }Snake[50]; struct Food {int x;int y;int isfood; }Food;再者voidCSNAKEView::OnInitialUpdate(){CView::OnInitialUpdate();S nake[0].x=10;Snake[0].y=10;Snake[1].x=11;Snake[1].y=10;Sna ke[2].x=12;Snake[2].y=10;Snake[0].direct=3;Snake[0].len=3;Fo od.isfood=1;// TODO: Add your specialized code here and/or call the baseclass}代码证明:初初化贪吃蛇起初有3个节面,少度为3,起初坐标;食物默认为 1无0有天然尔越收喜欢0无1有Step 2对于OnKeyDown()简直增加代码void CSNAKEView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){// TODO: Add your message handler code here and/or call defaultswitch(nChar){caseVK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break; case VK_DOWN:if(Snake[0].direct!=1)Snake[0].direct=2;break;case VK_LEFT:if(Snake[0].direct!=4)Snake[0].direct=3;break; case VK_RIGHT:if(Snake[0].direct!=3)Snake[0].direct=4;break; }C View::OnKeyDown(nChar, nRepCnt,nFlags);CView::OnKeyDown(nChar, nRepCnt, nFlags);}OnKeyDown函数的第一个参数 UINT nChar 是交支用户键进的疑息,而后咱们用switch举止采用推断代码证明:Snake[0]代表的是蛇头,咱们对于蛇头的目标Snake[0].direct举止推断.case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break;意义便是当Snake[0].direct的目标此时本去不等于“下”的时间,才搞搞出“上”的支配动做,可则则忽略用户“进与”的支配按键效验Step 3对于OnRButtonDown()简直增加代码void CSNAKEView::OnRButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default// TODO: Add your message handler code here and/or call defaultCStringstr;str.Format("%d,%d",point.x,point.y);AfxMessageBox(str);C View::OnRButtonDown(nFlags,point);CView::OnRButtonDown(nFlags,point);CView::OnRButtonDown(nFlags, point);}那个函数功能是:用鼠标左键屏幕,便会赶快隐现目前位子的坐标疑息.本去那个函数本去不是本游戏中需要增加的函数,不过为了正在后里游戏页里的安排的时间不妨用鼠标左键屏幕相识大概的屏幕坐标疑息,才特天搞的那里补充一个知识面WIN32坐标系有3种1 天下坐标系2 页里坐标系3 设备坐标系天下坐标系与页里坐标系称谓“逻辑空间”,本质上便等共于咱们现真死计中的数教坐标系一般.设备坐标系则可则,电脑屏幕便是一个用设备坐标系的,特性为以用户区窗心左上角为(0 , 0)本面,X坐标背左为正,Y坐标背下为正.Step 4void CSNAKEView::oninit(){CDC *pDC=GetDC();CBrush DrawBrush=(RGB(100,100,100));CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);for(int i=0;i<=snake[0].l-1;i++)pDC->Rectangle(snake[i].x*20,snake[i].y*20,(snake[i].x+1)*20,(snak e[i].y+1)*20);pDC->SelectObject(DrawBrush);}代码证明:利用Windows给咱们提供的CDC类去举止画图,咱们最先用一个指背CDC类的指针去交受与该窗心相闭联的DC句柄,而后用定义画刷一个DrawBrush对于象,而且用RGB(100,100,100)去给画刷初初化颜色.而且用SelectObject(&DrawBrush);函数把对于象画刷选进到设备形貌表中,用for循环依次把贪吃蛇的3个节面画出去.void far rectangle(int left, int top, int right, int bottom);那个函数的的功能根据函数功能:该函数画一个矩形,用目前的画笔划矩形表面,用目前画刷举止补充.Step 5 控件增加代码void CSNAKEView::OnStart(){// TODO: Add your command handler codehereSetTimer(1,3000,NULL);AfxMessageBox("3秒后启初游戏!");}void CSNAKEView::OnPause(){// TODO: Add your command handler code hereKillTimer(1);AfxMessageBox("久停游戏...");}void CSNAKEView::OnExit(){// TODO: Add your command handler code hereAfxMessageBox("退出游戏...");exit 0;}void CSNAKEView::OnContinue(){// TODO: Add your command handler code hereSetTimer(1,10,NULL);}代码证明:由于之前咱们设定了WM_TIMER消息,咱们能使用计时器功能用WM_TIMER去树坐定时器先请瞅SetTimer那个API函数的本型UINT_PTR SetTimer(HWND hWnd, // 窗心句柄UINT_PTR nIDEvent, // 定时器ID,多个定时器时,不妨通过该ID推断是哪个定时器UINT uElapse, // 时间隔断,单位为毫秒TIMERPROC lpTimerFunc // 回调函数);SetTimer(m_hWnd,1,1000,NULL); //一个1秒触收一次的定时器正在MFC步调中SetTimer被启拆正在CWnd类中,调用便不必指定窗心句柄了所以咱们那里不妨只去后3个参数写成SetTimer(1,10,NULL);1000为1秒闭于afxMessageBox的钻研正在本博客中有写有,那里便不正在赘述Step 6 对于OnDraw()的增加代码OnDraw()函数寡所周知视图类中的输出.视图类的输出基础上皆是正在视图类的OnDraw函数中处理的,系统会准备佳进参,而后调用OnDraw函数自己也不过多的去钻研过次函数,仅知讲一些皮毛.不过那里有个知识面那即是OnPaint()与OnDraw()的辨别,OnPaint ()派死于CWnd类,赞同WM_PAINT消息.OnDraw是CView类的成员函数,而且不消息赞同功能,那便是为什么视图类不惟有OnDraw()而不OnPaint()的本果.OnDraw()维护视图客户区(比圆通过试表正在视图中画图),而OnPaint()维护窗心的客户区void CSNAKEView::OnDraw(CDC* pDC){CSNAKEDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCBrushbackBrush(RGB(100,100,0));CBrush* pOldBrush = pDC->SelectObject(&backBrush);CRect rect;pDC->GetClipBox(&rect);pDC->PatBlt(rect.left, rect.top,rect.Width(), rect.Height(),PATCOPY);pDC->SelectObject(pOldBrush);pDC->Rectangle(19,19,501,501);oninit();}代码证明:此处是用画刷画一个背景,而且画出3个矩形天区函数本型:int GetClipBox(HDC hdc, LPRECT lprc);该函数得到一个不妨完包罗目前可睹天区的最小矩形的大小.函数本型:int nYLeft, int nWidth, int nHeight, DWORD dwRop);该函数使用目前选进指定设备环境中的刷子画制给定的矩形天区.Step 7 对于OnTime()的增加代码void CSNAKEView::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC();CStringsoure;if(Snake[0].len==2)SetTimer(1,370,NULL);if(Snake[0].len==3)SetTimer(1,270,NULL);if(Snake[0].len==6)SetTime r(1,200,NULL);if(Snake[0].len==9)SetTimer(1,100,NULL);s oure.Format("得分:%d!",(Snake[0].len-3)*10); //碰界推断if(Snake[0].x*20<=37||Snake[0].y*20<=37||Snake[0].x*20>=4 62||Snake[0].y*20>=462){KillTimer(1);AfxMessageBox(sour e);// s=0;}//蛇身相碰推断if(Snake[0].len>3)for(intsn=Snake[0].len-1;sn>0;sn--){if(Snake[0].x*20==Snake[sn].x*20&&Snake[0].y*20==Sna ke[sn].y*20){KillTimer(1);AfxMessageBox(soure);//s=0;}}///////////////////////////////////////////////////////////////////////////pDC->SelectStockObject(WHITE_PEN);pDC->Rectangle(Snake[Snake[0].len-1].x*20,Snake[Snake[0].len-1].y*20,(Snake[Snake[0].len-1].x+1)*20,(Snake[Snake[0].len-1].y+1)*20);for(int i=Snake[0].len-1;i>0;i--){Snake[i].x=Snake[i-1].x;Snake[i].y=Snake[i-1].y;}//止走目标推断if(Snake[0].direct==1)Snake[0].y--;if(Snake[0].direct==2)Snake[0].y++;if(Snake[0].direct==3)S nake[0].x--;if(Snake[0].direct==4)Snake[0].x++;pDC->SelectStockObject(BLACK_PEN);CBrushDrawBrush=(RGB(100,100,100));CBrush*Drawbrush=pDC->SelectObject(&DrawBrush);pDC->Rectangle(Snake[0].x*20,Snake[0].y*20,(Snake[0].x+1)*20, (Snake[0].y+1)*20);pDC->SelectObject(DrawBrush);//推断吃豆的条件,碰到便吃if(Snake[0].x*20==Food.x*20&&Snake[0].y*20==Food.y*20 ){Snake[0].len++;Food.isfood=1;Snake[Snake[0].len-1].x=Snake[Snake[0].len-2].x;Snake[Snake[0].len-1].y=Snake[Snake[0].len-2].y;}//如果食物被吃了便死成if(Food.isfood==1){srand((unsigned)time(NULL));do{for(int isfo=Snake[0].len-1;isfo>=0;isfo--)if(Snake[0].x*20==Snake[isfo].x*20&&Snake[0].y*20==Snake [isfo].y*20){Food.x=rand()%;Food.y=rand()%;}}while(Food.x* 20<70||Food.y*20<70||Food.x*20>430||Food.y*20>430);pDC->Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*2 0);Food.isfood=0;}CView::OnTimer(nIDEvent);}/////////////////////////////////底下由尔去小心分解代码if(Snake[0].len==2)SetTimer(1,370,NULL);if(Snake[0].len==3) SetTimer(1,270,NULL);if(Snake[0].len==6)SetTimer(1,200,NU LL);if(Snake[0].len==9)SetTimer(1,100,NULL);此段代码的效率是根据蛇的少度去举止SetTimer()函数的定义,不妨根据少度去举止游戏易度的设定,如上代码分别370ms 270ms 200ms 100ms举止一次新的移动.//碰界推断if(Snake[0].x*20<=37||Snake[0].y*20<=37||Snake[0].x*20>=46 2||Snake[0].y*20>=462){KillTimer(1);AfxMessageBox(soure);}那里为什么要乘以20呢?由于咱们初初化的时间是Snake[0].x=10;Snake[0].y=10;Snake[1].x=11;Snake[1].y=10;Sn ake[2].x=12;Snake[2].y=10;所以不过把贪吃蛇的起初位子“搬移”到20倍的位子天然不妨等价于Snake[0].x=10*20;Snake[0].y=10*20;Snake[1].x=11*20;Snake[ 1].y=10*20;Snake[2].x=12*20;Snake[2].y=10*20;蛇的一节身体为一个矩形块,那样表示每个矩形块只需起面坐标x战y身体是不竭删少的,所以用数组存搁每一节的坐标//蛇身相碰推断if(Snake[0].len>3)for(int sn=Snake[0].len-1;sn>0;sn--){if(Snake[0].x*20==Snake[sn].x*20&&Snake[0].y*20==Snak e[sn].y*20){KillTimer(1);AfxMessageBox(soure);// s=0;}}那段是最佳明黑的了,由于推断蛇自己是可咬到了自己,根据蛇少sn,举止sn次for sn-1次循环而且战Snake[0].x举止比较(之所以举止sn-1次那肯定是不包罗蛇头而且蛇的少度也必须大于3才会爆收自己咬自己的情况)KillTimer(1);是停止计时器;战之前的SetTime()对于应而已AfxMessageBox(soure);那里不深究,总之便是输出一个本样输出真质pDC->SelectStockObject(WHITE_PEN);//把红色的“PEN”选进设备举止画图pDC->Rectangle(Snake[Snake[0].len-1].x*20,Snake[Snake[0].len-1].y*20,(Snake[Snake[0].len-1].x+1)*20,(Snake[Snake[0].len-1].y+1)*20);//让它去画末尾一个节面for(int i=Snake[0].len-1;i>0;i--)//贪吃蛇的蛇身移动{Snake[i].x=Snake[i-1].x;Snake[i].y=Snake[i-1].y;}那段的知识面要宽沉的证明一下1 为什么要博门用黑笔划末尾一个呢?果为咱们的游戏界里是用红色的,贪吃蛇移动的时间,肯定是蛇头背前走一单位,而尾部肯定要“揩除”掉一个单位,那怎么揩除呢?咱们只可用战背景致一般的画笔.本去蛇的位子战新蛇的位子好一个单位,所以瞅起去蛇会多一节身体,所以将蛇的末尾一节用背景致覆盖SelectStockObject(WHITE_PEN) 让它起到“消得”末尾一个节面的功能让咱们以为蛇是背前走了.如假设目前贪吃蛇有4个单位0123Snake[Snake[0].len-1].x*20 <=>Snake[Snake[0].4-1].x*20=Snake[3].x*20数组3 恰佳是末尾一个节面的下标,别记了数组是从0启初算的请小心收会2for(int i=Snake[0].len-1;i>0;i--){Snake[i].x=Snake[i-1].x;Snake[i].y=Snake[i-1].y;}举止次数为"少度-1"次的循环为什么要举止少度-1次呢?尔那里要证明一下,那里是不包罗蛇头的举止的仄移,用数组赋值的要收,把前一节面保存正在后一个结面,而背面结面背前移动.//目标推断if(Snake[0].direct==1)Snake[0].y--;if(Snake[0].direct==2)Snake[0].y++;if(Snake[0].direct==3)Sna ke[0].x--;if(Snake[0].direct==4)Snake[0].x++;pDC->SelectStockObject(BLACK_PEN);CBrushDrawBrush=(RGB(100,100,100));CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);pDC->Rectangle(Snake[0].x*20,Snake[0].y*20,(Snake[0].x+1)*20,(S nake[0].y+1)*20);pDC->SelectObject(DrawBrush);“1234”本别代表“上下安排” x++,y++举止移动,而后用选定画刷画出一个新节面的矩形动做头结面//食物推断if(Food.isfood==0){srand((unsigned)time(NULL));do{for(int isfo=Snake[0].len-1;isfo>=0;isfo--)if(Snake[0].x*20==Snake[isfo].x*20&&Snake[0].y*20==Snake [isfo].y*20){Food.x=rand()%;Food.y=rand()%;}}while(Food.x* 20<70||Food.y*20<70||Food.x*20>430||Food.y*20>430);pDC->Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*2 0);Food.isfood=1;}那里闭于srand((unsigned)time(NULL));rand()的用法正在本博客有钻研帖那里不再赘述.当食物被吃了指定食物的场合出现的场合正在小于70 战大于430的矩形天区内而且把食物属性变动为“存留”//////////////////////////////////////////////////////////////////以上便是MFC版步调已经小心之至了,通过此次贪吃蛇尔创制MFC不易,不过花了尔整整一个国庆的时间,茶饭不思夜不克不迭寐,CView类的强盛尔是第一次瞅到,以去尔要多加闭注CView类的知识面,写出那个文档的意义尔感触能让尔的思路越收浑晰,到底能战他人阐明代码而且让他人能明黑那是一件很舒畅的事务.。
贪吃蛇课程设计mfc
贪吃蛇课程设计mfc一、教学目标本课程旨在通过学习“贪吃蛇”游戏的设计与实现,让学生掌握基于MFC (Microsoft Foundation Classes)的Windows应用程序开发的基本方法和步骤。
通过本课程的学习,学生将能够:1.知识目标:理解MFC的基本概念和架构,掌握常见的MFC类和窗口生命周期;掌握消息映射和事件处理机制;了解多线程编程和文件操作的基本方法。
2.技能目标:能够使用MFC创建一个基本的Windows应用程序,包括窗口的创建、销毁和更新;能够实现用户输入的处理和界面的响应用户操作;能够使用MFC进行简单的多线程编程和文件操作。
3.情感态度价值观目标:培养学生对计算机科学的兴趣和热情,培养学生的问题解决能力和创新精神,培养学生的团队合作意识和沟通能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.MFC基本概念和架构:介绍MFC的概念、历史和特点,了解MFC的层次结构和主要的类。
2.窗口编程:学习窗口的生命周期,掌握窗口的创建、销毁和更新的方法;学习消息映射和事件处理机制,了解如何响应用户的操作。
3.用户输入处理:学习如何处理用户的键盘输入和鼠标输入,实现对用户操作的响应。
4.多线程编程:学习多线程的概念和基本原理,掌握创建和管理线程的方法,了解如何在多线程中进行数据共享和同步。
5.文件操作:学习文件的打开、关闭、读写等基本操作,掌握文件操作的错误处理和异常处理方法。
6.贪吃蛇游戏设计与实现:通过具体案例,综合运用所学知识,设计和实现一个简单的贪吃蛇游戏。
三、教学方法为了提高教学效果和学生的学习兴趣,本课程将采用多种教学方法:1.讲授法:通过讲解和演示,向学生传授MFC的基本概念和编程方法。
2.案例分析法:通过分析具体的案例,让学生理解和掌握MFC的应用方法和技巧。
3.实验法:通过上机实验,让学生动手实践,加深对MFC编程的理解和掌握。
4.讨论法:通过小组讨论和课堂讨论,促进学生之间的交流和合作,培养学生的团队合作意识和沟通能力。
MFC写的贪吃蛇代码
手把手教“MFC版贪吃蛇教程”写在前面的话本次贪吃蛇教程主要知识点包括以下几个方面1 CView类中的消息响应2 控件的消息响应3 基于CView类内的具体游戏实现4 数组5游戏图形的实现用CDC类实现。
本版游戏的具体实现是在CViewl类中实现,所以其他类不用添加任何代码.由于此次贪吃蛇需要MFC的开发环境,所以打开VisualC++新建一个MFCAppWizard单文档工程,随意取名一个工程名称。
ﻫﻫ本次贪吃蛇基本流程与大体思想1定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的初始位置,长度,以及蛇的行走方向。
食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。
2 用数组初始化长度为3的贪吃蛇,并且默认食物未出现3在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer()函数让系统提供一个时钟节拍,更新游戏4 具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中还包括根据蛇的长度来进行游戏难度的改变。
5 具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown()来响应玩家的实际操作。
///////////////////////////////////////////////////////////////////////第一部分首先在已有工程下的“ClassView”中右键CView类添加以下Windows信息1 WM_KEYDOWN2 WM_RBUTTONDOWN3 WM_TIMER再右键CView类选择“ADD VirtualFunciton”选OnInitialUpdate()OnInitialUpdate()的功能如下:视图窗口完全建立后第一个被框架调用的函数.框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最合适的地方。
手把手教MFC贪吃蛇
手把手教MFC贪吃蛇13本文作者:唐伯虎发布于:2010-8-28 分类:MFC编程点击:766很多人学了很久MFC,都不知道到底学了什么。
因为他们被很多MFC的书给误导了,时下的MFC的书大部分的章节都是如何运用控件。
学来学去还是不知道学到了什么,除了移动控件。
我就被这些误导了好久,直到后来我尝试编写这个贪吃蛇,才开始真正理解MFC。
MFC提供的很多控件,这些只是辅助编程用的,给编好的程序添加个按钮之类的,真正要编写windows程序,归根结底还是要用c++的各种算法实现功能,MFC库则帮助我们从命令行程序过渡到GUI程序。
接下来我就开始指导贪吃蛇的编写。
首先,要创建一个基于对话框的mfc程序,取名为Snake,然后开始在这些自动生成的代码中添加自己要实现的功能。
我是怎么实现蛇的呢?我的方法是用GUI绘图画出很多小矩形,这些矩形连在一起,就可以出现一条蛇了。
于是我们便要记录每个小矩形的一个点的信息。
我用了一个Body类class Body{public:int x;int y;Body* next;Body* pre;Body(int xx,int yy){x=xx;y=yy;next=NULL;pre=NULL;}};然后还需要食物,我们再建立一个food结构体struct Food{int x;int y;}food;有人不禁要问为何body不用结构体呢,这里我主要是想用类的构造函数。
处理好这些微观问题,我们再来宏观研究这条蛇,我们需要这条蛇可以移动,可以吃食物,所以我们要建立一个snake类,并赋予它有移动,吃食物等的功能class Snake{public:Body* head;void move();Snake(){Body* body1=new Body(0,0);Body* body2=new Body(1,0);body1->next=body2;body2->pre=body1;head=body2;}void creatfood();int isGameOver();Body* getHead(){return head;}void DrawSnake(CDC *pDC);void DrawFood(CDC *pDC);};由于食物的随机出现,需要保证不和蛇身重合,所以我们需要调用蛇的信息,所以我们不妨把创建食物的函数也加入到snake类中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宿迁学院Windows程序设计课程考核报告班级: 11计本2班学号:姓名:得分:2013年12月20 日1. 设计目的及要求 ............................................................................. - 3 -1.1设计目的及问题描述 .............................................................. - 3 -1.2设计要求 .................................................................................. - 3 -1.3软件、硬件环境 ...................................................................... - 3 -2. 课程设计步骤 ................................................................................. - 3 -3. 课程设计内容 ................................................................................. - 4 -3.1 概要设计 ................................................................................. - 4 -3.1.1 程序总体框架描述 ....................................................... - 4 -3.1.2程序常用类声明和变量的声明 .................................... - 4 -3.2主要技术 .................................................................................. - 5 -3.3系统设计结果(界面截图、操作流程) ............................ - 5 -4.设计总结.......................................................................................... - 24 -4.1遇到的问题及如何解决 ........................................................ - 24 -4.2体会......................................................................................... - 24 -1.设计目的及要求1.1设计目的及问题描述贪吃蛇游戏经典,版本多样,娱乐性高,适合在闲暇时放松心神。
并且可在多个平台上实现,程序简单易懂,非常适合MFC初学者学习制作。
玩家通过按键上的上下左右四个键来控制蛇的方向移动,蛇头碰撞到食物则表示食物被蛇吃掉,这时蛇的身长长一节,接着出现食物,等待被蛇吃掉。
在吃食物的过程中,蛇的运行速度会越来越快,从而增加了游戏难度,具有挑战性。
如果蛇在移动过程中,撞到墙壁或者身体交叉蛇头撞到自己的身体游戏结束。
在贪吃蛇这款游戏设置和开发中,一方面考察了我们大一时候所学的C语言编程的算法运用,另一方面更是考察了我们大三这学期所学的在windows应用程序中编程的基础知识和MFC应用程序的基本知识,同时考察了我们面向对象程序设计的基本思路和方法的掌握情况。
1.2设计要求设计要求使用MFC基础类库,完成题目任选可以是小游戏、管理系统、通信软件等。
(题目需有一定规模)1、必须用到所学的控件、对话框、菜单、消息处理、视图框架、图形等大部分知识2、创建的项目名“姓名(拼音的首字母)”,需严格遵守,否则一定不及格。
3、若该程序涉及多个窗口则每个窗口对应的类名必须“姓名(拼音的首字母)”,需严格遵守,否则一定不及格。
1.3软件、硬件环境软件环境:Visual C++ 6.0、Microsoft Windows 7;硬件环境:笔记本电脑。
2.课程设计步骤1、系统用户需求贪吃蛇游戏以深入人心,版本多样,娱乐性高,适合大部分人在闲暇时放松心神。
2、需求分析我设计的贪吃蛇游戏是基于单文档设置的,所以在我创立ZYT这个工程之后会由软件自动生产五个大类(CAboutDlg、CMainFrame、CZYTApp、CZYTDoc、CZYTView).另外我在这款游戏设置中,我自己添加了如下几个十分重要的类:CBeanzyt:这个类是用来对贪吃蛇游戏中食物的出现和消失以及再出现进行设置;CGezyt:这个类是用来对贪吃蛇这款游戏中界面以及食物和蛇的设置进行编辑;CSnakezyt:这个类是用来对蛇的绘制以及运动进行编辑3、游戏设置功能设计首先绘制所选课题详细的流程图,根据游戏所要实现的过程把每一个过程的动作进行解析,并将其变成相应的变量;4、游戏功能的实现这个过程是在编程环境下实现的,通过我自己对整个程序的解析,一步一步的将各个过程实现的代码输入编程软件,通过反复的调试和运行进行程序的检验和最终功能的实现。
5、编写实验报告3. 课程设计内容3.1 概要设计3.1.1 程序总体框架描述3.1.2程序常用类声明和变量的声明3.2主要技术1、对于单文档设置界面大小功能的实现;2、对于单文档中Menu的菜单删除、添加功能的实现;3、对设置快捷键功能的实现;4、对于Bitmap制做功能的实现;5、代码的熟练运用。
3.3系统设计结果(界面截图、操作流程)1、打开VC++6.0,选中MFCAppWizard(exe),选路径如图:然后选择单文档,在高级选项中,将窗口样式厚边框和最大化边框的勾勾去掉。
2、在Menu中设置游戏快捷键,并在Accelerator中实现快捷功能,最后对快捷键建立类向导在OnStart()和OnPause()函数中添加如下代码:void CZYTView::OnStart(){// TODO: Add your command handler code herethis->m_start=true;SetTimer(1,200/m_speed,NULL);}void CZYTView::OnPause(){// TODO: Add your command handler code herestatic t=1;if(t%2==1){this->m_pause=true;}else{this->m_pause=false;}t++;}3、接下来新建4个位图BIPMAP,第一个IDB_BITMAP_zyt1用来设置游戏背景;第二个IDB_BITMAP_zyt2用来设置蛇的头;第三个IDB_BITMAP_zyt3用来设置蛇的身子;第四个IDB_BITMAP_zyt4用来设置豆。
IDB_BITMAP_zyt1IDB_BITMAP_zyt2IDB_BITMAP_zyt3 IDB_BITMAP_zyt44、OnDraw函数中将背景设置成一个个小方框,代码如下://画背景CDC dcMemory;dcMemory.CreateCompatibleDC(pDC);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP_zyt1);dcMemory.SelectObject(&bitmap);int i,j;for(i=0;i<=38;i++){for(j=0;j<=38;j++){pDC->StretchBlt(0+10*i,0+10*j,10,10,&dcMemory,0,0,48,48,SRCCOPY);}//边界线bitmap.Detach();CPen pen(PS_SOLID,1,RGB(0,0,0));CPen *pOldPen=pDC->SelectObject(&pen);pDC->MoveTo(0,390);pDC->LineTo(390,390);pDC->SelectObject(pOldPen);调整游戏界面窗口,并改名字cs.style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;cs.cx=400;cs.cy=480;cs.lpszName="周玉亭版贪吃蛇。
一定吃到豆噢!";5、画蛇首先插入一个类CGezytclass CGezyt{public:CGezyt();virtual ~CGezyt();public:int i;//小格所在的行数;int j;//小格所在的列数;};6、再插入一个CSnakezyt类,其代码如下:class CSnakezyt{public:CSnakezyt();virtual ~CSnakezyt();public:int n;//蛇身长度CGezyt body[200];//蛇身数组int direction;//蛇前进的方向,1代表向上,2代表向右,3代表向下,4代表向左public:CGezyt forwardUp(); //向上前进CGezyt forwardRight();//向右前进CGezyt forwardDown(); //向下前进CGezyt forwardLeft(); //向左前进};7、在CSnakezyt类CSnakezyt()构造函数中写出蛇上下左右四个运动是body数组是怎么变化的CGezyt CSnakezyt::forwardUp(){CGezyt ret=body[n-1];for(int i=n-1;i>=1;i--){body[i].i=body[i-1].i,body[i].j=body[i-1].j;}body[0].i--;return ret;}CGezyt CSnakezyt::forwardRight(){CGezyt ret=body[n-1];for(int i=n-1;i>=1;i--){body[i].i=body[i-1].i,body[i].j=body[i-1].j;}body[0].j++;return ret;}CGezyt CSnakezyt::forwardDown(){CGezyt ret=body[n-1];for(int i=n-1;i>=1;i--){body[i].i=body[i-1].i,body[i].j=body[i-1].j;}body[0].i++;return ret;}CGezyt CSnakezyt::forwardLeft(){CGezyt ret=body[n-1];for(int i=n-1;i>=1;i--){body[i].i=body[i-1].i,body[i].j=body[i-1].j;}body[0].j--;return ret;}8、在构造函数CViewZYT中初始化蛇this->m_start=false;this->m_pause=false;snake.n=4,snake.direction=2;snake.body[0].i=2,snake.body[0].j=5;snake.body[1].i=2,snake.body[1].j=4;snake.body[2].i=2,snake.body[2].j=3;snake.body[3].i=2,snake.body[3].j=2;9、在OnDraw函数中画蛇头和蛇身//画蛇头bitmap.LoadBitmap(IDB_BITMAP_zyt2);dcMemory.SelectObject(&bitmap);pDC->StretchBlt(0+10*snake.body[0].j,0+10*snake.body[0].i,10,10,&dcMemory,0,0,4 8,48,SRCCOPY);bitmap.Detach();//画蛇身bitmap.LoadBitmap(IDB_BITMAP_zyt3);dcMemory.SelectObject(&bitmap);for(i=1;i<snake.n;i++){pDC->StretchBlt(0+10*snake.body[i].j,0+10*snake.body[i].i,10,10,&dcMemory,0,0,48,48,S RCCOPY);}bitmap.Detach();10、在Onstart函数中设立一个计时器并在CylcView中添加计时函数OnTimer,其中的代码如下:if(this->m_start==true && this->m_pause==false){CGezyt tmp;CClientDC dc(this);CDC dcMemory;dcMemory.CreateCompatibleDC(&dc);CBitmap bitmap;switch(snake.direction){case 1:tmp=snake.forwardUp();break;case 2:tmp=snake.forwardRight();break;case 3:tmp=snake.forwardDown();break;case 4:tmp=snake.forwardLeft();break;}if(ZytGameLose()==true){m_marks=0;m_speed=1;m_start=false;MessageBox("亲,你怎么撞上了呢?!\n要再接再厉哟!");zytrestart();}if(ZytEatBean()==true){snake.n++;snake.body[snake.n-1].i=tmp.i;snake.body[snake.n-1].j=tmp.j;//初始化豆子unsigned seed=time(NULL);srand(seed);do{bean.i=rand()%24;bean.j=rand()%24;}while(ZytBeanInSnake()==true);bitmap.LoadBitmap(IDB_BITMAP_zyt4);dcMemory.SelectObject(&bitmap);dc.StretchBlt(0+10*bean.j,0+10*bean.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();//显示的得分COLORREF clr=dc.SetTextColor(dc.GetBkColor());dc.TextOut(100,400,m_string);m_marks+=100;CString m;m.Format("%d",m_marks);m_string="亲,您的得分是:"+m;dc.SetTextColor(clr);dc.TextOut(100,400,m_string);}bitmap.LoadBitmap(IDB_BITMAP_zyt1);dcMemory.SelectObject(&bitmap);dc.StretchBlt(0+10*tmp.j,0+10*tmp.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();//画蛇头bitmap.LoadBitmap(IDB_BITMAP_zyt2);dcMemory.SelectObject(&bitmap);dc.StretchBlt(0+10*snake.body[0].j,0+10*snake.body[0].i,10,10,&dcMemory,0,0,48,48,SRC COPY);bitmap.Detach();//画蛇身bitmap.LoadBitmap(IDB_BITMAP_zyt3);dcMemory.SelectObject(&bitmap);for(int i=1;i<snake.n;i++){dc.StretchBlt(0+10*snake.body[i].j,0+10*snake.body[i].i,10,10,&dcMemory,0,0,48,48,SRCCOPY);}bitmap.Detach();}CView::OnTimer(nIDEvent);}对上面代码中加粗的添加成员函数:添加ZytGameLose成员函数,其代码如下(撞上边框或撞上自己本身):bool CZYTView::ZytGameLose(){if(snake.body[0].i==-1 || snake.body[0].i==39 || snake.body[0].j==-1|| snake.body[0].j==39 || ZytHeadStrike()==true){return true;}else{return false;}}添加ZytHeadStrike成员函数,其代码如下:bool CZYTView::ZytHeadStrike(){bool flag=false;for(int i=1;i<snake.n;i++){if(snake.body[0].i==snake.body[i].i && snake.body[0].j==snake.body[i].j){flag=true;break;}}return flag;}添加ZytEatBean成员函数,其代码如下:bool CZYTView::ZytEatBean(){if(snake.body[0].i==bean.i && snake.body[0].j==bean.j){//this->m_marks+=100;return true;}else{return false;}}11、为了蛇会转弯移动,先添加KEYDOWN函数其代码如下:void CZYTView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call defaultif(nChar==VK_UP && snake.direction!=3){snake.direction=1;}if(nChar==VK_RIGHT && snake.direction!=4){snake.direction=2;}if(nChar==VK_DOWN && snake.direction!=1) {snake.direction=3;}if(nChar==VK_LEFT && snake.direction!=2){snake.direction=4;}CView::OnKeyDown(nChar, nRepCnt, nFlags); }12、下面对豆建立一个类其代码如下:class CBeanzyt{public:CBeanzyt();virtual ~CBeanzyt();public:int i;//豆子所在行int j;//豆子所在列};13、在CylcView构造函数中初始化豆子//初始化豆子srand(seed);do{bean.i=rand()%24;bean.j=rand()%24;}while(ZytBeanInSnake()==true);对上段代码中ZytBeanInSnake构造成员函数,其代码如下:bool CZYTView::ZytBeanInSnake(){bool flag=false;for(int i=0;i<snake.n;i++){if(bean.i==snake.body[i].i && bean.j==snake.body[i].j){flag=true;break;}}return flag;}14、在OnDraw函数中//画豆子bitmap.LoadBitmap(IDB_BITMAP_zyt4);dcMemory.SelectObject(&bitmap);pDC->StretchBlt(0+10*bean.j,0+10*bean.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();15、对游戏失败之后的游戏重启zytrestart进行设置,代码如下:void CZYTView::zytrestart(){//初始化蛇snake.n=4,snake.direction=2;snake.body[0].i=2,snake.body[0].j=5;snake.body[1].i=2,snake.body[1].j=4;snake.body[2].i=2,snake.body[2].j=3;snake.body[3].i=2,snake.body[3].j=2;//初始化豆子srand(seed);do{bean.i=rand()%24;bean.j=rand()%24;}while(ZytBeanInSnake()==true);Invalidate();}16、在界面上显示游戏分数代码如下(吃到一个豆就加100):在CZYTView()函数中添加如下代码:this->m_start=false;this->m_pause=false;this->m_speed=1;this->m_marks=0;CString m;m.Format("%d",m_marks);this->m_string="亲,您的得分是:"+m;在OnDraw函数中添加://显示分数pDC->TextOut(100,400,this->m_string);在OnTimer函数中添加://显示的得分COLORREF clr=dc.SetTextColor(dc.GetBkColor());dc.TextOut(100,400,m_string);m_marks+=100;CString m;m.Format("%d",m_marks);m_string="亲,您的得分是:"+m;dc.SetTextColor(clr);dc.TextOut(100,400,m_string);17、当游戏结束时分数变为0,在 zytrestart函数添加如下代码:this->m_marks=0;CString m;m.Format("%d",m_marks);this->m_string="您的得分是:"+m;当吃到5个豆以后速度加快:在OnTimer函数中添加如下代码:if(m_marks%500==0 && m_marks!=0)//如果分数是500的则速度加快{m_speed++;KillTimer(1);SetTimer(1,200/m_speed,NULL);}18、最后设置一下游戏的模式:在Menu中添加:建立成员函数:定义一个成员变量sign在CZYTView()函数中给sign赋初值sign=0; void CZYTView::OnLow(){// TODO: Add your command handler code heresign=1;}void CZYTView::OnHigh(){// TODO: Add your command handler code heresign=2;}在OnStart函数中添加如下代码:if(sign==1){this->m_start=true;SetTimer(1,200/m_speed,NULL);}if(sign==2){this->m_start=true;SetTimer(2,100/m_speed,NULL);}再将OnTimer函数中原来的速度加快模式改为如下:if(m_marks%500==0 && m_marks!=0)//如果分数是500的则速度加快{m_speed++;KillTimer(1);SetTimer(1,200/m_speed,NULL);KillTimer(2);SetTimer(2,100/m_speed,NULL);}运行结果:4.设计总结4.1遇到的问题及如何解决1、问题:有时候出现一些变量没有定义,例如error C2065: 'bean' : undeclaredidentifier、error C2228: left of '.i' must have class/struct/union type等原因:相关函数的头文件没有定义解决:在相关函数中定义头文件。