C语言大作业报告——贪吃蛇游戏

合集下载

C语言实现贪吃蛇游戏

C语言实现贪吃蛇游戏

C语言实现贪吃蛇游戏.txt每天早上起床都要看一遍“福布斯”富翁排行榜,如果上面没有我的名字,我就去上班。

谈钱不伤感情,谈感情最他妈伤钱。

我诅咒你一辈子买方便面没有调料包。

/*===========================================================*程序名:贪吃蛇/*===========================================================*调用库:*----------------------*图形库graphics.h,随机库stdlib.h*===========================================================*/#include <graphics.h>#include <stdlib.h>/*===========================================================*宏定义:*----------------------*上、下、左、右、退出(ESC),暂停(PAUSE),确定(ENTER)*alive---蛇活着,dead---蛇死亡*no---食物不存在,yes---食物存在*N---蛇最大长度,达到200时游戏完成*===========================================================*/#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define SPACE 0x3920#define ENTER 0x1c0d#define alive 1#define dead 0#define yes 1#define no 0#define N 200/*===========================================================*自定义函数以及全局变量声明*---------------------------*Score---统计吃的食物个数;Speed_degree:控制蛇速度变量*===========================================================*/void make_full_screen();void start_screen();void menu();void wall_note();void play_game();void score();void game_over();void close_full_screen();void victory();void forum();void leave_or_again();void victory();int Score,Speed_degree;/*=========================================================== *自定义函数:make_full_screen()*---------------------------------*初始化图形界面*===========================================================*/ void make_full_screen(){int driver=DETECT,mode;registerbgidriver(EGAVGA_driver);initgraph(&driver,&mode,"");cleardevice();}/*=========================================================== *自定义函数:start_screen()*------------------------------*贪吃蛇游戏的欢迎界面*===========================================================*/ void start_screen(){int i,p,color=9;settextstyle(0,0,2);setcolor(GREEN);outtextxy(150,400,"Press any key to loading...");setcolor(YELLOW);outtextxy(200,450,"Deviser:caolvchong");forum();while(bioskey(1)==0) /*当没有按键时显示snake*/{settextstyle(0,0,6);for(i=9;i<15;i++){color++;if(color>=14) color=9;setcolor(color);outtextxy(200,200,"SNAKE");for(p=1;p<3;p++)delay(50000);}}bioskey(0);/*返回键盘值,不然按下的扫描码将被后面检测按键函数接收*/ cleardevice();/*清屏*/}/*===========================================================*自定义函数:menu()*------------------------------*贪吃蛇游戏的菜单界面*===========================================================*/void menu(){int j=100,k=j,n,key,tag=1;char *char_up=NULL,*char_down=NULL;/*----------------------------------------------*参数说明:*j:作为显示选择条(bar)的位置参数*k: 作为清除选择条的位置参数*key:接收按键参数*tag:跳出menu()函数的标签,触发条件按下enter**char_up,*char_down接收ASCII码的24(↑)和25(↓)*----------------------------------------------*/setcolor(RED);settextstyle(0,0,2);outtextxy(15,15,"choose a level");setcolor(LIGHTBLUE);settextstyle(0,0,3);outtextxy(15,100,"Easy");outtextxy(15,150,"Normal");outtextxy(15,200,"Hard");setcolor(GREEN);settextstyle(0,0,2);sprintf(char_up,"%c",24);outtextxy(150,350,char_up);sprintf(char_down,"%c",25);outtextxy(210,350,char_down);outtextxy(170,350,"or ");outtextxy(230,350,"to select");outtextxy(150,380,"ENTER to play");outtextxy(150,410,"ESC to exit");setfillstyle(2,YELLOW);bar(190,j,215,j+25);forum();while(tag!=0){setfillstyle(1,BLACK);bar(190,k,215,k+25);setfillstyle(2,YELLOW);bar(190,j,215,j+25);key=bioskey(0);switch(key){case DOWN: k=j;if(j<200) j+=50;break;case UP: k=j;if(j>100) j-=50;break;case ENTER: tag=0;break;case ESC: close_full_screen(); /*退出*/}switch(j){case 100:Speed_degree=12;break;case 150:Speed_degree=8;break;case 200:Speed_degree=4;break; /*对应各等级的速度延迟循环次数*/ }}}/*===========================================================*自定义函数:wall_note()*------------------------------*贪吃蛇游戏的围墙,就是蛇的活动范围*以及游戏中提示按键:ESC--退出;SPACE--暂停*===========================================================*/void wall_note(){cleardevice();setlinestyle(0,0,3);setcolor(LIGHTRED);rectangle(47,57,603,453);setfillstyle(1,LIGHTGREEN);bar(55,10,600,40);settextstyle(0,0,3);setcolor(RED);outtextxy(58,15,"ESC:exit");outtextxy(305,15,"SPACE:pause");forum();}/*=========================================================== *自定义函数:play_game()*------------------------------*具体的游戏过程*===========================================================*/ void play_game(){struct{int x[N];int y[N];int block;int life;int direction;}snake;struct{int x;int y;int exist;}food;int i,key;/*---------------------------------*参数说明:*结构体snake.[x],snake.[y]为蛇身体坐标*snake.block蛇的节数;snake.life蛇生命参数*snake.direction蛇的运动方向*--------------*结构体food.x,food.y为食物坐标*food.exist食物存在参数*-------------*i:一些循环控制参量*key:接收键盘按键参量*----------------------------------*/randomize();/*初始化随机库*/snake.x[0]=100;snake.y[0]=100;snake.direction=RIGHT;snake.life=alive;snake.block=3;food.exist=no;score();/*初始分数*//*-----------------------------------*初始化:*蛇的头部位置,运动方向向右,生命活着*节数为3,食物开始不存在,初始化分数显示为0*-----------------------------------*/for(;;)/* 循环,作用于下面while(!kbhit),按键后重新开始* while(!hkbit)循环,并对按键分析,实现上下左右*以及退出暂停的检测*/{while(!kbhit())/*没有按键时,实现对食物是否存在的判断,对于不存*在时产生食物,并画出;*对蛇移动的处理:自动向前移动,对接收来的上下左*右的处理,对蛇运动过程是否导致死亡判断,对蛇身*体变长以及画出蛇的处理*对分数的处理:显示分数,对是否完全200个进行判断*/{if(food.exist==no)/*没有食物时,随机出现食物*/{food.x=random(531)+60;food.y=random(381)+60;/*随机出现食物,确保食物在蛇的活动范围内*/while(food.x%10!=0) food.x++;while(food.y%10!=0) food.y++;/*确保食物在屏幕坐标10的正数倍,这样才能被蛇吃到*/ food.exist=yes;/*食物存在了*/for(i=0;i<snake.block;i++)if(food.x==snake.x&&food.y==snake.y){food.exist=no;break;}/*如果食物在蛇的身体内,重新产生食物*/}setlinestyle(0,0,1);setcolor(RED);rectangle(food.x,food.y,food.x+10,food.y+10);/*画出食物*/for(i=snake.block-1;i>0;i--){snake.x=snake.x[i-1];snake.y=snake.y[i-1];}/*蛇身体后面一格变前面一格,实现蛇移动的原理*/switch(snake.direction){case RIGHT: snake.x[0]+=10;break;case LEFT: snake.x[0]-=10;break;case UP: snake.y[0]-=10;break;case DOWN: snake.y[0]+=10;break;}/*蛇上下左右移动的处理*/for(i=4;i<snake.block;i++)if(snake.x==snake.x[0]&&snake.y==snake.y[0]){snake.life=dead;break;}/*对蛇是否碰到自己的判断,碰到自己,蛇死*/if(snake.x[0]<48||snake.x[0]>597||snake.y[0]<53||snake.y[0]>447) snake.life=dead; /*碰到墙,蛇死*/if(snake.life==dead){game_over();break;}/*如果蛇死的话,显示游戏结束,退出while(!hkbit())循环*/if(food.x==snake.x[0]&&food.y==snake.y[0])/*食物被吃*/{setcolor(BLACK);rectangle(food.x,food.y,food.x+10,food.y+10);/*把食物去掉*/ snake.block++;/*蛇身增加*/Score++; /*分数增加*/score();/*统计显示分数*/victory();/*吃到食物200个显示完成游戏*/food.exist=no;/*食物被吃,食物就不存在了*/}setcolor(LIGHTBLUE);for(i=1;i<snake.block;i++){setlinestyle(0,0,1);rectangle(snake.x,snake.y,snake.x+10,snake.y+10);}/*画蛇*/setcolor(YELLOW);rectangle(snake.x[0],snake.y[0],snake.x[0]+10,snake.y[0]+10);/*设置蛇的头部*/snake.x[snake.block]=-100;snake.y[snake.block]=-100;for(i=0;i<Speed_degree;i++)delay(10000);setcolor(BLACK);rectangle(snake.x[snake.block-1],snake.y[snake.block-1],snake.x[snake.block-1]+10,snake.y[snake.block-1]+10);/*去掉蛇的最后一节*/}key=bioskey(0);/*等待按键*/if(key==SPACE) bioskey(0);/*暂停*/else if(key==ESC) closegraph();/*结束游戏*/else if(key==RIGHT&&snake.direction!=LEFT) snake.direction=RIGHT; else if(key==UP&&snake.direction!=DOWN) snake.direction=UP;else if(key==LEFT&&snake.direction!=RIGHT) snake.direction=LEFT; else if(key==DOWN&&snake.direction!=UP) snake.direction=DOWN; if(snake.life==dead) break;}}/*===========================================================*自定义函数:score()*------------------------------*统计显示分数*===========================================================*/void score(){char *str=NULL;setfillstyle(0,BLACK);bar(250,460,405,490);setcolor(LIGHTGREEN);settextstyle(0,0,2);sprintf(str,"Score:%d",Score);outtextxy(255,460,str);}/*=========================================================== *自定义函数:victory()*------------------------------*吃到食物200个,完成游戏*===========================================================*/ void victory(){if(Score==200){cleardevice();setcolor(YELLOW);settextstyle(0,0,6);outtextxy(100,200,"Victory!");forum();leave_or_again();}}/*=========================================================== *自定义函数:game_over()*------------------------------*显示游戏结束,选择继续游戏还是离开*===========================================================*/ void game_over(){cleardevice();score();setcolor(RED);settextstyle(0,0,6);outtextxy(100,200,"Game Over");forum();leave_or_again();}/*=========================================================== *自定义函数:leave_or_again()*------------------------------*离开还是重新游戏选择*至于菜单条的设计与前面menu()类似*===========================================================*/void leave_or_again(){int j=300,k,key,tag=1;while(tag!=0){setcolor(BLUE);settextstyle(0,0,3);outtextxy(150,300,"Leave");outtextxy(150,350,"Again");setfillstyle(1,BLACK);bar(330,k,355,k+25);setfillstyle(2,YELLOW);bar(330,j,355,j+25);key=bioskey(0);switch(key){case DOWN: k=j;if(j<350) j+=50;break;case UP: k=j;if(j>300) j-=50;break;case ENTER: tag=0;break;}}switch(j){case 300:close_full_screen();case 350:cleardevice();Score=0;menu();wall_note();play_game();break;}}*===========================================================*自定义函数:close_full_screen()*------------------------------*关闭图形界面*===========================================================*/ void close_full_screen(){cleardevice();closegraph();}/*=========================================================== *主函数:*------------------------------*调用图形界面--->开始欢迎界面--->菜单界面*--->画围墙--->游戏过程--->结束图形界面*===========================================================*/ main(){make_full_screen();start_screen();menu();wall_note();play_game();close_full_screen();}/*============================END============================*/。

2021年C语言贪吃蛇实验报告

2021年C语言贪吃蛇实验报告

