贪吃蛇游戏程序的设计说明

合集下载

C语言贪吃蛇程序设计说明书

C语言贪吃蛇程序设计说明书

C语言贪吃蛇程序设计说明书题目:贪吃蛇游戏学校: 系别: 专业班级: 姓名: 学号: 指导老师: 日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。

每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。

二、功能设计:本游戏要求实现以下几个功能:(1) 用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2) 用户可以调节蛇的运行速度来选择不同的难度;(3) 游戏分多个难度级别;(4) 用户可自选颜色;(5) 记录成绩前五名的游戏玩家;(6) 增加背景音乐;(7) 提高障碍物和游戏级别。

三、程序模块图:贪吃蛇游戏初画控设帮始图制置助模模模模化块块块块墙蛇食移食死变成等音体身物动物亡长绩级效2四、算法流程图:开始初始化界面和蛇身放置食物获取按键开始运动碰到边界是否否蛇吃到食是蛇长大蛇死亡是继续否结束3五、函数原型与功能 1.主函数:void main()启动程序,触动其他函数。

2.初始化:void init ()设置背景框大小、蛇体初始值,随机产生食物。

3.随机产生食物:void setfoodcrd()设置食物生成坐标,0表示食物被吃。

4.画食物:void showfood()用矩形框来画食物5.画蛇:void showsnake()根据蛇的坐标和节数,循环用矩形框来画蛇。

6.蛇移动:void snakemove() 根据按键,重设坐标7.改变蛇的方向:void changeskdir()响应用户的运动方向8.判断蛇是否死亡:void judgeslod判断蛇是否碰到自己或墙。

9.判断蛇是否吃到食物:void judgefood()判断是否吃到食物,吃食后变0,蛇增长一节。

10.结束游戏:void gameover()结束话语,并执行下一步。

六、基本代码#include<graphics.h> #include<conio.h>#include<stdio.h>#pragma comment(lib,"Winmm.lib")#include "MyTimer.h" #define SIZEMAX 100 /*蛇最大长度*/ #define SPEED 100 /*初始速度*/ #define len 20 /*蛇宽度*/#define lm 10 /*蛇每次移动距离*/ #define initlen 600 /*初始化窗口正方形的长度*/ #define Min_snakelen 2 /*蛇的最小长度*/typedef struct {int x,y;}DIR;int snakelen=Min_snakelen; /*蛇的长度*/4int isfood=1; /*食物状态*/ int isover=0; /*游戏状态*/int ispause=1; /*暂停状态*/int ismusic=1; /*音乐播放状态*/ char dir; /*记录蛇运动的方向*/ char c='d';DIR snake[500],food; /*定义蛇节点和食物的类型*/ int speed=SPEED;void drawmap() /*画地图函数*/ {IMAGE img;char str[10];loadimage(&img,"贪吃蛇.jpg"); /*游戏界面*/putimage(0,0,&img);loadimage(&img,"7.jpg"); /*侧栏提示*/putimage(600,0,&img);sprintf(str,"%d",snakelen);setfont(30,0,"宋体");setbkmode(TRANSPARENT);outtextxy(620,10,"操作说明:");setfont(20,0,"宋体");outtextxy(615,50,"awsd控制方向键");outtextxy(615,80,"p键暂停");outtextxy(615,110,"o键继续");outtextxy(615,200,"esc键退出");outtextxy(615,140,"l键暂停音乐");outtextxy(615,170,"k键继续播放");outtextxy(730,250,str);outtextxy(620,250,"蛇当前长度");}void init() /*初始化蛇函数*/ {int i;IMAGE img;snake[0].x=9*len+lm;snake[0].y=4*len+lm;loadimage(&img,"1.jpg");putimage(snake[0].x-lm,snake[0].y-lm,&img); for(i=1;i<snakelen;i++){snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;5loadimage(&img, "2.jpg");putimage(snake[i].x-lm,snake[i].y-lm, &img); }}void showsnake() /*画蛇函数*/ {int i;IMAGE img;loadimage(&img, "1.jpg");putimage(snake[0].x-lm,snake[0].y-lm , &img);loadimage(&img, "2.jpg");for(i=1;i<snakelen;i++)putimage(snake[i].x-lm,snake[i].y-lm, &img); }void snakemove() /*画动蛇函数*/ {int i;int mx=snake[0].x;int my=snake[0].y;switch(dir){case 'a':mx-=len;break;case 'd':mx+=len;break;case 'w':my-=len;break;case 's':my+=len;break;default:break;}for(i=snakelen-1;i>=0;i--){snake[i+1].x=snake[i].x;snake[i+1].y=snake[i].y;}snake[0].x=mx;snake[0].y=my;showsnake();}int ceshiover() /*检测游戏结束函数*/ {int i;if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm)return 1;for(i=1;i<snakelen;i++)6{if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y) return 1;}return 0;}int foodinsnake() /*检测食物是否在蛇上函数*/ {for(int i=0;i<snakelen;i++)if(food.x==snake[i].x&&food.y==snake[i].y)return 1;elsereturn 0;}void showfood() /*画食物函数*/{IMAGE img;do{food.x=(rand()%30)*len+lm;food.y=(rand()%30)*len+lm;}while(foodinsnake());loadimage(&img, "3.jpg");putimage(food.x-lm,food.y-lm , &img);isfood=0;}void kmusic(){if(ismusic==0)mciSendString("pause mymusic",NULL,0,NULL);if(ismusic==1)mciSendString("resume mymusic",NULL,0,NULL);}void playbkmusic() /*播放背景音乐函数*/{mciSendString("open 超级玛丽.mp3 alias mymusic", NULL, 0, NULL); mciSendString("play mymusic repeat", NULL, 0, NULL);}void playgame() /*玩游戏函数*/{c='d'; //蛇开始向右移动isover=0;7snakelen=Min_snakelen;dir='d';IMAGE img;MyTimer t; //定义精确延时对象int T=200; // 延长时间drawmap(); //画游戏地图init(); //画小蛇初始位置while(!isover){if(ispause){snakemove();FlushBatchDraw(); //批量绘图EndBatchDraw(); //结束批量绘图if(snake[0].x==food.x&&snake[0].y==food.y){ snakelen++;isfood=1;}if(isfood)showfood();if(snakelen<35)T=200-3*snakelen;t.Sleep(T);BeginBatchDraw(); // 开始批量绘图模式,防止闪烁问题drawmap();loadimage(&img, "3.jpg"); // 加载食物图片putimage(food.x-lm,food.y-lm , &img);};//按键控制if(kbhit())c=getch();switch(c){case 'a':if(dir!='d'){dir=c;}break;case 'd':if(dir!='a'){dir=c;}break;case 'w':if(dir!='s'){8dir=c;}break;case 's':if(dir!='w'){dir=c;}break;case 27: exit(0); break; //游戏退出case 'p': ispause=0;break; //p暂停case 'o': ispause=1;break; //o继续游戏case 'l': ismusic=0;break; //l暂停音乐case 'k': ismusic=1;break; //k继续播放default:break;}kmusic(); //音乐控制播放//判断游戏结束if(ceshiover())isover=1;//判断是否重新再来HWND wnd = GetHWnd(); //获取窗口句柄if(isover)if (MessageBox(wnd, "游戏结束。

