恕我直言貪吃蛇這個游戲雖小但涉及的方面還是不少的,想要做一個完整的貪吃蛇100行應該不好實現。
建議樓主試試這個。
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<stdlib.h>
#defineU1
#defineD2
#defineL3
#defineR4//蛇的狀態,U:上;D:下;L:左R:右
typedefstructSNAKE//蛇身的一個節點
{
intx;
inty;
structSNAKE*next;
}snake;
//全局變量//
intscore=0,add=10;//總得分與每次吃食物得分。
intstatus,sleeptime=200;//每次運行的時間間隔
snake*head,*food;//蛇頭指針,食物指針
snake*q;//遍歷蛇的時候用到的指針
intendgamestatus=0;//游戲結束的情況,1:撞到墻;2:咬到自己;3:主動退出游戲。
//聲明全部函數//
voidPos();
voidcreatMap();
voidinitsnake();
intbiteself();
voidcreatefood();
voidcantcrosswall();
voidsnakemove();
voidpause();
voidgamecircle();
voidwelcometogame();
voidendgame();
voidgamestart();
voidPos(intx,inty)//設置光標位置
{
COORDpos;
HANDLEhOutput;
pos.X=x;
pos.Y=y;
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,pos);
}
voidcreatMap()//創建地圖
{
inti;
for(i=0;i<58;i+=2)//打印上下邊框
{
Pos(i,0);
printf("■");
Pos(i,26);
printf("■");
}
for(i=1;i<26;i++)//打印左右邊框
{
Pos(0,i);
printf("■");
Pos(56,i);
printf("■");
}
}
voidinitsnake()//初始化蛇身
{
snake*tail;
inti;
tail=(snake*)malloc(sizeof(snake));//從蛇尾開始,頭插法,以x,y設定開始的位置//
tail->x=24;
tail->y=5;
tail->next=NULL;
for(i=1;i<=4;i++)
{
head=(snake*)malloc(sizeof(snake));
head->next=tail;
head->x=24+2*i;
head->y=5;
tail=head;
}
while(tail!=NULL)//從頭到為,輸出蛇身
{
Pos(tail->x,tail->y);
printf("■");
tail=tail->next;
}
}
intbiteself()//判斷是否咬到了自己
{
snake*self;
self=head->next;
while(self!=NULL)
{
if(self->x==head->x&&self->y==head->y)
{
return1;
}
self=self->next;
}
return0;
}
voidcreatefood()//隨機出現食物
{
snake*food_1;
srand((unsigned)time(NULL));
food_1=(snake*)malloc(sizeof(snake));
while((food_1->x%2)!=0)//保證其為偶數,使得食物能與蛇頭對其
{
food_1->x=rand()%52+2;
}
food_1->y=rand()%24+1;
q=head;
while(q->next==NULL)
{
if(q->x==food_1->x&&q->y==food_1->y)//判斷蛇身是否與食物重合
{
free(food_1);
createfood();
}
q=q->next;
}
Pos(food_1->x,food_1->y);
food=food_1;
printf("■");
}
voidcantcrosswall()//不能穿墻
{
if(head->x==0||head->x==56||head->y==0||head->y==26)
{
endgamestatus=1;
endgame();
}
}
voidsnakemove()//蛇前進,上U,下D,左L,右R
{
snake*nexthead;
cantcrosswall();
nexthead=(snake*)malloc(sizeof(snake));
if(status==U)
{
nexthead->x=head->x;
nexthead->y=head->y-1;
if(nexthead->x==food->x&&nexthead->y==food->y)//如果下一個有食物//
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
printf("■");
q=q->next;
}
score=score+add;
createfood();
}
else//如果沒有食物//
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!=NULL)
{
Pos(q->x,q->y);
printf("■");
q=q->next;
}
Pos(q->next->x,q->next->y);
printf("");
free(q->next);
q->next=NULL;
}
}
if(status==D)
{
nexthead->x=head->x;
nexthead->y=head->y+1;
if(nexthead->x==food->x&&nexthead->y==food->y)//有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
printf("■");
q=q->next;
}
score=score+add;
createfood();
}
else//沒有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!=NULL)
{
Pos(q->x,q->y);
printf("■");
q=q->next;
}
Pos(q->next->x,q->next->y);
printf("");
free(q->next);
q->next=NULL;
}
}
if(status==L)
{
nexthead->x=head->x-2;
nexthead->y=head->y;
if(nexthead->x==food->x&&nexthead->y==food->y)//有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
printf("■");
q=q->next;
}
score=score+add;
createfood();
}
else//沒有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!=NULL)
{
Pos(q->x,q->y);
printf("■");
q=q->next;
}
Pos(q->next->x,q->next->y);
printf("");
free(q->next);
q->next=NULL;
}
}
if(status==R)
{
nexthead->x=head->x+2;
nexthead->y=head->y;
if(nexthead->x==food->x&&nexthead->y==food->y)//有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
printf("■");
q=q->next;
}
score=score+add;
createfood();
}
else//沒有食物
{
nexthead