贪吃蛇游戏程序设计程序Word文档格式.docx

上传人:b****6 文档编号:18157216 上传时间:2022-12-13 格式:DOCX 页数:15 大小:25.10KB
下载 相关 举报
贪吃蛇游戏程序设计程序Word文档格式.docx_第1页
第1页 / 共15页
贪吃蛇游戏程序设计程序Word文档格式.docx_第2页
第2页 / 共15页
贪吃蛇游戏程序设计程序Word文档格式.docx_第3页
第3页 / 共15页
贪吃蛇游戏程序设计程序Word文档格式.docx_第4页
第4页 / 共15页
贪吃蛇游戏程序设计程序Word文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

贪吃蛇游戏程序设计程序Word文档格式.docx

《贪吃蛇游戏程序设计程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏程序设计程序Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

贪吃蛇游戏程序设计程序Word文档格式.docx

握,并且能够掌握C语言编程和程序调试的基本技能。

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

2、所用仪器设备

1、能正常工作的计算机一台;

2、WindowsXP;

3、TC程序;

4、MicrosoftWord2003;

3、具体设计过程

3.1、程序功能

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

3.2设计思想

程序关键在于表示蛇的图形及蛇的移动。

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

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

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

为了便于理解,定义两个结构体:

食物与蛇。

3.3(设计的具体实现

(1)函数定义

函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用

^defineN200

^include〈graphics.h>

/*图形头文件*/itinclude<

stdlib.h>

/*包含rand等函数*/ttinclude<

dos.h>

/*包含bios函数*/#defineLEFT0x4b00/*光标左键值*/^defineRIGHT0x4d00/*光标右键值*/^defineDOWN0x5000/*光标下键值*/ttdefineUP0x4800/*光标上键值*/ttdefineESC0x011b/*ESC的ASCII码*/inti,key;

/*图形坐标变量及按键变量*/intscore二0;

/*得分*/

intgamespeed二10000;

/*游戏速度自己调整*/structFood

{

intx;

/*食物的横坐标*/

inty;

/*食物的纵坐标*/

intyes;

/*判断是否要出现食物的变量*/}food;

/*食物的结构体*/

structSnake

intx[];

/*蛇的横坐标*/

inty[];

/*蛇的纵坐标*/

intnode;

/*蛇的节数*/

intdirection;

/*蛇移动方向*/

intlife;

/*蛇的生命,0活着,1死亡*/}snake;

voidInit(void):

/*图形驱动*/

voidClose(void);

/*图形结束*/

voidDrawK(void);

/♦画界面函数*/

voidGameOver(void):

/*结束游戏*/

voidGamePlay(void):

/*玩游戏具体过程*/voidPrScore(void);

/*输出成绩*/voidmain(void)/*主函数*/

(2)主函数main()

主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,

后初始化图形系统,调用函数DrawK()1EI出开始画面,调用函数GamePlay()»

即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序voidmain(void)/*主函数*/

Init();

DrawK();

/*开始画面*/

GamePlay();

/*玩游戏具体过程*/

Close();

}

voidInit(void)/*图形驱动*/

intgd二DETECT,gm;

initgraph(&

gd,&

gm,"

c:

\\tc"

);

/*第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式,笫三个参数指定驱动程序所在口录。

*/

cleardevice();

(3)画界面函数DrawK()

主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽

度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。

void

DrawK(void)/*开始画面,左上角坐标为(50,40),右下角坐标为(610,

460)的围墙*/

setbkcolor(O);

/*设置当前背景颜色*/

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);

/*右边*/

(4)游戏具体过程函数GamePlay()

这是游戏的主要组成部分,他采用将前一节的坐标赋给后一节,用背景颜色将最

后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。

GamePlay(void)/*玩游戏具体过程*/

randomize();

/*随机数发生器*/

food,yes二1;

/*1表示需要出现新食物,0表示已经存在食物*/

snake,life二0;

/*活着*/

snake,direction二1;

/*方向往右*/

snake.x[0]=100;

snake.y[0]=100;

/*蛇头*/

snake.x[l]=110;

snake.y[l]=100;

/*蛇第二节*/

snake,node二2;

/*节数*/

PrScoreO;

/*输出得分*/

while

(1)/*可以重复玩游戏,压ESC键结束*/

while(!

kbhit())/*在没有按键的情况下,蛇自己移动身体*/

if(food.yes=l)/*需要出现新食物*/

food.x=rand()%400+60;

food.y=rand()%350+60;