C++贪吃蛇说明

C++贪吃蛇说明

C语言课程设计报告题目:贪吃蛇指导教师:**院系:电气信息工程学院班级: 01 *名:***学号: 15目录1程序设计目的.......................................... 错误!未定义书签。

2程序设计具体要求...................................... 错误!未定义书签。

3程序功能.............................................. 错误!未定义书签。

4设计思路.............................................. 错误!未定义书签。

5程序清单.............................................. 错误!未定义书签。

6总结与体会............................................ 错误!未定义书签。

7结束语................................................ 错误!未定义书签。

1、课程设计目的:1.进一步掌握和利用C语言进行行程设计的能力;2.进一步理解和运用结构化程序设计的思想和方法;3.初步掌握开发一个小型实用系统的基本方法;4.学会调试一个较长程序的基本方法;5.学会利用流程图表示算法;6.掌握书写程序设计开发文档的能力(书写课程设计报告)。

2、课程设计具体要求:贪吃蛇是一种风靡全球的小游戏,就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的蛋,越吃越长。

只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。

和别的游戏不同,贪食蛇是一个悲剧性的游戏。

许多电子游戏都是打通关到底,游戏操作者以胜利而告终。

而贪食蛇的结局却是死亡。

“贪食蛇”,要命的就在一个“贪”字上。

所以,有时候真的需要及时收手,不要逼人太甚。

如果没有余地,就算你的手再快,面临的结局也是——崩盘。

C语言贪吃蛇程序设计说明书

C语言贪吃蛇程序设计说明书

C语言贪吃蛇程序设计说明书题目:贪吃蛇游戏学校: 系别: 专业班级: 姓名: 学号: 指导老师: 日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。

每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。

二、功能设计:本游戏要求实现以下几个功能:(1) 用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2) 用户可以调节蛇的运行速度来选择不同的难度;(3) 游戏分多个难度级别;(4) 用户可自选颜色;(5) 记录成绩前五名的游戏玩家;(6) 增加背景音乐;(7) 提高障碍物和游戏级别。

三、程序模块图:贪吃蛇游戏初画控设帮始图制置助模模模模化块块块块墙蛇食移食死变成等音体身物动物亡长绩级效2四、算法流程图:开始初始化界面和蛇身放置食物获取按键开始运动碰到边界是否否蛇吃到食是蛇长大蛇死亡是继续否结束3五、函数原型与功能 1.主函数:void main()启动程序,触动其他函数。

2.初始化:void init ()设置背景框大小、蛇体初始值,随机产生食物。

3.随机产生食物:void setfoodcrd()设置食物生成坐标,0表示食物被吃。

4.画食物:void showfood()用矩形框来画食物5.画蛇:void showsnake()根据蛇的坐标和节数,循环用矩形框来画蛇。