C语言程序设计汇报题目: 贪吃蛇游戏程序设计院系: 西语学院英语教育6班姓名:学号:1.1题目:设计贪吃蛇小游戏1.2 题目要求:玩家经过键盘控制蛇在地图上寻求食物, 蛇吃下食物, 能够加分, 碰到四壁游戏结束。

1.3设计步骤:●分析设计题目要求, 即需求分析。

●总体设计, 确定所需模块及模块间调用关系, 定义系统中使用数据类型。

●具体设计, 确定每个模块功效, 绘制关键函数步骤图。

●编写程序代码, 调试程序使其能正确运行。

要求书写规范, 注意采取缩进格式。

函数名、变量名要见文晓意, 注释要简而不失、详而不缀。

设计完成软件要便于操作和使用。

●程序测试, 发觉程序中存在错误并更正。

●完成汇报。

2具体设计说明2.1课程设计要求:经过游戏程序设计, 提升编程爱好与编程思绪, 巩固C语言中所学知识, 合理利用资料, 实现理论与实际相结合。

●搜集资料, 分析课题, 分解问题, 形成总体设计思绪;●对于设计中用到关键函数, 要学会经过查资料, 弄懂其使用方法, 要联络问题进行具体介绍;●上机调试, 查错, 逐步分析不能正常运行原因, 确保所设计程序正确, 而且能正常运行;完成课程设计汇报。

2.2程序功效:贪吃蛇游戏是一个经典小游戏, 一条蛇在封闭围墙里, 围墙里出现一个食物, 经过按键盘四个光标键控制蛇向上下左右四个方向移动, 蛇头撞倒食物, 则食物被吃掉, 蛇身体长一节, 同时记10分, 接着又出现食物, 等候蛇来吃, 假如蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

2.3课程设计思想:程序关键在于表示蛇图形及蛇移动。

用一个小圆点来表示蛇一节身体, 身体每长一节, 增加一个圆点, 蛇头用四节来表示。

移动时必需从蛇头开始, 所以蛇不能向相反方向移动, 假如不按任意键, 蛇自行在目前方向上前移, 假如按与蛇运动方向相反方向键, 此游戏就会暂停, 再按想前方向键才能继续游戏, 但按下有效方向键后, 蛇头朝着该方向移动, 一步移动一节身体, 所以按下有效方向键后, 先确定蛇头位置, 以后蛇身体随蛇头移动, 图形实现是从蛇头新位置开始画出蛇, 这时, 因为未清屏原因, 原来蛇位置和新蛇位置差一个单位, 所以看起来蛇多一节身体, 所以将蛇最终一节用背景色覆盖。

C语言课程设计报告——贪吃蛇源程序

C语言课程设计报告——贪吃蛇源程序

