[C++] 纯文本查看 复制代码 #include <graphics.h>
#include <time.h>
#define Block_szie 20
#define Width 40
#define Height 30
int Blocks[Height][Width]={0};//记录所有游戏数据
char direct;//方向
int snake_len,snake_v;
int food_x,food_y;
int gameover;
int wait;
struct Snake_s
{
int x;
int y;
int color;
}Snake[1000];
void moveSnake()//移动蛇
{
int i;
for(i=snake_len;i>0;i--)
{
Snake[i].x = Snake[i-1].x;
Snake[i].y = Snake[i-1].y;
}
switch(direct)
{
case 'w':
case 'W':
Snake[0].x = Snake[1].x;
Snake[0].y = Snake[1].y-1;
break;
case 'a':
case 'A':
Snake[0].x = Snake[1].x-1;
Snake[0].y = Snake[1].y;
break;
case 's':
case 'S':
Snake[0].x = Snake[1].x;
Snake[0].y = Snake[1].y+1;
break;
case 'd':
case 'D':
Snake[0].x = Snake[1].x+1;
Snake[0].y = Snake[1].y;
break;
}
}
void startup()//启动
{
snake_len =4;
for(int i=0;i<snake_len;i++)
{
Snake[i].x=Width/2-i;
Snake[i].y=Height/2;
}
direct = 'd';
snake_v = 20;
srand(time(0));//随机种子函数
initgraph(Width*Block_szie, Height*Block_szie, INIT_RENDERMANUAL); //初始化图形界面
setcolor(BLACK); //设置画图线为红色
setbkcolor(WHITE);//设置背景颜色为白色
setfillcolor(LIGHTGRAY);//设置填充颜色为浅灰色
setfont(20,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
}
void show()//显示
{
int i,j;
cleardevice();
//背景
for(i=0;i<Width;i++)
for(j=0;j<Height;j++)
{
//setcolor(WHITE); //设置画图线为白色
setfillcolor(WHITE);//设置填充颜色为浅灰色
bar(i*Block_szie,j*Block_szie,(i+1)*Block_szie,(j+1)*Block_szie);
}
//蛇
for(i=0;i<snake_len;i++)
{
setfillcolor(hsv2rgb(10*i%360, 1, 1));//设置填充颜色 参数(颜色,饱和度,明亮度)
bar(Snake[i].x*Block_szie,Snake[i].y*Block_szie,(Snake[i].x+1)*Block_szie,(Snake[i].y+1)*Block_szie);
}
//食物
setfillcolor(GREEN);//设置填充颜色
bar(food_x*Block_szie,food_y*Block_szie,(food_x+1)*Block_szie,(food_y+1)*Block_szie);
xyprintf(20,20,"得分:%d",snake_len-4);//格式化输出文字
xyprintf(20,40,"速度:%d",21-snake_v);//格式化输出文字
Sleep(10);
}
void update()//数据更新
{
wait++;
snake_v = 20-(snake_len-4)/5;
if(wait == snake_v)
{
moveSnake();
wait = 1;
}
if(kbhit())
{
direct = getch();
moveSnake();
}
}
void food_set()
{
int flag;
while(1)
{
flag = 0;//食物坐标有效
//将食物的横纵坐标的大小限定在窗口大小内
food_x=rand()%(Width-2)+1;
food_y=rand()%(Height-2)+1;
//如果食物出现在蛇上,重新产生食物
for(int i=0;i<snake_len;i++)
{
if((food_x==Snake[i].x)&&(food_y==Snake[i].y))
{
flag = 1;
break;
}
}
//食物不在蛇上,打印食物,结束循环
if(flag == 0)
{
break;
}
}
}
void eat_food()
{
if((Snake[0].x==food_x)&&(Snake[0].y==food_y))
{
snake_len++;
food_set();
}
}
bool game_over()//1结束
{
if((Snake[0].x>=Width)|| (Snake[0].x<0) ||
(Snake[0].y>=Height)|| (Snake[0].y<0))
{
return true;
}
for(int i=1;i<snake_len;i++)
{
if((Snake[i].x==Snake[0].x)&&(Snake[i].y==Snake[0].y))
return true;
}
return false;
}
int main()
{
startup();
food_set();
getch();
while(1)
{
show();
update();
eat_food();
if(game_over()) break;
}
getch();
return 0;
}
|