6.蛇移动:void snakemove() 根据按键,重设坐标7.改变蛇的方向:void changeskdir()响应用户的运动方向8.判断蛇是否死亡:void judgeslod判断蛇是否碰到自己或墙。

9.判断蛇是否吃到食物:void judgefood()判断是否吃到食物,吃食后变0,蛇增长一节。

10.结束游戏:void gameover()结束话语,并执行下一步。

六、基本代码#include<graphics.h> #include<conio.h>#include<stdio.h>#pragma comment(lib,"Winmm.lib")#include "MyTimer.h" #define SIZEMAX 100 /*蛇最大长度*/ #define SPEED 100 /*初始速度*/ #define len 20 /*蛇宽度*/#define lm 10 /*蛇每次移动距离*/ #define initlen 600 /*初始化窗口正方形的长度*/ #define Min_snakelen 2 /*蛇的最小长度*/typedef struct {int x,y;}DIR;int snakelen=Min_snakelen; /*蛇的长度*/4int isfood=1; /*食物状态*/ int isover=0; /*游戏状态*/int ispause=1; /*暂停状态*/int ismusic=1; /*音乐播放状态*/ char dir; /*记录蛇运动的方向*/ char c='d';DIR snake[500],food; /*定义蛇节点和食物的类型*/ int speed=SPEED;void drawmap() /*画地图函数*/ {IMAGE img;char str[10];loadimage(&img,"贪吃蛇.jpg"); /*游戏界面*/putimage(0,0,&img);loadimage(&img,"7.jpg"); /*侧栏提示*/putimage(600,0,&img);sprintf(str,"%d",snakelen);setfont(30,0,"宋体");setbkmode(TRANSPARENT);outtextxy(620,10,"操作说明:");setfont(20,0,"宋体");outtextxy(615,50,"awsd控制方向键");outtextxy(615,80,"p键暂停");outtextxy(615,110,"o键继续");outtextxy(615,200,"esc键退出");outtextxy(615,140,"l键暂停音乐");outtextxy(615,170,"k键继续播放");outtextxy(730,250,str);outtextxy(620,250,"蛇当前长度");}void init() /*初始化蛇函数*/ {int i;IMAGE img;snake[0].x=9*len+lm;snake[0].y=4*len+lm;loadimage(&img,"1.jpg");putimage(snake[0].x-lm,snake[0].y-lm,&img); for(i=1;i<snakelen;i++){snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;5loadimage(&img, "2.jpg");putimage(snake[i].x-lm,snake[i].y-lm, &img); }}void showsnake() /*画蛇函数*/ {int i;IMAGE img;loadimage(&img, "1.jpg");putimage(snake[0].x-lm,snake[0].y-lm , &img);loadimage(&img, "2.jpg");for(i=1;i<snakelen;i++)putimage(snake[i].x-lm,snake[i].y-lm, &img); }void snakemove() /*画动蛇函数*/ {int i;int mx=snake[0].x;int my=snake[0].y;switch(dir){case 'a':mx-=len;break;case 'd':mx+=len;break;case 'w':my-=len;break;case 's':my+=len;break;default:break;}for(i=snakelen-1;i>=0;i--){snake[i+1].x=snake[i].x;snake[i+1].y=snake[i].y;}snake[0].x=mx;snake[0].y=my;showsnake();}int ceshiover() /*检测游戏结束函数*/ {int i;if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm)return 1;for(i=1;i<snakelen;i++)6{if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y) return 1;}return 0;}int foodinsnake() /*检测食物是否在蛇上函数*/ {for(int i=0;i<snakelen;i++)if(food.x==snake[i].x&&food.y==snake[i].y)return 1;elsereturn 0;}void showfood() /*画食物函数*/{IMAGE img;do{food.x=(rand()%30)*len+lm;food.y=(rand()%30)*len+lm;}while(foodinsnake());loadimage(&img, "3.jpg");putimage(food.x-lm,food.y-lm , &img);isfood=0;}void kmusic(){if(ismusic==0)mciSendString("pause mymusic",NULL,0,NULL);if(ismusic==1)mciSendString("resume mymusic",NULL,0,NULL);}void playbkmusic() /*播放背景音乐函数*/{mciSendString("open 超级玛丽.mp3 alias mymusic", NULL, 0, NULL); mciSendString("play mymusic repeat", NULL, 0, NULL);}void playgame() /*玩游戏函数*/{c='d'; //蛇开始向右移动isover=0;7snakelen=Min_snakelen;dir='d';IMAGE img;MyTimer t; //定义精确延时对象int T=200; // 延长时间drawmap(); //画游戏地图init(); //画小蛇初始位置while(!isover){if(ispause){snakemove();FlushBatchDraw(); //批量绘图EndBatchDraw(); //结束批量绘图if(snake[0].x==food.x&&snake[0].y==food.y){ snakelen++;isfood=1;}if(isfood)showfood();if(snakelen<35)T=200-3*snakelen;t.Sleep(T);BeginBatchDraw(); // 开始批量绘图模式,防止闪烁问题drawmap();loadimage(&img, "3.jpg"); // 加载食物图片putimage(food.x-lm,food.y-lm , &img);};//按键控制if(kbhit())c=getch();switch(c){case 'a':if(dir!='d'){dir=c;}break;case 'd':if(dir!='a'){dir=c;}break;case 'w':if(dir!='s'){8dir=c;}break;case 's':if(dir!='w'){dir=c;}break;case 27: exit(0); break; //游戏退出case 'p': ispause=0;break; //p暂停case 'o': ispause=1;break; //o继续游戏case 'l': ismusic=0;break; //l暂停音乐case 'k': ismusic=1;break; //k继续播放default:break;}kmusic(); //音乐控制播放//判断游戏结束if(ceshiover())isover=1;//判断是否重新再来HWND wnd = GetHWnd(); //获取窗口句柄if(isover)if (MessageBox(wnd, "游戏结束。

