c语言精简版贪吃蛇

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?" ":"□");
}

运行画面:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值