C 语止课程安排之阳早格格创做(小游戏贪吃蛇的步调安排报告)安排人:班级:201年月号目录一:概括1:钻研背景及意思2:安排的任务与需要知识面3:简曲完毕安排真量二:需要领会1:功能需要2:支配要领三:总体安排1:模块区分2:数据结构安排四:仔细安排1:主空摸块安排2:画造游戏界里3:游戏的简曲历程4:游戏的中断处理5:隐现排止榜疑息模块五:步调的调试与尝试1:动画与音乐共步2:蛇的运止3:末止步调六:论断七::中断语八:步调浑单九:参照文献一.概括本课程安排以硬件工程要领为指挥,采与了结构化,模块化的步调安排要领,以C谈话技能为前提,使用TurboC++3.0为主要启垦工具,对付贪吃蛇游戏举止了需要领会,总体安排,仔细安排,最后完毕系统的真止与尝试.1.1 钻研的背景及意思随着社会的死少,人们死计的节奏日益加快,越去越多的人加进了寰球化的天下.人们不再拘泥与一小块天天,加班,出好成了新颖人不可预防的公务.而此时一款不妨随时随天娱乐的游戏成为了人们的需要.此次课程安排完毕的贪吃蛇小游戏,正是为了谦脚上述需要而安排出去的.贪吃蛇游戏虽小,却安排诸多的知识面.通过启垦贪吃蛇游戏系统,可使读者收端相识使用硬件工程的战那个收,技能战工具启垦硬件的历程,进一步掌握结构化,模块化的步调安排要领战步调,进一步掌握总体数据结构安排,模块区分要领,掌握局部变量,齐部变量,结构体,共用体,数组,指针,文献等数据结构的使用要领,掌握图形,声音,随机数等多种库函数的使用要领,教习动画,音乐,窗心,菜单,键盘等多项编程技能,进一步教会硬件调试,尝试,组拆等硬件尝试要领,为后绝课程的教习战将去本量硬件启垦挨下脆真的前提.1.2 安排的任务战需要的知识面1.2.1 课程安排主要完毕的任务1).通过编写“贪吃蛇游戏”步调,掌握结构化,模块块化步调安排的思维,培植办理本量问题的本领.2) 有共步播搁动画,声音效验.3) 安排佳数组元素与蛇,食物的对付应关系.4) 随机爆收食物.5) 有分数统计,排止榜,分数保存等功能.通过此次课程安排,期视使读者能更深进的明黑战掌握课程教教中的基础观念,培植读者应用基础技能办理本量问题的本领,进而进一步普及领会问题妥协决问题的本领.1.2.3本次课程安排需要掌握战使用如下的知识面:1) 数组的应用.2) 齐部变量的使用.3) 按键处理.4)结构体的应用.5)图形,音乐战动画的有关知识.6)随即函数的使用.7)文献的基础出支配.8) 结构化,模块化的安排要领.正在本次课程安排中需要完毕的任务有:包罗下令,齐部变量的定义战宏定义,函数声明等(50止),主控模块(MAIN函数,14止),动画,音乐播搁模块(DRAWSNOW函数,33止),画出游戏启初界里模块,简曲游戏历程模块,游戏中断处理模块.启垦中处事量约为215止源代码.二 .需要领会贪吃蛇游戏是个简朴的小游戏,能让游戏者的身心得到娱乐,进而不妨更佳天加进到教习或者处事核心.虽然目前市里上出去那百般百般的游戏版本,但是贪吃蛇那类的小游戏其商场仍旧相称大的,果为它玩法简朴易止,不管是脚机,仍旧小游戏机,皆能很成功的运止.对付于正在中闲碌的人,不可能耗费洪量时间正在娱乐上,庞大游戏是止短亨的,那样的小游戏刚刚佳迎合了他们的需要.要启垦贪吃蛇游戏步调,最先要领会改步调应真止哪些功能.对付贪吃蛇游戏步调的功能需要可形貌如下:步调运止后隐现动画,音乐,按ESC 键退出游戏界里后,左边有一个矩形区,中游戏天区,正在矩形区中有食物战贪食蛇,上圆有统计分数及关数隐现天区.蛇正在启关围墙利用绿色矩形表示,围墙里随机的出现一个食物,通过按键盘四个光标键统造蛇进与,下,安排四个目标移动,蛇头碰到食物,则食物被吃掉,蛇身体少一节,接着又出现食物,等待蛇去吃.食物用一个面表示,而且屡屡食物的位子皆是随机出现的.游戏中要使贪吃蛇尽大概的少,然而是不克不迭使贪吃蛇碰到四里的墙壁,而且蛇的身体不克不迭碰到所有,可则游戏中断.游戏中每吃掉一个食物要有积分,随着分数的减少可加进下一关,纵然速度会加快.游戏中断时,如果分数加进前5名则沉新排榜并保存.隐现排止榜.由于有关贪吃蛇战食物的数据较多,而且关系稀切,贪吃蛇及食物皆是定义结构体数据典型,那样定义便于支配与处理.2.2 支配要领三 总体安排决定贪吃蛇游戏体捆绑构,给出总体模块结构图,决定步调的主要函数及之间的调用关系,共时安排蛇与游戏者等的数据结构.3.1 模块区分本步调采与结构化步调安排的要领,依照自顶背下,逐步细化的要领对付要办理的问题举止逐层领会.最先画出顶层模块,即主控模块,之完毕对付下层模块的调用功能,即调用其余的功能模块;接着,按需要领会中的功能需要安排第一层模块,有音乐动画,图形启动,画主界里,游戏历程,中断处理,退出品级6个主要功能;接着,画出第二层模块.总体模块结构如图6-1所示.3.1.1. 主控模块. 3.1.2. 动画音乐模块 3.1.3. 画主界里模块 3.1.4. 游戏历程模块 3.1.5. 游戏中断处理模块 3.1.6. 读与记录模块 3.1.7. 结果排序模块 3.1.8. 写进文献模块 3.1.9. 排止榜模块 3.1.10. 退出3.2 总体数据结构安排安排思路:测序的关键正在于表示蛇的图形及蛇的移动.用一个小限造性圆块表示蛇的一节主 控 模 板 读与记录结果排序写进文献排止榜动画音乐图形启动退出中断处理 游戏历程画主界里身体,身体每少一节,减少一个矩形块,蛇头业用共样的一节小矩形圆块表示移动时必须从蛇不妨上背前爬止,档案下灵验目标键后,应先决定蛇头的位子,而后蛇的身体虽蛇头移动,图形的真止是从身体新位子启初画出蛇.那时,由于已浑屏的本果,本去的蛇的位子战新蛇的位子好一节蛇身,即瞅起去蛇多一节身体,所以将蛇的末尾一节用背景致覆盖.食物的出现与消得意识画矩形块战覆盖矩形块.为了便于明黑,定义二个结构体:食物与蛇.底下介绍贪吃蛇游戏步调的主要数据结构.3.2.1 食物与蛇的数据结构表示食物与蛇的矩形块安排为10*10个像素单位,食物的基础数据域为它所出现的位子,用X战Y坐标表示,则矩形块用函数RECTANGLE(X,Y,X+10,Y+10)或者RECTANGLE(X,Y,X+10,Y-10)不妨画出.由于屡屡只出现一个食物,所以设定YES表示是可需要出现食物.YES=1表示不食物或者食物已经被蛇吃掉,需要画出食物.搁置食物后,置YES=0.蛇的一节身体为一个矩形块,表示矩形块只需左上角面坐标(X,Y).由于正在游戏历程中蛇的身体不竭删少,需用数组存搁每节坐标,最大设定为N=200,NODE表示目前节数.DIRECTION是保存蛇的移动目标的变量,其值可为1、2、3、4之一,分别表示左、左、上、下的目标.LIFE是表示死命的变量,LIFE=0表示蛇活着,一朝LIFE=1,一朝LIFE=1,表示蛇死,中断游戏.#define N 200Struct Food{ int x;int y;Int yes;}food;Struct Snake{ int x[N];Int y[N];Int node;Int derection;Int life;}snake;3.2.2 排止榜中劣胜者的数据结构排止榜主要记录劣胜者的姓名战结果.为了存搁排止榜疑息,可定义如下的结构体典型,其中字符数组name成员存搁劣胜者的姓名,整型变量score成员存搁劣胜者的结果.Struct person{ char name[20];Int score;};3.2.3 其余齐部变量的定义Struct person per[5];Int score=0;Int gamespeed=400;3.2.4 标记常量的宏定义#define LEFT 0x4b00;#define RIGHT 0x4d00;#define DOWN 0x5000;#define UP 0x4800#define ESC 0x011b#define FILENAME四. 仔细安排根据总体安排的模块功能战结构,完毕所负担的步调模块的算法安排.给出每个模块的仔细的算法,算法分别用保守过程图战笔墨证明去形貌.4.1 主控模块main函数主函数是步调的主控模块.最先初初化图形系统,而后使用drawsnow函数播搁动画战声音,接着调用init函数初初化图形系统,之后调用drawk函数画出游戏启初画里,正在调用g ameplay函数,即启初了游戏的简曲历程,游戏中断后调用endplay函数举止游戏中断处理;从文献中读与记录疑息,排序,隐现排止榜疑息,末尾关关图形系统,中断步调.主控模块的过程图如图6-2所示.其中戴有二个横线的矩形框表示对付自定义函数的调用.4.2函数主界里便是一个启关的围墙,用二个循环语句分别正在火仄目标战笔曲目标输出连绝的宽度战下的均为10个像素单位的距止小圆块,围成启关图形表示围墙,为了醉目,树坐为浓青色,用函数setlinestyle设曲线型宽度为3个像素,树坐3个像素的围墙线,.末尾,正在界里的左上部输出游戏步调的版本疑息,正在左上部输出游戏结果(score)战关(level)的表头.4.3 游戏简曲历程gameplay函数该函数是游戏的核心部分.游戏简曲历程gameplay函数的大概算法过程图如图6-4所示.余下过程图正在下页4.3.1那24.3.21 0个4.3.3那里的易面是表示蛇的新位子并与消前一次的图形.采与的要领是屡屡移动的时间从末尾一节启初到第二节,将前一节的坐标值赋给后一节的坐标,移动后只消把末尾一节用背景致揩出即可,果为新位子0到n-1节仍旧要出目前画里上的.那里用一个for循环去决定蛇身的新坐标.4.3.4 吃到食物后的处理蛇吃到食物后,最先将食物揩除,即用背景致画出该食物,而后给蛇的节数加1,树坐需要食物标记,是游戏结果加10分,如果结果达到50分的倍数,则给关数加1,并加快游戏速度.4.3.5 有按键推断蛇的目标那是一个内嵌的嵌套的条件采用结构,根据安东上下安排键去设定蛇的移动目标.其中1=背左,2=背左,3=进与,4=背下.推断是还思量好异的目标键无效,比圆蛇正正在进与爬止,按下一键目标是无效的.4.4 游戏的中断处理木块ENDPLAY函数游戏中断时,该当用ENDPLAY函数举止游戏中断处理,其算法过程图如图6-5所示I 其次,推断游戏者的结果是可不妨上排止榜.如果不妨上榜,则画出浓蓝色矩形界里,正在界里中输进游戏者姓名,对付结果举止赋值,而后调用CompareScore 函数对付记录排序,并调用Writefiles 函数将记录写进排止榜助文献;如果不克不迭上榜,则间接正在游戏界里输出不克不迭上榜疑息.末尾,调用 pain_board 函数隐现排止榜疑息.函数void pain_board完毕排止榜的画造.五. 步调的调试与尝试调试与尝试硬件的目标便是创造并改正潜伏的过得.一个步调,必须通过认果然调试战尝试,才搞尽管缩小过得、包管步调谦脚功能、本能需要,达到最初的安排、使用央供,进而包管步调的启垦品量.仔细安排完毕后,便不妨用C谈话根据各个模块的算法去安排步调,每个模块皆要安排成一个自定义函数.几个模块不妨搁正在所有形成一个本函数步调文献,也不妨一个模块形成一个源步调文献.本步调安排佳后,输进到估计机中,并保存到磁盘上;而后对付每个源步调文献皆举止了独力编译战调试(简曲代码不妨参瞅步调浑单);并针对付分歧的模块步调安排尝试用例举止单元尝试;末尾,将几个分别启垦的模块组拆正在所有,产死一个完备的步调,举止集成尝试,进而创造并改正了步调步调中存留的一些潜躲的过得,并使步调的容错本领大大巩固.5.1 动画与音乐的共步播搁预期截止:①片头正在隐现动画得共时播搁音乐;②按任性键后加进游戏主界里;③加进游戏主界里后动画音乐共时停止.本量运止效验:谦脚①战②,不谦脚③,即加进游戏后仍旧播搁片头音乐.过得领会:步调中使用循环播搁动画,并正在其循环体中拔出收声函数以达到音乐战动画的共步.由于正在中断动画时不关关扬声器,所以加进游戏界里后仍旧收声.建改:正在动画播搁完后加一条“nosound();”语句将扬声器关关,问题得到办理. 建改后步调运止的本量效验与预期效验普遍.5.2 蛇的运止5.2.1 蛇碰到墙预期截止:蛇运止时如果碰到墙壁,则游戏中断.本量运效验:超出安排墙壁后步调中断,然而超出上头墙壁后仍旧运止,如图6-9所示.过得领会:过得步调段正在蛇运止中的条件推断语句中,其推断条件是:if(snake.x[0]<55|| snake.x[0]>595),即少了上、下二个目标的推断.建改:正在蛇的运止历程中增加二个逻辑表黑式,推断蛇是可闯到上下的围墙.代码:If( snake.x[0]<55|| snake.x[0]>595|| snake.y[0]<55|| snake.y[0]>455)建改后的步调运止截止与预期的截止普遍.5.2.2 蛇头闯到蛇身预期的截止:当蛇得头部与蛇身相碰时,游戏应核心断. 本量运止效验:蛇头碰到蛇身时,步调本去不末止.过得领会:正在蛇的运止推断的步调堕落,其代码如下Fori=3;i<snake.node;i++){ if(snake.x[i]=snake.x[0]&&snake.y[i]=snake.y[0]){snake.life=0;break;}}建改:将循环体中的snake.life=0改为snake.life=1;建改后的截止与预期截止普遍.5.3 末止循环通过对付各个模块的调试战单元尝试并建改了过得后,将各个模块组拆成一个系统,并举止集成尝试.正在集成的历程中创造了一些过得,比圆齐部变量沉复定义、函数沉复声明等,分别举止了改正.末尾连绝运止了5次,以便尝试该游戏步调的功能、本能是可达到了预期的目标,并根据所使用的简曲呆板对付蛇的爬止速度举止适合的安排.尝试真量包罗蛇的运止、分数、关数、排止榜及排序、文献保存、音乐动画等功能,情况均仄常.六. 论断通过2周的课程安排,正在启垦小组共共的齐力下,毕竟完毕了贪吃蛇游戏步调的启垦任务.该游戏步调真止了用目标键统造蛇正在围墙内爬止、随机爆收食物、统造蛇吃掉食物并加分、统造游戏中闯关的数目战蛇的运止速度、真时隐现得分战关数、中断时处理战隐现排止榜等功能.该游戏步调具备界里友佳、支配便当、统造准确战容错本领强等特性.那个贪吃蛇游戏还存留一些缺陷,还该当正在如下几个圆里加以矫正.1)加进游戏后,到蛇牺牲,只可玩一次便会退出步调.应加进多次游戏的统造本领.2)蛇的格式不好瞅,应将蛇头、蛇尾战蛇身进一步好化,使其更像真正在的蛇.3)当分数达到400分时,蛇的速度变得非常快,一下子便碰到围墙上了,应适合统造蛇的速度战关数,以便使游戏更具备吸引力.贪吃蛇游戏的编程训练思索数据结构:定义食物的坐标去统造它出现的位子,用一系列的函数时举止表示,比圆用函数rectangle去画出矩形,用life变量的值表示蛇的死命,用direction变量的值表示蛇移动的目标等,另有用数组去存搁蛇身各节的坐标,那些皆让咱们认识了对付数组的支配,别的还认识了百般函数的应用.贪吃蛇的安排有很多助闲,教习编写贪吃蛇的游戏对付掌握C谈话的知识有很大的助闲.通过编程试验,还能拓展思路,让咱们去觅找需要调用那些函数,何如普及步调的品量等. 要写出佳的步调,需要咱们有扎真的前提,那样逢到一些基础算法的时间便会游刃有余了.正在编程时咱们要有歉富的设念力,不要拘泥与牢固的思维办法,逢到问题的时侯要多念几种办理问题的规划.歉富的设念力是建坐正在歉富的知识前提上,所以咱们要通过多个道路去助闲自己建坐较歉富的知识结构.正在编程是咱们碰倒了很多的艰易,那便需要咱们多与他人接流.正在编程的历程中,咱们也创造有良佳的编程风格是格中要害的,起码正在时间效用上便体现了那一面.养成良佳的习惯,代码的缩进编排,变量的命名准则要末究脆持普遍,那些皆是普及咱们编程本领的重心.正在举止课程安排的历程中咱们也教到了许多别的物品.最先,咱们教会了合做,要以他人的视线瞅瞅问题,也许那样得到的会比各得意到的皆要多;其次,咱们教会了单干,单干是为了更佳天合做,单干才搞普及合做的效用;末尾,咱们教会了搏斗,咱们疑赖,通过四年的教习,咱们一定能写出更粗彩的步调,将去会描画出更粗彩的人死.正在那里,咱们要感动指挥课程安排的弛凤君教授,赋予咱们粗心的指挥.教授多次询问编写进程,并为咱们指面迷津,助闲咱们启拓钻研思路,粗心面拨、关切饱励.教授敷衍了事的处事做风,宽紧供真的做风,踩踩真真的粗神,不然而受尔以文,而且教尔搞人,给以末死受益无贫之讲.尔还要感动咱们启垦小组的其余共教,正在安排中他们给尔很大的助闲.正是由于咱们团结协做,才成功的完毕了课程安排任务.八.程序浑单/*贪吃蛇游戏步调浑单*/#include<stdio.h>#include<string.h>#include<time.h>#include<bios.h>#include<graphics.h>#include<conio.h>#include<stdlib.h>#include<dos.h>#define filename "c:\\person.dat" /*排止榜文献的文献齐名*/#define esc 0x011b /*esc键*/#define n 200 /*蛇的最大节数*/#define left 0x4b00 /*左移目标键*/#define right 0x4d00 /*左移搁背键*/#define down 0x5000 /*下移目标键*/#define up 0x4800 /*上移目标键*//*排止榜结构体*/struct person{int score; /*游戏者分数*/char name[20]; /*游戏者姓名*/}per[5];/*小蘑菇结构体*//*自定义的函数声明*/void drawmogu(); /*动画音乐函数*/void readfiles(); /*从文献中读与记录疑息*/void writefiles(struct person *) ; /*将记录写进文献中*/void initscorefiles(); /*初初化记录文献*/void comparescore(struct person); /*排止榜按分数举止排序*/void endplay(); /*游戏中断处理函数*/void paihb(); /*画造排止榜函数*//*输出欢迎词汇并播搁声音函数*/void pr(){ int s[15]={0,100,150,200,250,300,250,150,100,250,350};setcolor(change/10);/*改变欢迎词汇颜色*/settextstyle(0,0,4);outtextxy(20,200,"WELCOME TO OUR GAME");/*输出欢迎词汇*/sound(s[change/10]);/*使扬声器以括号内的频次收声*/}/*下雪的动画并共步播搁音乐函数*/void DrawSnow(){ int i;int sx[62];selinestyle(SOLID_LINE,0,THICK_WIDTH);line(1,1,9,9);/*一次3止画出红色雪花的3条线*/line(0,5,10,5);line(9,1,1,9);save=malloc(200);/*正在堆中申请200字节空间*/getimage(0,0,10,10,save);/*将雪花位图保存到save中*/cleardevice();/*浑屏*/randomize();/*树坐随机种子数*/for(i=0;i<62;i++)sx[i]=(i+2)*10/*估计雪花位子的横坐标数组*//*以下的键控while循环统造播搁音乐战下雪动画*/while(!kbhit())/*如果已按键,真止循环体*/{ Pr();/*调用Pr函数输出欢迎词汇并播搁声音*/if(snownum!=100){snow[snownum].speed=2+random(5);i=random(62);snow[snownum].x=sx[i];/*与横坐标*/snow[snownum].y=10-random(100);/*与纵坐标*/}/*循环搁置snownum个雪花*/for(i=0;i<snownum;i++)putimage(snow[i].x,snow[i].y,save,COPY_PUT);delay(100);/*延缓100ms以便瞅到雪花*/cleardevice();/*浑屏*/Pr(); /*调用Pr函数输出欢迎词汇并播搁声音*/if(snownum !=100) snownum++;setfillstyle(SOLID_FILL,15);for(i=0;i<snownum;i++) /*循环画出snownum个雪花*/{ snow[i].y+=snow[i].speed;putimage(snow[i].x,snow[i].y,save,COPY_PUT);if(snow[i].y>500)snow[i].y=10-random(200);}change++;if(change==140) change=10;}nosound(); /*关关扬声器*/cleardevice();/*浑屏*/}/*图像系统初初化函数*/void init(void){ int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc3\\BGI");cleardevice(); /*浑屏*/}/*游戏启初界里,左上角坐标为(50,40),左下角坐标(610,460)的围墙*/ void drawk(void){int i;setcolor(BLUE);setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*树坐线性*/for(i=50;i<=600;i+=10) /*用循环画围墙*/{setcolor(2*i+1);circle(i,40,5); /*画上边*/circle(i,451,5);circle(i,460,5); /*画下边*/}for(i=40;i<=450;i+=10){setcolor(2*i+1);circle(50,i,5); /*画左边*/circle(601,i,5);}for(i=40;i<=460;i+=10){setcolor(2*i+1);circle(41,i,5); /*画左边*/circle(610,i,5);}setcolor(LIGHTCYAN);setlinestyle(SOLID_LINE,0,THICK_WIDTH);outtextxy(20,5," GREEDY SNAKE GAMES ji 11_1"); /*输出版本*/ outtextxy(480,10,"score level "); /*输出此文本*/}/*玩游戏简曲历程*/void gameplay(void){food.yes=1; /*0表示苹果已经存留,1表示需要出现新苹果*/snake.life=0; /*蛇活着*/int level=1; /*记录游戏品级*/char buffer[10]; /*字符数组用于变换整形数据*/randomize(); /*树坐随机数的种子数*/snake.direction=1; /*目标背左*/snake.x[0]=110;snake.y[0]=100; /*蛇头坐标初值*/snake.x[1]=100;snake.y[1]=100; /*蛇身1节坐标初值*/snake.x[2]=90;snake.y[2]=100; /*蛇身2节坐标初值*/snake.node=3; /*蛇节数初值*/while(1) /*玩游戏死循环,按esc键或者蛇死时中断*/{ while(!kbhit()) /*正在不按键的情况下,蛇自己移动身体*/{if(food.yes==1) /*需要出现新苹果*/{food.x=rand()%400+60; /*正在墙内随机爆收苹果横坐标*/food.y=rand()%350+60; /*正在墙内随机爆收苹果纵坐标*//*真物随机爆收后必须让苹果不妨正在整格上,那样才搞吃到*/ while(food.x%10!=0) food.x++;while(food.y%10!=0) food.y++;food.yes=0; /*画里上有苹果了*/}if(food.yes==0) /*画里上有苹果便要画出去*/{setcolor(GREEN);setfillstyle(SOLID_FILL,GREEN);circle(food.x,food.y,5);fillellipse(food.x,food.y,5,5);}setfillstyle(1,BLUE);bar(475,18,590,35); /*画出隐现分数及关数蓝色矩形条*/setcolor(WHITE);itoa(score,buffer,10); /*将整形数据分数变换成字符串*/outtextxy(480,20,buffer); /*输出分数*/itoa(level,buffer,10); /*将整形数据关数变换成字符串*/outtextxy(560,20,buffer); /*输出关数*//*循环使蛇的每一节往前移动,那是贪吃蛇的“关键算法”*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}/*1、2、3、4表示左、左、上、下四个目标,通过那个推断去移动蛇头*/ switch(snake.direction){case 1:snake.x[0]+=10;break;case 2:snake.x[0]-=10;break;case 3:snake.y[0]-=10;break;case 4:snake.y[0]+=10;break;}/*推断蛇是可碰到墙*/if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<45||snake.y[0]>445){snake.life=1; /*置蛇死标记*/break;}/*从蛇的第四节启初推断是可碰到自己,*/for(i=3;i<snake.node;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){snake.life=1; /*置蛇死标记*/break;}}if(snake.life==1) /*以上二种推断以去,如果蛇死便跳出内循环*/break; /*跳出while(!kbhit)*/if(snake.x[0]==food.x&&snake.y[0]==food.y) /*吃到苹果以去*/{setcolor(BLACK); /*把画里上的苹果揩除*/circle(food.x,food.y,5);snake.node++; /*蛇的身体少一节*/food.yes=1; /*画里上需要出现新的苹果*/score+=10; /*出吃一个苹果减少10分*/if(score%50==0) /*吃够5个苹果加进下一关*/{level+=1; /*关数加1*/gamespeed-=60; /*统造速度的值缩小60,以便加赶快度*/}}setcolor(RED); /*画出红色蛇的循环*/setfillstyle(SOLID_FILL,RED); /*用圆画出红色蛇头*/fillellipse(snake.x[0],snake.y[0],5,5);setcolor(GREEN);setfillstyle(SOLID_LINE,GREEN);circle(snake.x[0],snake.y[0],1); /*对付蛇头弥补绿色小圆动做眼睛*/setcolor(RED);setfillstyle(SOLID_FILL,BLUE);for(i=1;i<snake.node;i++) /*用圆画出红色蛇身*/{setcolor(RED);setfillstyle(SOLID_FILL,BLUE);fillellipse(snake.x[i],snake.y[i],5,5); /*对付每节蛇身用蓝色弥补*/setcolor(CYAN);circle(snake.x[i],snake.y[i],1); /*用青色小圆画正在每节蛇身上*/}delay(gamespeed); /*延缓gamespeed毫秒,以便统造蛇的爬止速度*/setcolor(BLACK); /*用背景致乌色去除蛇的末尾一节*/circle(snake.x[snake.node-1],snake.y[snake.node-1],5) ;setfillstyle(SOLID_FILL,BLACK);fillellipse(snake.x[snake.node-1],snake.y[snake.node-1],5,5);}if(snake.life==1) break; /*如果蛇死便跳出循环*/key=bioskey(0); /*接支按键*/if(key==esc) break; /*按esc键退出*//*推断是可往好异的目标疏通*/else if(key==up&&snake.direction!=4)snake.direction=3;else if(key==right&&snake.direction!=2)snake.direction=1;else if(key==left&&snake.direction!=1)snake.direction=2;else if(key==down&&snake.direction!=3)snake.direction=4;} /*endwhile(1)*/} /*中断游戏*//*读与文献支配函数*/void readfiles(){FILE * fpread;/*如果文献不存留,则创造1个空文献,可则挨启该文献*/if((fpread=fopen(filename,"ab+"))==NULL){printf("cant't open the file person.dat! ");exit(0);}if(fgetc(fpread)==EOF) /*如果文献真量为空*/initscorefiles(); /*调用函数举止记录初初化处事*/rewind(fpread); /*沉新复位文献位子指针*/fread(per,sizeof(struct person),5,fpread);fclose(fpread); /*关关排止榜文献*/}/*写进文献支配函数*/void writefiles(struct person *tmp){FILE * fpwrite;/*以读写办法挨启文献,文献内本有的数据将被浑空*/if((fpwrite=fopen(filename,"wb+"))==NULL){printf("cant't open the file person.dat! ");exit(0);}fwrite(tmp,sizeof(struct person),5,fpwrite);fclose(fpwrite);}/*初初化记录函数*/void initscorefiles(){int i;struct person a[5];for(i=0;i<5;i++){a[i].score=0; /*5人的分数为0*/strcpy(a[i].name,"nobody"); /*5人的名为nobody*/}writefiles(a); /*调用记录写进函数*/}/*排序函数,如果玩家分数超出最矮记录,则将玩家分数拔出到符合的位子,共时简略本先的最矮记录 */void comparescore(struct person des)。