课程设计贪吃蛇小游戏程序设计

课程设计贪吃蛇小游戏程序设计

信息技术学院本科课程设计报告课程设计题目学生姓名:李雪学院:信息技术学院专业:信息治理与信息系统班级:B1102学号:0911110201指导教师:王浩涌完成日期:辽东学院Eastern Liaoning University一、题目(问题)描述贪吃蛇小游戏程序设计图1 贪吃蛇系统界面二、功能分析贪吃蛇游戏是一个经典小游戏,一条蛇在封锁围墙里,围墙里随机显现一个食物,通过按键盘四个光标键操纵蛇向上下左右四个方向移动,蛇头撞倒食物,那么食物被吃掉,蛇躯体长一节,同时记10分,接着又显现食物,等待蛇来吃,若是蛇在移动中撞到墙或躯体交叉蛇头撞倒自己躯体游戏终止。

三、系统设计1.程序整体结构图2贪吃蛇程序系统的构图2.界面设计如图,通过W、S、A、D、space键进行操作3.输入方式设计A 用W、S、A、D、键操纵蛇的上下左右移动,space键停止,esc键终止。

B 游戏目标:操纵屏幕上那条可爱的小蛇,在方框中不断吃豆豆,而每吃一个豆豆,蛇的躯体都变的更长一些,即增加一颗星星。

游戏的难度也会随之加大。

C 游戏终止:终止条件1——蛇头撞到墙上;终止条件2——蛇身形成一个圈,也确实是蛇头碰着自身的任何一处4.重要数据的数据结构设计5.函数设计6.函数挪用图7. 实体属性图四、关键技术、难点及其解决方式五、测试方式六、总结附录1程序源代码#include <windows.h>#include <stdlib.h>#include <time.h>#include <stdio.h>#include <string.h>#include <conio.h>#define N 21int apple[3];char score[3];char tail[3];void gotoxy(int x, int y) //输出坐标{COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); }void color(int b) //颜色函数{HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;SetConsoleTextAttribute(hConsole,b) ;int Block(char head[2]) //判定出界{if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))return 1;return 0;}int Eat(char snake[2]) //吃了苹果{if ((snake[0] == apple[0]) && (snake[1] == apple[1])){apple[0] = apple[1] = apple[2] = 0;gotoxy(N+44,10);color(13);printf("%d",score[0]*10);color(11);return 1;}return 0;}void Draw(char **snake, int len) //蛇移动{if (apple[2]) {gotoxy(apple[1] * 2, apple[0]);color(12);printf("●");color(11);}gotoxy(tail[1] * 2, tail[0]);if (tail[2]){ color(14);printf("★");color(11);}elseprintf("■");gotoxy(snake[0][1] * 2, snake[0][0]);color(14);printf("★");color(11);putchar('\n');char** Move(char **snake, char dirx, int *len) //操纵方向{int i, full = Eat(snake[0]);memcpy(tail, snake[(*len)-1], 2);for (i = (*len) - 1; i > 0; --i)memcpy(snake[i], snake[i-1], 2);switch (dirx){case 'w': case 'W': --snake[0][0]; break;case 's': case 'S': ++snake[0][0]; break;case 'a': case 'A': --snake[0][1]; break;case 'd': case 'D': ++snake[0][1]; break;default: ;}if (full){snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));snake[(*len)] = (char *)malloc(sizeof(char) * 2);memcpy(snake[(*len)], tail, 2);++(*len);++score[0];if(score[3] < 16)++score[3];tail[2] = 1;}elsetail[2] = 0;return snake;}void init(char plate[N+2][N+2], char ***snake_x, int *len) //初始化{int i, j;char **snake = NULL;*len = 3;score[0] = score[3] =3;snake = (char **)realloc(snake, sizeof(char *) * (*len));for (i = 0; i < *len; ++i)snake[i] = (char *)malloc(sizeof(char) * 2);for (i = 0; i < 3; ++i){snake[i][0] = N/2 + 1;snake[i][1] = N/2 + 1 + i;}for (i = 1; i <= N; ++i)for (j = 1; j <= N; ++j)plate[i][j] = 1;apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;apple[2] = 1;for (i = 0; i < N + 2; ++i){gotoxy(0, i);for (j = 0; j < N + 2; ++j){switch (plate[i][j]){case 0:color(12);printf("□");color(11); continue;case 1: printf("■"); continue;default: ;}}putchar('\n');}for (i = 0; i < (*len); ++i){gotoxy(snake[i][1] * 2, snake[i][0]);printf("★");}putchar('\n');*snake_x = snake;}void Manual(){gotoxy(N+30,2);color(10);printf("按W S A D 移动方向");gotoxy(N+30,4);printf("按space 键暂停");gotoxy(N+30,8);printf("历史最高分为: ");color(12);gotoxy(N+44,8);printf("%d",score[1]*10);color(11);gotoxy(N+30,12);printf("你此刻得分为: 0");}int File_in() //取记录的分数{FILE *fp;if((fp = fopen("C:\\tcs.txt","a+")) == NULL){gotoxy(N+18, N+2);printf("文件不能打开\n");exit(0);}if((score[1] = fgetc(fp)) != EOF);elsescore[1] = 0;return 0;}int File_out() //存数据{FILE *fp;if(score[1] > score[0]){gotoxy(10,10);color(12);puts("闯关失败加油耶");gotoxy(0,N+2);return 0;}if((fp = fopen("C:\\tcs.txt","w+")) == NULL){printf("文件不能打开\n");exit(0);}if(fputc(--score[0],fp)==EOF)printf("输出失败\n");gotoxy(10,10);puts("恭喜您打破记录");gotoxy(0,N+2);return 0;}void Free(char **snake, int len) //释放空间{int i;for (i = 0; i < len; ++i)free(snake[i]);free(snake);}int main(void){int len;char ch = 'g';char a[N+2][N+2] = {{0}};char **snake;srand((unsigned)time(NULL));color(11);File_in();init(a, &snake, &len);Manual();while (ch != 0x1B) // 按ESC 终止{Draw(snake, len);if (!apple[2]) {apple[0] = rand()%N + 1;apple[1] = rand()%N + 1;apple[2] = 1;}Sleep(200-score[3]*10);setbuf(stdin, NULL);if (kbhit()){gotoxy(0, N+2);ch = getche();}snake = Move(snake, ch, &len);if (Block(snake[0])==1){gotoxy(N+2, N+2);puts("你输了");File_out();Free(snake, len);getche();exit(0);}}Free(snake, len);exit(0);}。

