level 6
/*
在WIN-TC编译通过
编译时间:2009-12-10
作品名:贪吃蛇
编译人:FENGZI
*/
#include<stdio.h>
#include<graphics.h>
#include<time.h>
#include<stdlib.h>
#include<bios.h>
/*键值表*/
#define ESC 0x11b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ENTER 0x1c0d
#define SPACE 0x3920
/*游戏宽度*/
#define L_num_x 26
#define L_num_y 17
#define SNAKE_NUM (L_num_x*L_num_y)
#define START_X 60
#define START_Y 40
/*颜色*/
/*背景*/
#define CLO_back BLACK
/*地图*/
#define CLO_map YELLOW
/*snake*/
#define CLO_snake RED
/*食物*/
#define CLO_food GREEN
/*游戏速度*/
#define GAME_SPEEH 80000
/*游戏数据*/
int game[L_num_x][L_num_y]={0};
int snake_num;
int snakelife=1; /*1为生存,0为死亡*/
struct SNAKE
{
int x;
int y;
}snake[SNAKE_NUM];
int food=0;
long score=0; /*分数*/
float beishu=1; /*游戏速度设置数据*/
/*函数声明*/
void setgraph(void); /*设置图形函数*/
void setgamedata(void); /*设置游戏数据*/
void drawgamepicture(void); /*画游戏背景框图*/
void draw_key(int x,int y,int color); /*画格子函数*/
void gamemain(void); /*游戏主函数*/
void randfood(void); /*食物生成函数*/
void movesnake(int x,int y); /*snake 移动函数*/
void chacksnake(void); /*检查snake是否撞墙函数*/
void printfscore(void); /*分数输出函数*/
void gameover(void); /*游戏结束函数*/
/**/
/*设置图形函数*/
void setgraph(void)
{
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
}
/*设置游戏数据*/
void setgamedata(void)
{int i,j;
/*设置地图*/
for(i=0;i<L_num_x;i++)
for(j=0;j<L_num_y;j++)
{
if(i==0 || j==0 || i==L_num_x-1 || j==L_num_y-1)
game[i][j]=-1;
else
game[i][j]=0;
}
/*snake初始化,默认3节,从snake[1]开始,便于理解*/
snake_num=3;
for(i=1;i<=3;i++)
{snake[i].x=L_num_x/2+i-5;
snake[i].y=L_num_y/2;
draw_key(snake[i].x,snake[i].y,CLO_snake);
}
}
2009年12月09日 16点12分
3
level 6
/*画地图*/
void drawgamepicture(void)
{
int i,j;
setbkcolor(CLO_back);
setcolor(RED);
for(i=0;i<5;i++)
{
rectangle(i*10,i*10,639-i*10,479-i*10);
}
for(i=0;i<L_num_x;i++)
for(j=0;j<L_num_y;j++)
{
if(game[i][j]==-1)
{
draw_key(i,j,CLO_map);
}
}
outtextxy(100,400,"QQ:7695600XX BY:FENGZI ENTER(SPACE|ENTER) TO START ");
outtextxy(100,410,"UP=UPKEY DOWN=DOWNKEY LEFT=LEFTKEY RIGHT=RIGHTKEY");
outtextxy(160,420,"PAUSE=SPACE | ENTER QUIT=ESC");
}
/*画格子函数*/
void draw_key(int x,int y,int color)
{ setcolor(color);
rectangle(
x*20+START_X+1,
y*20+START_Y+1,
(x+1)*20+START_X-1,
(y+1)*20+START_Y-1
);
rectangle(
x*20+START_X+2,
y*20+START_Y+2,
(x+1)*20+START_X-2,
(y+1)*20+START_Y-2
);
}
/*游戏主函数*/
void gamemain(void)
{
long number=1;
int key;
int pause=0;
int x=1,y=0;
while(snakelife)
{
if(food==0) /*set food*/
randfood();
if(bioskey(1))
{ /*if*/
key=bioskey(0);
switch(key)
{
case UP:
{
if(snake[snake_num].x+(0) != snake[snake_num-1].x &&
2009年12月09日 16点12分
4
level 6
snake[snake_num].y+(-1) != snake[snake_num-1].y)
{x=0;y=-1;}break;/*这是判断是不是往回走的语句,重要*/
}
case DOWN:
{
if(snake[snake_num].x+(0) != snake[snake_num-1].x &&
snake[snake_num].y+(1) != snake[snake_num-1].y)
{x=0;y=1;}break;
}
case RIGHT:
{
if(snake[snake_num].x+(1) != snake[snake_num-1].x &&
snake[snake_num].y+(0) != snake[snake_num-1].y)
{x=1;y=0;}break;
}
case LEFT:
{
if(snake[snake_num].x+(-1) != snake[snake_num-1].x &&
snake[snake_num].y+(0) != snake[snake_num-1].y)
{x=-1;y=0;}break;
}
case ESC:
{
snakelife=0;
break;
}
case ENTER:;
case SPACE:
{
pause=(pause+1)%2;
break;
}
}
}/*endif*/
if(pause==1)
number++;
if(number%((long)(GAME_SPEEH / beishu))==0) /*速度控制*/
{
number=0;
movesnake(x,y); /*MOVE SNAKE*/
chacksnake();
}
}/*end while*/
gameover();
}
2009年12月09日 16点12分
5
level 6
/*分数输出*/
void printfscore(void)
{
int i;
char s[40];
sprintf(s,"SCORE:%ld SPEEH:%.2f",score,beishu);
setcolor(CLO_back);
for(i=0;i<10;i++)
rectangle(190+i,385+i,400-i,397-i);
setcolor(GREEN);
outtextxy(200,390,s);
}
/*看snake有没有撞墙或撞自己*/
void chacksnake(void)
{
int i,j;
int x,y;
x=snake[snake_num].x;
y=snake[snake_num].y;
if(game[x][y]==-1) /*-1是墙*/
snakelife=0;
for(i=snake_num-3;i>0;i--)
{
if(snake[i].x==x && snake[i].y==y)
{ snakelife=0;
break;
}
}
}
/*随机生成食物*/
void randfood(void)
{
int i,j;
int x,y,ok=1;
while(ok)
{
x=rand()%(L_num_x-2)+1;
y=rand()%(L_num_y-2)+1;
ok=0;
for(i=1;i<=snake_num;i++)
{
if(snake[i].x==x && snake[i].y==y)
ok=1;
}
}
draw_key(x,y,CLO_food);
game[x][y]=2;
food=1;
}
/*snake的移动*/
void movesnake(int x,int y)
{
int i,j;
if(game[snake[snake_num].x+x][snake[snake_num].y+y]==2) /* 前面有食物*/
{
snake_num++;
snake[snake_num].x=snake[snake_num-1].x+x;
snake[snake_num].y=snake[snake_num-1].y+y;
game[snake[snake_num].x][snake[snake_num].y]=0;
food=0;
draw_key(snake[snake_num].x,snake[snake_num].y,CLO_snake);
if(snake_num%15==0)
{
beishu=beishu*1.1;
}
score=score+100;
printfscore();
/*有食物*/
}
else
/*前面没食物*/
{
/*判断不是向后走*/
for(i=1;i<snake_num;i++)
{
if(i==1)
{
draw_key(snake[i].x,snake[i].y,CLO_back);
}
snake[i].x=snake[i+1].x;
snake[i].y=snake[i+1].y;
}
snake[snake_num].x=snake[snake_num].x+x;
snake[snake_num].y=snake[snake_num].y+y;
draw_key(snake[snake_num].x,snake[snake_num].y,CLO_snake);
}
}
/*game over */
void gameover(void)
{
cleardevice();
setcolor(RED);
outtextxy(250,200,"GAME OVER !");
getch();
}
int main()
{
srand(time(NULL));
setgraph();
setgamedata();
drawgamepicture();
gamemain();
closegraph();
return(0);
}
2009年12月09日 16点12分
6
level 6
/*
在WIN-TC编译通过
编译时间:2009-12-10
作品名:贪吃蛇
编译人:FENGZI
*/
#include<stdio.h>
#include<graphics.h>
#include<time.h>
#include<stdlib.h>
#include<bios.h>
/*键值表*/
#define ESC 0x11b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ENTER 0x1c0d
#define SPACE 0x3920
/*游戏宽度*/
#define L_num_x 26
#define L_num_y 17
#define SNAKE_NUM (L_num_x*L_num_y)
#define START_X 60
#define START_Y 40
/*颜色*/
/*背景*/
#define CLO_back BLACK
/*地图*/
#define CLO_map YELLOW
/*snake*/
#define CLO_snake RED
/*食物*/
#define CLO_food GREEN
/*游戏速度*/
#define GAME_SPEEH 80000
/*游戏数据*/
int game[L_num_x][L_num_y]={0};
int snake_num;
int snakelife=1; /*1为生存,0为死亡*/
struct SNAKE
{
int x;
int y;
}snake[SNAKE_NUM];
int food=0;
long score=0; /*分数*/
float beishu=1; /*游戏速度设置数据*/
/*函数声明*/
void setgraph(void); /*设置图形函数*/
void setgamedata(void); /*设置游戏数据*/
void drawgamepicture(void); /*画游戏背景框图*/
void draw_key(int x,int y,int color); /*画格子函数*/
void gamemain(void); /*游戏主函数*/
void randfood(void); /*食物生成函数*/
void movesnake(int x,int y); /*snake 移动函数*/
void chacksnake(void); /*检查snake是否撞墙函数*/
void printfscore(void); /*分数输出函数*/
void gameover(void); /*游戏结束函数*/
/**/
/*设置图形函数*/
void setgraph(void)
{
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
}
/*设置游戏数据*/
void setgamedata(void)
{int i,j;
/*设置地图*/
for(i=0;i<L_num_x;i++)
for(j=0;j<L_num_y;j++)
{
if(i==0 || j==0 || i==L_num_x-1 || j==L_num_y-1)
game[i][j]=-1;
else
game[i][j]=0;
}
/*snake初始化,默认3节,从snake[1]开始,便于理解*/
snake_num=3;
for(i=1;i<=3;i++)
{snake[i].x=L_num_x/2+i-5;
snake[i].y=L_num_y/2;
draw_key(snake[i].x,snake[i].y,CLO_snake);
}
2009年12月09日 19点12分
9
level 6
}
/*画地图*/
void drawgamepicture(void)
{
int i,j;
setbkcolor(CLO_back);
setcolor(RED);
for(i=0;i<5;i++)
{
rectangle(i*10,i*10,639-i*10,479-i*10);
}
for(i=0;i<L_num_x;i++)
for(j=0;j<L_num_y;j++)
{
if(game[i][j]==-1)
{
draw_key(i,j,CLO_map);
}
}
outtextxy(100,400,"QQ:7695600XX BY:FENGZI ENTER(SPACE|ENTER) TO START ");
outtextxy(100,410,"UP=UPKEY DOWN=DOWNKEY LEFT=LEFTKEY RIGHT=RIGHTKEY");
outtextxy(160,420,"PAUSE=SPACE | ENTER QUIT=ESC");
}
/*画格子函数*/
void draw_key(int x,int y,int color)
{ setcolor(color);
rectangle(
x*20+START_X+1,
y*20+START_Y+1,
(x+1)*20+START_X-1,
(y+1)*20+START_Y-1
);
rectangle(
x*20+START_X+2,
y*20+START_Y+2,
(x+1)*20+START_X-2,
(y+1)*20+START_Y-2
);
}
/*游戏主函数*/
void gamemain(void)
{
long number=1;
int key;
int pause=0;
int x=1,y=0;
while(snakelife)
{
if(food==0) /*set food*/
randfood();
if(bioskey(1))
{ /*if*/
key=bioskey(0);
switch(key)
{
case UP:
{
if(snake[snake_num].x+(0) != snake[snake_num-1].x &&
2009年12月09日 19点12分
10
level 6
snake[snake_num].y+(-1) != snake[snake_num-1].y)
{x=0;y=-1;}break;/*这是判断是不是往回走的语句,重要*/
}
case DOWN:
{
if(snake[snake_num].x+(0) != snake[snake_num-1].x &&
snake[snake_num].y+(1) != snake[snake_num-1].y)
{x=0;y=1;}break;
}
case RIGHT:
{
if(snake[snake_num].x+(1) != snake[snake_num-1].x &&
snake[snake_num].y+(0) != snake[snake_num-1].y)
{x=1;y=0;}break;
}
case LEFT:
{
if(snake[snake_num].x+(-1) != snake[snake_num-1].x &&
snake[snake_num].y+(0) != snake[snake_num-1].y)
{x=-1;y=0;}break;
}
case ESC:
{
snakelife=0;
break;
}
case ENTER:;
case SPACE:
{
pause=(pause+1)%2;
break;
}
}
}/*endif*/
if(pause==1)
number++;
if(number%((long)(GAME_SPEEH / beishu))==0) /*速度控制*/
{
number=0;
movesnake(x,y); /*MOVE SNAKE*/
chacksnake();
}
}/*end while*/
gameover();
}
2009年12月09日 19点12分
11