C语言课程设计报告(贪吃蛇)

C语言课程设计报告(贪吃蛇)

C语言课程设计报告(项目:贪吃蛇)学号:姓名:课程设计题目:贪吃蛇游戏专业班级:核工程与核技术4班报告人姓名:学号:同组组长:同组其他成员:课程教师:实验地点:95101实验室完成起止日期:2011年3月7日至2011年3 月15日一、课程设计概述(目的、任务、开发环境、参考资料)课程目的:1.熟悉二维数组的应用2.图形库文件中图形函数的使用3.通过游戏程序增加编程兴趣,提高编程水平课程任务:1.数组元素为结构体的数组应用2.全局变量应用3.按键处理4.数组元素与蛇食物对应关系5.图形方式开发环境:turbo C参考资料:《C语言课程设计案例精编》郭翠英等编著中国水利水电出版社二、项目的可行性研究项目流程图三、项目设计的基本原理和采用的主要方法与技术1.项目流程图2.graphics.h库函数中的矩形函数rectangle()等图形函数的应用3.二维数组的应用4.按键控制5.全局变量四、本人实现项目的过程与步骤1.画出项目流程图(如上图)2.写出主函数的整个运行过程3.整理函数运行过程中所需要的函数及定义如:(1).矩形图形函数rectangle()(2).定义蛇和实物的二维数组结构体struct Snake{int x[N]; int y[N]; int node; int direction;int life;}snake;(3).按键定义#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b4.定义各函数,分配功能void Init(void);图形驱动void Close(void);图形结束void DrawK(void);开始画面void GameOver(void);游戏结束void GamePlay(void);游戏过程void PrScore(void);输出成绩5.各函数的编辑开始画面函数(画围墙)游戏过程函数(蛇移动的算法蛇吃食物的算法按键算法等)游戏结束及成绩输出函数6.定义与各函数的整合嵌入7.编译调试8.对程序的扩展功能的调整9.完成实验报告五、个人遇到的困难与获得的主要成果(一)遇到的主要主要困难1.程序结构的理解由于长时间对C语言与数据结构没有接触,使我们对这些有一些相对陌生,主要是二维数组的引用以及循环的控制方面,如:(1) for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}(2)for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ {if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) {GameOver();/*显示失败*/snake.life=1;break;}}2.graphics.h图形库函数的陌生第一次接触graphics.h库函数,对其一无所知通过查阅资料找到graphics.h库函数中几个关键函数的功能及用法。

C#实验报告(贪吃蛇游戏)

C#实验报告(贪吃蛇游戏)

《C#程序设计及应用教程》课程设计报告设计题目贪吃蛇游戏专业2011级软件工程班级2011级软件工程姓名学号*********完成日期2013-06-24目录1. 问题描述………………………………………………2. 系统设计………………………………………………3. 数据结构与算法描述…………………………………4. 测试结果与分析………………………………………5. 总结…………………………………………………6. 参考文献………………………………………………附录程序源代码…………………………………………(报告正文部分):课程设计题目1. 问题描述我设计的的游戏首先在主界面选择游戏难度,接着进行游戏,在游戏过程中贪吃蛇不停地吃掉随机产生的食物,蛇身增长,直到蛇触碰到自己的身躯或边框,游戏结束特色:1.游戏可以自选难度,且蛇身长每增加2游戏可以储存游戏分数,你可以查看最高分3游戏过程中蛇的颜色,食物的颜色,分数的颜色,可以不停变换,增加视觉效果2. 系统设计2.1 设计目标C#课程设计是教学实践环节中一项重要内容,进行此课程设计旨在掌握基础知识的基础上,进一步加深对C#的理解和掌握;提高和加强学生的计算机应用及软件开发能力,使学生具备初级程序员的基本素质;培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应信息管理行业日新 2 月异的发展形势;本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,做出设计报告。

2.2 设计思想程序关键在于表示蛇的图形及蛇的移动。

用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块。

移动时必须从蛇头开始,所以蛇不可以向相反的方向移动,如果不按任意键,蛇自行在当前方向右前移,但按下有效方向键后,蛇头朝该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后节用背景色覆盖。

c语言贪吃蛇实训报告

c语言贪吃蛇实训报告

