贪吃蛇(精简)

#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#define wide 20
#define framex 5
#define framey 5
int i=0,a[2];
//光标定位
void gotoxy(HANDLE hout,int x,int y){
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(hout,pos);
}
//蛇结构 
struct snake{
int x[30];
int y[30];
int length;
int speed;
};
//食物结构 
struct food{
int x;
int y;
};
//输出框架
void framework(HANDLE hout){
for(i=0;i<=wide;i++){
gotoxy(hout,framex+2*i,framey);
printf("■");
gotoxy(hout,framex+2*i+2,framey+wide+1);
printf("■");
gotoxy(hout,framex,framey+1+i);
printf("■");
gotoxy(hout,framex+2*wide+2,framey+i);
printf("■");
}
}
//蛇初始化
void initsnake(struct snake *snake){
snake->speed=300;
snake->length=3;
for(i=0;i<3;i++){
snake->x[i]=7;
snake->y[i]=15;
}

//打印蛇 
void printsnake(HANDLE hout,struct snake *snake){
for(i=0;i<snake->length;i++){
gotoxy(hout,snake->x[i],snake->y[i]);
printf("■");
}
}
//移动蛇 
void movesnake(HANDLE hout,struct snake *snake){
gotoxy(hout,snake->x[0],snake->y[0]);
printf("  ");
for(i=0;i<snake->length-1;i++){
snake->x[i]=snake->x[i+1];
snake->y[i]=snake->y[i+1];
}
}
//输出食物 
void printfood(HANDLE hout,struct snake *snake,struct food *food){
begin:
srand(time(NULL));
food->x=framex+2*rand()%wide+2;
food->y=framey+rand()%wide+1;
for(i=0;i<snake->length;i++){
if(food->x==snake->x[i]&&food->y==snake->y[i])
goto begin;
}
gotoxy(hout,food->x,food->y);
printf("■");
}
//吃食物 
void eatfood(HANDLE hout,struct snake *snake,struct food *food){
if(snake->x[snake->length-1]==food->x&&snake->y[snake->length-1]==food->y){
snake->length++;
for(i=snake->length-1;i>0;i--){
snake->x[i]=snake->x[i-1];
snake->y[i]=snake->y[i-1];
}
snake->x[0]=a[0];
snake->y[0]=a[1];
printfood(hout,snake,food);
if(snake->length%3==0)
            snake->speed-=50;
}
}
//判断死亡 
int ifdeath(struct snake *snake){
for(i=0;i<snake->length-1;i++){
if(snake->x[snake->length-1]==snake->x[i]&&snake->y[snake->length-1]==snake->y[i])
return 0;
}
if(snake->x[snake->length-1]==framex||snake->x[snake->length-1]==framex+2*wide+2||snake->y[snake->length-1]==framey||snake->y[snake->length-1]==framey+wide+1)
return 0;
return 1;
}
//主函数 
int main(){
char c=77;
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
struct snake s,*snake=&s;
struct food f,*food=&f;
initsnake(snake);
framework(hout);
printfood(hout,snake,food);
printsnake(hout,snake);
Sleep(500);
while(1){
a[0]=snake->x[0];
        a[1]=snake->y[0];
begin:
if(kbhit()){
c=getch();
}
switch(c){
case 'w':case 'W':case 72:
movesnake(hout,snake);
snake->y[snake->length-1]--;
break;
case 's':case 'S':case 80:
movesnake(hout,snake);
snake->y[snake->length-1]++;
break;
case 'a':case 'A':case 75:
movesnake(hout,snake);
snake->x[snake->length-1]-=2;
break;
case 'd':case 'D':case 77:
movesnake(hout,snake);
snake->x[snake->length-1]+=2;
break;
default:goto begin;
}
eatfood(hout,snake,food);
printsnake(hout,snake);
Sleep(snake->speed);
if(ifdeath(snake)==0||c==27||snake->speed==0){
gotoxy(hout,18,15);
if(snake->speed==0) {
printf("恭喜你!你赢了");
}
        else printf("你输了");
        Sleep(2000);
        break;
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在月光下弹琴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值