C语言推箱子小游戏(控制台版)

​  各位C语言初学者的小伙伴们,学C语言那么久了,大家是不是每天日复一日的敲着那几行枯燥的代码,练习的题目也是一些偏简单的数学应用题 。在这种环境下,似乎大家对C语言的学习,早就感到了厌倦。大家不要着急,今天,基诺教大家,如何用C语言写出一个简单的推箱子小游戏哟。
  对于需要用到C语言的知识,各位萌新也无需担心哦,都是大家学的基础知识,而且不涉及指针哦。接下来让我来给大家详细介绍一下如何编写一个简单的推箱子游戏。



地图绘制

​   第一步首先我们需要做的,当然是绘制地图了呀。我们可以回想一下,在一个推箱子小游戏的地图上,有哪些东西呢?

  人、通道、墙壁、箱子、目的地

  除此之外,我们也该考虑,人可能会走到目的地,箱子也可能推到目的地,所以就还有:

  箱子+目的地、人+目的地

  当然了,我们需要在地图上表示出来,该如何显示呢?
  今天,基诺教大家的,不涉及图形库,所以我们只需要在控制台上面打印出地图即可。所以我们就可以用到大家所熟悉的printf函数了。
​  同时,我们也该考虑的一个问题就是,如何存储地图呢?

  玩过推箱子小游戏的朋友都知道,游戏界面的地图是一个二维平面,因此我们也只需要用一个二位数组来对游戏的地图进行存储。好,那我们接下来开始绘制地图吧。
  我们先开辟一个整形的9x9数组,在数组里面,我们用不同的数字代替地图上面不同的元素:

0:通道	1:墙壁	2:人		3:箱子	4:目的地	6(2+4):人+目的地	7(3+4):箱子+目的地

  在此,开辟一个9x9的二维数组:

#define COL 9
#define ROW 9

//这里的map数组是全局变量
int map[ROW][COL] = {
   {1,1,1,1,1,1,1,1,1},
   {1,0,0,0,0,0,0,0,1},
   {1,0,0,0,3,0,0,0,1},
   {1,0,0,1,4,1,0,0,1},
   {1,0,3,1,4,1,3,0,1},
   {1,0,0,1,4,1,0,0,1},
   {1,0,0,1,1,1,0,0,1},
   {1,0,0,0,0,0,0,2,1},
   {1,1,1,1,1,1,1,1,1}
};

​  既然地图已经存储了,那么我们接下来就可以利用存储的地图,对其进行打印了,接下来我们就用printf函数对其进行打印,根据不同的值打印出对应的符号标志。这里我们将打印函数封装成一个printMap函数。

//打印地图
void printMap() {
	int i, j;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++) {
			switch (map[i][j])
			{
			case 0://通道
				printf("  ");
				break;
			case 1://墙壁
				SetColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
				printf("■ ");
				break;
			case 2://人
				SetColor(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
				printf("♀ ");
				break;
			case 3://箱子
				SetColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
				printf("□ ");
				break;
			case 4://目的地
				SetColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
				printf("☆ ");
				break;
			case 6://人+目的地
				SetColor(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
				printf("♀ ");
				break;
			case 7://箱子+目的地
				SetColor(FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
				printf("★ ");
				break;
			}
		}
		printf("\n");
	}
}

  代码中的setColor函数为自定义的函数,里面的参数为颜色值,因为控制台打印出来的元素都是白色,这里为了美观,就设置了多种颜色的值。

  接着,我们在main函数里面调用printMap函数,地图的打印结果如图所示:
在这里插入图片描述


角色移动

​  地图绘制好了之后,接下来考虑的就是角色移动了。一般来说,小人在地图上主要就是上下左右四个方位的移动,因此我们可以设计四个函数,分别是Up()、Down()、Left()、Right()。这里,我们主要以Up()向上这个函数进行讲解。

  首先我们定义一个函数Up()

void Up(){

}

  在操控人物移动的时候,首先需要确定的就是人的具体位置。也就是地图上2或者6的位置,代码如下:

void Up(){
    
    // 确定人的坐标
    int i, j;// i,j为人所在的位置坐标
	bool flag = false; // 用来表示是否找到了人的位置
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++) {
			if (map[i][j] == 2 || map[i][j] == 6) {
				flag = true;
				break;
			}
		}
		if (flag) {// 找到了人的位置,则跳出循环
			break;
		}
	}
    
    
}

  当获取了人的坐标之后,就要开始向上移动了,首先我们肯定先要判断人的上方是什么。
  如果人的上方是个通道或者目的地的话,那么人直接就向上移动。那么我们该如何实现这个功能呢?
  首先,人一旦向上移动,那么所对应的上方位置上的数值直接+2即可,比如上面是个通道0,那么直接+2,变成小人,如果是个目的地4,那么直接+2变成6即人+目的地重合,而原来的位置则-2变回空地或者目的地。代码如下:

void Up(){
    
    /*······*/
    //以上代码为确定人的坐标,前面已展示
    
    //上方为通道或者目的地,小人移动
    if (map[i - 1][j] == 0 || map[i - 1][j] == 4) {
		map[i - 1][j] += 2;
		map[i][j] -= 2;
	}
    
}

  小人向上移动则已经完成,接下来,如果上面是个箱子或者箱子与目的地的重合,那么向上移动小人就要使得小人和箱子一起向上移动。
​  我们先要考虑的是,箱子要想向上推得动,是不是箱子上面必须是通道或者目的地。然后,一旦执行了向上推的操作,那么箱子上面的位置,直接就+3即可。而原来箱子的位置因为少了箱子所以要-3,但因为人又上去了所以又要+2,则合并一下就是原来箱子的位置变化就是直接-1。原来人的位置则直接-2。代码如下:

void Up(){
    
    /*······以上代码省略*/

	// 向上推箱子
    if (map[i - 1][j] == 3 || map[i - 1][j] == 7) {
		if (map[i - 2][j] == 0 || map[i - 2][j] == 4) {
			map[i - 2][j] += 3;
			map[i - 1][j] -= 1;
			map[i][j] -= 2;
		}
	}
}

  同理,Down()、Left()、Right()函数也是一样,这里就不一一介绍了。

  综上而言,实现推箱子的功能无非就是数组的改变。但改变数组远远不够,我们需要的是玩家在控制台上看到地图的变化。因此我们可以在主函数里面不断循环,更新地图,代码如下:

int main(){
    while (true) {
        printMap();
        
        //方向操作,移动人物
		char choose = _getch();
		
        //72、80、75、77分别为键盘上下左右的ASCII码,wsad四个键也可以控制上下左右
		switch (choose) {
		case 'w':case 'W': case 72://往上
			Up(); break;
		case 's':case 'S':case 80://往下
			Down(); break;
		case 'a':case 'A':case 75://往左
			Left(); break;
		case 'd':case 'D':case 77://往右
			Right(); break;
		}

		system("cls");//清屏操作,不断清楚屏幕打印地图
    }
    
    return 0;
}

判断结束

  推箱子游戏结束的条件是所有箱子均推向了目的地,就表示游戏结束了。那么,我们通过观察不难发现,如果所有箱子均推向了目的地,那么也就表示,空箱子的个数为0,也就是地图上3的个数为0.我们只需要写一个函数来判断地图上空箱子的个数即可。代码如下:

//计算空箱子个数
int getEmptBoxNum() {
	int i, j;
	int num = 0;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++) {
			if (map[i][j] == 3) {
				num++;
			}
		}
	}
	return num;//返回空箱子个数
}

  在主函数中调用该函数,判断空箱子个数是否为0,如果为0则跳出循环,结束游戏。

int main(){
    while (true) {
		/*······*/
		if (getEmptBoxNum() == 0) {
			printf("游戏结束,请按任意键退出!!\n");
			char randomKey = _getch();
			break;
		}

		//方向操作,移动人物
		/*······*/
	}
	
	return 0;
}

  游戏结束界面如下:
在这里插入图片描述



  好!一个简单的推箱子小游戏就这样做好了。是不是很简单呢?想要源码的同学,记得点赞+关注并私信基诺领取哦。关注基诺,你会有更多意想不到的惊喜。
  • 43
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值