c语言贪吃蛇实训报告C语言贪吃蛇实验报告C语言程序设计实训报告姓名专业班级指导教师二011年7 月14 日11.1 1.2目录实训目的和要求 (1)实训目的和任务........................................................... .................................. 1 实训要求........................................................... .. (1)22.1 2.2实训任务内容 (1)游戏规则........................................................... .................................................. 1 流程设计........................................................... .. (2)33.1 3.2 3.3软件使用说明 (3)编辑程序主要软件........................................................... ............................. 3 编辑程序辅助软件........................................................... ............................. 3 程序使用过程........................................................... ........................................ 3 3.3.1 3.3.2 3.3.3贪吃蛇进入........................................................... ............................. 3 贪吃蛇的玩法........................................................... ........................ 4 贪吃蛇的结束........................................................... (4)44.1 4.2实训心得和体会 (5)实训的心得........................................................... ............................................. 5 实训的体会........................................................... (5)参考文献.............................. 6 附录:部分程序清单. (7)1 实训目的和要求1.1 实训目的和任务1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C 语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 实训要求1. 分析实训题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用4. 设计完成后提交实训报告2 实训任务内容2.1 游戏规则通过一个学期对C语言程序设计的学习,经过实训,完善我们对C语言学习的漏洞和未学会的知识点,更加熟练的掌握C语言程序设计,锻炼我们独立自主设计程序编辑代码的能力,通过设计出来的程序,提高我们对C语言学习的兴趣,玩家通过键盘控制蛇在地图上寻找食物,蛇吃蛇食物,可以加分,碰到四壁游戏结束。

C语言贪吃蛇实验报告

C语言贪吃蛇实验报告

C语言程序设计实训报告姓名专业班级指导教师2011 年7月14日目录一.实训目的和要求....................................................................... 1二.实训任务内容........................................................................... 1三.详细设计说明........................................................................... 1四.软件使用说明........................................................................... 3五.实训心得与体会....................................................................... 3六.参考文献................................................................................... 5七.部分程序清单(带有详细的注释)....................................... 6八.程序结果............................................................................... 10一.实训目的和要求1.实训目的本实训是软件技术专业重要的实践性环节之一,是在学生学习完《C语言程序设计》课程后进行的一次全面的综合练习。

本实训的目的和任务:(1). 巩固和加深学生对C语言课程的基本知识的理解和掌握(2). 掌握C语言编程和程序调试的基本技能(3). 利用C语言进行基本的软件设计(4). 掌握书写程序设计说明文档的能力(5). 提高运用C语言解决实际问题的能力2.实训要求(1). 分析实训题目的要求(2). 写出详细设计说明(3). 编写程序代码,调试程序使其能正确运行(4). 设计完成的软件要便于操作和使用(5). 设计完成后提交实训报告二.实训任务内容设计贪吃蛇游戏玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。

C语言课程设计报告——贪吃蛇源程序

C语言课程设计报告——贪吃蛇源程序

