#include <graphics.h> /*调用图象的函数的头文件*/
#include <stdlib.h> /*常用函数库*/
#include <time.h>
#include <dos.h>/*DOS库*/
#define MAX_JOINTS 200
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define MV_RIGHT 1
#define MV_LEFT 2
#define MV_UP 3
#define MV_DOWN 4
void InitGraph(void); /*图形驱动初始化函数*/
void DrawKFence(void); /*绘制游戏场景*/
void GameOver(int score); /*结束游戏*/
void GamePlay(void); /*玩游戏具体过程*/
void PrScore(int score); /*输出成绩*/
struct Food /*食物的结构体定义*/
{
int x; /*食物的横坐标*/
int y; /*食物的纵坐标*/
int addFood; /*判断是否要出现食物的变量*/
};
struct Snake /*蛇的结构体定义*/
{
int x[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/
int y[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的行坐标*/
int joint; /*蛇的节数*/
int direction; /*蛇移动方向*/
int life; /*蛇的生命,0活着,1死亡*/
};
/*主函数*/
void main(void)
{
InitGraph(); /*图形驱动*/
DrawKFence(); /*游戏场景*/
GamePlay(); /*玩游戏具体过程*/
Closegraph(); /*图形结束*/
}
/*图形驱动初始化函数*/
void InitGraph(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm," "); /*initgraph()中的第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式,第三个参数指定驱动程序所在目录"c:\\tc"。*/
cleardevice(); /*清除图形屏幕*/
setbkcolor(BLUE);
cleardecive();
setcolor(WHITE);
settextstyle(DEFAULT_FONT,HORIZ_ZIR,3);
outtextxy(170,150,"Greedy Snake");
outtextxy(219,254,"Ready?");
setcolor(BLUE);
cleardecive();
}
/*游戏开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawKFence(void)
{
int i;
setbkcolor(LIGHTGREEN); /*设置颜色*/
setbkcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*设置线型*/SOLID_LINE/*为整数型,用来定义所画直线类型*/ 0/*为无符号整数型,该参数在需要用户自定义线型时使用 ,如果是使用系统预定义的线型则参数取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)
{
int i,key;
int gamespeed=22000; /*控制游戏速度*/
int score=0; /*记录游戏得分*/
struct Food food; /*食物结构体变量*/
struce Snake snake; /*蛇结构体变量*/
food.addFood=1; /*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0; /*置蛇的生命状态为活着*/
snake.direction=MV_RIGHT; /*置蛇头初始位置方向往右*/
snake.x[0]=100;snake.y[0]=100;
snake.x[1]=110;snake.y[1]=100;/*先初始化了蛇头在X100,Y100的位置,然后蛇头在X方向向右移动了10个单位的位置*/
snake.joint=2; /*置蛇的初始节数为2*/
PrScore(score); /*显示游戏得分*/
/*重复玩游戏,直到压ESC键结束*/
srand(time(NULL));
while(1)
{
while(!kbhit()) /*在没有按键的情况下,蛇自己移动身体*/ /*检查当前按下的键*/
{
if(food.addFood==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.addFood=0; /*画面上有食物了*/
}
if(food.addFood==0) /*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.joint-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 MV_RIGHT:snake.x[0]+=10;break;
case MV_LEFT: snake.x[0]-=10;break;
case MV_UP: snake.y[0]-=10;break;
case MV_DOWN: snake.y[0]+=10;break;
}
/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
for(i=3;i <snake.joint;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.joint]=-20;snake.y[snake.joint]=-20;
snake.joint++; /*蛇的身体长一节*/
food.yes=1; /*画面上需要出现新的食物*/
score+=10;
PrScore(score); /*输出新得分*/
}
/*画出蛇*/
setcolor(4);
for(i=0;i <snake.joint;i++)
{
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
}
delay(gamespeed); /*延时控制蛇的速度*/
/*用黑色去除蛇的的最后一节*/
setcolor(0);
rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1], snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10);
} /*end of while(!kbhit)*/
if(snake.life==1) break; /*如果蛇死就跳出循环*/
key=bioskey(0); /*接收按键*/
/*判断按键,是否往相反方向移动,按ESC键退出*/
if(key==ESC) break;
else if(key==UP&&snake.direction!=4)
snake.direction=MV_UP;
else if(key==RIGHT&&snake.direction!=MV_LEFT)
snake.direction=MV_RIGHT;
else if(key==LEFT&&snake.direction!=MV_RIGHT)
snake.direction=MV_LEFT;
else if(key==DOWN&&snake.direction!=MV_UP)
snake.direction=MV_DOWN;
} /*end of while(1)*/
}
/*游戏结束*/
void GameOver(int score)
{
cleardevice();
PrScore(score);
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(int score)
{
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();
}
用tc运行后总说这两个语句参数太少,一个加参数后可以执行,但第二个无论加什么参数都运行不了!请高手前来赐教!
/*游戏结束*/
void GameOver(int score)// <---这个函数是需要一个参数的,所以你标注的地方应当传一个合适的值
{
cleardevice();
PrScore(score);
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
void Gam
评论1