C语言贪吃蛇游戏

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<time.h>

/宏 定 义/
#define U 1
#define D 2
#define L 3
#define R 4 //蛇的状态,U:上 ;D:下;L:左 R:右

typedef struct snake{
int x;
int y;
struct snake *next;
}snake;
HANDLE hout;
snake *snakehead,*food;
int status=U,endflag,sleeptime=200,add=10,score=0;
void movesnake();

//加速
void speedup()
{
if(sleeptime>=100)
{
sleeptime-=50;
add+=10;
}
}
//减速
void speeddown()
{
if(sleeptime<=300)
{
sleeptime+=50;
}
}
//结束游戏
void endgame()
{
system(“cls”);
if(endflag1)
{
printf(“你撞墙了!\n”);
}
else if(endflag=2)
{
printf(“你咬到了自己\n”);
}
else
{
printf(“你结束了游戏\n”);
}
printf(“你的总分是:%d”,score);
printf(“按任意键退出游戏\n”);
getch();
exit(0);
}
//判断是否撞墙
void crosswall()
{
if(snakehead->x
0||snakehead->x50||snakehead->y0||snakehead->y25)
{
endflag=1;
endgame();
}
}
//判断是否咬到自己
void biteself()
{
snake *head,*tmp;
head=snakehead;
tmp=snakehead->next;
while(tmp)
{
if(head->x
tmp->x&&head->y==tmp->y)
{
endflag=2;
endgame();
}
tmp=tmp->next;
}
}
//设置颜色
int color(int c)
{
SetConsoleTextAttribute(hout,c); //更改文字颜色
return 0;
}

void gotoxy(int x,int y)
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(hout,coord);
}

//打印游戏地图
void map()
{
int i,j;
color(5);
for(j=0;j<=25;j++)//打印左右墙
{
gotoxy(0,j);
printf(“□”);
gotoxy(50,j);
printf(“□”);
}
for(i=0;i<=50;i+=2)//打印上下墙
{
gotoxy(i,0);
printf(“□”);
gotoxy(i,25);
printf(“□”);
}
color(3);
for(i=2;i<=48;i+=2)//打印地图的长宽为26(0—25)
{
for(j=1;j<=24;j++)
{
gotoxy(i,j);
printf(“■”);
}
}
}

void initsnake()
{
snake tmp,head;
int x=14,y=14;
int i=0;
snakehead=head=(snake
)malloc(sizeof(snake));
head->x=x;
head->y=y;
for(;i<12;i+=2)//设置蛇的初始长度为5
{
tmp=(snake
)malloc(sizeof(snake));
if(tmp==NULL)
{
printf(“蛇一出生就死了\n”);
exit(0);
}
x-=2;
tmp->x=x;
tmp->y=y;
tmp->next=NULL;
head->next=tmp;
head=tmp;
}
}

void printsnake()
{
snake *head=snakehead;
while(head!=NULL)
{
gotoxy(head->x,head->y);
printf(“★”);
head=head->next;
}
}

//随机出现食物
void createfood()
{
snake *tmp,head=snakehead;
srand((unsigned int)time(NULL));
tmp=(snake
)malloc(sizeof(snake));
tmp->x=rand()%47+2;//x的取值范围为2到48
tmp->y=rand()%24+1;//y的取值范围为1到24
if(tmp->x%2!=0)
{
tmp->x=tmp->x+1;//将x变成偶数
}
while(head!=NULL)
{
if(tmp->xhead->x&&tmp->yhead->y)
{
free(tmp);
createfood();
}
head=head->next;
}
food=tmp;
gotoxy(food->x,food->y);
printf(“●”); //输出食物
}
//键盘控制
void keyboardcontrol()
{
while(1)
{
if(GetAsyncKeyState(VK_UP)&&status!=D)
{
status=U;
}
if(GetAsyncKeyState(VK_DOWN)&&status!=U)
{
status=D;
}
if(GetAsyncKeyState(VK_LEFT)&&status!=R)
{
status=L;
}
if(GetAsyncKeyState(VK_RIGHT)&&status!=L)
{
status=R;
}
if(GetAsyncKeyState(VK_SPACE))
{
while(1)
{
Sleep(300);
if(GetAsyncKeyState(VK_SPACE))
break;
}
}
if(GetAsyncKeyState(VK_ESCAPE))
{
endflag=3;
endgame();
}
if(GetAsyncKeyState(VK_F1))//f1加速
{
speedup();
}
if(GetAsyncKeyState(VK_F2))//f2减速
{
speeddown();
}
movesnake();
Sleep(sleeptime);
}
}

//控制蛇移动
void movesnake()
{
snake head;
if(status==U)
{
head=(snake
)malloc(sizeof(snake));
head->y=snakehead->y-1;
head->x=snakehead->x;
head->next=snakehead;
snakehead=head;
gotoxy(head->x,head->y);
printf(“★”);
if(food->xhead->x&&food->yhead->y)
{
score+=add;
createfood();
}
while(head->next->next!=NULL)
{
head=head->next;
}
gotoxy(head->next->x,head->next->y);
printf(“■”);
free(head->next);
head->next=NULL;
}
if(statusD)
{
head=(snake*)malloc(sizeof(snake));
head->y=snakehead->y+1;
head->x=snakehead->x;
head->next=snakehead;
snakehead=head;
gotoxy(head->x,head->y);
printf(“★”);
if(food->x
head->x&&food->yhead->y)
{
score+=add;
createfood();
}
while(head->next->next!=NULL)
{
head=head->next;
}
gotoxy(head->next->x,head->next->y);
printf(“■”);
free(head->next);
head->next=NULL;
}
if(status
L)
{
head=(snake*)malloc(sizeof(snake));
head->y=snakehead->y;
head->x=snakehead->x-2;
head->next=snakehead;
snakehead=head;
gotoxy(head->x,head->y);
printf(“★”);
if(food->xhead->x&&food->yhead->y)
{
score+=add;
createfood();
}
while(head->next->next!=NULL)
{
head=head->next;
}
gotoxy(head->next->x,head->next->y);
printf(“■”);
free(head->next);
head->next=NULL;
}
if(statusR)
{
head=(snake*)malloc(sizeof(snake));
head->y=snakehead->y;
head->x=snakehead->x+2;
head->next=snakehead;
snakehead=head;
gotoxy(head->x,head->y);
printf(“★”);
if(food->x
head->x&&food->y==head->y)
{
score+=add;
createfood();
}
while(head->next->next!=NULL)
{
head=head->next;
}
gotoxy(head->next->x,head->next->y);
printf(“■”);
free(head->next);
head->next=NULL;
}
biteself();
crosswall();
}

int main()
{
hout=GetStdHandle(STD_OUTPUT_HANDLE);
map();
initsnake();
printsnake();
createfood();
keyboardcontrol();
return 0;
}
//通过这次编程,我学会了如何控制控制台光标移动,如何在控制台绘制图案,如何调用Windows api函数来获得键盘按键信息,以及加速减速的实现,通过sleep函数来完成。学了一年的编程,我终于编出了一个游戏,泪流满面,然鹅并没有什么卵用,,,

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值