创作时间:二零二一年六月三十日C 语言课程设计之南宫帮珍创作(小游戏贪吃蛇的法式设计陈说)设计人:班级:201年月号创作时间:二零二一年六月三十日目录一:概述1:研究布景及意义2:设计的任务与需要知识点3:具体完成设计内容二:需求分析1:功能需求2:把持方法三:总体设计1:模块划分2:数据结构设计四:详细设计1:主空摸块设计2:绘制游戏界面3:游戏的具体过程4:游戏的结束处置5:显示排行榜信息模块五:法式的调试与测试1:动画与音乐同步2:蛇的运行3:终止法式六:结论七::结束语八:法式清单九:参考文献一.概述本课程设计以软件工程方法为指导, 采纳了结构化, 模块化的法式设计方法, 以C语言技术为基础, 使用Turbo C++3.0为主要开发工具, 对贪吃蛇游戏进行了需求分析, 总体设计, 详细设计, 最终完成系统的实现与测试.1.1 研究的布景及意义随着社会的发展, 人们生活的节奏日益加快, 越来越多的人加入了全球化的世界.人们不再拘泥与一小块天地, 加班, 出差成了现代人不成防止的公务.而此时一款可以随时随地娱乐的游戏成了人们的需要.此次课程设计完成的贪吃蛇小游戏, 正是为了满足上述需求而设计出来的.贪吃蛇游戏虽小, 却设计诸多的知识点.通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的和那个发, 技术和工具开发软件的过程, 进一步掌握结构化, 模块化的法式设计方法和步伐, 进一步掌握总体数据结构设计, 模块划分方法, 掌握局部变量, 全局变量, 结构体, 共用体, 数组, 指针, 文件等数据结构的使用方法, 掌握图形, 声音, 随机数等多种库函数的使用方法, 学习动画, 音乐, 窗口, 菜单, 键盘等多项编程技术, 进一步学会软件调试, 测试, 组装等软件测试方法, 为后续课程的学习和将来实际软件开发打下坚实的基础.1.2 设计的任务和需要的知识点1.2.1 课程设计主要完成的任务1). 通过编写“贪吃蛇游戏”法式, 掌握结构化, 模块块化法式设计的思想, 培养解决实际问题的能力.2) 有同步播放动画, 声音效果.3) 设计好数组元素与蛇, 食物的对应关系.4) 随机发生食物.5) 有分数统计, 排行榜, 分数存储等功能.通过此次课程设计, 希望使读者能更深入的理解和掌握课程教学中的基本概念, 培养读者应用基本技术解决实际问题的能力, 从而进一步提高分析问题和解决问题的能力.1.2.3本次课程设计需要掌握和运用如下的知识点:1) 数组的应用.2) 全局变量的使用.3) 按键处置.4)结构体的应用.5)图形, 音乐和动画的有关知识.6)随即函数的使用.7)文件的基本出把持.8) 结构化, 模块化的设计方法.在本次课程设计中需要完成的任务有:包括命令, 全局变量的界说和宏界说, 函数声明等(50行), 主控模块(MAIN函数, 14行), 动画, 音乐播放模块(DRAWSNOW函数, 33行), 画出游戏开始界面模块, 具体游戏过程模块, 游戏结束处置模块.开发中工作量约为215行源代码.二 .需求分析贪吃蛇游戏是个简单的小游戏, 能让游戏者的身心获得娱乐,从而能够更好地投入到学习或工作傍边.虽然现在市面上出来这各种各样的游戏版本,可是贪吃蛇这类的小游戏其市场还是相当年夜的, 因为它玩法简单易行, 不论是手机,还是小游戏机, 都能很顺利的运行.对在外忙碌的人, 不成能花费年夜量时间在娱乐上,年夜型游戏是行欠亨的, 这样的小游戏刚好迎合了他们的需求.要开发贪吃蛇游戏法式,首先要分析改法式应实现哪些功能.对贪吃蛇游戏法式的功能需求可描述如下:法式运行后显示动画, 音乐, 按ESC 键退出游戏界面后, 左边有一个矩形区, 外游戏区域, 在矩形区中有食物和贪食蛇, 上方有统计分数及关数显示区域. 蛇在封闭围墙利用绿色矩形暗示, 围墙里随机的呈现一个食物,通过按键盘四个光标键控制蛇向上, 下, 左右四个方向移动, 蛇头撞到食物, 则食物被吃失落, 蛇身体长一节, 接着又呈现食物, 等候蛇来吃.食物用一个点暗示, 而且每次食物的位置都是随机呈现的.游戏中要使贪吃蛇尽可能的长, 可是不能使贪吃蛇撞到四周的墙壁, 而且蛇的身体不能撞到一起,否则游戏结束.游戏中每吃失落一个食物要有积分, 随着分数的增加可进入下一关, 即使速度会加快.游戏结束时,如果分数进入前5名则重新排榜并存储.显示排行榜.由于有关贪吃蛇和食物的数据较多, 而且关系密切, 贪吃蛇及食物都是界说结构体数据类型, 这样界说便于把持与处置.2.2 把持方法三 总体设计确定贪吃蛇游戏体系结构, 给出总体模块结构图, 确定法式的主要函数及之间的调用关系, 同时设计蛇与游戏者等的数据结构.3.1 模块划分本法式采纳结构化法式设计的方法, 依照自顶向下,逐步细化的方法对要解决的问题进行逐层分解.首先画召盘层模块, 即主控模块, 之完成对下层模块的调用功能, 即调用其他的功能模块;接着,按需求分析中的功能需求设计第一层模块, 有音乐动画, 图形驱动, 画主界面, 游戏过程, 结束处置, 退出等第6个主要功能;接着, 画出第二层模块.总体模块结构如图6-1所示.3.1.1. 主控模块. 3.1.2. 动画音乐模块 3.1.3. 画主界面模块 3.1.4. 游戏过程模块 3.1.5. 游戏结束处置模块 3.1.6. 读取记录模块 3.1.7. 成果排序模块 3.1.8. 写入文件模块 3.1.9. 排行榜模块 3.1.10. 退出3.2 总体数据结构设计设计思路:测序的关键在于暗示蛇的图形及蛇的移动.用一个小局限性方块暗示蛇的一节身体, 身体每长一节, 增加一个矩形块, 蛇头业用同样的一节小矩形方块暗示移动时必需从蛇可以上向前爬行, 档案下有效方向键后, 应先确定蛇头的位置, 而后蛇的身体虽蛇头移动, 图形的实现是从身体新位置开始画出蛇.这时, 由于未清屏的原因, 原来的蛇的位置和新蛇的位置差一节蛇身, 即看起来蛇多一节身体, 所以将蛇的最后一节用布景色覆盖.食物的呈现与消失意识画矩形块和覆盖矩形块.为了便于理解, 界说两个结构体:食物与蛇.下面介绍贪吃蛇游戏法式的主要数据结构. 3.2.1 食物与蛇的数据结构暗示食物与蛇的矩形块设计为10*10个像素单位, 食物的基本数据域为它所呈现的位置,主 控 模 板 读取记录成果排序写入文件排行榜动画音乐图形驱动退出结束处置 游戏过程画主界面用X和Y坐标暗示, 则矩形块用函数RECTANGLE(X,Y,X+10, Y+10)或RECTANGLE(X,Y,X+10, Y-10)可以画出.由于每次只呈现一个食物, 所以设定YES暗示是否需要呈现食物.YES=1暗示没有食物或食物已经被蛇吃失落,需要画出食物.放置食物后, 置YES=0.蛇的一节身体为一个矩形块, 暗示矩形块只需左上角点坐标(X,Y).由于在游戏过程中蛇的身体不竭增长,需用数组寄存每节坐标, 最年夜设定为N=200, NODE暗示以后节数.DIRECTION是保管蛇的移动方向的变量, 其值可为1、2、3、4之一, 分别暗示右、左、上、下的方向.LIFE是暗示生命的变量, LIFE=0暗示蛇活着, 一旦LIFE=1, 一旦LIFE=1, 暗示蛇死, 结束游戏.#define N 200Struct Food{ int x;int y;Int yes;}food;Struct Snake{ int x[N];Int y[N];Int node;Int derection;Int life;}snake;3.2.2 排行榜中优胜者的数据结构排行榜主要记录优胜者的姓名和成果.为了寄存排行榜信息, 可界说如下的结构体类型, 其中字符数组name成员寄存优胜者的姓名, 整型变量score成员寄存优胜者的成果.Struct person{ char name[20];Int score;};3.2.3 其他全局变量的界说Struct person per[5];Int score=0;Int gamespeed=400;3.2.4 符号常量的宏界说#define LEFT 0x4b00;#define RIGHT 0x4d00;#define DOWN 0x5000;#define UP 0x4800#define ESC 0x011b#define FILENAME四. 详细设计根据总体设计的模块功能和结构,完成所承当的法式模块的算法设计.给出每个模块的详细的算法,算法分别用传统流程图和文字说明来描述.4.1 主控模块main函数主函数是法式的主控模块.首先初始化图形系统,然后使用drawsnow函数播放动画和声音, 接着调用init函数初始化图形系统, 之后调用drawk函数画出游戏开始画面, 在调用gameplay函数, 即开始了游戏的具体过程, 游戏结束后调用endplay函数进行游戏结束处置;从文件中读取记录信息, 排序, 显示排行榜信息, 最后关闭图形系统, 结束法式.主控模块的流程图如图6-2所示.其中带有两个竖线的矩形框暗示对自界说函数的调用.4.2 函数主界面就是一个封闭的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高的均为10个像素单位的距行小方块, 围成封闭图形暗示围墙, 为了醒目, 设置为淡青色, 用函数setlinestyle 设直线型宽度为3个像素, 设置3个像素的围墙线, .最后, 在界面的左上部输出游戏法式的版本信息,在右上部输出游戏成果(score )和关(level)的表头.4.3 游戏具体过程gameplay 函数该函数是游戏的核心部份.游戏具体过程gameplay 函数的年夜致算法流程图如图6-4所示.余下流程图在下页4.3.1 , , 4.3.2由于蛇吃到食物的判断是蛇头的坐标和食物的坐标相等,所以要确保食物呈现的位置在10的倍数位置上.先用两个带随机函数的表达式发生一个位于围墙内的x 、y 坐标, 然后用两个while 循环将两个坐标值调整到10的倍数上, 这样就可以让蛇吃到.4.3.3 循环确定蛇身的新坐标这里的难点是暗示蛇的新位置并消除前一次的图形.采纳的方法是每次移动的时候从最后一节开始到第二节, 将前一节的坐标值赋给后一节的坐标, 移动后只要把最后一节用布景色擦出即可, 因为新位置0到n-1节还是要呈现在画面上的.这里用一个for 循环来确定蛇身的新坐标. 4.3.4 吃到食物后的处置 蛇吃到食物后, 首先将食物擦除, 即用布景色画出该食物, 然后给蛇的节数加1, 设置需要食物标识表记标帜, 是游戏成果加10分, 如果成果到达50分的倍数, 则给关数加1, 并加快游戏速度.4.3.5 有按键判断蛇的方向 这是一个内嵌的嵌套的条件选择结构,根据安东上下左右键来设定蛇的移动方向.其中1=向右, 2=向左, 3=向上, 4=向下.判断是还考虑相反的方向键无效, 比如蛇正在向上爬行, 按下一键方向是无效的. 4.4 游戏的结束处置木块ENDPLAY 函数游戏结束时, 应该用ENDPLAY 函数进行游戏结束处置, 其算法流程图如图6-5所示2存在,, 在界面中输入游戏者姓名, 对成果进行赋值, 然后调用CompareScore 函数对记录排序, 并调用Writefiles 函数将记录写入排行榜帮文件;如果不能上榜, 则直接在游戏界面输出不能上榜信息.最后, 调用 pain_board 函数显示排行榜信息.函数void pain_board完成排行榜的绘制.五. 法式的调试与测试调试与测试软件的目标就是发现并改正潜伏的毛病.一个法式,必需经过认真的调试和测试, 才华尽量减少毛病、保证法式满足功能、性能需求, 到达最初的设计、使用要求, 从而保证法式的开发质量.详细设计完成后, 就可以用C语言根据各个模块的算法来设计法式, 每个模块都要设计成一个自界说函数.几个模块可以放在一起构成一个原函数法式文件,也可以一个模块构成一个源法式文件.原法式设计好后, 输入到计算机中, 并存储到磁盘上;然后对每个源法式文件都进行了自力编译和调试(具体代码可以参看法式清单);并针对分歧的模块法式设计测试用例进行单位测试;最后,将几个分别开发的模块组装在一起, 形成一个完整的法式, 进行集成测试, 从而发现并改正了法式法式中存在的一些潜藏的毛病, 并使法式的容错能力年夜年夜增强.5.1 动画与音乐的同步播放预期结果:①片头在显示动画得同时播放音乐;②按任意键后进入游戏主界面;③进入游戏主界面后动画音乐同时停止.实际运行效果:满足①和②, 不满足③, 即进入游戏后仍然播放片头音乐.毛病分析:法式中使用循环播放动画,并在其循环体中拔出发声函数以到达音乐和动画的同步.由于在结束动画时没有关闭扬声器, 所以进入游戏界面后仍然发声.修改:在动画播放完后加一条“nosound();”语句将扬声器关闭, 问题获得解决.修改后法式运行的实际效果与预期效果一致.5.2 蛇的运行5.2.1 蛇撞到墙预期结果:蛇运行时如果撞到墙壁, 则游戏结束.实际运效果:超越左右墙壁后法式结束, 但超越上面墙壁后仍然运行, 如图6-9所示.毛病分析:毛病法式段在蛇运行中的条件判断语句中, 其判断条件是:if(snake.x[0]<55|| snake.x[0]>595),即少了上、下两个方向的判断.修改:在蛇的运行过程中添加两个逻辑表达式, 判断蛇是否闯到上下的围墙.代码:If( snake.x[0]<55|| snake.x[0]>595|| snake.y[0]<55|| snake.y[0]>455)修改后的法式运行结果与预期的结果一致.5.2.2 蛇头闯到蛇身预期的结果:当蛇得头部与蛇身相撞时, 游戏应当结束.实际运行效果:蛇头撞到蛇身时,法式其实不终止.毛病分析:在蛇的运行判断的法式犯错, 其代码如下Fori=3;i<snake.node;i++){ if(snake.x[i]=snake.x[0]&&snake.y[i]=snake.y[0]){snake.life=0;break;}}修改:将循环体中的snake.life=0改为snake.life=1;修改后的结果与预期结果一致.5.3 终止循环经过对各个模块的调试和单位测试并修改了毛病后, 将各个模块组装成一个系统, 并进行集成测试.在集成的过程中发现了一些毛病,比如全局变量重复界说、函数重复声明等, 分别进行了改正.最后连续运行了5次, 以便测试该游戏法式的功能、性能是否到达了预期的目标,并根据所使用的具体机器对蛇的爬行速度进行适当的调整.测试内容包括蛇的运行、分数、关数、排行榜及排序、文件存储、音乐动画等功能,情况均正常.六. 结论通过2周的课程设计, 在开发小组共同的努力下, 终于完成了贪吃蛇游戏法式的开发任务.该游戏法式实现了用方向键控制蛇在围墙内爬行、随机发生食物、控制蛇吃失落食物并加分、控制游戏中闯关的数目和蛇的运行速度、实时显示得分和关数、结束时处置和显示排行榜等功能.该游戏法式具有界面友好、把持方便、控制准确和容错能力强等特点.这个贪吃蛇游戏还存在一些缺陷, 还应该在如下几个方面加以改进.1)进入游戏后, 到蛇死亡, 只能玩一次就会退出法式.应加入屡次游戏的控制能力.2)蛇的样子不美观, 应将蛇头、蛇尾和蛇身进一步美化, 使其更像真实的蛇.3)当分数到达400分时, 蛇的速度变得非常快, 一下子就撞到围墙上了, 应适当控制蛇的速度和关数, 以便使游戏更具有吸引力.贪吃蛇游戏的编程练习思考数据结构:界说食物的坐标来控制它呈现的位置,用一系列的函数时进行暗示, 比如用函数rectangle来画出矩形, 用life变量的值暗示蛇的生命, 用direction变量的值暗示蛇移动的方向等, 还有用数组来寄存蛇身各节的坐标, 这些都让我们熟悉了对数组的把持, 另外还熟悉了各种函数的应用.贪吃蛇的设计有很多帮手,学习编写贪吃蛇的游戏对掌握C语言的知识有很年夜的帮手.通过编程实践, 还能拓展思路, 让我们去寻找需要调用那些函数, 怎样提高法式的质量等.要写出好的法式, 需要我们有扎实的基础, 这样遇到一些基本算法的时候就会游刃有余了.在编程时我们要有丰富的想象力,不要拘泥与固定的思维方式,遇到问题的时侯要多想几种解决问题的方案.丰富的想象力是建立在丰富的知识基础上,所以我们要通过多个途径来帮手自己建立较丰富的知识结构.在编程是我们碰倒了很多的困难, 这就需要我们多与他人交流.在编程的过程中, 我们也发现有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点.养成良好的习惯, 代码的缩进编排, 变量的命名规则要始终坚持一致, 这些都是提高我们编程能力的要点.在进行课程设计的过程中我们也学到了许多另外工具.首先, 我们学会了合作, 要以他人的眼光看看问题, 也许这样获得的会比各自获得的都要多;其次, 我们学会了分工, 分工是为了更好地合作, 分工才华提高合作的效率;最后, 我们学会了奋斗, 我们相信, 通过四年的学习, 我们一定能写出更精彩的法式, 将来会描绘出更精彩的人生.在这里, 我们要感谢指导课程设计的张凤君老师, 给予我们悉心的指导.老师屡次询问编写进程, 并为我们指点迷津, 帮手我们开拓研究思路, 精心点拨、热心鼓励.老师一丝不苟的工作作风, 严谨求实的态度, 踏踏实实的精神, 不单受我以文, 而且教我做人, 给以终生受益无穷之道.我还要感谢我们开发小组的其他同学, 在设计中他们给我很年夜的帮手.正是由于我们团结协作, 才顺利的完成了课程设计任务. 八.程序清单/*贪吃蛇游戏法式清单*/#include<stdio.h>#include<string.h>#include<time.h>#include<bios.h>#include<graphics.h>#include<conio.h>#include<stdlib.h>#include<dos.h>#define filename "c:\\person.dat" /*排行榜文件的文件全名*/#define esc 0x011b /*esc键*/#define n 200 /*蛇的最年夜节数*/#define left 0x4b00 /*左移方向键*/#define right 0x4d00 /*右移放向键*/#define down 0x5000 /*下移方向键*/#define up 0x4800 /*上移方向键*//*排行榜结构体*/struct person{int score; /*游戏者分数*/char name[20]; /*游戏者姓名*/}per[5];/*小蘑菇结构体*//*自界说的函数声明*/void drawmogu(); /*动画音乐函数*/void readfiles(); /*从文件中读取记录信息*/void writefiles(struct person *) ; /*将纪录写入文件中*/void initscorefiles(); /*初始化记录文件*/void comparescore(struct person); /*排行榜按分数进行排序*/void endplay(); /*游戏结束处置函数*/void paihb(); /*绘制排行榜函数*//*输出欢迎词并播放声音函数*/void pr(){ int s[15]={0,100,150,200,250,300,250,150,100,250,350};setcolor(change/10);/*改变欢迎词颜色*/settextstyle(0,0,4);outtextxy(20,200,"WELCOME TO OUR GAME");/*输出欢迎词*/sound(s[change/10]);/*使扬声器以括号内的频率发声*/}/*下雪的动画并同步播放音乐函数*/void DrawSnow(){ int i;int sx[62];selinestyle(SOLID_LINE,0,THICK_WIDTH);line(1,1,9,9);/*一次3行画出白色雪花的3条线*/line(0,5,10,5);line(9,1,1,9);save=malloc(200);/*在堆中申请200字节空间*/getimage(0,0,10,10, save);/*将雪花位图保管到save中*/cleardevice();/*清屏*/randomize();/*设置随机种子数*/for(i=0;i<62;i++)sx[i]=(i+2)*10/*计算雪花位置的横坐标数组*//*以下的键控while循环控制播放音乐和下雪动画*/while(!kbhit())/*如果未按键, 执行循环体*/{ Pr();/*调用Pr函数输出欢迎词并播放声音*/if(snownum!=100){snow[snownum].speed=2+random(5);i=random(62);snow[snownum].x=sx[i];/*取横坐标*/snow[snownum].y=10-random(100);/*取纵坐标*/}/*循环放置snownum个雪花*/for(i=0;i<snownum;i++)putimage(snow[i].x,snow[i].y,save,COPY_PUT);delay(100);/*延迟100ms以便看到雪花*/cleardevice();/*清屏*/Pr(); /*调用Pr函数输出欢迎词并播放声音*/if(snownum !=100) snownum++;setfillstyle(SOLID_FILL,15);for(i=0;i<snownum;i++) /*循环画出snownum个雪花*/{ snow[i].y+=snow[i].speed;putimage(snow[i].x,snow[i].y,save,COPY_PUT);if(snow[i].y>500)snow[i].y=10-random(200);}change++;if(change==140) change=10;}nosound(); /*关闭扬声器*/cleardevice();/*清屏*/}/*图像系统初始化函数*/void init(void){ int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc3\\BGI");cleardevice(); /*清屏*/}/*游戏开始界面, 左上角坐标为(50, 40), 右下角坐标(610, 460)的围墙*/ void drawk(void){int i;setcolor(BLUE);setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*设置线性*/for(i=50;i<=600;i+=10) /*用循环画围墙*/{setcolor(2*i+1);circle(i,40,5); /*画上边*/circle(i,451,5);circle(i,460,5); /*画下边*/}for(i=40;i<=450;i+=10){setcolor(2*i+1);circle(50,i,5); /*画左边*/circle(601,i,5);}for(i=40;i<=460;i+=10){setcolor(2*i+1);circle(41,i,5); /*画右边*/circle(610,i,5);}setcolor(LIGHTCYAN);setlinestyle(SOLID_LINE,0,THICK_WIDTH);outtextxy(20,5," GREEDY SNAKE GAMES ji 11_1"); /*输出书本*/ outtextxy(480,10,"score level "); /*输出此文本*/}/*玩游戏具体过程*/void gameplay(void){food.yes=1; /*0暗示苹果已经存在, 1暗示需要呈现新苹果*/snake.life=0; /*蛇活着*/int level=1; /*记录游戏品级*/char buffer[10]; /*字符数组用于转换整形数据*/randomize(); /*设置随机数的种子数*/snake.direction=1; /*方向向右*/snake.x[0]=110;snake.y[0]=100; /*蛇头坐标初值*/snake.x[1]=100;snake.y[1]=100; /*蛇身1节坐标初值*/snake.x[2]=90;snake.y[2]=100; /*蛇身2节坐标初值*/snake.node=3; /*蛇节数初值*/while(1) /*玩游戏死循环, 按esc键或蛇死时结束*/{ while(!kbhit()) /*在没有按键的情况下, 蛇自己移出发体*/{if(food.yes==1) /*需要呈现新苹果*/{food.x=rand()%400+60; /*在墙内随机发生苹果横坐标*/food.y=rand()%350+60; /*在墙内随机发生苹果纵坐标*//*事物随机发生后必需让苹果能够在整格上, 这样才华吃到*/while(food.x%10!=0) food.x++;while(food.y%10!=0) food.y++;food.yes=0; /*画面上有苹果了*/}if(food.yes==0) /*画面上有苹果就要画出来*/{setcolor(GREEN);setfillstyle(SOLID_FILL,GREEN);circle(food.x,food.y,5);fillellipse(food.x,food.y,5,5);}setfillstyle(1,BLUE);bar(475,18,590,35); /*画出显示分数及关数蓝色矩形条*/setcolor(WHITE);itoa(score,buffer,10); /*将整形数据分数转换成字符串*/outtextxy(480,20,buffer); /*输出分数*/itoa(level,buffer,10); /*将整形数据关数转换成字符串*/outtextxy(560,20,buffer); /*输出关数*//*循环使蛇的每一节往前移动, 这是贪吃蛇的“关键算法”*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}/*1、2、3、4暗示右、左、上、下四个方向, 通过这个判断来移动蛇头*/ switch(snake.direction){case 1:snake.x[0]+=10;break;case 2:snake.x[0]-=10;break;case 3:snake.y[0]-=10;break;case 4:snake.y[0]+=10;break;}/*判断蛇是否撞到墙*/if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<45||snake.y[0]>445){snake.life=1; /*置蛇死标识表记标帜*/break;}/*从蛇的第四节开始判断是否撞到自己, */for(i=3;i<snake.node;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){snake.life=1; /*置蛇死标识表记标帜*/break;}}if(snake.life==1) /*以上两种判断以后, 如果蛇死就跳出内循环*/break; /*跳出while(!kbhit)*/if(snake.x[0]==food.x&&snake.y[0]==food.y) /*吃到苹果以后*/{setcolor(BLACK); /*把画面上的苹果擦除*/circle(food.x,food.y,5);snake.node++; /*蛇的身体长一节*/food.yes=1; /*画面上需要呈现新的苹果*/score+=10; /*没吃一个苹果增加10分*/if(score%50==0) /*吃够5个苹果进入下一关*/{level+=1; /*关数加1*/gamespeed-=60; /*控制速度的值减少60, 以便加快速度*/}}setcolor(RED); /*画出红色蛇的循环*/setfillstyle(SOLID_FILL,RED); /*用圆画出红色蛇头*/fillellipse(snake.x[0],snake.y[0],5,5);setcolor(GREEN);setfillstyle(SOLID_LINE,GREEN);circle(snake.x[0],snake.y[0],1); /*对蛇头填充绿色小圆作为眼睛*/setcolor(RED);setfillstyle(SOLID_FILL,BLUE);for(i=1;i<snake.node;i++) /*用圆画出红色蛇身*/{setcolor(RED);setfillstyle(SOLID_FILL,BLUE);fillellipse(snake.x[i],snake.y[i],5,5); /*对每节蛇身用蓝色填充*/setcolor(CYAN);circle(snake.x[i],snake.y[i],1); /*用青色小圆画在每节蛇身上*/}delay(gamespeed); /*延迟gamespeed毫秒, 以便控制蛇的爬行速度*/setcolor(BLACK); /*用布景色黑色去除蛇的最后一节*/circle(snake.x[snake.node-1],snake.y[snake.node-1],5) ;setfillstyle(SOLID_FILL,BLACK);fillellipse(snake.x[snake.node-1],snake.y[snake.node-1],5,5);}if(snake.life==1) break; /*如果蛇死就跳出循环*/key=bioskey(0); /*接收按键*/if(key==esc) break; /*按esc键退出*//*判断是否往相反的方向运动*/else if(key==up&&snake.direction!=4)snake.direction=3;else if(key==right&&snake.direction!=2)snake.direction=1;else if(key==left&&snake.direction!=1)snake.direction=2;else if(key==down&&snake.direction!=3)snake.direction=4;} /*endwhile(1)*/} /*结束游戏*//*读取文件把持函数*/void readfiles(){FILE * fpread;/*如果文件不存在, 则创立1个空文件, 否则翻开该文件*/if((fpread=fopen(filename,"ab+"))==NULL){printf("cant't open the file person.dat! ");exit(0);}if(fgetc(fpread)==EOF) /*如果文件内容为空*/initscorefiles(); /*调用函数进行记录初始化工作*/rewind(fpread); /*重新复位文件位置指针*/fread(per,sizeof(struct person),5,fpread);fclose(fpread); /*关闭排行榜文件*/}/*写入文件把持函数*/void writefiles(struct person *tmp){FILE * fpwrite;/*以读写方式翻开文件, 文件内原有的数据将被清空*/if((fpwrite=fopen(filename,"wb+"))==NULL){printf("cant't open the file person.dat! ");exit(0);}fwrite(tmp,sizeof(struct person),5,fpwrite);fclose(fpwrite);}/*初始化记录函数*/void initscorefiles(){int i;struct person a[5];for(i=0;i<5;i++){a[i].score=0; /*5人的分数为0*/strcpy(a[i].name,"nobody"); /*5人的名为nobody*/}writefiles(a); /*调用记录写入函数*/}/* 排序函数, 如果玩家分数超越最低记录, 则将玩家分数拔出到合适的位置, 同时删除原先的最低记录 */void comparescore(struct person des)。

