用C语言复现用贪吃蛇游戏(二)完结

书接上回,咱们复现了贪吃蛇的页面,接下来是对游戏的操作进行复现:

//移动小蛇
//第一步扫描数组canvas的所有元素,找到正数元素都加1
//找到最大元素(蛇尾巴),把其变为0
//找到等于2的元素(蛇头),根据输出上下左右的方向把对应的另一个像素值设为1(新蛇头) 
void moveSnakeByDirection()
{
	int i,j;
	for(i=1;i<High-1;i++)
	  for(j=1;j<Width-1;j++)
	    if(canvas[i][j]>0)
	    canvas[i][j]++;
	    
	    
	int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
	int max = 0;
	
	for(i=1;i<High-1;i++)
	  for(j=1;j<Width-1;j++)
	    if(canvas[i][j]>0)
	{
		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;
		}
    }
int newHead_i,newHead_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 ;  //原来的蛇尾留着,长度自动加1 
}
else                              //否则,原来的旧蛇尾减掉,保持长度不变
  canvas[oldTail_i][oldTail_j] = 0;
  

这些是对经典的游戏规则进行复现:出现食物,蛇吃到食物后尾巴的长度增加。

//小蛇是否和自身或者和边框撞。游戏失败
if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1)
{
	printf("游戏失败!\n");
	Sleep(2000);
	system("pause");
	exit(0);
 } 
 else
 canvas[newHead_i][newHead_j] = 1;
 
}

这是对游戏失败的判定,当小蛇与自身和墙体相撞则判定为游戏失败。

   

	else if(canvas[i][j]==-2)
			printf("F");                  //输出食物 F 

将这段代码插入到(一)中 viod show 函数中内循环for的最后面。(文章末尾会将全部代码呈现)

void updateWithoutTnput()             //与用户无关的更新 
{
  moveSnakeByDirection();
}
void updateWithInput()               //与用户有关的更新 
{
	char input;
	if(kbhit())                      //判断是否有输入 
	{
		input=getch();               //根据用户的不同输入来移动,不必输入回车
		if(input =='a')
		{
			moveDirection = 3;       //位置左移 
			moveSnakeByDirection();
		}
		else if (input=='d')
		{
			moveDirection =4;               //位置右移
			moveSnakeByDirection();         
		}
		else if(input=='w')
		{
			moveDirection =1;              //位置上移 
			moveSnakeByDirection();
		}
		else if (input=='s')
		{
			moveDirection =2;              //位置下移 
			moveSnakeByDirection();
		 } 
	}	
}

这些函数实现了玩家对小蛇的控制。

上面讲述的不够太完全,下面是这款建议贪吃蛇游戏的全部代码:

#include<stdio.h>
#include<stdlib.h>              //包含了C、C++语言的最常用的系统函数
#include<conio.h>               //主要是文件和标准控制台的输入输出
#include<windows.h>             //控制页面 

#define High 20                 //游戏画面大小 :高20.宽30 
#define Width 30


//0为空格,-1为边框#,1为蛇头@,大于1为蛇身                     
int canvas[High][Width]={0};       //二维数组 储存元素 
int moveDirection; 
int food_x,food_y;
	   
void gotoxy(int x,int y)          //将光标移动到(x,y);包含在conio.h    
{
	HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos; 
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
}




//移动小蛇
//第一步扫描数组canvas的所有元素,找到正数元素都加1
//找到最大元素(蛇尾巴),把其变为0
//找到等于2的元素(蛇头),根据输出上下左右的方向把对应的另一个像素值设为1(新蛇头) 
void moveSnakeByDirection()
{
	int i,j;
	for(i=1;i<High-1;i++)
	  for(j=1;j<Width-1;j++)
	    if(canvas[i][j]>0)
	    canvas[i][j]++;
	    
	    
	int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
	int max = 0;
	
	for(i=1;i<High-1;i++)
	  for(j=1;j<Width-1;j++)
	    if(canvas[i][j]>0)
	{
		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;
		}
    }
int newHead_i,newHead_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;
	//原来的蛇尾留着,长度自动加1 
}
else                          //否则,原来的旧蛇尾减掉,保持长度不变
  canvas[oldTail_i][oldTail_j] = 0;
  
  
  
  
//小蛇是否和自身或者和边框撞。游戏失败
if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1)
{
	printf("游戏失败!\n");
	Sleep(2000);
	system("pause");
	exit(0);
 } 
 else
 canvas[newHead_i][newHead_j] = 1;
 
}
 
void startup()                //数据的初始化 
{
	int i,j;
	
	//初始化边框 
	for(i=0;i<High;i++)
	{
		canvas[i][0]=-1;              //[a][b]第a-1行,第b-1列 
		canvas[i][Width-1] = -1;
	} 
	for(j=0;j<Width;j++)
	{
		canvas[0][j] = -1;
		canvas[High-1][j]= -1;		
	}
	
	
	//初始化蛇头位置
	canvas[High/2][Width/2]=1;
	// 初始化蛇身,画布中的元素值为2,3,4,5等
	for (i=1;i<=4;i++) 
	 canvas[High/2][Width/2-i]=i+1;

	//初始小蛇向右移动
    moveDirection=4;
	
	food_x = rand()%(High-5) + 2;
	food_y = rand()%(Width-5) + 2;
	canvas[food_x][food_y] = -2;
	
}


void show()           //显示画面
{
	gotoxy(0,0);                     //光标移动到原点位置,清屏
	int i,j;
	for (i=0;i<High;i++)
	{
		for(j=0;j<Width;j++)
		{
			if(canvas[i][j]==0)            //将未赋值的,赋值为0 
			printf(" ");                   //输出空格 
			else if(canvas[i][j]==-1)
			printf("#");                  //输出边框 
			else if(canvas[i][j]==1)
			printf("@");                  //输出蛇头 
			else if(canvas[i][j]>1)
			printf("*");                  //输出蛇身 
			else if(canvas[i][j]==-2)
			printf("F");                  //输出食物 F 
				
		}
		printf("\n"); 
	}
	Sleep(100);
}

void updateWithoutTnput()             //与用户无关的更新 
{
  moveSnakeByDirection();
}
void updateWithInput()               //与用户有关的更新 
{
	char input;
	if(kbhit())                      //判断是否有输入 
	{
		input=getch();               //根据用户的不同输入来移动,不必输入回车
		if(input =='a')
		{
			moveDirection = 3;       //位置左移 
			moveSnakeByDirection();
		}
		else if (input=='d')
		{
			moveDirection =4;               //位置右移
			moveSnakeByDirection();         
		}
		else if(input=='w')
		{
			moveDirection =1;              //位置上移 
			moveSnakeByDirection();
		}
		else if (input=='s')
		{
			moveDirection =2;              //位置下移 
			moveSnakeByDirection();
		 } 
	}	
}

int main()                          //主函数 
{   
    CONSOLE_CURSOR_INFO cci;
	cci.bVisible = FALSE;
	cci.dwSize = sizeof(cci);
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);

	startup();                       //调用startup函数 
	while(1)
	{
		show();
		updateWithoutTnput();           //与用户无关的更新 
		updateWithInput();              //与用户有关的更新 
	}
	return 0;
 } 

注:代码运行的时候小蛇的初始化只会出现一条尾巴,向蛇尾移动的话会直接判定失败。程序可以运行,但这两问题还没有解决,可能会降低玩家体验。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值