贪吃蛇游戏课程设计.docx
- 文档编号:9045901
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:15
- 大小:46.66KB
贪吃蛇游戏课程设计.docx
《贪吃蛇游戏课程设计.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
贪吃蛇游戏课程设计
{
Init();//图形驱动
DrawK();//开始画面
GamePlay();//玩游戏的具体过程
Close();//图形结束
}
voidInit()//图形驱动
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"");/*此处为turboc的路径,读者可以根据自己的电脑而改*/
cleardevice();
}
(3)画界面函数DrawK()
主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。
voidDrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙
{
setbkcolor(GREEN);
setcolor(LIGHTRED);
setlinestyle(0,0,5);//设置线型
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);//右边
}
}
(4)游戏具体过程函数GamePlay()
这是游戏的主要组成部分,他采用将前一节的坐标赋给后一节,用背景颜色将最后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。
voidGamePlay()//玩游戏的具体过程
{
rand();//随机数发生器
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)
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];
}
switch(snake.direction)//1,2,3,4表示上下左右四个方向,通过这个判断来移动蛇头
{
case1:
snake.x[0]+=10;break;
case2:
snake.x[0]-=10;break;
case3:
snake.y[0]-=10;break;
case4:
snake.y[0]+=10;break;
}
for(i=3;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(WHITE);//画出蛇 for(i=0;i rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); Sleep(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); } if(snake.life==1)//如果蛇死就跳出循环 break; key=getchar();//接受案件 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) } (5)游戏结束函数GameOver() 游戏结束,清除屏幕,输出分数,显示游戏结束信息。 voidGameOver()//游戏结束 { cleardevice(); PrScore(); setcolor(RED); outtextxy(100,100,"我会回来的! ! ! ! ! "); getch(); } voidPrScore()//输出成绩 { charstr[10]; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); sprintf(str,"score: %d",score); outtextxy(55,20,str); } voidClose()//图形结束 { getch(); closegraph(); } 五、调试及解决方法 可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我去图书馆或上网查阅一些资料或者是向老师请教也解决了对源程序一一修改直到运行成功 七、设计心得体会 在设计这个程序中我主要学会了如何运用以下有关C语言和C++的知识 1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序 十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增 加了程序的可读性。 2)分析函数先从main()函数入手。 Main()函数是C++源程序编译时的开始, 从main()函数开始读函数可将其他函数的功能理解得更透彻。 3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出 来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。 4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行 处理的函数,起功能我都有所了解。 5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。 6)了解到了注释的重要性。 八、附录 1、参考文献: 谭浩强,《C++程序设计》清华大学出版社 郭翠英,《C语言课程设计案例精编》,中国水利水电出版社,2004.3 李丽娟,《C语言程序设计教程》人民邮电出版社 林华聪,《C语言程序设计思想与实践》冶金工业出版社 2、源代码 #defineM200 #include"graphics.h" #include #include #include #include #include #include #include #defineLEFT97//A #defineRIGHT100//D #defineDOWN115//S #defineUP119//W #defineEsc0x011b inti,key; intscore=0; intgamespeed=250;//游戏速度可根据实际情况自行调整 structFood { intx;//食物的横坐标 inty;//食物的纵坐标 intyes;//判断是否要出现食物的变量 }food;//食物的结构体 structSnake { intx[M]; inty[M]; intnode;//蛇的节数 intdirection;//蛇的移动方向 intlife;//蛇的生命,0表示活着,1表示死亡 }snake; voidInit();//图形驱动 voidClose();//图形结束 voidDrawK();//开始画面 voidGamePlay();//玩游戏的具体过程 voidGameOver();//游戏结束 voidPrScore();//输出成绩 voidmain()//主函数 { Init();//图形驱动 DrawK();//开始画面 GamePlay();//玩游戏的具体过程 Close();//图形结束 } voidInit()//图形驱动 { intgd=DETECT,gm; initgraph(&gd,&gm,"");/*此处为turboc的路径,读者可以根据自己的电脑而改*/ cleardevice(); } voidDrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 { setbkcolor(GREEN); setcolor(LIGHTRED); setlinestyle(0,0,5);//设置线型 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);//右边 } } voidGamePlay()//玩游戏的具体过程 { rand();//随机数发生器 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) 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]; } switch(snake.direction)//1,2,3,4表示上下左右四个方向,通过这个判断来移动蛇头 { case1: snake.x[0]+=10;break; case2: snake.x[0]-=10;break; case3: snake.y[0]-=10;break; case4: snake.y[0]+=10;break; } for(i=3;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(WHITE);//画出蛇 for(i=0;i rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); Sleep(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); } if(snake.life==1)//如果蛇死就跳出循环 break; key=getchar();//接受案件 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) } voidGameOver()//游戏结束 { cleardevice(); PrScore(); setcolor(RED); outtextxy(100,100,"我会回来的! ! ! ! ! "); getch(); } voidPrScore()//输出成绩 { charstr[10]; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); sprintf(str,"score: %d",score); outtextxy(55,20,str); } voidClose()//图形结束 { getch(); closegraph(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 游戏 课程设计