C语言贪吃蛇实验报告

C语言贪吃蛇实验报告

C语言程序设计报告题目:贪吃蛇游戏的程序设计院系:西语学院英语教育6班姓名:学号:1.1题目设计贪吃蛇小游戏1.2题目的要求:玩家通过键盘控制蛇在地图上寻找食物,蛇吃下食物,可以加分,碰到四壁游戏结束。

1.3设计的步骤:分析设计题目的要求,即需求分析。

总体设计,确定所需模块及模块间调用关系,定义系统中使用的数据类型。

详细设计,确定每个模块的功能,绘制主要函数的流程图。

编写程序代码,调试程序使其能正确运行。

要求书写规范,注意采用缩进格式。

函数名、变量名要见文晓意,注释要简而不失、详而不缀。

设计完成的软件要便于操作和使用。

程序测试,发现程序中存在的错误并改正。

完成报告。

2详细设计说明2.1课程设计的要求:通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。

收集资料,分析课题,分解问题,形成总体设计思路;对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;完成课程设计报告。

2.2 程序的功能:贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10 分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

2.3 课程设计的思想:程序关键在于表示蛇的图形及蛇的移动。

用一个小圆点来表示蛇的一节身体,身体每长一节,增加一个圆点,蛇头用四节来表示。

移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,如果按与蛇运动方向相反的方向键,此游戏就会暂停,再按想前的方向键才能继续游戏,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。

c语言贪吃蛇毕业论文

c语言贪吃蛇毕业论文

c语言贪吃蛇毕业论文本论文将介绍一种用C语言实现的贪吃蛇游戏。

贪吃蛇是一款经典的益智游戏,深受各年龄层玩家的喜爱。

C语言是一种功能强大而且易于掌握的编程语言,被广泛用于游戏开发。

本文将首先介绍贪吃蛇游戏的规则和实现方法,然后详细讲解程序的整体结构和核心代码,最后进行功能测试和结论总结。

一、贪吃蛇游戏规则1、游戏地图贪吃蛇游戏的游戏地图是一个矩形区域,由n*m个正方形格子组成,每个格子有两种状态:有贪吃蛇或为空白。

在游戏开始时,贪吃蛇占据地图中的一部分格子,空白的格子数量随机生成。

2、贪吃蛇贪吃蛇由一条长条组成,初始时只有一个方块。

贪吃蛇可以通过移动来吃掉地图上的食物,每吃掉一个食物身体就会增长一个方块。

但是,贪吃蛇不能碰到墙壁或自身,否则游戏失败。

3、食物贪吃蛇的目标是吃掉地图上的食物,每当贪吃蛇吃掉一个食物,就会在地图上随机产生一个新的食物。

如果食物数量不足,玩家将面临更大的挑战。

4、游戏玩法在游戏中,玩家通过键盘上的方向键来控制贪吃蛇的移动方向。

当贪吃蛇吃到食物或撞到障碍物时,游戏进入下一个阶段。

二、程序设计1、整体结构贪吃蛇程序的整体结构可以分为输入输出、游戏控制和图形化界面三个模块。

输入输出模块负责从键盘接收输入,输出游戏状态和游戏结果。

游戏控制模块是贪吃蛇游戏的核心,负责处理游戏逻辑,包括贪吃蛇的移动、碰撞检测和食物生成等。

图形化界面模块用于绘制游戏界面,包括地图、贪吃蛇和食物等。

图形化界面的实现可以使用GDI或OpenGL等图形库。

2、核心代码(1)定义结构体和全局变量定义结构体Snake和Map,分别表示贪吃蛇和游戏地图。

定义全局变量score记录玩家得分、length记录贪吃蛇长度、speed记录游戏速度,以及map表示游戏地图。

typedef struct {int x, y;} POS;typedef struct {POS pos[MAX_LEN];int len;int dir;} Snake;typedef struct {int value;int x, y;} Map;int score = 0;int length = 0;int speed = 300;Map map[MAX_N][MAX_M];(2)初始化游戏地图为了初始化游戏地图,可以使用循环遍历地图中的每个格子,并设置其值为0或1(表示有或没有贪吃蛇)。

贪吃蛇游戏C程序设计报告

贪吃蛇游戏C程序设计报告