贪吃蛇设计说明书

贪吃蛇设计说明书

贪吃蛇设计说明书贪吃蛇设计说明书开发小组成员:目录1.需求陈述 (3)2.软件结构 (3)2.1用例图 (3)2.2类图 (4)2.3状态图---------------------------------------------------------------4 3.程序描述 (4)3.1功能 (5)3.2性能 (5)3.3输入项目 (5)3.4输出项目 (6)3.5算法 (6)3.6程序逻辑 (6)4.测试要点-----------------------------------------75.对象设计-------------------------------------------------------------------71.需求陈述1.用户需要开发一款命名为贪吃蛇的休闲小游戏2.开始游戏时,存在一条向右运动的小蛇和蛇需要吃掉的豆3.用户通过键盘的“上下左右”键控制小蛇分别向“上下左右”运动来吃掉豆,同时增加自身的长度4.小蛇吃掉游戏规定数量的豆后,游戏结束5.游戏分为初级、中级、高级6.小蛇不能碰到边界7.小蛇自身不能碰撞8.游戏可以暂停和重新开始9.游戏完成后计算所得分数10.游戏在任何时候都可以退出2.软件结构1.用例图2.类图3.状态图3.程序描述3.1功能小蛇可以通过方向键进行方向的变化。

屏幕上随机的出现豆,贪吃蛇在运动的过程中蛇头可以吃掉出现的的豆。

吃掉豆后,蛇的身体会增长一节。

当蛇的身体碰到四周的墙壁或者是自己的身体时,游戏会结束。

并且,在屏幕的上方有一个分数牌显示,游戏开始时分数为0,每当蛇吃掉一个豆,分数会增加10分。

而在游戏的过程中,玩家可以按菜单上的退出键或点击界面的关闭按钮退出游戏。

3.2性能本款游戏在界面设计上清晰明了、美观大方;在操作上简单、易懂。

有效率高,不易出错的优点。

本游戏着重于娱乐大众,并且有锻炼反应速度的特点。

3.3输入项目1)用户在界面菜单的操作有点击“开始”、“暂停”、“结束”、“重新开始”、“初级”、“中级”、“高级”。

c语言贪吃蛇小游戏程序课程设计

c语言贪吃蛇小游戏程序课程设计

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

)二、技术路线使用VC++6.0作为开发环境,采用控制台的形式完成整个游戏的开发,没有用到MFC。

加入了pcc32.h的头文件及库文件,用于对控制台打印效果的控制。

同时也加入了PlaySound()函数,实现了对菜单选择,游戏开始,游戏结束的音效控制。

游戏栏和输出栏的同时打印,数据的更新打印效果,没有采用双线程的方法实现。

接收用户键盘输入信息,实现游戏暂停,重新开始,菜单选择和进入菜单。

