c语言精简版贪吃蛇
本大一菜鸟在上个月刚学完数组,就迫不及待写了经典的贪吃蛇。但毕竟能力不足,捣鼓一下午,写了个四百多行、花里花俏的版本,虽能运行,也是bug百出。最近闲来无事,便重写了一个“简约”版(无边界)的贪吃蛇,在此记录。
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
void gotoxy(int x,int y,int c);//第三参数指明要打印的方块类型,1为蛇身,大于1为食物,小于1为空白(清除尾部)
void main(void)
{
char ch=75,mid;//用来读取方向,mid为中间值
int x,y,k,bool_=1;//xy存储食物坐标
int L=0,head=0,t=90;//蛇身长度//蛇头数组下标//行进速度
int a[400][2]={0};//数组用来存放蛇身坐标(遇到高手400肯定不够用,应该更大)
CONSOLE_CURSOR_INFO cursor_info = {1,0};//隐藏光标,使画面更整洁
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
srand(time(NULL));
system("color f0");//白底黑字
gotoxy(a[0][0]=20,a[0][1]=10,1);//先把初始位置打印出来
while(1)
{
while(bool_++)//得到食物坐标,如果位置与蛇身重叠,重来
{
x=rand()%115+2;
y=rand()%19;
for(bool_=0,k=0;k<400;k++)
if(x%2||(x==a[k][0]&&y==a[k][1]))//一个方块占两格,所以x轴须为偶数
bool_=1;
}
L++;//来打印新食物,说明吃到食物了,长度+1
gotoxy(x,y,L+1);//打印食物
while(a[head][0]!=x||a[head][1]!=y)//头与食物坐标不重叠
{
Sleep(t);
t=90;
if(kbhit()&&(mid=getch())==-32)//检测并读取方向
{
mid=getch();
if((mid==72&&ch!=80)||(mid==80&&ch!=72)||(mid==75&&ch!=77)||(mid==77&&ch!=75))//方向相反不读取
{
if(mid==ch)//方向相同则加速
t-=50;
ch=mid;
}
}
a[head=(head+1)%400][1]=(a[(head+399)%400][1]+(ch==72?19:(ch==80?1:0)))%20;//计算蛇头坐标//无边界处理
a[ head ][0]=(a[(head+399)%400][0]+(ch==75?116:(ch==77?2:0)))%118;
gotoxy(a[k][0],a[k=(head+400-L)%400][1],0);//清除尾部
gotoxy(a[head][0],a[head][1],1);//打印蛇头
a[k][0]=0;
a[k][1]=0;
for(k=1;k<L;k++)//撞到自己则结束
{
if(a[(head-k+400)%400][0]==a[head][0]&&a[(head-k+400)%400][1]==a[head][1])
{
printf("游戏结束!");
return;
}
}
}
}
}
void gotoxy(int x,int y,int c)
{
COORD coord;HANDLE hscr;
coord.X=x;
coord.Y=y;
hscr=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hscr,coord);
printf("%s",c==1?"■":c<1?" ":"□");
}
运行画面: