课程设计指导书 用C语言程序制作的小游戏贪吃蛇Word文件下载.docx
《课程设计指导书 用C语言程序制作的小游戏贪吃蛇Word文件下载.docx》由会员分享,可在线阅读,更多相关《课程设计指导书 用C语言程序制作的小游戏贪吃蛇Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
#include<
graphics.h>
stdlib.h>
dos.h>
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
inti,key;
intscore=0;
/*得分*/
intgamespeed=50000;
/*游戏速度自己调整*/
structFood
{
intx;
/*食物的横坐标*/
inty;
/*食物的纵坐标*/
intyes;
/*判断是否要出现食物的变量*/
}food;
/*食物的结构体*/
structSnake
intx[N];
inty[N];
intnode;
/*蛇的节数*/
intdirection;
/*蛇移动方向*/
intlife;
/*蛇的生命,0活着,1死亡*/
}snake;
voidInit(void);
/*图形驱动*/
voidClose(void);
/*图形结束*/
voidDrawK(void);
/*开始画面*/
voidGameOver(void);
/*结束游戏*/
voidGamePlay(void);
/*玩游戏具体过程*/
voidPrScore(void);
/*输出成绩*/
/*主函数*/
voidmain(void)
Init();
DrawK();
GamePlay();
Close();
}
voidInit(void)
intgd=DETECT,gm;
initgraph(&
gd,&
gm,"
c:
\\tc"
);
cleardevice();
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawK(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;
=450;
i+=10)
rectangle(50,i,59,i+10);
/*左边*/
rectangle(601,i,610,i+10);
/*右边*/
voidGamePlay(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)
food.y++;
food.yes=0;
/*画面上有食物了*/
if(food.yes==0)/*画面上有食物了就要显示*/
setcolor(BROWN);
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)
case1:
snake.x[0]+=10;
break;
case2:
snake.x[0]-=10;
case3:
snake.y[0]-=10;
case4:
snake.y[0]+=10;
for(i=3;
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)/*蛇是否撞到墙壁*/
/*本次游戏结束*/
/*蛇死*/
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
if(snake.x[0]==food.x&
snake.y[0]==food.y)/*吃到食物以后*/
setcolor(0);
/*把画面上的食物东西去掉*/
snake.x[snake.node]=-20;
snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;
/*蛇的身体长一节*/
/*画面上需要出现新的食物*/
score+=10;
/*输出新得分*/
setcolor(4);
/*画出蛇*/
for(i=0;
i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
/*用黑色去除蛇的的最后一节*/
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)/*如果蛇死就跳出循环*/
key=bioskey(0);
/*接收按键*/
if(key==ESC)/*按ESC键退出*/
else
if(key==UP&
snake.direction!
=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
if(key==RIGHT&
=2)
if(key==LEFT&
=1)
snake.direction=2;
if(key==DOWN&
=3)
snake.direction=4;
}/*endwhile
(1)*/
/*游戏结束*/
voidGameOver(void)
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"
GAMEOVER"
getch();
voidPrScore(void)
{
charstr[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);
voidClose(void)
closegraph();
五、主要解决问题的方法及技术关键
1、主要问题及解决方法:
主要调用到graphics.h,stdio.h,dos.h,stdlib.h等重要库函数,运用结构体、链表以及结构体等进行编译。
2、技术关键
Ifelse、breakcontinue等语句的运用,及绘图函数等函数的应用。
食物和围墙坐标的设置。
六、设计结果说明
1、设计优点:
容易理解,而且操作简单。
并且运用了简单的C语言知识,巩固C语言运用的目的。
2、设计不足:
由于对C语言了解还不够,所以程序的某些地方还有些不足,游戏的趣味性还很不够,而且没有声音,要想效果更加好,还需加以改正。