三、设计与实现1.游戏基本功能:游戏有开始菜单界面,并有开始游戏,游戏帮助,关于游戏,退出游戏四个选项游戏初始化后,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个方向键控制蛇移动,蛇在移动过程中撞到墙壁将不会死亡,而是穿过围墙继续行进,但是如果蛇身体交叉蛇头撞到自己的身体,则游戏结束。

同时,游戏过程中可暂停游戏,并有积分系统,且积分每满一定值,蛇的运行速度也会逐步增加。

2.函数定义和声明(1)头文件#include<iostream>#include<windows.h>#include<conio.h>#include<time.h>#include<stdlib.h>#include "mmsystem.h" #pragma comment (lib,"winmm.lib")#include"pcc32.h"#pragma comment(lib, "pcc32_vc6.lib") using namespace std; #define UP 72//定义上下左右常量#define DOWN 80#define LEFT 75#define RIGHT 77#define ESC 27#define SPACE 32//空格#define ENTER 13//回车(2)函数声明void GamePrint();//游戏开始画面函数void Gameinit();//游戏初始化函数void Sweep_Screem();//清屏函数void Gotoxy(int , int); //光标移动函数void Hid_Cursor();//光标隐藏函数void Snake_Move();//蛇运动函数int Create_Food();//食物产生函数void Pwall();//画墙函数void Key();//键盘操作和处理函数void Hit_Wall();//判断是否撞墙void Eat_Itself();//判断是否咬到自己void Whether_Eat();//判断蛇是否吃到食物void GameRun();//游戏运行函数void SurFace();//开始菜单界面void GameOver(); //游戏结束判断函数void Pause();//游戏暂停函数void MyCount1();//统计边栏,用来做提示void MyCount2();//统计边栏,用来做一些统计void Menu( int );//开始界面void Inti_Data();//初始化数据(3)变量声明int X, Y;//食物坐标int Map[79][24]={{0}};//地图尺寸,其实有食物记为1int over = 0;//用来标记游戏结束int score = 0;//记录分数int speed = 130;//记录速度int ColoArray[15]={15,1,2,3,4,5,6,7,8,9,10,11,12,13,14} ;//自己定义的用来控制颜色的数组int length = 3;//初始化蛇的长度为3int Key_Menu;//开始菜单界面用的零时按键3.主函数int main()int main() //主函数{START:Inti_Data();fixConsoleSize(18,15);Hid_Cursor();SurFace();PlaySound(TEXT("m22.wav"), NULL, SND_FILENAME | SND_ASYNC );fixConsoleSize(105,25);GamePrint();Gameinit();GameRun();while(over) //如果游戏结束了,是否重新开始。

贪吃蛇设计报告

贪吃蛇设计报告

贪吃蛇设计报告1. 引言贪吃蛇是一款经典的游戏,它的目标是通过操纵蛇的移动,吃掉尽量多的食物,并尽可能长大。

本文将介绍贪吃蛇游戏的设计过程和实现细节。

2. 游戏介绍贪吃蛇游戏由一个蛇和若干个食物组成。

玩家通过控制蛇的移动方向,使蛇能够吃到食物并增长身体长度。

当蛇撞到游戏边界或自己的身体时,游戏结束。

3. 游戏设计3.1 游戏场景贪吃蛇游戏的场景是一个矩形的游戏区域,可以使用二维数组来表示。

每个数组元素可以表示该位置的状态,如蛇的身体部分、食物或空白区域。

3.2 蛇的移动蛇的移动是关键部分,可以通过控制蛇的方向来实现。

蛇的长度会随着吃到食物而增加,当蛇移动时,蛇的尾部会被剪切掉,而蛇头会根据移动方向新增一个位置。

3.3 食物的生成食物的生成可以随机选择游戏区域的一个空白位置,并将该位置设置为食物。

3.4 碰撞检测碰撞检测主要检测蛇是否撞到了游戏边界或自己的身体。

当蛇的头部位置与边界或身体的其他部分位置重叠时,游戏结束。

4. 游戏实现贪吃蛇游戏可以使用编程语言来实现。

以下是一个示例的实现代码:import random# 游戏区域的大小width =10height =10# 蛇的初始位置和方向snake = [(0, 0)]direction = (1, 0)# 食物的位置food = (random.randint(0, width-1), random.randint(0, height-1))# 游戏是否结束的标志game_over =False# 游戏主循环while not game_over:# 处理输入# ...# 更新蛇的位置head = snake[0]new_head = (head[0] + direction[0], head[1] + direction[1])snake.insert(0, new_head)# 如果蛇头位置与食物位置重叠,则吃掉食物并生成新的食物if new_head == food:food = (random.randint(0, width-1), random.randint(0, height-1)) else:snake.pop()# 检测碰撞if new_head[0] <0or new_head[0] >= width or new_head[1] <0or ne w_head[1] >= height:game_over =Trueif new_head in snake[1:]:game_over =True# 渲染游戏界面# ...# 游戏结束,显示得分等信息# ...5. 总结贪吃蛇游戏是一款简单但耐人寻味的游戏,通过实现蛇的移动、食物的生成和碰撞检测等功能,可以让玩家体验到游戏的乐趣。

