贪吃蛇游戏
章第1
贪吃蛇游贪
;TC 2.0贪贪,
随断来丰着贪子贪品性能的不提升~所附贪的贪贪性游贪也越越富。贪吃蛇游贪作贪一古老而又贪典的游贪被不完善~而且可以使用多贪贪言贪贪个断。本章贪贪贪述了使用C贪言贪贪贪吃蛇游贪基本功能的流程和相贪技贪。通贪本章的贪~贪者能贪到,学学
贪 游贪贪贪思路
贪 游贪贪面贪贪
贪 贪度控制函贪贪数
贪 贪函贪贪画数
贪 行贪程函贪贪运数
贪 游贪贪束贪面贪贪
C贪言贪目贪贪全程贪贪
1.1 贪吃蛇游贪述概
贪吃蛇起源于西方~自于蛇贪夏娃和贪贪吃禁果的神贪。人贪贪了贪明蛇的一“贪”字~贪贪出了贪吃来当个
蛇游贪。本章使用C贪言贪贪一贪吃蛇游贪~贪贪贪述了贪贪流程和贪贪技贪。下面看一下贪贪的贪贪贪程。个来
1.1.1 功能贪述
本游贪只需要用贪贪贪行程序~就可以贪入游贪界面~然后贪贪游贪贪度;本游贪分贪双运3个即贪度水平,~
可贪入游贪。
1.1.2 系贪贪贪
本游贪系贪的游贪界面富~下面列出典型贪面~其他贪面贪贪光贪中的源程序。很丰几个参
贪吃蛇游贪系贪主贪面的行效果如贪运1.1所示。
游贪行效果如贪运1.2所示。
贪1.1 贪吃蛇游贪主贪面 贪1.2 游贪行效果运
游贪失贪行效果如贪运1.3所示。
贪1.3 游贪失贪行效果运2
第1章 贪吃蛇游贪;TC 2.0贪贪,
1.2 贪 贪 技 贪
graphics.h文件是TC中的贪形贪~如果要使用~贪贪用TC贪行贪贪。下面贪graphics.h文件中的函贪行贪贪数
介贪。
主要函的分贪及函贪明如
数数1.1所示。
表1.1 graphics.h文件中主要函及贪明数函 数贪 明
像素函数
putpixel()画数像素点函getpixel()返回像素点函 数
直贪和贪型函数
line()画数贪函lineto()画数贪函linerel()相贪贪函画数setlinestyle()贪置贪型函数getlinesettings()贪取贪型贪置函数setwritemode()贪置贪模式函画数
多贪形函数
rectangle()画数矩形函bar()画条数函bar3d()画条数贪函drawpoly()画数多贪形函
贪、弧和曲贪函数
getaspectratio()贪取贪比函横数circle()画数贪函arc()画数贪弧函ellipse()画数贪贪弧函fillellipse()画区数贪贪函贪pieslice()画区数扇函sector()画区数贪贪扇函getarccoords()贪取贪弧坐贪函 数
填数充函
setfillstyle()贪置充贪贪和贪色函填数setfillpattern()贪置用贪贪贪函数floodfill()填数充贪域函fillpoly()填数充多贪形函
3
C贪言贪目贪贪全程贪贪
贪表
函 数贪 明
填数充函
getfillsettings()贪取充贪置函填数
getfillpattern()贪取用贪贪贪贪置函 数
贪像函数
imagesize()贪像存贪大小函数
getimage()保存贪像函数
putimage()贪出贪像函数下面贪程序中使用到的一些函贪行贪贪介贪。数
1.2.1 bioskey()函数
bioskey()函的功能是直接使用数BIOS服贪的贪贪接口。
函原型,数
int bioskey(int cmd)
bioskey()函的原型在数bios.h贪文件中。bioskey()完成直接贪贪操作~cmd的贪定贪行什贪操作。决参数的贪置贪及其含贪如表1.2所示。
表1.2 cmd参数的贪置贪及含贪参数 贪含 贪
bioskey()返回下一在贪贪贪入的贪;等待到按下一贪,。返回一个它将个它个16位的二贪制~包括数两
cmd = 0个当个不同的贪。按下一普通贪贪~低8位存放贪字符的ASCII贪~高8位存放贪贪的贪描贪~贪于特殊贪
;如方向贪、F1,F12等,~低8位贪0~高8位字贪存放贪贪的贪描贪cmd = 1bioskey()贪贪是否按下一贪~若按下一贪贪返回非零贪~否贪返回个个0
bioskey()返回Shift、Ctrl、Alt、ScrollLock、NumLock、CapsLock、Insert贪的贪。各贪贪存放在返回贪的状状cmd = 2低8位字贪中。字贪位的贪置及含贪如表1.3所示
表1.3 字贪位的贪置及含贪
字 贪 位含 贪
0右贪Shift贪贪状
1左贪Shift贪贪状
2Ctrl贪贪状
3Alt贪贪状
4ScrollLock贪贪状
5NumLock贪贪状
6CapsLock贪贪状
7Insert贪贪状4
第1章 贪吃蛇游贪;TC 2.0贪贪, 1.2.2 initgraph()函和数closegraph()函数
1,initgraph()函数
initgraph()函的功能是初始化贪形系贪。数
函原型,数
void far initgraph(int far *graphdriver, int far *graphmode,char far *pathtodriver);
2,closegraph()函数
closegraph()函的功能是贪贪贪形系贪。数
函原型,数
void far closegraph(void);
1.2.3 setbkcolor()函数
setbkcolor()函用指定的贪色贪贪置前的背景色~如果指定的贪色贪超出了前贪贪的表示范贪~贪贪数来当当
置贪最近似的、贪贪可以表示的贪色。
函原型,数
COLORREF SetBkColor( HDC hdc, COLORREF crColor );
参数贪明如下。
,hdc,贪置上下文句柄。
,crColor,贪贪新的背景贪色贪。如果想要贪得COLORREF的贪~贪使用RGB宏。
如果函成功~返回贪是原背景色的数COLORREF贪~如果函失贪~贪返回数CLR_INVALID。1.2.4 outtextxy()函数
outtextxy()函在指定位置贪示一字符串。数
函原型,数
void far outtextxy(int x, int y, char *textstring);1.2.5 settextstyle()函数
settextstyle()函用于贪贪形贪出贪置前的文本性。数当属
5
C贪言贪目贪贪全程贪贪
函原型,数
void far settextstyle(int font, int direction, char size);
函的贪明如表数参数1.4所示。
表1.4 settextstyle()函的贪明数参数参数 贪 明
字。取贪贪体DEFAULT_FONT、TRIPLEX_FONT、SMALL_FONT、SANSSERIF_FONT或GOTHIC_ fontFONT~也可以用0,4代替
direction字符的排列方向~包括向和贪向~横0贪向排列~横1贪贪向排列size字大小。可用体interger作参数
1.2.6 setcolor()函数
setcolor()函用于贪置前幕的贪色。数当屏画笔
函原型,数
void setcolor (int color);
1.2.7 getch()函数
getch()函用于控制台无回贪地贪取一字符。数从个
函原型,数
int getch(void);
返回贪,贪贪上贪取到的字符。从
在Windows/MS-DOS中~可以利用getch()函使程序贪贪贪束后等待贪程者按下贪贪才返回贪贪界面。贪函数
数包含在贪文件conio.h中。在使用贪~在主函贪尾“数return 0;”之前加上getch()即可。
getch()函可以贪系贪在用贪按下任意贪而不需要按数Enter贪贪就可以接收到用贪的贪入~可以用作贪来
press anykey to continue的贪贪。
1.3 程序贪贪理模贪1.3.1 文件引用
在本游贪系贪中需要引用一些贪文件~以便程序更好地行。引用贪文件需要使用运#include命令~下面
6
第1章 贪吃蛇游贪;TC 2.0贪贪,
即是要引用的文件和引用代贪~贪贪代贪如下,
#include
/*贪入/贪出函数*/#include/*常用子程序*/#include/*贪用DOS控制台I/O*/#include /*贪形贪文件*/#include/*MS-DOS和8086贪用的一些常量和函数*/
1.3.2 宏定贪
宏定贪也是贪贪理命令的一贪~以#define贪贪~提供了一贪可以替贪源代贪中字符串的机制。本系贪用贪使将
用贪贪操作贪吃蛇贪使用的方向贪的贪贪定贪贪宏。定贪形式如下,#define LEFT 0x4b00/*向左贪*/#define RIGHT 0x4d00/*向右贪*/#define DOWN 0x5000/*向下贪*/#define UP 0x4800/*向上贪*/#define Esc 0x011b/*Esc退出贪*/#define N 100/*贪吃蛇的最大贪度*/
1.3.3 声构体明贪
food是表示食物基本信息的贪~构体snake是定贪贪吃蛇基本信息的贪~明贪的代贪如下,构体声构体struct food
{
int x; /*食物的坐贪横*/
int y; /*食物的贪坐贪*/
int flag; /*贪志是否要出贪食物*/} food;
struct snake
{
int x[N];
int y[N];
int node; /*蛇的贪数*/
int dir; /*蛇移贪方向*/
int life; /*贪志是死是活*/} snake;
7
C贪言贪目贪贪全程贪贪
1.3.4 函明数声
在本程序中使用了自定贪的函~贪些函的功能及明形式如下,几个数数声
void GameOver();/*贪束游贪*/void Play();/*玩游贪贪程*/void dwall();/*画*/贪void wall(int x,int y);/*画贪成贪的贪*/int Speed();/*贪贪贪吃蛇的速度*/
1.4 主函模贪贪贪数
程序行后~首先运从main()函贪始~在数main()主函中~首先贪贪形化界面贪行初始化~贪用自定贪数
函数Speed()贪取蛇的行贪速度~然后贪贪始游贪。贪贪代贪如下,清屏画
main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
speed=Speed();/*将数函返回贪贪贪speed*/
cleardevice();/*清屏*/
dwall();/*贪始贪画*/
Play();/*贪始玩游贪*/
getch();
closegraph();/*退出贪形界面*/}
1.5 速度贪贪界面1.5.1 模贪述概
本模贪主要贪贪贪游贪贪度水平的贪贪。玩家在本界面贪贪好游贪的贪度后就可以贪入相贪的游贪界面~如贪1.4所
示。
8
第1章 贪吃蛇游贪;TC 2.0贪贪,
贪1.4 游贪主界面
1.5.2 速度贪贪界面的贪贪
自定贪speed()函~用贪贪贪吃蛇的速度~程序代贪如下,数来
int speed() /*贪贪贪吃蛇行的速度运*/{
int m;
gotoxy(20, 10);
printf("level1\n");
gotoxy(20, 12);
printf("level2\n");
gotoxy(20, 14);
printf("level3\n\t\tplease choose:");
scanf("%d", &m);
switch (m)
{
case 1:
return 60000;
case 2:
return 40000;
case 3:
return 20000;
default:
cleardevice();
Speed();
}
}
1.6 画数贪函的贪贪
1.6.1 模贪述概
本模贪主要是贪贪贪~贪吃蛇撞到贪后~游贪贪束。本游贪中的贪如贪画画1.5所示。
9
C贪言贪目贪贪全程贪贪
贪1.5 画贪的界面
1.6.2 画数贪函的贪贪
自定贪dwall()函~用贪~程序代贪如下,数来画
void dwall() /*用前面好的贪贪画来画*/{
int j;
for (j = 50; j <= 600; j += 10)
{
wall(j, 40); /*画上面贪*/
wall(j, 451); /*画下面贪*/
}
for (j = 40; j <= 450; j += 10)
{
wall(50, j); /*画左面贪*/
wall(601, j);/*画右面贪*/
}
}
在上面代贪中贪用了一函个数wall()~贪函主要是用贪成贪的贪~通贪循贪贪出贪贪~形成游贪需要的贪数来画
贪~贪贪代贪如下,
void wall(int x,int y)
{
int sizx=9;
int sizy=9;
setcolor(15);/*白色贪的上贪和左贪画*/
line(x,y,x+sizx,y);
line(x,y+1,x+sizx-1,y+1);
line(x,y,x,y+sizy);
10
第1章 贪吃蛇游贪;TC 2.0贪贪,
line(x+1,y,x+1,y+sizy-1);
setcolor(4);/*贪色贪的右面和下面画*/
line(x+1,y+sizy,x+sizx,y+sizy);
line(x+2,y+sizy-1,x+sizx,y+sizy-1);
line(x+sizx-1,y+2,x+sizx-1,y+sizy-1);
line(x+sizx,y+1,x+sizx,y+sizy);
setfillstyle(1,12);/*用淡贪色充贪的中贪部分填*/
bar(x+2,y+2,x+sizx-2,y+sizy-2);
}
1.7 游贪行函的贪贪运数
1.7.1 模贪述概
在自定贪函数play()中~主要贪贪了贪吃蛇游贪的具贪程。在游贪贪程中~程序判贪贪贪入的贪贪~如使断
用上、下、左、右方向贪控制贪吃蛇的贪方向~贪贪贪食物出贪位置的控制。本游贪行界面如贪来运并运1.6所示。
贪1.6 游贪行界面运
1.7.2 游贪行函的贪贪运数
自定贪play()函~用贪贪贪吃蛇游贪的具贪程~程序代贪如下,数来体
void play(void) /*游贪贪贪贪程*/
{
srand((unsigned long)time(0));
food.flag = 1; /*1表示需出贪新食物~0表示食物已存在*/
11
C贪言贪目贪贪全程贪贪
snake.life = 0; /*贪志贪吃蛇活着*/
snake.dir = 1; /*方向向右*/
snake.x[0] = 300;
snake.y[0] = 240; /*定位蛇贪初始位置*/
snake.x[1] = 290;
snake.y[1] = 240;
snake.node = 2; /*贪食蛇贪数*/
do
{
while (!kbhit()) /*在有按贪的情下~蛇自己移贪身没况体*/
{
if (food.flag == 1)/*需要出贪新食物*/
do
{
food.x = rand() % 520+60;
food.y = rand() % 370+60;
food.flag = 0; /*贪志已有食物*/
}
while (food.x % 10 != 0 || food.y % 10 != 0);
if (food.flag == 0)/*画出食物*/
{
setcolor(GREEN);
setlinestyle(3, 0, 3);
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.dir)
{
case 1:
snake.x[0] += 10;
break;/*向右移*/
case 2:
snake.x[0] -= 10;
break; /*向左移*/
case 3:
snake.y[0] -= 10;
break; /*向上移*/
case 4:
12
第1章 贪吃蛇游贪;TC 2.0贪贪,
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] < 60 || snake.x[0] > 590 || snake.y[0] < 50 ||
snake.y[0] > 440)/*蛇是否撞到贪壁*/
{
GameOver(); /*游贪贪束*/
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.node++;/*蛇的身贪一贪体*/
food.flag = 1;/*需要出贪新的食物*/
}
setcolor(4);/*画蛇*/
for (i = 0; i < snake.node; i++)
{
setlinestyle(0, 0, 1);
rectangle(snake.x[i], snake.y[i], snake.x[i] + 10, snake.y[i] +10);
}
delay(speed);
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 = bioskey(0);/*接收按贪*/
if (key == UP && snake.dir != 4)/*判是否断往相反的方向移贪*/
snake.dir = 3;
13
C贪言贪目贪贪全程贪贪
else
if (key == DOWN && snake.dir != 3)/*判是否断往相反的方向移贪*/
snake.dir = 4;
else
if (key == RIGHT && snake.dir != 2)/*判是否断往相反的方向移贪*/
snake.dir = 1;
else
if (key == LEFT && snake.dir != 1)/*判是否断往相反的方向移贪*/
snake.dir = 2;
}
while (key != Esc);/*按Esc贪退出游贪*/}
1.8 游贪贪束界面的贪贪
1.8.1 模贪述概
在蛇撞贪死后~游贪贪出游贪贪束的界面。本游贪中贪束界面如贪会1.7所示。
贪1.7 游贪贪束界面
1.8.2 游贪贪束界面的贪贪
自定贪GameOver()函~用提示游贪贪束~程序代贪如下,数来
void GameOver(void)
{
cleardevice();
setcolor(RED); /*贪置字贪贪色体*/
settextstyle(0, 0, 4);
outtextxy(50, 200, "GAME OVER,BYE BYE!");
sleep(3);
}
14
第1章 贪吃蛇游贪;TC 2.0贪贪,
1.9 贪 贪 贪 贪
贪吃蛇游贪是一款老少皆宜的贪典游贪~其基本贪贪是,通贪按贪贪的上、下、左、右贪控制蛇行的方向来运~当体当蛇吃了食物后身贪度自贪增加~蛇撞贪或吃到自身贪贪蛇死。本章通贪贪贪吃蛇游贪程序的介贪~使贪者了解一贪贪的游贪程序贪贪的基本思路和贪程~加个并深贪贪形贪像技贪的理解~贪今后程序的贪贪奠定基贪。
15