《DOS贪吃蛇程序设计思路及代码.docx》由会员分享,可在线阅读,更多相关《DOS贪吃蛇程序设计思路及代码.docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、DOS贪吃蛇程序设计思路及代码 游戏背景及设计原因 蛇引诱夏娃吃了苹果之后,就被贬为毒虫,成为阴险的象征。而蛇吃东西是整只动物吞进去的,很久以前(大概文艺复兴的时候)就有人发明了一种游戏,就是现在贪吃蛇的前身,后来慢慢的发展就变成了今天的贪吃蛇了一个很受欢迎、为人熟知、给很多人美好时光的经典小游戏。 贪吃蛇在我们曾经的岁月里留下了很多美好的记忆,也伴随我们走过了很长一段的人生路,对于贪吃蛇这个游戏有着特殊的感情,也一直很好奇这个游戏是怎么设计的,所以这次我们就选择了这个题目。一是弄清楚这个游戏的设计;二是学习程序的编辑过程和对编程的进一步深入了解。 程序结构图 程序流程图 程序设计及说明 1、
2、边墙(Wall) 该类规定游戏的范围大小。 2、蛇类(Snake) 用该类生成一个实例蛇snake。 3、移动(Move) 该类用于实现对蛇的操作控制,即蛇头方向的上下左右的移动操作。 4、食物类(Food) 该类是游戏过程中食物随机产生的控制和显示。 5、判断死亡(Dead) 该类是对游戏过程中判断玩家操作是否导致蛇的死亡,其中包括蛇头咬食自己身体和蛇头是否触及游戏“边墙”。 6、蛇结点(SnakeNode) 该类是蛇吃下随机产生的食物从而增加长度的控制类,其中包括蛇长度增加和尾部的变化。 7、计分统计(Score) 该类由于玩家的游戏成绩记录,及游戏结束时的得分输出。 . 部分函数及说明
3、1.Char menu(); /*用于玩家选择的游戏速度,返回一个char值*/ 2.DELAY(char ch1); /*用于控制游戏速度*/ 3.void drawmap(); /*绘制游戏地图函数* 4、void menu() /*游戏帮助信息的输出* . 部分类细节解说 1、蛇的构建Snake class Snake public: int xn; int yn; int node; /蛇身长度 int direction;/蛇运动方向 int life;/蛇生命,判断死亡 2、随机食物Food 利用rand()函数进行随机数产生,然后就行坐标定位void Food(void) . i
4、nt pos_x = 0; int pos_y = 0; pos_x = rand() % length;/x坐标的确定 pos_y = rand() % (width-1);/y坐标的确定. 3、蛇头方向确定 利用switch语句进行方向确定. switch() case VK_UP: OutChar2.Y-; y-; break; case VK_LEFT: OutChar2.Y+; y+; break; case VK_DOWN: OutChar2.X-; x-; break; case VK_RIGHT: OutChar2.X+; x+; break; 代码 #include #inc
5、lude #include #include #include using namespace std; int score=0,t=300,f=1;/得分与时间间隔/ms(控制贪吃蛇的速度)double ss=0,tt=0;/统计时间所用参数 class Node Node(): x(0), y(0), prior(0), next(0) int x; int y; Node *prior; Node *next; friend class Snake; ; class Snake public: Snake(); Snake(); void output(); void move(); v
6、oid change_point(char); private: Node *head; Node *tail; enum p UP, RIGHT, DOWN, LEFT point; /方向 int food_x, food_y; /食物的坐标 static const int N = 23; int gameNN; void add_head(int, int); /添加坐标为a,b的结点 void delete_tail(); /删除最后一个结点 void greate_food(); /产生食物 void gotoxy(int, int); ; void menu(); /游戏操作菜单
7、 int main() system(color a); /初始cmd窗口颜色为黑(背景)淡绿(文字) coutnext; delete temp; void Snake:add_head(int a, int b) Node *temp = new Node; temp-x = a; temp-y = b; if (NULL = head) /如果头结点为空,那么就将这个点设为头结点 head = tail = temp; else /否则添加到头结点的前面,作为新的头结点 head-prior = temp; temp-next = head; head = head-prior; /这里
8、head前移,使head一直指向头结点 gameab = 1; void Snake:delete_tail() Node *temp = tail; gametail-xtail-y = 0; /将该结点的坐标对应的值置为 tail = tail-prior; /tail尾结点前移,删除保存了原来尾结点的temp; tail-next = NULL; delete temp; int i, j; gotoxy(0, 0); coutx; int b = head-y; switch (point) case UP: -a; break; case DOWN: +a; break; case
9、RIGHT: +b; break; case LEFT: -b; break; if (1 = gameab & a != food_x & b != food_y) /碰到点了但不是食物那么死亡 this-Snake(); gameover(); if (a = food_x & b = food_y) /吃到食物了 add_head(a, b); score+=f; if(score%5=0&t0) t-=100; system(cls); if(score=15) coutnnnnnnn 太棒了,已经是最高时速了endl; else coutnnnnnnn 很不错,要加速了,请小心!en
10、dl; Sleep(3000);system(cls);menu();ss-=3; greate_food(); return; add_head(a, b); delete_tail(); void Snake:greate_food() srand(unsigned(time(0); do food_x = rand() % 21 + 1; /产生-21的随机数 food_y = rand() % 21 + 1; while (1 = gamefood_xfood_y); /对应的坐标已经有点存在就重新产生食物 gamefood_xfood_y = 1; /食物坐标对应的值赋为 void Snake:gotoxy(int x, int y) /定位光标 HANDLE hOutput; COORD loc; loc.X = x; loc.Y = y; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, loc);