贪吃蛇程序设计

贪吃蛇程序设计

贪吃蛇程序设计贪吃蛇是一款经典的电子游戏,其设计简单却极具挑战性,深受各个年龄段玩家的喜爱。

下面将详细介绍贪吃蛇程序的设计过程,包括基本规则、程序结构、实现方法以及可能的扩展功能。

基本规则贪吃蛇游戏的基本规则如下:1. 游戏界面是一个矩形网格,蛇在网格中移动。

2. 蛇由多个方块组成,初始时通常只有几个方块。

3. 玩家通过键盘控制蛇头的移动方向。

4. 蛇在吃到食物后,身体长度会增加一节。

5. 如果蛇头撞到自己的身体或屏幕边缘,游戏结束。

程序结构贪吃蛇程序主要包括以下几个部分:1. 游戏界面:显示蛇、食物和网格。

2. 蛇的移动逻辑:控制蛇的移动方向和速度。

3. 食物生成逻辑:随机在界面上生成食物。

4. 碰撞检测:检测蛇是否吃到食物或撞到自己及屏幕边缘。

5. 分数和生命值:记录玩家的得分和剩余生命。

实现方法1. 初始化- 设置游戏界面的大小。

- 初始化蛇的位置和长度。

- 随机生成食物的位置。

2. 游戏循环- 监听键盘输入,更新蛇头的移动方向。

- 根据移动方向更新蛇的位置。

- 检查蛇是否吃到食物,如果是,则增加蛇的长度和分数,并生成新的食物。

- 检查蛇是否撞到自己的身体或屏幕边缘,如果是,则结束游戏。

- 刷新游戏界面,显示当前的蛇、食物和分数。

3. 绘制界面- 使用图形库或API绘制网格、蛇和食物。

4. 处理用户输入- 监听键盘事件,根据用户的输入改变蛇的移动方向。

5. 碰撞检测- 检查蛇头是否与食物重叠,如果是,则触发吃食物的逻辑。

- 检查蛇头是否与蛇身其他部分重叠,如果是,则游戏结束。

- 检查蛇头是否到达屏幕边缘,如果是,则游戏结束。

可能的扩展功能1. 多种难度级别:根据游戏难度调整蛇的移动速度或食物的生成频率。

2. 特殊食物:例如,某些食物可以让蛇短暂加速或获得保护,避免碰撞。

3. 自定义皮肤:允许玩家选择或设计蛇和食物的外观。

4. 多人模式:支持多个玩家在同一设备或网络上进行游戏。

5. 成就系统:为玩家设置各种成就目标,增加游戏的可玩性。

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

测控技术与仪器专业课程设计题单班级0982011 学生某某课程名称计算机课程设计课题贪吃蛇游戏程序设计设计要求 1.学习游戏设计有关知识。

2.设计贪吃蛇游戏程序。

3.调试并修改程序。

4.完成课程设计论文。

课题发给日期2011年6月25日课程设计完成日期2011年7月09日指导教师余某某评语:贪吃蛇游戏学生:某某班级:0882011指导老师:余某某摘要:编写C语言程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜爱的游戏,一条蛇在密闭的围墙,在围墙随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。

作为一个完整的程序,必须考虑人机交流与用户体验。

游戏的界面不能太丑,更不能连个简单的界面都没有。

游戏应该有个比较漂亮的界面,在有必要硬件支持和软件的支持下,游戏开发者必须最大限度的使游戏美观。

游戏的美观是一方面,游戏的在素质是另一方面。

一个游戏的优劣,最终由玩家决定。

在游戏与玩家见面之前,游戏开发者要设计一种让玩家投入的游戏模式,并且在一定的游戏规则下进行。

关键词:贪吃蛇流程图c语言源程序目录1 前言 (1)2 课设容 (3)2.1课设目的 (3)2.2设计功能 (3)2.3结构设计 (7)3结论 (11)参考文献 (15)附录A (16)1 前言C语言是一种易学易懂的通用程序设计语言,由于它具有功能性强,运用简洁,灵活兼有高级语言与低级语言的优点,以及“目标程序效率高”可移植性和能在各种系统上普遍实现等特点使它成为当今世界上的主流程序设计语言之一,同时被选作目前全世界广泛应用,同时也是大学生必修的科目。

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

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

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

C语言课程应注重边学边练,但由于课堂教学和实验的深度和广度有限,练习的深度也受到一定限制。

为了弥补这一点,学校开设了本课程设计。

它比教学实验复杂一些,涉及的深度广些并更加接近实用。

目的是通过课程设计的综合训练,培养我们实际分析问题、编程和动手能力,最终目标是想通过这种形式,帮助我们系统地掌握程序设计的主要容,更好地完成学业。

这次课程设计的主要特点如下:1.函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。

2.分析函数先从main()函数入手。

Main()函数是C源程序编译时的开始,从main()函数开始读函数可将其他函数的功能理解得更透彻。

3.在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。

4.我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,起功能我都有所了解。

