#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
#include <stdbool.h>
#include <windows.h>
#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
typedef struct node
{
int x;
int y;
struct node* next;
}snake;
snake *head,*tail,*p;
struct Food
{
int x;
int y;
}*food;
char click='d';
void buildWall();// 创建游戏窗口
void buildSnack();//创建小蛇;
void buildFood();//创建食物;
void playGame();//开始游戏
void movingSnack();//进行移动
void change(int x,int y);//改变位置;
void Eating();
void gotoxy(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//获取坐标
SetConsoleCursorPosition(hOutput, pos);//修改坐标
}
void buildWall()
{
int n=45,m=26;
for(int i=0; i<n; ++i)
{
if(i==0||i==n-1)
{
for(int j=0; j<m; ++j)
{
gotoxy(2*i,j);
printf("■");
}
}
else
{
gotoxy(2*i,0);
printf("■");
gotoxy(2*i,m-1);
printf("■");
}
}
}
void buildSnack()
{
head=(snake*)malloc(sizeof(snake));
head->x=25;
head->y=15;
head->next=NULL;
tail=head;
p=(snake*)malloc(sizeof(snake));
p->next=NULL;
p->x=23;
p->y=15;
tail->next=p;
tail=p;
p=(snake*)malloc(sizeof(snake));
p->next=NULL;
p->x=21;
p->y=15;
tail->next=p;
tail=p;
p=head;
while(p)
{
gotoxy(p->x,p->y);
printf("■");
p=p->next;
}
gotoxy(1,1);
}
void deleted(int x,int y)
{
gotoxy(x,y);
printf(" ");
}
void buildFood()
{
food=(struct Food*)malloc(sizeof(struct Food));
srand(time(0));
food->x=rand()%40+3;
food->y=rand()%20+2;
gotoxy(food->x,food->y);
printf("■");
}
void playGame()
{
while(true)
{
if(_kbhit())
{
click=_getch();
}
movingSnack();
Eating();
}
}
void movingSnack()
{
int a=head->x,b=head->y;
p=head;
while(p)
{
deleted(p->x,p->y);
p=p->next;
}
switch(click)
{
case up:
head->y-=1;
change(a,b);
break;
case down:
head->y+=1;
change(a,b);
break;
case left:
head->x-=2;
change(a,b);
break;
case right:
head->x+=2;
change(a,b);
break;
}
p=head;
while(p)
{
gotoxy(p->x,p->y);
printf("■");
p=p->next;
}
Sleep(150);
}
void change(int x,int y)
{
p=head->next;
while(p)
{
int t=p->x;
p->x=x;
x=t;
t=p->y;
p->y=y;
y=t;
p=p->next;
}
}
void Eating()
{
if((head->x==food->x)&&(head->y==food->y))//bug可能的来源
{
snake *newHead=(snake*)malloc(sizeof(newHead));
buildFood();//出现bug,食物被吃后无法出现新的食物;
}
}
int main()
{
system("color 09");
buildWall();
buildSnack();
buildFood();
playGame();
system("pause");
return 0;
}
sncak
最新推荐文章于 2024-08-13 09:00:55 发布