贪吃蛇程序
C语言贪吃蛇程序设计说明书
![C语言贪吃蛇程序设计说明书](https://img.taocdn.com/s3/m/8ba8e81b69eae009591bec04.png)
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, "游戏结束。
贪吃蛇游戏程序设计实验报告
![贪吃蛇游戏程序设计实验报告](https://img.taocdn.com/s3/m/cc9af60f5b8102d276a20029bd64783e08127d69.png)
贪吃蛇游戏程序设计实验报告贪吃蛇游戏程序设计实验报告1、引言1.1 文档目的1.2 背景介绍1.3 项目概述2、需求分析2.1 用户需求2.2 功能需求2.3 非功能需求3、总体设计3.1 系统结构3.2 使用的开发工具和技术3.3 程序流程图3.4 数据结构设计4、模块设计4.1 游戏界面模块设计4.2 蛇的移动模块设计4.3 食物模块设计4.4 游戏结束判定模块设计5、开发过程5.1 编码规范5.2 界面设计与实现5.3 功能模块实现5.4 联合测试与整合调试6、测试结果与分析6.1 单元测试6.2 集成测试6.3 性能测试6.4 用户验收测试7、部署与运维7.1 系统环境要求7.2 安装步骤7.3 运行与维护8、问题与解决方案8.1 开发中的问题8.2 解决方案9、结论9.1 实验总结9.2 实现目标9.3 后续改进方向附件:- 源代码文件- 参考文献法律名词及注释:- 版权:保护原创作品的独有权利,防止他人未经授权使用、复制或传播。
- 许可证:授权他人在特定条件下使用受版权保护的作品。
- 商标:用于标识特定产品或服务来源的标识,可以是文字、图形、颜色或声音。
- 专利:通过创造一种新的发明而获得的对该发明的独有权利,防止他人在未获许可的情况下制造、使用或销售该发明。
- 使用条款:规定使用软件、服务或作品的条件和限制。
- 免责声明:声明作者或提供者对使用软件、服务或作品时可能产生的损害不承担责任。
全文结束 \。
C语言贪吃蛇全部程序及说明Word版
![C语言贪吃蛇全部程序及说明Word版](https://img.taocdn.com/s3/m/a1edae5783d049649a6658cb.png)
#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#include <time.h>const int H = 8; //地图的高const int L = 16; //地图的长char GameMap[H][L]; //游戏地图int key; //按键保存int sum = 1, over = 0; //蛇的长度, 游戏结束(自吃或碰墙)int dx[4] = {0, 0, -1, 1}; //左、右、上、下的方向int dy[4] = {-1, 1, 0, 0};struct Snake //蛇的每个节点的数据类型{int x, y; //左边位置int now; //保存当前节点的方向, 0,1,2,3分别为左右上下}Snake[H*L];const char Shead = '@'; //蛇头const char Sbody = '#'; //蛇身const char Sfood = '*'; //食物const char Snode = '.'; //'.'在地图上标示为空void Initial(); //地图的初始化void Create_Food(); //在地图上随机产生食物void Show(); //刷新显示地图void Button(); //取出按键,并判断方向void Move(); //蛇的移动void Check_Border(); //检查蛇头是否越界void Check_Head(int x, int y); //检查蛇头移动后的位置情况int main(){Initial();Show();return 0;}void Initial() //地图的初始化{int i, j;int hx, hy;system("title 贪吃蛇"); //控制台的标题memset(GameMap, '.', sizeof(GameMap)); //初始化地图全部为空'.' system("cls");srand(time(0)); //随机种子hx = rand()%H; //产生蛇头hy = rand()%L;GameMap[hx][hy] = Shead;Snake[0].x = hx; Snake[0].y = hy;Snake[0].now = -1;Create_Food(); //随机产生食物for(i = 0; i < H; i++) //地图显示{for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");getch(); //先接受一个按键,使蛇开始往该方向走Button(); //取出按键,并判断方向}void Create_Food() //在地图上随机产生食物{int fx, fy;while(1){fx = rand()%H;fy = rand()%L;if(GameMap[fx][fy] == '.') //不能出现在蛇所占有的位置{GameMap[fx][fy] = Sfood;break;}}}void Show() //刷新显示地图{int i, j;while(1){_sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图Button(); //先判断按键在移动Move();if(over) //自吃或碰墙即游戏结束{printf("\n**游戏结束**\n");printf("你的得分:%d\n",sum=10*(sum-1));getchar();break;}system("cls"); //清空地图再显示刷新吼的地图for(i = 0; i < H; i++){for(j = 0; j < L; j++)printf("%c", GameMap[i][j]);printf("\n");}printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");}}void Button() //取出按键,并判断方向{if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 {while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主key = getch(); //将按键从控制台中取出并保存到key中switch(key){ //左case 75: Snake[0].now = 0;break;//右case 77: Snake[0].now = 1;break;//上case 72: Snake[0].now = 2;break;//下case 80: Snake[0].now = 3;break;}}}void Move() //蛇的移动{int i, x, y;int t = sum; //保存当前蛇的长度//记录当前蛇头的位置,并设置为空,蛇头先移动x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';Snake[0].x = Snake[0].x + dx[ Snake[0].now ];Snake[0].y = Snake[0].y + dy[ Snake[0].now ];Check_Border(); //蛇头是否越界Check_Head(x, y); //蛇头移动后的位置情况,参数为: 蛇头的开始位置if(sum == t) //未吃到食物即蛇身移动哦for(i = 1; i < sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照{if(i == 1) //尾节点设置为空再移动GameMap[ Snake[i].x ][ Snake[i].y ] = '.';if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理{Snake[i].x = x;Snake[i].y = y;Snake[i].now = Snake[0].now;}else //其他蛇身即走到前一个蛇身位置{Snake[i].x = Snake[i+1].x;Snake[i].y = Snake[i+1].y;Snake[i].now = Snake[i+1].now;}GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身}}void Check_Border() //检查蛇头是否越界{if(Snake[0].x < 0 || Snake[0].x >= H|| Snake[0].y < 0 || Snake[0].y >= L)over = 1;}void Check_Head(int x, int y) //检查蛇头移动后的位置情况{if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空GameMap[ Snake[0].x ][ Snake[0].y ] = '@';elseif(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物{GameMap[ Snake[0].x ][ Snake[0].y ] = '@';Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个Snake[sum].y = y;Snake[sum].now = Snake[0].now;GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';sum++;Create_Food(); //食物吃完了马上再产生一个食物}elseover = 1;}。
scratch贪吃蛇教程
![scratch贪吃蛇教程](https://img.taocdn.com/s3/m/58fb8d2258eef8c75fbfc77da26925c52cc59186.png)
scratch贪吃蛇教程贪吃蛇是一款经典的游戏,曾经风靡一时。
如今,在Scratch这样的编程平台上,我们可以轻松地用图形化编程方式制作出属于自己的贪吃蛇游戏。
下面,我将为大家详细介绍Scratch贪吃蛇游戏的制作过程。
首先,我们需要创建一些角色和舞台。
在Scratch中,角色可以是动物、人物或物体。
我们需要创建蛇、食物和墙壁这三个角色。
接下来,我们来为蛇添加一些脚本,使它能够移动和吃食物。
我们可以使用Scratch提供的积木块来编写脚本。
首先,我们需要让蛇追踪玩家的指令,并根据指令改变自己的方向。
然后,我们可以使用循环来让蛇一直移动,直到游戏结束。
当蛇吃到食物时,我们需要让蛇增长一个身体长度,并在舞台中随机生成新的食物。
然后,我们来为食物添加一些脚本,使其能够在舞台中随机移动。
我们可以使用Scratch提供的广播功能来随机生成食物的位置。
当蛇吃到食物时,我们可以广播一个消息,在接收到消息的食物角色中,修改自己的位置。
最后,我们需要为游戏添加一些附加功能,如游戏开始和结束的界面、分数计算、碰撞判断等。
我们可以使用Scratch提供的事件积木块来实现这些功能。
当游戏开始时,我们可以显示一个开始界面,并等待玩家点击开始按钮。
当蛇撞到自己的身体或墙壁时,游戏结束。
我们需要在这些情况下,显示一个游戏结束的界面,并停止游戏的进行。
同时,我们还可以根据蛇吃到的食物数量来计算分数,并在游戏界面中显示。
通过以上步骤,我们已经完成了Scratch贪吃蛇游戏的制作。
当你点击开始按钮,游戏就会开始。
你可以通过键盘上的方向键来控制蛇的移动方向,使其吃到尽可能多的食物。
当蛇撞到自己的身体或墙壁时,游戏就结束了,你可以看到你的分数和游戏结束的提示。
总结来说,用Scratch制作贪吃蛇游戏是一项简单而有趣的任务。
通过这个项目,你可以掌握基本的图形化编程知识,同时也能提高逻辑思维和问题解决能力。
无论你是初学者还是有一定编程经验的人,用Scratch制作贪吃蛇游戏都是一个不错的选择。
贪吃蛇游戏单片机程序
![贪吃蛇游戏单片机程序](https://img.taocdn.com/s3/m/04f065650622192e453610661ed9ad51f11d5478.png)
贪吃蛇游戏单片机程序贪吃蛇游戏是一款经典的游戏,其简洁的规则和有趣的玩法使其成为了许多人喜爱的游戏之一。
在单片机中实现贪吃蛇游戏需要利用单片机的输入输出功能以及控制算法来完成游戏的控制和显示。
下面是一个简单的贪吃蛇游戏单片机程序的实现。
首先,我们需要定义一些常量和变量来表示游戏中的一些参数和状态。
比如,我们可以定义一个常量来表示屏幕的宽度和高度,以及一个变量来表示蛇的长度和当前的移动方向。
c#define SCREEN_WIDTH 16#define SCREEN_HEIGHT 8#define SNAKE_MAX_LENGTH 64int snake_length;int snake_direction;接着,我们需要定义一个数据结构来表示蛇的身体,可以使用一个数组来表示蛇的每一节身体的位置。
同时,我们还需要定义一个数据结构来表示食物的位置。
cstruct point {int x;int y;};struct point snake[SNAKE_MAX_LENGTH];struct point food;然后,我们可以编写一个函数来初始化游戏的状态。
在这个函数中,我们需要初始化蛇的位置和长度,以及随机生成食物的位置。
void init_game{// 初始化蛇的位置和长度snake[0].x = SCREEN_WIDTH / 2;snake[0].y = SCREEN_HEIGHT / 2;snake_length = 1;// 随机生成食物的位置food.x = rand% SCREEN_WIDTH;food.y = rand% SCREEN_HEIGHT;}接下来,我们需要编写一个函数来处理用户输入,并更新蛇的移动方向。
这个函数可以通过读取按键的状态来实现,比如可以通过一个变量来记录当前的按键状态。
cvoid handle_input{// 读取按键状态int key = read_key// 根据按键状态更新蛇的移动方向if (key == 'W' && snake_direction != 'S') {snake_direction = 'W';} else if (key == 'S' && snake_direction != 'W') {snake_direction = 'S';} else if (key == 'A' && snake_direction != 'D') {snake_direction = 'A';} else if (key == 'D' && snake_direction != 'A') {snake_direction = 'D';}然后,我们可以编写一个函数来更新蛇的位置。
贪吃蛇程序设计
![贪吃蛇程序设计](https://img.taocdn.com/s3/m/ceb6e6b0112de2bd960590c69ec3d5bbfd0adab1.png)
贪吃蛇程序设计贪吃蛇是一款经典的电子游戏,其设计简单却极具挑战性,深受各个年龄段玩家的喜爱。
下面将详细介绍贪吃蛇程序的设计过程,包括基本规则、程序结构、实现方法以及可能的扩展功能。
基本规则贪吃蛇游戏的基本规则如下:1. 游戏界面是一个矩形网格,蛇在网格中移动。
2. 蛇由多个方块组成,初始时通常只有几个方块。
3. 玩家通过键盘控制蛇头的移动方向。
4. 蛇在吃到食物后,身体长度会增加一节。
5. 如果蛇头撞到自己的身体或屏幕边缘,游戏结束。
程序结构贪吃蛇程序主要包括以下几个部分:1. 游戏界面:显示蛇、食物和网格。
2. 蛇的移动逻辑:控制蛇的移动方向和速度。
3. 食物生成逻辑:随机在界面上生成食物。
4. 碰撞检测:检测蛇是否吃到食物或撞到自己及屏幕边缘。
5. 分数和生命值:记录玩家的得分和剩余生命。
实现方法1. 初始化- 设置游戏界面的大小。
- 初始化蛇的位置和长度。
- 随机生成食物的位置。
2. 游戏循环- 监听键盘输入,更新蛇头的移动方向。
- 根据移动方向更新蛇的位置。
- 检查蛇是否吃到食物,如果是,则增加蛇的长度和分数,并生成新的食物。
- 检查蛇是否撞到自己的身体或屏幕边缘,如果是,则结束游戏。
- 刷新游戏界面,显示当前的蛇、食物和分数。
3. 绘制界面- 使用图形库或API绘制网格、蛇和食物。
4. 处理用户输入- 监听键盘事件,根据用户的输入改变蛇的移动方向。
5. 碰撞检测- 检查蛇头是否与食物重叠,如果是,则触发吃食物的逻辑。
- 检查蛇头是否与蛇身其他部分重叠,如果是,则游戏结束。
- 检查蛇头是否到达屏幕边缘,如果是,则游戏结束。
可能的扩展功能1. 多种难度级别:根据游戏难度调整蛇的移动速度或食物的生成频率。
2. 特殊食物:例如,某些食物可以让蛇短暂加速或获得保护,避免碰撞。
3. 自定义皮肤:允许玩家选择或设计蛇和食物的外观。
4. 多人模式:支持多个玩家在同一设备或网络上进行游戏。
5. 成就系统:为玩家设置各种成就目标,增加游戏的可玩性。
超简单贪吃蛇c语言代码编写
![超简单贪吃蛇c语言代码编写](https://img.taocdn.com/s3/m/2ffd1394783e0912a3162ac1.png)
超简单贪吃蛇c语言代码编写贪吃蛇其实就是实现以下几步——1:蛇的运动(通过“画头擦尾”来达到蛇移动的视觉效果)2:生成食物3:蛇吃食物(实现“画头不擦尾”)4:游戏结束判断(也就是蛇除了食物,其余东西都不能碰)#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#include<time.h>#define width 60#define hight 25#define SNAKESIZE 200//蛇身的最长长度int key=72;//初始化蛇的运动方向,向上int changeflag=1;//用来标识是否生成食物,1表示蛇还没吃到食物,0表示吃到食物int speed=0;//时间延迟struct {int len;//用来记录蛇身每个方块的坐标int x[SNAKESIZE];int y[SNAKESIZE];int speed;}snake;struct{int x;int y;}food;void gotoxy(int x,int y)//调用Windows的API函数,可以在控制台的指定位置直接操作,这里可暂时不用深究{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }//■○void drawmap(){//打印图框for (int _y = 0; _y < hight; _y++){for (int x = 0; x < width; x+=2){if (x == 0 || _y == 0 || _y == hight - 1 || x == width - 2){gotoxy(x, _y);printf("■");}}}//打印蛇头snake.len=3;snake.x[0]=width/2;snake.y[0]=hight/2;gotoxy(snake.x[0],snake.y[0]);printf("■");//打印蛇身for(int i=1;i<snake.len;i++){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]+1;gotoxy(snake.x[i],snake.y[i]);printf("■");}//初始化食物的位置food.x=20;food.y=20;gotoxy(food.x,food.y);printf("○");}/**控制台按键所代表的数字*“↑”:72*“↓”:80*“←”:75*“→”:77*/void snake_move()//按键处理函数{int history_key=key;if (_kbhit()){fflush(stdin);key = _getch();key = _getch();}if(changeflag==1)//还没吃到食物,把尾巴擦掉{gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);printf(" ");}for(int i=snake.len-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}if(history_key==72&&key==80)key=72;if(history_key==80&&key==72)key=80;if(history_key==75&&key==77)key=75;if(history_key==77&&key==75)key=77;switch(key){case 72:snake.y[0]--;break;case 75:snake.x[0]-= 2;break;case 77:snake.x[0]+= 2;break;case 80:snake.y[0]++;break;}gotoxy(snake.x[0],snake.y[0]);printf("■");gotoxy(0,0);changeflag=1;}void creatfood(){if(snake.x[0] == food.x && snake.y[0] == food.y)//只有蛇吃到食物,才能生成新食物{changeflag=0;snake.len++;if(speed<=100)speed+=10;while(1){srand((unsigned int) time(NULL));food.x=rand()%(width-6)+2;//限定食物的x范围不超出围墙,但不能保证food.x 为偶数food.y=rand()%(hight-2)+1;for(int i=0;i<snake.len;i++){if(food.x==snake.x[i]&&food.y==snake.y[i])//如果产生的食物与蛇身重合则退出break;}if(food.x%2==0)break;//符合要求,退出循环}gotoxy(food.x,food.y);printf("○");}}bool Gameover(){//碰到围墙,OVERif(snake.x[0]==0||snake.x[0]==width-2)return false;if(snake.y[0]==0||snake.y[0]==hight-1) return false;//蛇身达到最长,被迫OVERif(snake.len==SNAKESIZE)return false;//头碰到蛇身,OVERfor(int i=1;i<snake.len;i++){if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])return false;}return true;}int main(){system("mode con cols=60 lines=27");drawmap();while(Gameover()){snake_move();creatfood();Sleep(350-speed);//蛇的移动速度}return 0;}。
贪吃蛇程序
![贪吃蛇程序](https://img.taocdn.com/s3/m/d1cb462fccbff121dd36837c.png)
贪吃蛇程序游戏说明:1、在英文状态下用w、a、s、d键操纵蛇头上下左右移动。
2、操控蛇头吃到食物时蛇长便增加1。
3、蛇头不能碰到四周墙壁和自己身体。
4、当蛇身长度达到45时(可自行调节),游戏成功。
源代码:(可直接复制到VC6.0里运行程序)#include <iostream.h> //标准输入输出流#include <windows.h> //win32下的函数#include <stdlib.h> //常用系统函数,此处产生随机数#include <conio.h> //控制台输入输出函数#include <time.h> //时间函数,使用当前时间做种子enum dir{up,down,left,right}; //枚举类型enum dir// 1、围墙的制作class Fence //定义出一个类:围墙{public:void InitFence(); //定义边界函数的组成void OutputF(); //输出边界函数public:char game[30][30]; //game定义为游戏框,注意类型为字符}f; //定义对象//画框框void Fence::InitFence(){for(int i=0;i<21;i++)for(int j=0;j<25;j++){if(i==0||i==20||j==0||j==24) game[i][j]= '*'; //画出边框else game[i][j]= ' '; //将内部点设置为空}}//显示框框void Fence::OutputF(){for(int i=0; i<21; i++){for(int j=0; j<25; j++){cout<<game[i][j]<<' ';}cout<<endl;}}// 2、蛇结点的构建class SnakeNode{private:int x,y;SnakeNode *prior,*next;public:void add_head(int x,int y);int get_x();int get_y();void delete_tail();}*head=NULL, *tail =NULL;void SnakeNode::add_head(int x,int y) //定义插入头结点函数{SnakeNode *q=new SnakeNode;q->x =x; q->y =y;q->next =head;q->prior =NULL;if(head) head->prior =q;head =q;if(!tail) tail =head;f.game[x][y]= '*'; //f对象可以在定义Fence类时定义; 且Fence类在SnakeNode 类前定义}int SnakeNode::get_x(){return x;}int SnakeNode::get_y(){return y;}void SnakeNode::delete_tail() //定义删除尾结点函数{SnakeNode *p =tail;f.game[tail->get_x()][tail->get_y()]= ' '; //把尾结点的坐标表示的'*'置为空格if(tail==head) tail= head= NULL;else{tail= tail->prior;tail->next= NULL;}delete p;}// 3、定义移动class move{public:dir point; //枚举变量point: 控制方向int food_x;int food_y;public:void moving();void change_point(char); //改变方向void get_food();};void move::moving() //对类中moving函数定义{int a,b;a= head->get_x(); //取得头结点横坐标b= head->get_y(); //头结点纵坐标switch(point){case up: --a; break;case down: ++a; break;case left: --b; break;case right: ++b; break;}if(a==20||b==24||a==0||b==0) //判断是否撞墙{cout<<"game over!!!"<<endl;exit(0);}if(a==food_x && b==food_y) //吃food{head->add_head(a,b);get_food();}else{if(f.game[a][b]=='*'){cout<<"game over!!!"<<endl;exit(0);}else{head->add_head(a,b); //插入头结点head->delete_tail(); //删除尾结点}}}void move::change_point(char keydown) //定义改变方向函数{switch(keydown){case 'w': point= up; break;case 's': point= down; break;case 'a': point= left; break;case 'd': point= right; break;}}void move::get_food() //定义得到食物函数{for(int v=0;;v++){srand((unsigned int) time(NULL)); //做种子(程序运行时间)food_x= rand()%19+1;food_y= rand()%23+1;if(f.game[food_x][food_y]!='*'){f.game[food_x][food_y]= '@';break;}else continue;}}//主函数int main(){cout<<"Using 'w,s,a,d'to control direction!!!\n";//画框框和小蛇move m;f.InitFence();head->add_head(4,3);head->add_head(4,4);head->add_head(4,5);m.get_food();f.OutputF();while (true){char keydown= getch(); //getch()返回键盘上读取的字符;包含头文件<conio.h>m.change_point(keydown);while(!kbhit()){ //判断有没有按键落下;system("cls"); //清屏函数;m.moving();f.OutputF();Sleep(200);}}return 0;}游戏截图:。
c语言贪吃蛇毕业论文
![c语言贪吃蛇毕业论文](https://img.taocdn.com/s3/m/faa7471ebc64783e0912a21614791711cc79796d.png)
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程序及流程图和模块设计说明](https://img.taocdn.com/s3/m/370058791711cc7931b71613.png)
#define N 200#include <graphics.h>#include <stdlib.h>#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/ struct 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;void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void GamePlay(void);/*玩游戏具体过程*/ void PrScore(void);/*输出成绩*//*主函数*/void main(void){Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}/*图形驱动*/void Init(void){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){/*setbkcolor(LIGHTGREEN);*/setcolor(11);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);/*右边*/}}/*玩游戏具体过程*//*第一部分初始设定*/void GamePlay(void){randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=100;snake.y[0]=100;/*蛇头*/snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/PrScore();/*输出得分*/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)/*食物整个坐标大小需要符合10*10的大小否则社无法迟到*/ food.y++;food.yes=0;/*画面上有食物了*/}if(food.yes==0)/*画面上有食物了就要显示*/{setcolor(GREEN); /*设置食物颜色*/rectangle(food.x,food.y,food.x+10,food.y-10);}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;}/*第二部分:死亡设定模块*/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;}}if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*死亡条件二:蛇是否撞到墙壁*/{GameOver();/*本次游戏结束*/snake.life=1; /*蛇死*/}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;/*第三部分:食物设定模块*/if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/{setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node++;/*蛇的身体长一节*/food.yes=1;/*画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/}/*第四部分:死亡后返回初始设定(或是退出开始新游戏)*/setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);} /*endwhile(!kbhit)*/if(snake.life==1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key==ESC)/*按ESC键退出*/break;/*判断是否往相反的方向移动(向相反方向移动会死亡)第三类死亡条件*/ elseif(key==UP&&snake.direction!=4)snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/}/*第五部分:游戏结束*/void GameOver(void){cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,"GAME OVER"); getch();}/*第六部分:输出成绩*/void PrScore(void){char str[10];setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,"score:%d",score); outtextxy(55,20,str);}/*第七部分:结束图形*/void Close(void){getch();closegraph();}本系统分为:初始化即图形驱动函数init()模块、图形界面设计Drawk()模块、游戏GamePlay()模块、输出成绩PrScore()模块、退出游戏Close模块、在游戏模块中通过3个控制语句判断游戏中的蛇是否死亡(3中死亡方式),不出现死亡在游戏结束时候打出成绩,如果出现死亡则跳出循环并打出成绩并进行初始化设定,如果不玩游戏按ESC则退出游戏。
JAVA课程设计贪吃蛇小程序附代码
![JAVA课程设计贪吃蛇小程序附代码](https://img.taocdn.com/s3/m/e1d8a693d05abe23482fb4daa58da0116c171ff2.png)
Part Two
JAVA贪吃蛇小程序 代码解析
游戏界面实现
游戏窗口:设置游戏窗口大小和位置
游戏背景:设置游戏背景颜色和图片 游戏元素:设置蛇、食物、障碍物等 元素的位置和样式
游戏控制:设置键盘控制和鼠标控制, 实现游戏的开始、暂停和结束
游戏得分:显示游戏得分和等级,以 及游戏结束提示
游戏音效:设置游戏音效和背景音乐, 增加游戏的趣味性和沉浸感
重新开始:提供重新开始游 戏的选项,重新开始游戏时, 重置游戏界面和蛇的位置
游戏控制实现
键盘控制:通过键盘输入控制蛇的移动方向 游戏循环:通过循环实现游戏的持续运行 蛇的移动:通过改变蛇的位置实现蛇的移动 食物生成:随机生成食物,增加游戏的挑战性 碰撞检测:检测蛇与食物或边界的碰撞,实现游戏的结束或重新开始
Part Four
总结
JAVA贪吃蛇小程序的特点和亮点
添加标题
简单易用:界面简洁,操作简单,适合初学者使用
添加标题
功能丰富:支持多种游戏模式,如经典模式、挑战模式等
添加标题
性能优化:采用高效的算法和优化技术,提高游戏运行速度和稳定性
添加标题
扩展性强:支持自定义皮肤、背景音乐等,满足不同用户的需求
程序实现原理
贪吃蛇游戏是一种经典的游戏,通过控制蛇的移动来获取食物,同时避免撞到墙壁或自己的身 体。
JAVA贪吃蛇小程序的实现原理主要是通过JAVA语言编写程序,实现蛇的移动、食物的生成、 碰撞检测等功能。
蛇的移动是通过改变蛇头的位置来实现的,食物的生成则是随机生成在屏幕上的某个位置。
碰撞检测则是通过判断蛇头是否与墙壁或自己的身体发生碰撞来实现的。
游戏界面: 显示贪吃 蛇和食物
游戏操作: 通过键盘 控制贪吃 蛇移动
c贪吃蛇程序课程设计
![c贪吃蛇程序课程设计](https://img.taocdn.com/s3/m/6cdb036b30126edb6f1aff00bed5b9f3f80f727d.png)
c 贪吃蛇程序课程设计一、课程目标知识目标:1. 学生能理解并掌握贪吃蛇游戏的基本原理和编程逻辑;2. 学生能运用所学编程知识,独立编写并调试一个简单的贪吃蛇程序;3. 学生能理解并运用坐标定位、方向控制、碰撞检测等编程概念。
技能目标:1. 学生能够运用编程语言(如Python)实现贪吃蛇游戏的基本功能;2. 学生通过编写贪吃蛇程序,培养逻辑思维和问题解决能力;3. 学生通过团队协作,提高沟通与协作能力。
情感态度价值观目标:1. 学生对编程产生兴趣,培养主动学习和探索的精神;2. 学生在编写程序过程中,树立正确的价值观,认识到编程对生活的影响;3. 学生通过完成课程任务,增强自信心和成就感,激发进一步学习编程的热情。
课程性质:本课程为信息技术课程,旨在通过实践操作,让学生掌握编程基础知识和技能。
学生特点:六年级学生,具备一定的计算机操作能力,好奇心强,喜欢尝试新事物。
教学要求:结合学生特点,注重实践操作,鼓励学生动手编写程序,培养其编程兴趣和技能。
在教学过程中,关注学生的个体差异,提供适当的指导和帮助,确保每位学生都能达到课程目标。
通过课程学习,使学生能够将所学知识应用于实际编程任务,实现具体的学习成果。
二、教学内容1. 引入编程思维:介绍编程的基本概念,如算法、程序等,通过案例展示编程在生活中的应用,引发学生兴趣。
2. 编程环境搭建:指导学生安装并熟悉编程环境(如Python解释器和IDLE),了解编程工具的基本操作。
3. 基本语法讲解:讲解Python基本语法,如变量定义、数据类型、控制结构(if判断、循环)等,为学生编写贪吃蛇程序打下基础。
4. 贪吃蛇游戏原理分析:讲解贪吃蛇游戏的基本规则、原理,分析游戏中的坐标定位、方向控制、食物生成、碰撞检测等关键功能。
5. 编写贪吃蛇程序:按照以下步骤进行:a. 创建游戏窗口和蛇、食物对象;b. 实现蛇的移动、转向功能;c. 实现食物的随机生成;d. 实现碰撞检测和游戏结束逻辑;e. 优化程序,添加计分、速度等功能。
贪吃蛇小游戏
![贪吃蛇小游戏](https://img.taocdn.com/s3/m/7d230fa9162ded630b1c59eef8c75fbfc67d9476.png)
贪吃蛇小游戏
贪吃蛇是一款经典的小游戏,玩家需要控制一条蛇在一个有限的区域内移动并吃食物,以使蛇身变长。
游戏的目标是尽可能地吃到更多的食物,同时避免撞到自己的身体或撞墙。
游戏规则如下:
1. 开始游戏时,玩家控制的蛇只有一个头部,初始长度为1。
2. 蛇的移动由玩家控制,可以使用键盘上的方向键来控制蛇的移动方向(上、下、左、右)。
3. 蛇每移动一步,身体的每个部分都会向前移动一格,蛇的头部会向玩家指定的方向移动一格。
4. 游戏区域内会随机生成食物,蛇需要吃掉食物才能增加长度。
5. 当蛇吃到食物时,蛇的长度会增加一格,并在尾部生成新的身体部分。
6. 如果蛇撞到自己的身体或撞墙,则游戏结束。
为了提高游戏的乐趣和挑战性,可以考虑以下技巧和策略:
1. 尽量利用整个游戏区域,避免让蛇的身体占据太多空间,以便有更多的机会移动和吃到食物。
2. 注意蛇头的移动方向,避免频繁改变方向,以免撞到自己的身体。
3. 预测食物的位置,尽量使蛇头朝向食物的方向移动,以更快地吃到食物。
4. 控制蛇的速度,适当调整移动的速度,以便更好地控制蛇的位置和方向。
5. 利用蛇的身体长度,可以通过蛇的身体绕过障碍物或自己的身体,以获得更好的移动路径。
通过这些规则、技巧和策略,玩家可以享受到贪吃蛇游戏的乐趣,并挑战自己
的反应能力和操作技巧。
不断尝试不同的策略和方法,可以使游戏更具挑战性和乐趣。
贪吃蛇C程序(gtk)
![贪吃蛇C程序(gtk)](https://img.taocdn.com/s3/m/c3bf6ca10029bd64783e2c75.png)
贪吃蛇源程序#include <gtk/gtk.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#define length 10/*最长蛇节数*/#define side 24/*每节蛇身以及食物的边长*/#define p_prize 20/*特殊食物概率*/GtkWidget *window;/*定义窗体*/GtkWidget *fixed;/*定义固定容器构件*/GtkWidget *snake[length];/*蛇的节数*/GtkWidget *food[length];/*食物数*/GtkWidget *border_up;/*上边界*/GtkWidget *border_down;/*下边界*/GtkWidget *border_left;/*左边界*/GtkWidget *border_right;/*右边界*/GtkWidget *game_score_label;/*当前分数标签*/GtkWidget *game_score[2*length-12];/*当前分数值*/GtkWidget *game_pause;/*游戏暂停*/GtkWidget *game_speed_label;/*速度调节标签*/GtkWidget *game_speed[4];/*当前速度*/GtkWidget *death;/*游戏失败提示窗口*/GtkWidget *win;/*游戏通关提示窗口*/GtkWidget *direction[4];/*改变蛇的方向*/GdkColor color[20];/*颜色值*/gint function(gpointer data);/*主体函数*/void up(void);/*往上*/void down(void);/*往下*/void left(void);/*往左*/void right(void);/*往右*/gboolean key_control(GtkWidget *widget,GdkEventKey *event);//键盘void show_pause(void);/*暂停|开始游戏*/void speed_control0(void);/*速度控制*/void speed_control1(void);void speed_control2(void);void eat(void);/*吃到食物*/void showwin(void);/*游戏通关*/void showdeath(void);/*游戏结束*/gpointer data;gint sign;/*定时器*/int i=0;/*暂停开始状态标记*/int j=0;/*累加变量*/int j1=0;int k=0;/*未设置速度前为0 游戏过程中为1 游戏结束时为-1*/int snake_x[length],snake_y[length],food_x[length],food_y[length];/*蛇及食物的坐标位置数组*/int flag=3;/*方向标记*/int jieshu=6;/*蛇当前节数*/int stop=1;/*蛇停止运动时stop=1*/int speed=0;int op_speed[3]={100,300,500};int prize[2*length-12]={0};charscore[41][8]={"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","1 6","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32"," 33","34","35","36","37","38","39","40"};char dir[4][4]={"上","下","左","右"};/*四个方向键的显示值*/int main(int argc,char *argv[ ]){gtk_init(&argc,&argv);/*初始化*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/*游戏窗口*/gdk_color_parse ("#00F0F0", &color[0]);gdk_color_parse ("#F00000", &color[1]);gdk_color_parse ("#0F0000", &color[2]);gdk_color_parse ("#00F000", &color[3]);gdk_color_parse ("#000F00", &color[4]);gdk_color_parse ("#0000F0", &color[5]);gdk_color_parse ("#00000F", &color[6]);gdk_color_parse ("#F0F000", &color[7]);gdk_color_parse ("#FF0000", &color[8]);gdk_color_parse ("#0FF000", &color[9]);gdk_color_parse ("#00FF00", &color[10]);gdk_color_parse ("#F00F00", &color[11]);gdk_color_parse ("#F000F0", &color[12]);gdk_color_parse ("#F0F0F0", &color[13]);gdk_color_parse ("#F0000F", &color[14]);gdk_color_parse ("#0FF00F", &color[15]);gdk_color_parse ("#00FFF0", &color[16]);gdk_color_parse ("#F00FF0", &color[17]);gdk_color_parse ("#FF00F0", &color[18]);gdk_color_parse ("#F0F0FF", &color[19]);gtk_window_set_title(GTK_WINDOW(window),"贪吃蛇键盘、鼠标两种控制方式游戏前请先选择难度蛇不会咬到自己彩色食物加分多");/*设定游戏标题*/gtk_widget_set_usize(window,580,480);/*设置窗口大小*/gtk_widget_set_uposition(window,400,100);/*设定窗口位置*/g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),N ULL);gtk_window_set_resizable(GTK_WINDOW(window),FALSE);/*不允许修改窗口大小*/fixed=gtk_fixed_new();/*创建固定容器构件*//*蛇与食物*/srand((int)time(0));/*设置随机数种子*/for(j=0;j<length;j++){snake[j]=gtk_button_new_with_label("ss");/*创建蛇身*/food[j]=gtk_button_new_with_label("food");/*创建食物*/gtk_widget_set_size_request(snake[j],side,side);/*蛇身尺寸*/gtk_widget_set_size_request(food[j],side,side);/*食物大小*/gtk_widget_modify_bg(snake[j], GTK_STATE_NORMAL,&color[0]);if((rand()%100+1)<=p_prize){gtk_widget_modify_bg(food[j],GTK_STATE_NORMAL,&color[(rand()%19 )+1]);for(j1=j+1;j1<2*length-12;j1++){prize[j1]++;}}}for(j=0;j<length;j++) /*将蛇身放在窗口的指定位置*/{gtk_fixed_put(GTK_FIXED(fixed),snake[j],snake_x[j]=side*(6-j),snake_y[j]=sid e);/*蛇身初始位置设定*/gtk_fixed_put(GTK_FIXED(fixed),food[j],food_x[j]=side*(rand()%10)+side,foo d_y[j]=side*((rand()%10))+side);/*食物位置随机设定,最好利用系统时间获得随机分布*/}for(j=0;j<6;j++) /*初始显示6节蛇身*/{gtk_widget_show(snake[j]);/*显示蛇身*/}gtk_widget_show(food[0]);/*显示第一个食物*//*键盘按键控制方向*/g_signal_connect(G_OBJECT(window), "key-press-event",G_CALLBACK(key_control), NULL);/*方向键鼠标控制*/for(j=0;j<4;j++){direction[j]=gtk_button_new_with_label(dir[j]);/*方向按键*/gtk_widget_modify_bg(direction[j], GTK_STATE_NORMAL, &color[10]);gtk_widget_set_size_request(direction[j],50,50);/*按键大小*/gtk_widget_set_sensitive(direction[j],FALSE);/*方向无效*/}/*4个方向键位置设置*/gtk_fixed_put(GTK_FIXED(fixed),direction[0],485,25);/*上键位置*/gtk_fixed_put(GTK_FIXED(fixed),direction[1],485,125);/*下键位置*/gtk_fixed_put(GTK_FIXED(fixed),direction[2],442,75);/*左键位置*/gtk_fixed_put(GTK_FIXED(fixed),direction[3],528,75);/*右键位置*//*4个方向键的功能设置*/g_signal_connect(GTK_OBJECT(direction[0]),"clicked",G_CALLBACK(up),NULL);g_signal_connect(GTK_OBJECT(direction[1]),"clicked",G_CALLBACK(down),NULL);g_signal_connect(GTK_OBJECT(direction[2]),"clicked",G_CALLBACK(left),NULL);g_signal_connect(GTK_OBJECT(direction[3]),"clicked",G_CALLBACK(right),NULL); /*显示4个方向键*/for(j=0;j<4;j++){gtk_widget_show(direction[j]);/*显示4个方向按键*/}/*游戏边界*/border_left=gtk_button_new();/*创建游戏范围左边界*/gtk_widget_set_sensitive(border_left,FALSE);/*设定左边界类型不敏感*/ border_right=gtk_button_new();/*创建游戏范围右边界*/gtk_widget_set_sensitive(border_right,FALSE);/*右边界不敏感*/border_up=gtk_button_new();/*创建游戏范围上边界*/gtk_widget_set_sensitive(border_up,FALSE);/*上边界不敏感*/border_down=gtk_button_new();/*创建游戏范围下边界*/gtk_widget_set_sensitive(border_down,FALSE);/*下边界不敏感*/gtk_widget_modify_bg(border_up, GTK_STATE_NORMAL, &color[1]);gtk_widget_modify_bg(border_down, GTK_STATE_NORMAL, &color[1]);gtk_widget_modify_bg(border_left, GTK_STATE_NORMAL, &color[1]);gtk_widget_modify_bg(border_right, GTK_STATE_NORMAL, &color[1]);gtk_fixed_put(GTK_FIXED(fixed),border_left,15,15);/*左边界加入固定容器构件*/gtk_fixed_put(GTK_FIXED(fixed),border_right,432,15);/*右边界加入固定容器构件*/gtk_fixed_put(GTK_FIXED(fixed),border_up,15,15);/*上边界加入固定>容器构件*/gtk_fixed_put(GTK_FIXED(fixed),border_down,15,432);/*将下边界加入固定容器构件*/gtk_widget_set_size_request(border_up,580,10);/*上边界尺寸*/gtk_widget_set_size_request(border_down,580,10);/*下边界尺寸*/gtk_widget_set_size_request(border_left,10,425);/*左边界尺寸*/gtk_widget_set_size_request(border_right,10,425);/*右边界尺寸*/gtk_widget_show(border_up);/*显示上边界*/gtk_widget_show(border_down);/*显示下边界*/gtk_widget_show(border_left);/*显示左边界*/gtk_widget_show(border_right);/*显示右边界*//*计分功能*/game_score_label=gtk_button_new_with_label("目前得分:");gtk_widget_modify_bg(game_score_label, GTK_STATE_NORMAL, &color[6]);gtk_widget_set_sensitive(game_score_label,FALSE);/*不敏感*/gtk_fixed_put(GTK_FIXED(fixed),game_score_label,15,440);/*放入固定容器构件*/gtk_widget_show(game_score_label);/*显示标签*/for(j=0;j<2*length-12;j++){game_score[j]=gtk_button_new_with_label(score[j]);gtk_widget_modify_bg(game_score[j], GTK_STATE_NORMAL, &color[7]);gtk_fixed_put(GTK_FIXED(fixed),game_score[j],80,440);}gtk_widget_show(game_score[0]);/*暂停|开始功能*/game_pause=gtk_button_new_with_label("暂停|开始");gtk_widget_modify_bg(game_pause, GTK_STATE_NORMAL, &color[13]);gtk_widget_set_size_request(game_pause,140,140);/*设定尺寸*/gtk_fixed_put(GTK_FIXED(fixed),game_pause,439,295);/*位置设定*/gtk_widget_set_sensitive(game_pause,FALSE);g_signal_connect(GTK_OBJECT(game_pause),"clicked",G_CALLBACK(show_pause) ,NULL);/*暂停|开始按键功能设置*/gtk_widget_show(game_pause);/*显示暂停|开始按键*//*游戏速度步进调节功能*/game_speed_label=gtk_button_new_with_label("游戏难度选择");gtk_widget_set_sensitive(game_speed_label,FALSE);/*标签不敏感*/game_speed[0]=gtk_button_new_with_label("1困难");/*快速按钮*/game_speed[1]=gtk_button_new_with_label("2一般");/*一般按钮*/game_speed[2]=gtk_button_new_with_label("3容易");/*慢速按钮*/gtk_widget_modify_bg(game_speed[0], GTK_STATE_NORMAL, &color[1]);gtk_widget_modify_bg(game_speed[1], GTK_STATE_NORMAL, &color[3]);gtk_widget_modify_bg(game_speed[2], GTK_STATE_NORMAL, &color[5]);gtk_fixed_put(GTK_FIXED(fixed),game_speed_label,465,190);/*速度调节标签位置*/for(j=0;j<3;j++){gtk_fixed_put(GTK_FIXED(fixed),game_speed[j],445+45*j,220);}/*速度按钮功能设置*/g_signal_connect(GTK_OBJECT(game_speed[0]),"clicked",G_CALLBACK(speed_con trol0),NULL);g_signal_connect(GTK_OBJECT(game_speed[1]),"clicked",G_CALLBACK(speed_con trol1),NULL);g_signal_connect(GTK_OBJECT(game_speed[2]),"clicked",G_CALLBACK(speed_con trol2),NULL);/*显示按钮*/gtk_widget_show(game_speed_label);for(j=0;j<3;j++){gtk_widget_show(game_speed[j]);}/*游戏通关*/win=gtk_button_new_with_label("!!!恭喜你!!!");/*通关提示*/gtk_widget_modify_bg(win, GTK_STATE_NORMAL, &color[9]);gtk_widget_set_size_request(win,200,100);/*通关提示大小*/gtk_fixed_put(GTK_FIXED(fixed),win,120,150);/*通关提示位置*/g_signal_connect(GTK_OBJECT(win),"clicked",G_CALLBACK(gtk_main_quit),NULL);/*设定点击游戏成功提示窗口后游戏关闭*//*游戏失败*/death=gtk_button_new_with_label("!!!你输了!!!");/*创建游戏失败提示*/ gtk_widget_modify_bg(death, GTK_STATE_NORMAL, &color[8]);gtk_widget_set_size_request(death,200,100);/*设置游戏失败提示大小*/gtk_fixed_put(GTK_FIXED(fixed),death,120,150);/*设定游戏失败提示位置*/g_signal_connect(GTK_OBJECT(death),"clicked",G_CALLBACK(gtk_main_quit),NUL L);/*设定点击游戏失败提示窗口后游戏关闭*//*显示游戏窗口*/gtk_container_add(GTK_CONTAINER(window),fixed);/*放入窗体*/gtk_widget_show(fixed);/*显示固定容器构件*/gtk_widget_show(window);/*显示窗体*/gtk_main();/*等待gtk_main_quit执行后正常退出程序*/}/*以下为回调函数部分*/gint function(gpointer data){int q;eat();/*调用吃食物函数*/if(!stop)/*判断是否处于暂停状态*/{switch(flag)/*判断当前运动方向标记值*/{case 0:if(snake_y[0]<48)/*蛇已撞墙*/{showdeath();break;/*显示游戏失败提示*/}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0],snake_y[0]-side);break;/*蛇未撞墙则把蛇头往运动方向移动一格*/ case 1:if(snake_y[0]>400)/*蛇已撞墙*/{showdeath();break;/*显示游戏失败提示*/}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0],snake_y[0]+side);break;/*蛇未撞墙蛇头往运动方向移动一格*/case 2:if(snake_x[0]<48)/*蛇已撞墙*/{showdeath();break;/*显示游戏失败提示*/}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0]-side,snake_y[0]);break;/*蛇未撞墙蛇头往运动方向移动一格*/case 3:if(snake_x[0]>400)/*蛇已撞墙*/{showdeath();break;/*显示游戏失败提示*/}gtk_fixed_move(GTK_FIXED(fixed),snake[0],snake_x[0]+side,snake_y[0]);break;/*蛇未撞墙蛇头往运动方向移动一格*/}for(j=length-1;j>0;j--)/*剩余蛇身位置处理*/{gtk_fixed_move(GTK_FIXED(fixed),snake[j],snake_x[j]=snake_x[j-1],snake_y[j]= snake_y[j-1]);/*后一节蛇身移至前一节蛇身的位置*/}switch(flag)/*根据当前运动方向改变蛇头位置坐标值*/{case 0:snake_y[0]=snake_y[0]-side;break;/*若向上则将y减去一节蛇身长度*/ case 1:snake_y[0]=snake_y[0]+side;break;/*若向下则将y加上一节蛇身长度*/ case 2:snake_x[0]=snake_x[0]-side;break;/*若向左则将x减去一节蛇身长度*/ case 3:snake_x[0]=snake_x[0]+side;break;/*若向右则将x加上一节蛇身长度*/ }}}gboolean key_control(GtkWidget *widget, GdkEventKey *event)//键盘{if(k==0)/*通过数字1 2 3选择难度*/{if(strcmp(gdk_keyval_name(event->keyval),"1")==0)speed_control0();else if(strcmp(gdk_keyval_name(event->keyval),"2")==0)speed_control1();else if(strcmp(gdk_keyval_name(event->keyval),"3")==0)speed_control2();}else if(k==1)/*游戏开始后回车键暂停和开始游戏*/{if(strcmp(gdk_keyval_name(event->keyval),"Return")==0) show_pause();}else if(k==-1)/*游戏结束后回车键退出游戏*/{if(strcmp(gdk_keyval_name(event->keyval),"Return")==0)gtk_main_quit();}if(!stop)/*暂停状态不记录键盘方向控制*/{if(strcmp(gdk_keyval_name(event->keyval),"Up")==0)up();else if(strcmp(gdk_keyval_name(event->keyval),"Down")==0)down();else if(strcmp(gdk_keyval_name(event->keyval),"Left")==0)left();else if(strcmp(gdk_keyval_name(event->keyval),"Right")==0)right();}}void up(void)/*按“上”方向键*/{if(flag!=1)/*当前运动方向不为“下”时才向上运动*/flag=0;/*修改方向标记*/}void down(void)/*按“下”方向键*/{if(flag!=0)/*当前运动方向不为“上”时才向下运动*/flag=1;/*修改方向标记*/}void left(void)/*按“左”方向键*/{if(flag!=3)/*当前运动方向不为“右”时才向左运动*/flag=2;/*修改方向标记*/}void right(void)/*按“右”方向键*/{if(flag!=2)/*当前运动方向不为“左”时才向右运动*/flag=3;/*修改方向标记*/}void show_pause(void)/*暂停|开始函数*/{if(i==0){stop=1;for(j=0;j<4;j++){gtk_widget_set_sensitive(direction[j],FALSE);/*暂停时方向键无效*/}i=1;}else{stop=0;for(j=0;j<4;j++){gtk_widget_set_sensitive(direction[j],TRUE);/*开始后方向键有效*/}i=0;}}void eat(void)/*吃食物函数*/{if(jieshu==length)/*蛇身长度已达极限,食物已吃完*/{stop=1;gtk_widget_hide(food[jieshu-6]);showwin();/*调用游戏通关处理函数*/}else if((snake_x[0]==food_x[jieshu-6])&&(snake_y[0]==food_y[jieshu-6]))/*判断是否成功吃到食物*/{gtk_widget_show(snake[jieshu]);/*蛇身增长一节*/gtk_widget_hide(food[jieshu-6]);/*除去本次所吃食物*/gtk_widget_hide(game_score[jieshu-6+prize[jieshu-6]]);/*除去上次得分*/ jieshu++;/*蛇身长度标记增长一节*/gtk_widget_show(game_score[jieshu-6+prize[jieshu-6]]);//新得分gtk_widget_show(food[jieshu-6]);/*显示下一个食物*/}}void speed_control0(void)/*游戏难度选择困难处理函数*/{gtk_widget_hide(game_speed[1]);/*隐藏其余难度值*/gtk_widget_hide(game_speed[2]);/*隐藏其余难度值*/speed=0;k=1;sign=g_timeout_add(op_speed[speed],function,data);/*创建定时器*/ gtk_widget_set_sensitive(game_speed[0],FALSE);/*当前速度不敏感*/ gtk_widget_set_sensitive(game_pause,TRUE);/*暂停|开始按钮有效*/ for(j=0;j<length;j++){gtk_widget_set_sensitive(snake[j],TRUE);gtk_widget_set_sensitive(food[j],TRUE);}for(j=0;j<4;j++){gtk_widget_set_sensitive(direction[j],TRUE);/*使方向选择有效*/ }sleep(0.7);/*等待0.7S便于游戏者反应*/stop=0;/*开始游戏*/}void speed_control1(void)/*游戏难度选择一般处理函数*/{gtk_widget_hide(game_speed[0]);/*隐藏其余难度值*/gtk_widget_hide(game_speed[2]);/*隐藏其余难度值*/speed=1;k=1;sign=g_timeout_add(op_speed[speed],function,data);/*创建定时器*/ gtk_widget_set_sensitive(game_speed[1],FALSE);/*当前难度不敏感*/ gtk_widget_set_sensitive(game_pause,TRUE);/*暂停|开始按钮有效*/ for(j=0;j<length;j++){gtk_widget_set_sensitive(snake[j],TRUE);gtk_widget_set_sensitive(food[j],TRUE);}for(j=0;j<4;j++){gtk_widget_set_sensitive(direction[j],TRUE);/*使方向选择有效*/ }sleep(0.7);/*等待0.7S便于游戏者反应*/stop=0;/*开始游戏*/}void speed_control2(void)/*游戏难度选择简单处理函数*/{gtk_widget_hide(game_speed[0]);/*隐藏其余难度值*/gtk_widget_hide(game_speed[1]);/*隐藏其余难度值*/speed=2;k=1;sign=g_timeout_add(op_speed[speed],function,data);/*创建定时器*/ gtk_widget_set_sensitive(game_speed[2],FALSE);/*当前难度不敏感*/ gtk_widget_set_sensitive(game_pause,TRUE);/*暂停|开始按钮有效*/ for(j=0;j<length;j++){gtk_widget_set_sensitive(snake[j],TRUE);gtk_widget_set_sensitive(food[j],TRUE);}for(j=0;j<4;j++){gtk_widget_set_sensitive(direction[j],TRUE);/*使方向选择有效*/ }sleep(0.7);/*等待0.7S便于游戏者反应*/stop=0;/*开始游戏*/}void showwin(void)/*游戏通关处理函数*/{stop=1;for(j=0;j<4;j++){gtk_widget_set_sensitive(direction[j],FALSE);/*方向键无效*/}gtk_widget_set_sensitive(game_pause,FALSE);/*暂停键失效*/sleep(0.3);/*离开0.3S*/gtk_widget_show(win);/*显示通关提示*/k=-1;}void showdeath(void)/*游戏失败处理函数*/{gtk_timeout_remove(sign);for(j=0;j<4;j++){gtk_widget_set_sensitive(direction[j],FALSE);/*方向键无效*/}gtk_widget_set_sensitive(game_pause,FALSE);/*暂停键失效*/sleep(0.3);/*离开0.3S*/gtk_widget_show(death);/*显示失败提示*/k=-1;}。
《贪吃蛇》游戏程序代码
![《贪吃蛇》游戏程序代码](https://img.taocdn.com/s3/m/927b9f6091c69ec3d5bbfd0a79563c1ec4dad77a.png)
《贪吃蛇》游戏程序代码1. 游戏初始化:设置游戏窗口、蛇的初始位置和长度、食物的初始位置等。
2. 蛇的移动:根据用户输入的方向键,更新蛇的位置。
确保蛇的移动不会超出游戏窗口的边界。
3. 食物的:在游戏窗口中随机食物的位置。
确保食物不会出现在蛇的身体上。
4. 碰撞检测:检测蛇头是否撞到食物或自己的身体。
如果撞到食物,蛇的长度增加;如果撞到自己的身体,游戏结束。
5. 游戏循环:不断更新游戏画面,直到游戏结束。
6. 游戏结束:显示游戏结束的提示,并询问用户是否重新开始游戏。
import random游戏窗口大小WIDTH, HEIGHT = 800, 600蛇的初始位置和长度snake = [(WIDTH // 2, HEIGHT // 2)]snake_length = 1食物的初始位置food = (random.randint(0, WIDTH // 10) 10,random.randint(0, HEIGHT // 10) 10)蛇的移动方向direction = 'RIGHT'游戏循环while True:更新蛇的位置if direction == 'UP':snake.insert(0, (snake[0][0], snake[0][1] 10)) elif direction == 'DOWN':snake.insert(0, (snake[0][0], snake[0][1] + 10)) elif direction == 'LEFT':snake.insert(0, (snake[0][0] 10, snake[0][1])) elif direction == 'RIGHT':snake.insert(0, (snake[0][0] + 10, snake[0][1]))检测碰撞if snake[0] == food:food = (random.randint(0, WIDTH // 10) 10, random.randint(0, HEIGHT // 10) 10)else:snake.pop()检测游戏结束条件if snake[0] in snake[1:] or snake[0][0] < 0 or snake[0][0] >= WIDTH or snake[0][1] < 0 or snake[0][1] >= HEIGHT:break游戏画面更新(这里使用print代替实际的游戏画面更新) print(snake)用户输入方向键direction = input("请输入方向键(WASD): ").upper() print("游戏结束!")。
贪吃蛇程序设计说明书
![贪吃蛇程序设计说明书](https://img.taocdn.com/s3/m/093e352454270722192e453610661ed9ad51553e.png)
贪吃蛇程序设计说明书贪吃蛇游戏程序设计说明书题目:贪吃蛇游戏学校:系别:专业班级:姓名:学号:指导老师:日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。
每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。
二、功能设计:本游戏要求实现以下几个功能:(1)用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2)用户可以调节蛇的运行速度来选择不同的难度;(3)游戏分多个难度级别;(4)用户可自选颜色;(5)记录成绩前五名的游戏玩家;(6)增加背景音乐;(7)提高障碍物和游戏级别。
三、程序模块图:贪吃蛇游戏初始化图模块控制模块设置模块帮助模块墙体蛇身食物移动食物死亡变长绩等级音效四、算法流程图:是否否是否是开始初始化界面和蛇身放置食物获取按键开始运动碰到边界蛇吃到食蛇长大蛇死亡继续结束五、函数原型与功能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#include#include#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; /*蛇的长度*/int 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++)< p="">{snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;loadimage(&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++)< p="">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++)< p="">{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++)< p="">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;snakelen=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'){dir=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, "游戏结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以使用Invalidate()来重绘整个窗口, 量是很大的,这会导致屏幕出现闪烁, • // 以用InvalidateRect()来替代Invalidate(), 要绘制的内容计算量会要小很多。
刷新游戏区域中pPoint处的一个
• void CSnakeView::ReDisplay(CPoint p 绘的窗口的句柄 { 重绘的矩形区域 /重绘矩形的方式。 InvalidateRect (CRect (m_nLeft + pPoi 个参数是需要重绘的窗口的句柄,但是 m_nTop + pPoint. x * m_nSize, 生类中可以不要填写,第二个参数是 m_nLeft + (pPoint. y + 1) * m_nSize, m 的坐标必须是逻辑坐标。第三个参数是 + 1) * m_nSize) ); SE是重绘传入的矩形,为TRUE的时候 }
1
• (2)在CSnakeView. Cpp文件,添加3个成员函数 IniAim、IniGame和ReDiaplay:
// 该函数随机产生一个供蛇吃的目标,如果该目标恰巧与蛇身重合,则 重新产生一个 • void CSnakeView::IniAim() { int uX, uY; // 目标位置 while (1) { uX=rand ( ) % m_nHeight; uY=rand ( ) % m_nWidth; int uTag = 0; // 0-不与蛇身重合,1-重合 for (int i=0;i <= m_aBody. GetUpperBound ( );i++) { CPoint uPoint = m_aBody. GetAt (i); if (uPoint. x == uX ||uPoint. y == uY ) // 目标与蛇身重合 { uTag = 1; break; } } if (uTag == 0) break; } m_pAim = CPoint (uX, uY); // 产生的目标存放在成员变量中 }
ID_GAME_START, ID_GAME_END ,ID_GAME_EASY , ID_GAME_NORMAL 和ID_GAME_DIFFICULTY如图1所示。
4. 解题步骤
•(3)在ClassWizard中为刚才编辑好的菜单添加消息处理函数。 打开ClassWizard,选中Message Maps页。在Class Name中选 择CSnakeView,在Object ID中选择ID_GAME_ START,在 Messages中选择COMMAND,添加消息处理函数,其他的做相 同处理。 • (4)在ClassWizard中添加键盘消息处理函数。打开 ClassWizard,选中Message Maps页。在Class Name中选择 CSnakeView,在Object ID中选择CSnakeView,在Messages 中选择WM_KeyDown,添加消息处理函数。
数的用法 ()提供一个种子,它是一个unsigned int类型; d(),它会根据提供给srand()的种子值返回一个 到RAND_MAX之间);顺便说一下,在ANSI规 文件stdlib.h里面包含对RAND_MAX的宏定义。 X是个常数,它告诉你C库函数rand()的固定范 可以设RAND_MAX为其它的值,也没有办法要 回其它范围的值,如果你用的随机数发生器返 1的浮点值,要取得范围在0 到N-1内的整数, 机数乘以N就可以了。 要多次调用rand(),从而不间断地得到新的随机
2. 编程要求
• (1)画出程序初始样式(方框、蛇身、目标及文字); • (2)允许玩家用菜单项“开始”开始游戏,“结束”结 束游戏; • (3)允许玩家选择游戏难度:“简单”、“普通”、 “困难”; • (4)蛇能自动前进,蛇身显示正确; • (5)用方向键可以改变蛇头方向,并且蛇身在改变方向 处正确弯曲; • (6)蛇头碰到目标可以正确计分并显示; • (7)蛇头碰到目标可以正确增加蛇身长度; • (8)正确判断游戏结束(包括蛇头碰到四壁或蛇身); • (9)正确显示计时
3. 要点分析
• 蛇的活动区域是由若干个小方格组成的。当这些 小方格呈现灰色时,便表示蛇身。设整个区域由 m×n个方格组成,最左上角的方格坐标为(0, 0)。蛇是由若干个邻的方格组成的,将这些方格 的坐标依蛇头至蛇尾的次序存入到一个数组中便 代表了蛇身。当蛇在游戏区域中“游动”一格时, 所对应的数组操作应该是,将新的位置坐标插入 到数组头部,同时将数组中最后一个元素删除。 这项工作可以用一个一般的数组来完成,但当进 行插入操作时需要自己移动数组中的元素;也可 以使用CArray来完成这些工作,CArray的成员函 数提供了需要的操作,这样做简单一些。
• (3)修改CSnakeView的构造函数,完成游戏的 初始化。 • CSnakeView::CSnakeView() { IniGame(); }
• (4)在OnDraw中加入代码,显示游戏界面。
• void CSnakeView::OnDraw(CDC* pDC) { CSnakeDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here // 画游戏区域 pDC -> SelectStockObject (WHITE_BRUSH); pDC -> Rectangle (CRect (m_nLeft - 1, m_nTop - 1, m_nLeft + m_nWidth * m_nSize + 1, m_nTop + m_nHeight * m_nSize + 1) ); // 显示当前用时 CString uStr; uStr. Format ("当前用时:% d", m_nTime); pDC -> TextOut (m_nLeft + m_nWidth * m_nSize + 30, 40, uStr);
贪吃蛇程序
计算机科学与技术091班 王保平 路海英 张跃龙 2010年12月23日
1.问题描述
• 在一个方框内有一条蛇和一个目标,蛇身 由若干小方格组成(游戏开始时,蛇身长 度为4)。蛇自动前进,用光标键可以控制 蛇头的前进方向。蛇头每前进一格,蛇身 的最后一节消失,蛇头改变方向时,蛇身 在该点弯曲。蛇头碰到目标时,玩家得一 分,同时蛇身长度增加一个长度。蛇头碰 到四壁或碰到蛇身时游戏结束。
(1)新建工程Snake,在MFC的向导第一步选择Single Document,按Finish结束。 (2)选择ResourceView窗口,打开菜单编辑器,在顶层 菜单上添加一个名为“游戏”的弹出式菜单,该菜单下添 加一个名为“开始”的子菜单,一个名为“结束”的子菜 单,一个名为“简单”的子菜单,一个名为“普通”的子 菜单合一个名为“困难”的子菜单,其ID为
• (5)在ClassWizard中定时器消息添加处理函数。打开 ClassWizard,选中Message Maps页。在Class Name 中选择CSnakeView,在Object ID中选择CSnakeView, 在Messages中选择WM_Timer,添加消息处理函数。 •(6)编辑生成的代码,完成程序。
• // 该函数对游戏初始化,定义游戏的初始状态
• void CSnakeView::IniGame() { // 游戏区域 m_nLeft = 20; m_nTop = 20; m_nWidth = 40; m_nHeight = 30; m_nSize = 10; • // 游初始状态 m_nGameStatus = 0; m_nDirect = 1; m_nCount = 0; • // 初始化蛇身 m_aBody. RemoveAll ( ); m_aBody. Add ( CPoint (2, 7) ); m_aBody. Add ( CPoint (2, 6) ); m_aBody. Add ( CPoint (2, 5) ); m_aBody. Add ( CPoint (2, 4) );
•
• • • • • • • • • • • • • • • • • • • • • • • • •
CArray类的成员 构造函数 Carray构造一个空数组 属性 GetSize获得此数组中的元素数 GetUpperBound返回最大的有效索引值 SetSize设置包含在此数组中的元素数 操作 FreeExtra释放大于当前上界的未使用的内存 RemoveAll从此数组移去所有元素 元素访问 GetAt返回在给定索引上的值 SetAt设定一个给定索引的值;数组不允许扩展 ElementAt返回一个对数组中元素指针的临时参考 GetData允许对数组中的元素访问。可以为NULL 扩展数组 SetAtGrow为一个给定索引设置值;如果必要,扩展数组 Add在数组的末尾添加元素;如果必要,扩展数组 Append在数组上附加另一个数组;如果必要,扩展数组 Copy把另一个数组拷贝到数组上;如果必要,扩展数组 插入/移去 InsertAt在指定的索引上插入一个元素(或另一个数组中的所有元素) RemoveAt在指定的索引上移去一个元素 运算符 [ ]在特定索引上设置或获取元素
• // 计时器清零
• • • • • • • • • m_nTime = 0; m_nTime1 = 0; // 初始化随机数发生器 srand ( (unsigned) time // 产生一个目标 IniAim ( ); }
么时候,都可以给srand()提供一个新的种子,从 “随机化”rand()的输出结果。rand()产生的随机 运行的时候都是与上一次相同的。若要不同,用函 初始化。srand((unsigned int)(time(NULL)),产 随机数种子,因为每一次运行程序的时间是不同