贪吃蛇代码

#include <graphics.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>

void draw(void);//初始屏幕的内容
void gameover(void);//游戏结束

struct Snake
{
int x[2000];//蛇的x轴上参数
int y[2000];//y轴上的参数
int direction;//蛇的方向
int life;//蛇的存活情况
int len;//蛇的长度
}snake;
/*食物的参数*/
struct Food
{
int x;
int y;
int exist;
}food;

int score=0;//得分情况

int main()
{
initgraph(970,660);//初始化游戏屏幕的大小
int i;
char ch;
snake.len=3;//初始化蛇的长度
snake.direction=2;//初始化蛇的方向
snake.life=1;
food.exist=1;

draw();//画边框

srand( (unsigned) time(NULL) );

snake.x[0]=300;
snake.y[0]=500;
snake.x[1]=290;
snake.y[1]=500;
snake.x[2]=280;
snake.y[2]=500;
while(1)
{
while(!kbhit())//当不按键的时候进入循环
{
if(food.exist==1)//判断食物是不是存在,如果不存在则生成食物的参数
{
food.x=rand()%630+40;
food.y=rand()%570+40;
food.exist=0;
}
/*两个while函数是为了让食物出现在10的倍数线上,因为蛇的宽度是10,这样能够让蛇刚好吃到食物,不会出现蛇走过食物而吃不到的情况*/
while(food.x%10!=0)
food.x++;
while(food.y%10!=0)
food.y++;
if(food.exist==0)//生成食物
{
setcolor(RED);
rectangle(food.x,food.y,food.x+10,food.y+10);
}
/*让蛇的每一节都与前一节蛇身保持一致,这样即使在转弯的时候也可以正常转弯,蛇的重要算法*/
for(i=snake.len-1;i>0;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/***********************************************************************************/
if(snake.x[0]<=40||snake.x[0]>=670||snake.y[0]>=610||snake.y[0]<=40)//判断蛇是否碰到边框
{
gameover();
snake.life=0;
break;
}
for(i=4;i<snake.len;i++)//判断蛇是否咬到自己,蛇只有从第五开始才会咬到自己,咬的最近的蛇身是第四节
{
if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])
{
gameover();
snake.life=0;
break;
}
}

if(snake.life==0) break;//蛇死跳出循环
/****判断蛇是否吃到食物,如果吃到食物,则让食物变成蛇身的颜色,并增加蛇身长度,让蛇身的最后一节的参数跟前一节的蛇身的参数相同*/
if(snake.x[0]==food.x&&snake.y[0]==food.y)
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y+10);
snake.x[snake.len]=snake.x[snake.len-1];
snake.y[snake.len]=snake.y[snake.len-1];
snake.len++;//蛇身的长度 +1;
food.exist=1;//食物消失
score+=10;//吃到食物分数加10
}
/****判断蛇的方向,让蛇保持在此方向上的移动****/
switch(snake.direction)
{
case 1:snake.y[0] -= 10;break;
case 2:snake.x[0] += 10;break;
case 3:snake.y[0] += 10;break;
case 4:snake.x[0] -= 10;break;
}
/**画蛇,因每向前移动一次蛇身,就要消掉蛇的最后一节蛇身,因为蛇的头向前移动了一节蛇身,相当于多画了一节蛇身,因此要消掉最后一节蛇身**/
setcolor(GREEN);
for(i=0;i<snake.len;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]+10);
Sleep(100);
setcolor(BLACK);
/*用于消掉最后一节蛇身*/
rectangle(snake.x[snake.len-1],snake.y[snake.len-1],snake.x[snake.len-1]+10,snake.y[snake.len-1]+10);
}
/*以下用于判断当按键时的方向改变问题*/
if(snake.life==0) break;
ch=getch();
if(ch=='w'&&snake.direction!=3) snake.direction=1;
else if(ch=='d'&&snake.direction!=4) snake.direction=2;
else if(ch=='s'&&snake.direction!=1) snake.direction=3;
else if(ch=='a'&&snake.direction!=2) snake.direction=4;
}
getch();
closegraph();
return 0;
}
void draw(void)
{
setcolor(BLUE);//边框颜色
setfillcolor(BLUE);//填充颜色

fillrectangle(20,20,40,640);//左边边框
fillrectangle(20,20,700,40);//上边边框
fillrectangle(680,20,700,640);//右边边框
fillrectangle(20,620,700,640);//下边边框

setcolor(YELLOW);
setfont(20,0,"黑体");
outtextxy(750,230,"请用 w、s、");
outtextxy(800,260,"a、d控制方向");
}
void gameover(void)
{
char str[20];
cleardevice();
sprintf(str,"You got the score is:%d",score);//参考别人代码写的,
settextstyle(30,30,"黑体");
outtextxy(300,260,"Your Are Lost!");
setcolor(GREEN);
settextstyle(20,10,"黑体");
outtextxy(370,300,str);//输出所得分数
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值