wh订e(food.x%10!

=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

food.x++;

while(food.y%10!

=0)

food.y++;

food,yes二0;

/*画面上有食物了*/

辻(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・;

snake・y[i]二snake・y[i-l];

switch(snake,direction)/*定义1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/

case1:

snake・x[0]+=10;

b:

reak;

case2:

snake・x[0]-二10;

break;

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=l;

if(snake,x[0]<

551isnake,x[0]>

595Iisnake,y[0]<

551Isnake.y[0]>

455)/*蛇是否撞到墙壁*/

/*本次游戏结束*/

snake.life=l;

/*蛇死*/

if(snake,life-1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/

if(snake.x[Oj~food.x&

snake.y[0]=food.y)/*吃到食物以后*/

setcolor(0);

/*把画面上的食物东西去掉*/

snake,x[snake,node]=-20;

snake,y[snake,node]=-20;

/*-20表示尾巴长一节*/

/*新的一节先放在看不见的位置,下次循环就取询一节的位置*/

snake,node卄;

/*蛇的身体长一节*/

/*画面上需要出现新的食物*/

score+=10;

/*输出新得分*/

setcolor(4);

for(i=0;

Ksnake.node;

i++)/*画出蛇*/

rectangle(snake.x[i_,snake.y[i_,snake.x[i]+10,

snake,y[i]T0);

delay(gamespeed);

/*用黑色去除蛇的的最后一节*/

rectangle(snake・x[snake・node一1],snake・y[snake・node一1],snake・x[snake・node一l]+10,snake・y[snake・node一1]一10);

}/*endwhile(〜kbhit)*/

if(snake.life==l)/*如果蛇死就跳出循环*/

key=bioskey(0);

/*接收按键*/

if(key二二ESC)/*按ESC键退出*/

else

if(key==UP&

snake・direction!

=4)

/*判断是否往相反的方向移动*/

snake・direction=3;

if(key—RIGHT&

snake.direction!

=2)

snake・direction=l;

if(key==LEFT&

=l)

snake・direction=2;

辻(key二二D0WN&

=3)

snake・direction=4;

}/*endwhile(l)*/

(5)游戏结束函数GameOver()

游戏结束,清除屏幕,输出分数,显示游戏结束信息。

GameOver(void)/*游戏结束*/

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"

guojiarT);

getch();

voidPrScore(void)/*输出成绩*/

charstr[10]:

setfillstyle(SOLID_FILL,WHITE);

bar(50,15,200,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"

scorescore);

outtextxy(55,20,str);

}

voidClose(void)/*图形结束*/

closegraph();

3.4总体流程图

3.5、程序代码编写及注释

itdefineN200

^include<

graphics.h>

^include<

^define

LEFT0x4b00ttdefineRIGHT0x4d00defineDOWN0x5000itdefineUP0x4800ttdefineESC0x011binti,key;

intscore二0;

intgamespeed二50000;

intx[N];

inty[N];

intnode:

/*蛇的节数*/

/*蛇的生命,0活着,1死亡*/}snake;

voidClose(void);

voidGameOver(void);

/*结束游戏*/voidGamePlay(void);

/*玩游戏具体过

程*/voidPrScore(void);

/*输出成绩*//*主函数*/

voidmain(void){

voidInit(void)

c:

);

/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

voidDrawK(void)

/*setbkcolor(LIGHTGREEN):

setcolor(11);

setlinestyle(SOLID.LINE,0,THICK_WIDTH):

/*设置线型*/

i+=10)/*画围墙水/

rectangle(i,451,i+10,460);

for(i=40;

i<

=450;

i+=10)

voidGamePlay(void)

snake.1辻e二0;

/*活着*/

snake.direction=l;

snake.node=2;

while(l)/*可以重复玩游戏,压ESC键结束*/

while(!

kbhit())/*在没有按键的情况下,蛇自己移动身体*/

辻(food.yes=l)/*需要出现新食物*/

food.x=rand()%400+60:

food.y=rand()%350+60:

food・x++;

while(food.y%10!

food・y++;

setcolor(GREEN);

rectangle(food・x,food・y,food・x+10,food・y-10);

i—)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/

snake・x[i]=snake・x[i-l.;

snake・y[i]二snake・y[i-l_;

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头权

switch(snake・direction)

snake.x[0]+=10;

case2:

snake.x[0]~=10;

case3:

snake.y[0]~=10;

ase4:

snake,y[0]+=10;

c

for(i=3;

i++)/*从蛇的第四节开始判断是否撞到自己了,因为

if(snake.x[i]==snake.x[0J&

snake.y[i]==snake.y[0])

if(snake,x[0]<

55)Isnake,x[0]>

595)Isnake,y[0]<

55I)

snake.y[0]>

455)/*蛇是否撞到墙壁*/

辻(snake.x[0]==food.x&

snake.y[Oj==food.y)/*吃到食物以后*/

snake・x[snake・node]二一20;

snake・y[snake・node]二一20;

/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

snake.node++;

setcolor(4);

/*画出蛇*/

for(i二0;

snake・node;

i++)

rectangle(snake・x[i],snake・y[i],snake・xEi.+lO,

snake・y[i[T0);

rectangle(snake・x[snake・node一1],snake・y[snake・node一1],snake・x[snake・node一l]+10,snake・y[snake・node一1]一10);

辻(key二二ESC)/*按ESC键退出*/

if(key—UP&

二4)/*判断是否往相反的方向移动*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1