#include<stdio.h>
#include<conio.h>
#include<windows.h>
#define High 20 //定义边界
#define Width 45
//定义全局变量
int canvas[High][Width]={0}; //定义元素;0为空格,-1为边界,1为蛇头,>1为蛇身,-2为食物
int food_x,food_y; //食物坐标
int moveDirection; //蛇移动方向,1,2,3,4,对应上下左右
void HideCursor() //隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void gotoxy(int x,int y) //光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
void startup() //数据初始化
{
int i,j;
//初始化食物坐标
food_x=rand()%(High-5)+2;
food_y=rand()%(Width-5)+2;
canvas[food_x][food_y]=-2;
//边界初始化
for(i=0;i<High;i++)
{
canvas[i][Width-1]=-1;
canvas[i][0]=-1;
}
for(j=0;j<Width;j++)
{
canvas[High-1][j]=-1;
canvas[0][j]=-1;
}
//蛇头 蛇身初始化
canvas[High/2][Width/2]=1;
for(i=1;i<=4;i++)
canvas[High/2][Width/2-i]=i+1;
moveDirection=4; //初始化小蛇移动方向
HideCursor(); //隐藏光标
}
void moveSnakeByDirection() //小蛇移动
{
int i,j;
int max=0;
int oldTail_i,oldTail_j; //记录旧蛇尾
int oldHead_i,oldHead_j; //记录旧蛇头
int newHead_i,newHead_j; //记录新蛇头
for(i=0;i<High-1;i++)
{
for(j=0;j<Width-1;j++)
{
if(canvas[i][j]>0)
{
canvas[i][j]++;
if(max<canvas[i][j])
{
max=canvas[i][j];
oldTail_i=i; //记录旧蛇尾坐标
oldTail_j=j;
}
if(canvas[i][j]==2)
{
oldHead_i=i; //记录旧蛇头坐标
oldHead_j=j;
}
}
}
}
//新蛇头
if(moveDirection==1)
{
newHead_i=oldHead_i-1;
newHead_j=oldHead_j;
}
if(moveDirection==2)
{
newHead_i=oldHead_i+1;
newHead_j=oldHead_j;
}
if(moveDirection==3)
{
newHead_i=oldHead_i;
newHead_j=oldHead_j-1;
}
if(moveDirection==4)
{
newHead_i=oldHead_i;
newHead_j=oldHead_j+1;
}
//判断小蛇吃到食物
if(canvas[newHead_i][newHead_j]==-2)
{
canvas[food_x][food_y]=-0; //吃到食物,食物消失,生成新食物,长度自动加一
food_x=rand()%(High-5)+2;
food_y=rand()%(Width-5)+2;
canvas[food_x][food_y]=-2;
}
else
canvas[oldTail_i][oldTail_j]=0; //旧蛇尾为0
//判断校舍是否撞到自身
if(canvas[newHead_i][newHead_j]>0 || canvas[newHead_i][newHead_j]==-1)
{
printf("游戏结束\n");
exit(0);
}
else
canvas[newHead_i][newHead_j]=1;
}
void show() //显示界面
{
int i,j;
gotoxy(0,0); //光标移动到(0,0)
for(i=0;i<High;i++)
{
for(j=0;j<Width;j++)
{
if(canvas[i][j]==0)
printf(" "); //输出空格
else if(canvas[i][j]==-1)
printf("#"); //输出边界
else if(canvas[i][j]==1)
printf("@"); //输出蛇头
else if(canvas[i][j]==-2)
printf("@"); //输出食物
else if(canvas[i][j]>1)
printf("*"); //输出蛇身
}
printf("\n");
}
Sleep(100);
}
void updateWithoutInput() //无需用户输入的更新
{
moveSnakeByDirection(); //小蛇移动函数
}
void updateWithInput() //需要用户输入的更新
{
char input;
if(kbhit())
{
input=getch();
if(input=='w')
moveDirection=1;
else if(input=='s')
moveDirection=2;
else if(input=='a')
moveDirection=3;
else if(input=='d')
moveDirection=4;
}
}
int main()
{
startup() ; //数据初始化
while(1)
{
show() ; //显示界面
updateWithoutInput(); //无需用户输入的更新
updateWithInput(); //需要用户输入的更新
}
}
C语言贪吃蛇
猜你喜欢
转载自blog.csdn.net/qq_40685101/article/details/80379147
今日推荐
周排行