C++实现推箱子,只有两百行代码


前言

基于C++编写的推箱子小游戏,功能尚未完善,今后应该会更新。编译通过,运行的环境:vs2019,Devc++,其它编译器没有测试

一、实现功能

设置:空地0:空格,墙1:■,人5:♀,
箱子7:●,目标点8:○,成功9:◎
人与标记点重合6。

实现了人物的上下左右移动,与箱子的碰撞检测,与目标点的碰撞,与墙的碰撞,过关成功判定,跳到下一关。

二、演示

1.代码

代码如下(示例):

#include<iostream>
#include<stdlib.h>//system("cls") 头文件
#include"conio.h"//_getch()头文件,要加"_"

using namespace std;
/*推箱子*/
/*
空地0:空格,墙1:■,人5:♀,
箱子7:●,目标点8:○,成功9:◎
人与标记点重合6:
后期添加选关,菜单,悔步
*/
int hero_x=0;
int hero_y=0;
int aa = 0, bb = 0;//因为上下左右方向的函数差不多的,
//定义aa,bb两个量作为地图的行偏移量和列偏移量,以达到化简程序的目的
int guanShu = 0;//现在是第几关
int arr[2][10][10] = {
{
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 8, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 7, 0, 7, 0, 0, 0, 5, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 8, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},

},
{
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 7, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 5, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},

}
};




int main() {
	void map(int);
	void action(int);
	void tiShi();
	tiShi();
	action(0);

	return 0;
}
void map( int n) {//地图函数,打印函数
	for (int i=0;i<10;i++) {
		for (int j=0;j<10;j++) {
			switch (arr[n][i][j]) {
			case 0:cout << "  "; break;//空地
			case 1:cout << "■"; break;//墙
			case 5:
			case 6:cout << "♀"; break;//5,6是人
			case 7:cout << "●"; break;//箱子
			case 8:cout << "○"; break;//目标点
			case 9:cout << "◎"; break;//成功
			}
		}
		cout << endl;//打印一排换行
	}
}

void site(int n) {//找到当前人物的位置
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			if (arr[n][i][j] == 5||arr[n][i][j]==6) {
				hero_x = i;
				hero_y = j;
				break;
			}
		}
	}

}


void action(int n) {
	void site(int);//声明
	void map(int);//地图函数的声明
	void direction(int n);//方向移动函数
	void win(int);//判断成功
	
	
	map(n);//刚开始时调用一次地图
	while (1) {
		char ch;
		ch=_getch();//用getchar,回车也是字符
		if (ch == 't') break;//按t退出
		switch (ch) {
		case 'w':
		case 'W':aa = -1; bb = 0; direction(n); break;
		case 's':
		case 'S':aa = 1; bb = 0; direction(n); break;
		case 'a':
		case 'A':aa = 0; bb = -1; direction(n); break;
		case 'd':
		case 'D':aa = 0; bb = 1; direction(n); break;
		
			
		}
		system("cls");//清除控制台内容
		map(n);//移动一次,打印一次地图
		win(n);
		
	}

}

void direction(int n) {//向上移动函数
	void site(int);//声明
	site(n);
	int x, y;//先传入位置
	x = hero_x;
	y = hero_y;
	if (arr[n][x+aa][y+bb]==0 ||arr[n][x+aa][y+bb] == 8 || ((arr[n][x+aa][y+bb] == 7||arr[n][x+aa][y+bb]==9 )&& (arr[n][x+2*aa][y+2*bb] != 7 && arr[n][x+2*aa][y+2*bb] != 1))) {
		
		//上个位置是空地或是成功点或是箱子
		if (arr[n][x][y] == 5) {
			switch (arr[n][x+aa][y+bb]) {//人物的上一个位置

			case 0:
				arr[n][x][y] = 0;
				arr[n][x+aa][y+bb] = 5;

				break;
			case 8:
				arr[n][x][y] = 0;
				arr[n][x+aa][y+bb] = 6;
				break;
			case 7:
				if (arr[n][x+2*aa][y+2*bb] == 0) {//上两格位置是空地
					arr[n][x][y] = 0;
					arr[n][x+aa][y+bb] = 5;
					arr[n][x+2*aa][y+2*bb] = 7;
				}
				else {//上两格位置是目的地
					arr[n][x][y] = 0;
					arr[n][x+aa][y+bb] = 5;
					arr[n][x+2*aa][y+2*bb] = 9;
				}
				break;
			case 9:
				if (arr[n][x+2*aa][y+2*bb] == 0) {//上两格位置是空地
					arr[n][x][y] = 0;
					arr[n][x+aa][y+bb] = 6;
					arr[n][x+2*aa][y+2*bb] = 7;
				}
				else {//上两格位置是目的地
					arr[n][x][y] = 0;
					arr[n][x+aa][y+bb] = 6;
					arr[n][x+2*aa][y+2*bb] = 9;
				}
				break;

			}
		}
		else if (arr[n][x][y] == 6) {//现在在目标点上
			switch (arr[n][x+aa][y+bb]) {//人物的上一个位置

			case 0:
				arr[n][x][y] = 8;
				arr[n][x+aa][y+bb] = 5;

				break;
			case 8:
				arr[n][x][y] = 8;
				arr[n][x+aa][y+bb] = 6;
				break;
			case 7:
				if (arr[n][x+2*aa][y+2*bb] == 0) {//下两格位置是空地
					arr[n][x][y] = 8;
					arr[n][x+aa][y+bb] = 5;
					arr[n][x+2*aa][y+2*bb] = 7;
				}
				else {//下两格位置是目的地
					arr[n][x][y] = 8;
					arr[n][x+aa][y+bb] = 6;
					arr[n][x+2*aa][y+2*bb] = 9;
				}
				break;
			case 9:
				if (arr[n][x+2*aa][y+2*bb] == 0) {//上两格位置是空地
					arr[n][x][y] = 8;
					arr[n][x+aa][y+bb] = 6;
					arr[n][x+2*aa][y+2*bb] = 7;
				}
				else {//上两格位置是目的地
					arr[n][x][y] = 8;
					arr[n][x+aa][y+bb] = 6;
					arr[n][x+2*aa][y+2*bb] = 9;
				}
				break;

			}
		}
		
	}

}
void win(int n) {
	void action(int );//声明行动函数
	bool K=true;
	for (int i = 0;i<10;i++) {
		for (int j = 0;j<10;j++) {
			if (arr[n][i][j] == 7) K = false;
		}
	}
	if (K) {
		cout << endl<<"===过关===" << endl;
		cout << "-->输入T退出<--" << endl;
		cout << "***按任意键下一关***" << endl;
		char ch;
		ch = _getch();
		if (ch == 't' || ch == 'T') {
			exit(0);//直接退出
		}
		else {
			system("cls");
			action(++guanShu);
		}

	}
}



void tiShi() {
	cout << "***----->欢迎游玩推箱子益智小游戏<------***" << endl;
	cout << "***         w:上 s:下 a:左 d:右         ***" << endl;
	cout << "***               按T退出               ***" << endl;
	cout << "***            敬请期待更新             ***" << endl;
	cout << "***              2021/4/16              ***" << endl;
	cout << "*******************************************" << endl;
}

2.程序运行结果

开始:

在这里插入图片描述
过关:

第二关:
在这里插入图片描述


总结

本推箱子小游戏全由博主一点一点手敲上去的,如果对你有用,点个

在这里插入图片描述
有什么疑惑可以评论哦!

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值