c语言贪吃蛇小游戏的简易实现

命令行界面通过打印字符实现了贪吃蛇游戏的基本功能    

代码仅130行

实现原理为,采用链式单调数列在矩阵地图中储存为蛇的坐标信息。

//贪吃蛇的实现原理在于,将蛇在矩阵中的点表示为正数,并且由蛇尾到蛇头是有向的,从1逐个递增的数列。
//每次移动时,将蛇头下一格的数据填入当前蛇头的数据+1,再使得地图矩阵的所有正数-1,即可实现整体蛇的移动。 如(01234500 -》 01234560 -》00123450)
//若吃到食物,则不执行整体-1,即可实现长度+1;
//移动例子   如  0 1 2 3 4 5 0 0     -》 
//              0 1 2 3 4 5 6 0     -》  (若吃到食物,执行到这一步结束就是蛇的边长。)
//              0 0 1 2 3 4 5 0 

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define M 20        //可调节地图的宽高
#define N 40
#define SL 5
int G=1;
int l=SL;
int boundary_x,boundary_y;
int frame[M][N]={0};
int turn=4; 
void initialization()
{
	boundary_x=M;
	boundary_y=N;
}
void refresh()
{
	int i,j;
	system("cls");
	for(i=0;i<M;i++)
		{for(j=0;j<N;j++)
		if(frame[i][j]==-1) printf("*");
		else if(frame[i][j]==0) printf(" ");
		else if(frame[i][j]==1) printf("@");
		else if(frame[i][j]>1) printf("#"); 
		else if(frame[i][j]==-2) printf("X"); 
		//printf("%3d",frame[i][j]);
		printf("\n");
		}
	printf("得分:%d",l-SL);
}
void withinput()
{
	int i,j;
	char c;
	if(kbhit())
	{
		c=getch();
	if(turn!=3&&(c=='w'||c=='W')) turn=1;
	else if(turn!=4&&(c=='a'||c=='A')) turn=2;
	else if(turn!=1&&(c=='s'||c=='S')) turn=3;
	else if(turn!=2&&(c=='d'||c=='D')) turn=4;  
	}
}
void withoutinput()
{
	int i,j,p=0;
	int x=-1,y=-1;
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
		{	
			if(frame[i][j]>0)		//蛇身整体++ 
		frame[i][j]++;
			
		}
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
		{if(frame[i][j]==2)
			{
				if(turn==2) {if(frame[i][j-1]==0||frame[i][j-1]==-2) frame[i][j-1]=1;
							else if(frame[i][j-1]>0||frame[i][j-1]==-2) G=0;
							else if(frame[i][j-1]==-1) frame[i][N-2]=1;}
				else if(turn==4){if(frame[i][j+1]==0||frame[i][j+1]==-2) frame[i][j+1]=1;
							else if(frame[i][j+1]>0||frame[i][j+1]==-2) G=0;
							else if(frame[i][j+1]==-1) frame[i][1]=1;}
				else if(turn==1){if(frame[i-1][j]==0||frame[i-1][j]==-2) frame[i-1][j]=1;
							else if(frame[i-1][j]>0||frame[i-1][j]==-2) G=0;
							else if(frame[i-1][j]==-1) frame[M-2][j]=1;}
				else if(turn==3){if(frame[i+1][j]==0||frame[i+1][j]==-2) frame[i+1][j]=1;
							else if(frame[i+1][j]>0||frame[i+1][j]==-2) G=0;
							else if(frame[i+1][j]==-1) frame[1][j]=1;}
			}
		}
	for(i=0;i<M;i++)      
		for(j=0;j<N;j++){ 
			if(frame[i][j]==l+1)				//除尾操作 
				frame[i][j]=0;
			if(frame[i][j]==-2)				//判断场上是否存在目标 
			p=1;                     //p=1为判断存在 
		}
		
	if(p==0)      //取模随机生成; 
	{
		l++;
		do{
		x=rand()%(M-2)+1;
		y=rand()%(N-2)+1;
		if(frame[x][y]==0)
		frame[x][y]=-2;
		}
		while(frame[x][y]!=-2);
	}
	if(G==0)
	exit(0);
}
int main()
{
	int x,y;
	int i,j;
	i=M/2;
	for(j=M/2;j<M/2+SL;j++)
	frame[i][j]=M/2+SL-j;
	x=rand()%(M-2)+1;
		y=rand()%(N-2)+1;
		frame[x][y]=-2;
	for(i=0;i<M;i++)
		{for(j=0;j<N;j++)
		if(i==0||i==M-1||j==0||j==N-1)
		frame[i][j]=-1;}
		while(1)
		{	
			refresh();
			withinput();
			withoutinput();
			Sleep(50);
	 }
}

运行截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值