5.它独立于具体的C语言教科书,重点放在C语言的基本特征上,以"不变"应"万变",涵盖C语言的重要基础知识,让我们熟练掌握C语言的实际使用。

6.结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实际需要。

激发学习兴趣,调动我们主动学习的积极性,并会根据实际编程要求,训练自己实际分析问题的能力及编程能力,并养成良好的编程习惯。

7.提供综合的课程设计理念,以期进一步锻炼学生的动手能力。

同时让同学合作完成这些实验,以便锻炼互相合作精神,培养团队意识。

8.通过观察网络的实例,循序渐进地启发学生完成设计。

课程设计将要求、算法和源程序分开,为学生创造独立思考的条件。

学生在充分理解要求和算法的前提下,设计自己的应用程序。

同时我也获得了许多宝贵的经验:1) 在设计程序之前,务必要对你所设计的题目和容有一个系统的了解, 知道所设计的题目和容包含那些资源。

2) 设计程序采用什么编程语言并不是非常重要,关键要有一个清晰的思路和一个完整的软件流程图,因而,要先把设计原理与思路搞清楚,再把流程图画出来,这样设计起来就简单多了。

3) 在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改进”是程序设计的必经之路,发现错误也是取得成绩的一种。

4) 要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。

2 课设容2.1设计目的通过课程设计的综合训练,培养我们实际分析问题、编程和动手能力,据课堂讲授容,学生做相应的自主练习,消化课堂所讲解的容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。

最终目标是想通过这种形式,帮助我们系统地掌握程序设计的主要容,更好地完成学业。

2.2设计功能在这次课射中,我选择的是贪吃蛇游戏的制作,游戏是人们生活中不可或缺的,一个人从小到大,真正伴随他成长的东西,游戏占有着很重要的地位.不论是一个玩具,还是一个能和伙伴一起开心的小游戏,都是能给我们留下很多美好的回忆.所以不论是什么样的游戏,只要它能迎合人们心的某种需求,它的市场总会是好的,而贪吃蛇是一个深受人们喜爱的游戏,一条蛇在密闭的围墙,在围墙随即出现一个食物,通过按键上的四个光标键控制向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体则游戏结束。

本程序运行实现的主要技巧在二维数组的应用上,程序运行时,游戏界面如下图所示,边框表示围墙,黑色单独方块表示食物:图2.1 游戏界面2.3结构设计程序关键在于表示蛇的图形及蛇的移动。

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

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

食物的出现与消失也是画矩形块和覆盖矩形块。

为了便于理解,定义两个结构体:食物与蛇。

2.3.1 数据结构表示食物和蛇的矩形都设计为10 X 10个像素单位,食物的基本数据域为它所出现的位置,用X和y 坐标表示,则矩形块用函数rectangle(x,y,x+10,y+10)或rectangle(x,y,x+10,y-10)可以画出。

由于每次只出现一个食物,而食物被吃掉后,才出现下一个食物,所以设定yes 表示是否要出现一个食物的变量。

蛇的一节身体为一个矩形块,这样表示每个矩形块只需起点坐标x 和y。

身体是不断增长的,所以用数组存放每一节的坐标,最大设定为N=200 ,node表示当前节数。

另外还需要保存蛇移动方向的变量direction 和表示生命的变量 life ,一但life 为1,则蛇死,游戏结束。

所以程序功能的实现就是数组的操作。

#define N 200struct Food{int x; /* 食物的横坐标 */int y; /* 食物的纵坐标 */int yes; /* 判断是否出现食物的变量 */} food; /* 食物的结构体 */struct snake{int x[N]; /* 蛇的横坐标 */int y[N]; /* 蛇的纵坐标 */int node; /* 蛇的节数 */int direction; /* 蛇移动方向 */int life; /* 蛇生命,0活着,1死亡 */}snake;2.3.2 main()主函数主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序void main(void)/*主函数*/{Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}void Init(void)/*图形驱动*/{int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc"); /*第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式,第三个参数指定驱动程序所在目录。

*/cleardevice();2.3.3 画界面函数 DrawK ()主界面就是一个密封的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高度均为10 个单位的矩形小方块,围成密闭图形,表示围墙,为了醒目,设置淡青颜色,用函数setlinestyle ( SOLD_LINE,0,THICK_WIDTH )设置线型宽度为3个像素。

设置3个像素的围墙线,蛇在贴墙走的时候,会擦掉部分围墙线,使线变细,图形变得不好看,如果不想这种情况出现,则将线型宽度设置为1个像素。

void DrawK(void)/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/{setbkcolor(0);/*设置当前背景颜色*/setcolor(YELLOW);/*设置当前画线颜色*/setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i<=600;i+=10)/*画围墙*/{rectangle(i,40,i+10,49); /*上边*/rectangle(i,451,i+10,460);/*下边*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10); /*左边*/rectangle(601,i,610,i+10);/*右边*/}}2.3.4 游戏具体过程函数 GamePlay ()这个函数是游戏的主要部分,难点在表示蛇的新位置并消除前一次的图形。

相关文档
最新文档