文末有贪吃蛇代码全览,代码有十分粗疏的注释,文末有贪吃蛇代码全览,代码有十分粗疏的注释,文末有贪吃蛇代码全览,代码有十分粗疏的注释,码文不易,给个收费的小星星和收费的赞吧,关注也行呀,⑅•͈ᴗ•͈,.,*♡不要白嫖哇,⁍̥̥̥᷄д⁍̥̥̥᷅ू,伤心目录1课题剖析1.1钻研背景与现状1.2钻研意义与钻研步骤2设计概述2.1名...
文末有贪吃蛇代码全览,代码有十分粗疏的注释!!!
文末有贪吃蛇代码全览,代码有十分粗疏的注释!!!
文末有贪吃蛇代码全览,代码有十分粗疏的注释!!!
码文不易,给个收费的小星星和收费的赞吧,关注也行呀(⑅•͈ᴗ•͈).:*♡
不要白嫖哇(⁍̥̥̥᷄д⁍̥̥̥᷅ ू )伤心
目录
1 课题剖析
1.1钻研背景与现状
1.2钻研意义与钻研步骤
2 设计概述
2.1 名目详细内容
2.2 系统框图
2.2.1程序结构图
2.2.2游戏流程图
2.2.3检查规定界面流程图
2. 系统模块划分
3 详细设计说明
3.1 主菜单界面设计说明
3.1.1 设计说明
3.1.2 性能展现
3.2 检查规定界面设计说明
3.2.1 设计说明
3.2.2 性能展现
3.3 开局游戏界面设计说明
3.3.1 设计说明
3.3.2 性能展现
4 论断
1 课题剖析
1.1钻研背景与现状
随着计算机行业迅速开展,也涌现了多种抢手编程言语,作为经常使用十分宽泛的初级程序设计言语,C言语程序开发学习尤为关键,其绘图才干强,可移植性,具备弱小数据处置才干的特点,适于编写系统软件、图形和动画。
当今游戏成为时下比拟盛行的一种消遣形式,贪吃蛇这款游戏正好合乎公众心思,顺应人群宽泛,具备很强的文娱性和交互性,可以丰穷人们文娱期间。
贪吃蛇作为一款小游戏,运转便捷,易上手,游戏机制的抚慰性强,能引人入胜,爱不释手,且相较于大型游戏的长期间消耗,贪吃蛇对碎片化文娱期间更具备正当性,可以做到便捷易行,满足人们需求。
本文关键目的为钻研并设计C言语贪吃蛇游戏,应用EasyX Graphics Library收费绘图库成功游戏画面,函数设计与调用,制订游戏规定与运转机制,并在Windows控制台服务器输入画面,成功游戏运转。
1.2钻研意义与钻研步骤
钻研意义:
在快节拍社会中,人们期间愈加紧凑,文娱休闲期间也显得十分紧促,在大型游戏受众范畴广的状况下,轻游戏和快游戏更紧贴胃口,在碎片化期间里让用户失掉更满足的快节拍文娱体验。
经过贪吃蛇小游戏,人们不只可以在休闲期间文娱,还可以在游戏中记载自己的分数记载,在一次性次应战中优化自我,游戏的意图也是通知人们不时向前,打破自我,向着指标前行才干取得成功。同时,钻研C言语课程设计,编写贪吃蛇游戏,可以锻炼思想,相熟代码运用,无利于为未来名目开发积攒阅历,片面开展。
钻研步骤:
(1)设计: 游戏最关键的是界面显示设计,要思考游戏窗体大小,文字内容揭示,让用户在关上游戏环节中有良好的运转体验,明白每特性能的作用与游戏操作。其次是设计流利良好的键鼠操作,让玩家有更良好的交互反应。
(2)游戏程序测试是关键步骤。每参与一个游戏性能函数,就要对其启动实例测试,确保代码无报错、贪吃蛇运转环节无误、游戏界面无不良输入。并在键鼠交互保障其流利性和稳固性,为用户提供良好的游戏体验。
2 设计概述
2.1 名目详细内容
该名目经过C程序文语以及EasyX Graphics Library绘图库设计出贪吃蛇游戏程序。其中该名目关键分为三个界面,区分是主菜单界面,规定界面和开局游戏界面。
经过主菜单界面咱们可以进入开局游戏界面,经过鼠标交互点击按钮,即可开局游戏,游戏可实时计分。在检查规定界面可以看到贪吃蛇游戏规定设定,并检查游戏历史最高分。假构想分开游戏,便可在主菜单选用分开按钮完结程序运转。
2.2 系统框图
2.2.1程序结构图
贪吃蛇游戏程序关键由主菜单界面,游戏界面,规定界面和分开游戏界面造成如图2-1所示。
图2-1 程序结构图
2.2.2游戏流程图
游戏的主体由几个函数造成,区分为游戏初始化函数,画面显示函数,分数读写函数,交互函数,上方是游戏运转的流程图,如图2-2所示:
图2-2 游戏流程图
2.2.3检查规定界面流程图
检查规定界面由读取最高分、界面文字输入和鼠标按钮交互成功,定义结构体鼠标,判别其行为,假设不点击按钮,则处于规定界面不启动任何操作,如图2-3所示:
图2-3 规定界面流程图
2. 系统模块划分
课程名目设计中,贪吃蛇游戏关键分为三个界面,区分是菜单界面,规定界面和游戏主体界面。模块划分为主菜单模块、游戏初始化、画面显示、蛇移动模块、与键盘输入有关的降级(即键盘控制蛇的移动方向)、与输入有关的降级(移动速度控制),处罚机制、分数模块
在主菜单界面设计当中,咱们经过easyx图形库来设计出按钮的选项,并对界面着色,经过监控鼠标左键的行为及鼠标点击位置来判别用户所选用的按钮选项,以此成功交互,成功界面跳转
入选用“开局游戏”选项,则进入游戏开局函数,启动游戏的初始化和最高分读取,对蛇及画面启动初始化,然后进入循环,当不满足游戏的失败条件,界面就会不时降级绘图,确保游戏的继续启动
其中在贪吃蛇游戏的速度机制和处罚机制区分做了改良,速度可以同时满足长按方向键减速行进,并且吃的食物越多,速度越快;分数处罚机制则满足必定的阈值限定,每当吃的食物到达必定水平,分数会以倍数参与,提高处罚分。
在游戏失败结算界面中,咱们参与了分数显示,更直观地看到此局游戏中用户所得分数,而在分数模块,会启动txt文件读写操作,假设玩家分数大于最高分,则此局分数笼罩最高分。
3 详细设计说明
3.1 主菜单界面设计说明
3.1.1 设计说明
主菜单界面运用图形库的绘画性能,绘画出按钮矩形,并在按钮输入揭示文字,让玩家了解其性能作用,并经过while函数时辰监控鼠标信息,当鼠标左键单击时,再启动if判别语句,当合乎其中一个按钮的点击位置时,就进入该if语句中的函数,成功跳转性能
3.1.2 性能展现
主菜单界面如图3-1所示。
图3-1 主菜单界面
3.2 检查规定界面设计说明
3.2.1 设计说明
检查规定界面性能:在检查规定界面中,玩家可以了解规定事项以及游戏触及到的按键操作,同时在此界面显示最高分,让玩家有一个游戏指标,在了解关系规定后,玩家可以点击按钮前往主菜单,选用开局游戏或分开游戏。
详细成功:成功的界面展现与主菜单分歧,读取最高分则应用到编写的分数读写函数,把txt文件中的分数读取并显示于界面上
3.2.2 性能展现
检查规定界面如图3-2所示。
图3-2检查规定界面
3.3 开局游戏界面设计说明
3.3.1 设计说明
开局游戏界面性能:成功游戏的主体,绘画蛇、食物与游戏界面,键盘操作贪吃蛇移动吃食物,界面展现最高分,并随着进程启动,实时记载分数,当游戏完结时,弹出结算画面字样
详细成功:经过设置画布大小确定界面,并画横竖线把画布分为小方格,计算固定的像素值,把每个矩形方格都逐一对应方格数组。在游戏初始化时遍历该数组来绘画蛇以及食物,尔后每一次性画面降级,都会遍历数组刷新蛇的长度和食物位置。
实时记载分数则经过定义一个int变量,依据分数机制参与对应数值,然后转化成char类型存入字符数组,再将其输入至画面。
游戏结算界面则经过判别蛇头所处位置,让全局变量扭转数值,跳出游戏的循环,并输入相应文字。
3.3.2 性能展现
游戏界面如图3-3图3-4所示。
图3-3 游戏界面
图3-4 游戏结算界面
4 论断
经过一个学期的C言语课程的学习,我与我的组员对c言语有了更深一步的了解。从一开局的什么都不会,自己一点点缓缓的探索。发现书本上学到的物品还是很不够的,还有好多物品须要课外的学习。关于贪吃蛇,知道了它的成功原理,学会了对程序的模块设计、数据结构设计的便捷剖析。并经过源码剖析讲述了各个模块的成功方法。在几个模块的成功环节中浸透了局部图形性能函数。经过本文的编写环节 ,把握了以下几点常识点:
1.图形系统的初始化和封锁
2.各种画图函数的经常使用
3.结构体的定义
5.函数嵌套及调用
6.键盘操作
总的来说,编程还是一个很须要耐烦的上班,特意是有bug找不进去的时刻,特意须要我静下心来好好钻研。很多时刻都没有耐烦改下去了。这次学习对咱们组的耐烦是一个极大的磨砺,收获还是蛮多的,在这次课程设计中咱们坚固了C言语常识,学会了正当规范书写函数并正确调用,并且能够运用easyx参与拓展性内容,最关键的是发现了自己的无余之处。
咱们接上去会再接再厉,不时通常,不时打破自己,争取做出更好的作品。
附录:
贪吃蛇程序如下:
#include <graphics.h>
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <cstdio>#define Width 40 //宽40格
#define Height 30 //高30格
#define Size 20 //格子大小:20int blocks[Width][Height] = {0}; //用以表示一切方格
char moveDir; //表示静止方向
char oldmove; //旧的移动方向
int fx, fy; //food食物坐标
int addspeed = 15; //控制初始速度
int failure = 0; //用以判别游戏能否失败,失败赋值为 1
int score = 0; //记载分数
int max = 0; //记载最高分
int k = 1; //处罚机制初始值
char num[20]; //输入分数数组
char best[20]; //最高分数组 void initGame();
void show(); //图像绘制降级显示函数
void WithInput(); //与输入有关的降级
void WithoutInput(); //与输入有关的降级
void movesnake(); //蛇的移动函数
void readscore(); //读取分数
void writescore(); //写入分数
void ShowWord(); //界面文字
void drawmenu(); //主菜单
void gamestart(); //开局游戏
void seerule(); //检查规定
void back(); //分开游戏int main() { drawmenu();return 0;
} void initGame() { int i;initgraph(1000, 600); //①初始化绘图窗口,格子个数乘格子大小即为长度setbkcolor(CYAN); //设置背景颜色BeginBatchDraw(); //easyx中成功批绘图性能的函数,可以消弭图像闪动cleardevice(); //经常使用以后背风景清空绘图设施setlinecolor(WHITE); //划线颜色为红色for (i = Size; i < Width * Size+1; i += Size) { //用for循环绘制多条线line(i, 0, i, Height * Size); //竖线坐标从x1(i,0)-> y1(i,Height * Size)}for (i = Size; i < Height * Size; i += Size) {line(0, i, Width * Size, i); //横线坐标从x2(0,i) -> y2(Width * Size, i)}moveDir = oldmove = 'd'; //初始化自动蛇行进方向朝右blocks[Width / 2][Height / 2] = 1; /*正两边画蛇头,蛇为赋值的方格0则为空白区域*/for (i = 1; i < 4; i++) {blocks[Width / 2 - i][Height / 2] = i + 1; //y坐标不变,更改x坐标,在蛇头前方画蛇身}srand(time(0)); //srand函数发生一个期间种子,从而到达真正的随机成果fx = rand() % (Width - 1) + 1; //随机数除39取余并+1,则为食物所生成的格子x坐标fy = rand() % (Height - 1) + 1; //随机数除取余并+1,则为食物所生成的格子y坐标
} void show() { cleardevice();for (int i = 0; i < Width; i++) { //遍历一切方格,降级蛇的颜色for (int j = 1; j < Height; j++) {if (blocks[i][j] != 0) {setfillcolor(HSVtoRGB(blocks[i][j] * 10, 0.9, 1)); //HSV转RGB颜色,颜色H 0°->360°,此处设置每长一个蛇身,优化10°颜色,饱和度0.9,明度1}else{setfillcolor(CYAN); //否则降级为反常背景颜色}fillrectangle(i * Size, j * Size, (i + 1) * Size, (j + 1) * Size); //填充,(参数为左上角和右下角坐标)}}setfillcolor(LIGHTGREEN); //食物颜色fillrectangle(fx * Size, fy * Size, (fx + 1) * Size, (fy + 1) * Size);ShowWord();FlushBatchDraw(); /*BeginBatchDraw执行后,任何绘图操作都将临时不输入到绘图窗口上直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输入。*/
}void ShowWord() {if (failure) {settextcolor(LIGHTRED); //设置字体颜色settextstyle(80, 0, _T("宋体")); //设置字体样式setbkmode(TRANSPARENT);outtextxy(240, 220, "游戏失败");settextstyle(40, 0, _T("宋体"));sprintf(num, "%d", score); //将int转换为char并存入num中outtextxy(260, 360, "分数:"); //显示的字体及坐标outtextxy(380, 360, num);}else { //②settextcolor(BLACK); //设置分数颜色settextstyle(25, 0, _T("隶书")); //设置字体样式setbkmode(TRANSPARENT); //设置以后设施图案填充和文字输入时的背景形式,THANSPARENT为透明背景sprintf(num, "%d", score); //将int转换为char并存入num中outtextxy(860, 40, "分数:"); //显示的字体及坐标outtextxy(940, 42, num);outtextxy(845, 73, "最高分:");sprintf(best, "%d", max);outtextxy(940, 75, best);}
}
void readscore() { //③FILE* fpread = fopen("score.txt", "r"); //以只读的形式关上文件if (fpread == NULL) {return;}fscanf(fpread, "%d", &max);fclose(fpread);
}void writescore() {FILE* fpWrite = fopen("score.txt", "w"); //"w"关上并写入文本文件.(若不存在则新建,反之,则从头写,笼罩原内容)if (fpWrite == NULL) {return ;}fprintf(fpWrite, "%d", score);fclose(fpWrite);
}void WithInput() {if (_kbhit() && failure == 0) {//键盘输入控制蛇的方向char input = _getch();if (input == 'a' || input == 's' || input == 'd' || input == 'w') {moveDir = input;//设定规定:当向某一方向执行时,按下反向键不起作用(防止误触造成判别为咬到蛇身游戏失败),强迫将按下的反向键变为以后静止方向if (moveDir == 'a' && oldmove == 'd') {moveDir = 'd';}else if (moveDir == 's' && oldmove == 'w') {moveDir = 'w';}else if (moveDir == 'd' && oldmove == 'a') {moveDir = 'a';}else if (moveDir == 'w' && oldmove == 's') {moveDir = 's';}else {oldmove = input;}movesnake();}}
}void WithoutInput() {if (failure) { //先判别能否失败,失败则前往return;}//Sleep(100); //降级速度控制蛇的移动速度,但经常使用sleep会发生键盘控制与画面的提前,所以不经常使用//movesnake();static int speed = 1; //设置一个静态变量speed,应用循环特定次数来触发movesnake函数speed++;if (speed == addspeed) { //每15帧移动一次性,同时成功长按方向键放慢蛇的移动速度movesnake();speed = 1;}
}void movesnake() {int i, j;//对蛇启动降级,蛇每个格数值都+1,以便前面筹备一个数值为1的新蛇头,当吃到食物时,新蛇头扭转颜色参与蛇身中for (i = 0; i < Width; i++) {for (j = 0; j < Height; j++) {if (blocks[i][j] != 0) {blocks[i][j]++;}}}int oldhx, oldhy, oldtx, oldty; //旧蛇头和旧蛇尾的坐标int tailblock = 0;for (i = 0; i < Width; i++) {for (j = 0; j < Height; j++) {if (tailblock < blocks[i][j]) {tailblock = blocks[i][j]; //遍历找出最大值即为蛇尾oldtx = i;oldty = j;}if (blocks[i][j]==2) { //寻觅旧蛇头oldhx = i;oldhy = j;}}}//依据蛇的静止方向来赋值新蛇头的xy坐标int newhx = oldhx, newhy = oldhy; //定义新蛇头switch (moveDir) {case'a':newhx -= 1;break;case's':newhy += 1;break;case'd':newhx += 1;break;case'w':newhy -= 1;break;}//判别游戏能否失败if (newhx >= Width || newhx < 0 || newhy >= Height || newhy < 0 || blocks[newhx][newhy] != 0) {failure = 1;return;}//令蛇头方格值为1blocks[newhx][newhy] = 1;//对吃到食物以及蛇尾的处置 ⑤if (newhx == fx && newhy == fy) { //吃到食物,从新随机数生成新食物坐标score = score + k; //吃到食物分数+kif (score % 2 == 0) { //经过判别吃食物的数量来叠加处罚分k = k + 1;}if (score > max) { //与最高分判别,条件成立才干笼罩最高分writescore(); //写入最高分}//④if (score) { //“减速”判别,经过判别分数增大的取值,放慢蛇的静止速度,score不为0时进入该判别语句if (score % 2 == 0) { //便于测试结果显著,设置每吃2个食物,蛇速度放慢1帧addspeed--;}}fx = rand() % (Width - 1) + 1; fy = rand() % (Height - 1) + 1;}else{ //未吃到食物blocks[oldtx][oldty] = 0;}}void drawmenu() {MOUSEMSG m; //定义结构体鼠标minitgraph(600, 600); //定义画布大小setbkcolor(CYAN); //设置背景颜色cleardevice(); //经常使用以后背风景清空绘图设施,相似system(cls)的刷新setfillcolor(WHITE); //方框颜色fillrectangle(140, 50, 460, 170); //矩形左上角xy坐标和右下角xy坐标fillrectangle(120, 220, 480, 350); //矩形左上角xy坐标和右下角xy坐标fillrectangle(100, 400, 500, 540); //矩形左上角xy坐标和右下角xy坐标settextcolor(BLACK); //设置字体颜色settextstyle(50, 0, _T("楷体")); //设置字体魄式setbkmode(TRANSPARENT); //去除文字背景outtextxy(200, 85, "开局游戏"); //文字输上天位的xy坐标outtextxy(200, 260, "检查规定");outtextxy(200, 445, "分开游戏");while (1) {m = GetMouseMsg(); //失掉一个鼠标信息if (m.x >= 140 && m.x <= 460 && m.y >= 50 && m.y <= 170) { //判别鼠标点击的位置if (m.uMsg == WM_LBUTTONDOWN) { //当鼠标按下左键gamestart(); //开局游戏}}else if (m.x >= 120 && m.x <= 480 && m.y >= 220 && m.y <= 350) {if (m.uMsg == WM_LBUTTONDOWN) { //当鼠标按下左键seerule(); //检查规定}}else if (m.x >= 100 && m.x <= 500 && m.y >= 400 && m.y <= 540) {if (m.uMsg == WM_LBUTTONDOWN) { //当鼠标按下左键back(); //封锁菜单分开游戏}}}
}void gamestart() {readscore(); //读取最高分initGame(); //游戏初始化while (1) { //循环启动界面实时刷新,直至游戏判定失败show(); //界面显示WithoutInput(); //先调用与输入有关的降级WithInput(); }
}void seerule() {MOUSEMSG m; //定义结构体鼠标mreadscore(); //读取历史最高分initgraph(600, 600); //定义画布大小setbkcolor(CYAN); //设置背景颜色cleardevice(); //经常使用以后背风景清空绘图设施,相似system(cls)的刷新setfillcolor(WHITE); //方框颜色fillrectangle(100, 400, 500, 540); //矩形左上角xy坐标和右下角xy坐标settextcolor(BLACK); //设置字体颜色settextstyle(50, 0, _T("楷体")); //设置字体魄式setbkmode(TRANSPARENT); //去除文字背景outtextxy(200, 445, "前往菜单");settextcolor(BLACK); //设置字体颜色settextstyle(30, 0, _T("楷体")); //设置字体魄式setbkmode(TRANSPARENT); //去除文字背景outtextxy(45, 30, "WASD控制蛇移动,长按方向键可减速移动");outtextxy(45, 80, "碰到墙壁游戏失败");outtextxy(45, 130, "吃的食物越多,分数处罚越高");outtextxy(45, 180, "历史最高分:");sprintf(best, "%d", max);outtextxy(220, 180, best);while (1) {m = GetMouseMsg(); //失掉一个鼠标信息if (m.x >= 100 && m.x <= 500 && m.y >= 400 && m.y <= 540) {if (m.uMsg == WM_LBUTTONDOWN) { //当鼠标按下左键drawmenu(); //前往主菜单}}}
}void back() {closegraph(); //封锁画面exit(0); //分开程序
}
客服邮箱:kefu@itcaiji.cn
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!