目录一.设计要求 (2)二.设计的作用、目的 (2)三.课题分析 (2)1.贪吃蛇游戏功能分析 (2)2.游戏界面分析 (3)3.设计思路分析 (3)四.设计的具体实现 (3)1.系统组成模块结构及功能 (3)(1)函数定义 (3)(2)主函数main( ) (4)(3)画界面函数DrawK( ) (5)(4)游戏具体过程函数GamePlay() (6)(5)游戏结束函数GameOver() (9)2.系统程序结构及流程图 (10)3.重要函数介绍 (12)4.程序代码编写及注释 (14)5.软件调试问题分析及解决方法 (20)6.软件运行结果 (20)五.心得体会及建议 (22)六.参考文献 (23)贪吃蛇游戏C程序设计报告一.设计要求通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。

(1).收集资料,分析课题,分解问题,形成总体设计思路;(2).深入分析各个小问题,列出大纲,编写各部分程序模块;(3).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;(4).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;(5).完成课程设计报告,并进行答辩。

二.设计的作用、目的C语言是一种易学易懂的通用程序设计语言,由于它具有功能性强,运用简洁,灵活兼有高级语言与低级语言的优点,以及“目标程序效率高”可移植性和能在各种系统上普遍实现等特点使它成为当今世界上的主流程序设计语言之一,同时被选作目前全世界广泛应用,同时也是大学生必修的科目。

作为当代的大学生要很好的利用它,学好一门设计语言,实现学以至用。

制作C程序报告,是为了巩固和加深对C语言课程的基本知识的理解和掌握,并且能够掌握C语言编程和程序调试的基本技能。

通过游戏程序的设计训练和提高学生的基本技能,掌握字符串的表示方法和字符串函数的功能、Turbo C图形操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高运用C语言解决实际问题的能力,巩固C语言语法规则的理解和掌握,学会通过源程序写出流程图,提高自学以及查阅资料的能力。

贪吃蛇小游戏实验报告[

贪吃蛇小游戏实验报告[

- 0 -软件设计报告设计题目: 贪吃蛇 目录一. 需求分析 二. 概要设计 三. 详细设计四. 心得体会一. 需求分析1.1关于题目 1.1.1题目要求(1)利用MicrosoftVisualC++制作一个贪吃蛇的小游戏, 要求:(2)应用MFC 单文档制作(3)能够记录游戏成绩学 院:专业班级:学生姓名:学生学号:指导教师:提交时间:成 绩:(4)可根据玩家要求设置游戏速度(级别): 初级, 中级, 高级可以根据个人喜好更换背景图片, 食物图片, 障碍物图片, 结束图片等1.1.2选题背景贪吃蛇是家喻户晓的益智类小游戏, 选择这个题目一是为了将自己的所学知识加以运用, 二是一直以来贪吃蛇这个游戏就深深地吸引着我们, 它的制作方法对于以前的我们而言都是很神秘的。

我们希望通过自己的所学知识把它剖析开来, 真真正正的了解它的本质和精髓。

虽然我们的编程能力不是很强, 但是我们有信心, 在这次学习中我们将从实践和实际的项目中提高自己的编程能力。

因此我们选定了这个题目。

1.2关于编译软件本程序采用Microsoft Visual C++6.0的英文版本进行编译。

VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具, 尽管Microsoft公司推出了.NET平台的集成开发环境, 但由于其良好的界面和可操作性, 加上支持标准C/C++规范, 但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。

- 1 -1.3关于兼容性本程序经过调试, 可以在XP系统下编译运行, 也可以在Vista下运行, 界面稍有不同, 但不影响运行结果。

二. 概要设计2.1软件主要功能设计2.1.1程序结构根据分析, 贪吃蛇这个程序一共要实现如下几个功能, 包括游戏方面开始游戏、停止游戏, 设置游戏级别(速度), 设置图片等。

具体的程序结构如下面的图1-1所示。

- 2 -图2-1 贪吃蛇结构图2.1.2程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。

贪吃蛇(C语言)

贪吃蛇(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语言“贪吃蛇”程序设计报告

山东交通学院C语言课程设计贪吃蛇游戏编程院(系)别信息工程系班级学号姓名指导教师时间2011-03-28—2011-04-01课程设计任务书题目贪吃蛇游戏编程系 (部) 信息工程系专业班级学生姓名学号03 月 28 日至 04 月 01 日共 1 周指导教师(签字)系主任(签字)年月日成绩评定表目录一.摘要 (06).二.题目要求 (07)三.设计思想 (07)四.数据结构设计及用法说明 (07)五.程序描述 (08)六.程序流程图 (09)七.程序源代码及注释 (11)八.运行结果 (23)九.课程设计总结 (25)十.参考文献 (26)5一.摘要:食いしん坊な蛇ゲームは1つのすばらしくて小さいゲームで、当設計は3つの等級に分けます。

1匹の蛇は閉鎖的な塀の中で、塀の中で無作為の出現の1つの食品、キーボードの4つのカーソルキーによってを通じて(通って)上下左右の4つの方向のモバイルに蛇を制御して、スネークヘッドは食品をぶつかって倒して、食品は食べてしまわれて、蛇の体の長さの1節(つ)、同時に等級は1のために1分計算して、等級は2のために2分計算して、等級は3のために3分計算します。

引き続いてまた食品が現れて、蛇が食べにくることを待って、もし蛇はモバイル中で壁あるいは体の交差するスネークヘッドにぶつかって自分の体のゲームオーバーをぶつかって倒すならば。

索引のキーワー:ド:食いしん坊な蛇プログラミングします6二.题目要求A 用键盘的方向键控制蛇的上下左右移动。

B 游戏分为三种难度,SLUG为慢速,每吃一朵花得1分;WORM为中速,每吃一朵花得2分;PYTHON为快速,每吃一朵花得3分。

C 游戏目标:操纵屏幕上那条可爱的小蛇,在黑框中不停吃花,而每吃一朵花,蛇的身体都变的更长一些,游戏的难度也会随之加大。

D 游戏终止:终止条件1——蛇头撞到墙上;终止条件2——蛇身形成一个圈,也就是蛇头碰到自身的任何一处。

用C实现经典的贪吃蛇游戏

用C实现经典的贪吃蛇游戏

用C实现经典的贪吃蛇游戏经典贪吃蛇游戏的C语言实现贪吃蛇是一款经典的游戏,它具有简单的规则和上瘾的玩法。

本文将介绍如何使用C语言实现经典的贪吃蛇游戏。

一、游戏规则简介在贪吃蛇游戏中,玩家操控一条蛇,通过操纵蛇的移动方向来吃掉食物。

随着蛇吃到食物的数量增加,蛇的身体也会逐渐变长。

玩家需要注意的是,蛇的头部不能碰到自己的身体或游戏边界,否则游戏结束。

二、游戏实现思路要实现贪吃蛇游戏,我们需要解决以下几个主要问题:1. 游戏画面的绘制:使用C语言的图形库,如graphics.h或SDL,来绘制游戏画面。

2. 蛇的移动:通过键盘控制蛇的移动方向,确定蛇每次移动的位置。

3. 食物的生成:在游戏区域中随机生成食物,供蛇吃掉。

4. 身体碰撞检测:判断蛇的头部是否碰到自身的身体或游戏边界,如果是,则游戏结束。

三、游戏实现步骤以下是实现贪吃蛇游戏的简要步骤:1. 初始化游戏:设置游戏窗口大小、颜色和其他必要的初始化操作。

在游戏区域中生成一条初始长度为3的蛇,设置蛇的初始位置和移动方向。

2. 绘制游戏画面:使用图形库提供的函数,在游戏窗口中绘制蛇的身体和食物。

3. 键盘控制移动:使用键盘监听函数,当玩家按下方向键时,改变蛇的移动方向。

4. 蛇的移动:根据蛇的当前位置和移动方向,更新蛇头的位置,并将蛇头加入蛇的身体中,同时删除蛇的尾部,实现蛇的移动。

5. 食物的生成:在游戏区域中随机生成食物,初始位置不能与蛇的位置重叠。

6. 身体碰撞检测:判断蛇的头部是否碰到自身的身体或游戏边界,如果是,则游戏结束。

7. 游戏结束:显示游戏得分和结束信息,释放资源。

四、代码实现示例(部分代码)```c#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <time.h>#include <Windows.h>#include <stdbool.h>// 定义游戏窗口大小和蛇身颜色#define WIDTH 80#define HEIGHT 25#define SNAKE_COLOR 15// 定义蛇的结构体typedef struct _node {int x; // 蛇身坐标xint y; // 蛇身坐标ystruct _node* next; // 指向下一个节点的指针} node;node* head; // 蛇头指针node* tail; // 蛇尾指针int direction; // 蛇的移动方向int score; // 游戏得分// 初始化蛇void initSnake() {// 创建蛇头节点head = (node*)malloc(sizeof(node)); head->x = WIDTH / 2;head->y = HEIGHT / 2;head->next = NULL;// 设置初始移动方向direction = 'w';}// 绘制游戏画面void draw() {// 清空屏幕system("cls");// 绘制蛇身node* p = head;while (p) {gotoxy(p->x, p->y);printf("■");p = p->next;}// 绘制食物// 绘制游戏信息gotoxy(0, HEIGHT + 1);printf("Score: %d", score);}// 键盘控制移动void control() {char ch;if (_kbhit()) {ch = _getch();if (ch == 'w' || ch == 's' || ch == 'a' || ch == 'd') { direction = ch;}}}// 蛇的移动void move() {// 根据移动方向改变蛇头位置// 更新蛇身位置// 判断是否吃到食物 // 判断是否撞墙或自身}int main() {// 初始化游戏// 游戏循环while (true) {// 绘制游戏画面// 键盘控制移动// 蛇的移动// 判断游戏是否结束 }// 游戏结束return 0;}```以上是使用C语言实现经典贪吃蛇游戏的简要介绍。

贪吃蛇实训报告

贪吃蛇实训报告

郑州轻工业学院实训报告实训名称:贪吃蛇指导教师:姓名:学号:班级:提交日期:一.实验目的通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。

二.实验题目本次实训的题目为贪吃蛇。

通过使用C#编程语言来实现。

三.功能描述1.游戏的基本功能描述1)游戏场地是一片矩形区域的空地构成,蛇可以在这片定义的区域中自由移动。

2)定义一个Block来构成石块,蛇头,蛇身以及豆。

蛇由蛇头和蛇身组成。

3)当游戏开始之后,定义的区域中出现一颗豆和一条蛇,并且蛇不停地移动,蛇移动的方向与蛇头的方向一致。

4)通过space或者暂停键可以使游戏停止,蛇停止移动,分数停止积分。

5)当蛇移动时,玩家可以使用“↑”、“↓”、“←”和“→”四个方向键改变蛇的移动方向。

6)当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生成一颗新的豆,蛇身增加一节。

7)当蛇头碰到石块时,蛇死亡,游戏结束。

8)当蛇头咬到蛇身时,则蛇死亡,游戏结束。

9)当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。

10)游戏分为不同的级别,第一关游戏速度为200,当蛇吃五个豆子就可以过关,级别显示为2,速度增加100变为300.第二关为吃够10个豆子,速度增加50,以后以此类推。

11)游戏菜单中设有游戏帮助,玩家可以通过点击帮助了解游戏的玩法。

12)对于不是第一次玩的玩家可以改变蛇的运动速度,来增加难度。

在菜单中设有加速和减速两个键,单击可以改变速度。

13)游戏菜单中还有时间显示。

14)当游戏暂停时,可以通过“继续”键使游戏继续进行。

四.需求分析本游戏用户可以自己练习和娱乐。

本游戏需要满足以下几点要求:(1)利用方向键“↑、↓、←、→”来改变蛇的运行方向。

(2)空格键暂停游戏,并在随机的地方产生食物。

(3)吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。

可行性分析:贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。

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