C++实现推箱子游戏

news/2025/2/1 16:41:49/

C++实现推箱子游戏

设计地图

使用二维数组搭建地图,
其中0为虚空、1为墙壁、2为玩家、3为箱子、4为目标点。

int map[HEIGHT][WIDTH] = 
{{1, 1, 1, 1, 1, 1, 1, 1},{1, 0, 0, 4, 0, 0, 0, 1},{1, 0, 0, 0, 0, 0, 0, 1},{1, 0, 0, 3, 0, 3, 4, 1},{1, 4, 0, 3, 2, 0, 0, 1},{1, 0, 0, 0, 3, 0, 0, 1},{1, 0, 0, 0, 4, 0, 0, 1},{1, 1, 1, 1, 1, 1, 1, 1}
};

可以根据实际需求改变地图,记得将HEIGHT和WIDTH的值按地图大小改变。

地图实例化

设计出来的地图需要将其可视化,即打印到屏幕上。遍历数组所有元素,使用switch语句将各个元素转化为可视化图形。

void drawMap()
{for (int i = 0; i < width; i++){for (int j = 0; j < lenth; j++){switch (map[i][j]){case 1:                     cout << "* ";            //墙壁break;case 2:cout << "P ";            //玩家break;case 3: cout << "+ ";            //箱子break;case 4:cout << "G ";            //目标break;case 0:cout << "  ";            //空气break;}}cout << endl;}
}

玩家定位

原理同地图实例化,遍历数组,找出玩家所在位置,为玩家建立一个坐标(x,y)

for (int i = 0; i < width; i++)
{for (int j = 0; j < lenth; j++){if (map[i][j] == 2){x = i;y = j;}}
}

注意将x,y定义在全局下。

方向控制

这里以玩家向上移动进行举例。
当玩家向上移动时

上方是空气
if (map[x-1][y] == 0){map[x-1][y] = map[x][y];map[x][y] = 0;}

此时玩家移动到了上方的位置,原来的地方变成了空气。

上方是箱子
if (map[x - 1][y] == 3){if (map[x - 2][y] == 0){map[x - 2][y] = map[x - 1][y];map[x - 1][y] = map[x][y];map[x][y] = 0;}else if (map[x - 2][y] == 4){box--;map[x - 2][y] = map[x - 1][y];map[x - 1][y] = map[x][y];map[x][y] = 0;}}

其中分为箱子的上方是空气和箱子上方是目标点。

记得在该函数结束时更新玩家的坐标

x = x - 1;
y = y;

其他三个方位同理。

控制方式

同样使用switch语句将键盘输入的内容判断,进行操控。在游戏进行当中,需要一个无限循环来防止游戏中断。

while(true)
{	system("cls");if (box == 0){break;}drawMap();char tap;cin >> tap;switch (tap){case 'w':moveUP();break;case 's':moveDown();break;case 'd':moveRight();break;case 'a':moveLeft();break;}
}

判断结束

定义一个整形箱子数量,当未移动到指定位置的箱子数量为零,则跳出死循环,程序结束。

遍历数组,查询箱子的个数

for (int i = 0; i < width; i++)
{for (int j = 0; j < lenth; j++){if (map[i][j] == 4){box++;}}
}

若箱子为零,程序结束

if (box == 0)
{break;
}

源码

#include<iostream>using namespace std;
const int lenth = 8;
const int width = 8;
int x, y;
int box = 0;int map[width][lenth] = 
{{1, 1, 1, 1, 1, 1, 1, 1},{1, 0, 0, 4, 0, 0, 0, 1},{1, 0, 0, 0, 0, 0, 0, 1},{1, 0, 0, 3, 0, 3, 4, 1},{1, 4, 0, 3, 2, 0, 0, 1},{1, 0, 0, 0, 3, 0, 0, 1},{1, 0, 0, 0, 4, 0, 0, 1},{1, 1, 1, 1, 1, 1, 1, 1}
};void drawMap()
{for (int i = 0; i < width; i++){for (int j = 0; j < lenth; j++){switch (map[i][j]){case 1:                     cout << "* ";            //墙壁break;case 2:cout << "P ";            //玩家break;case 3: cout << "+ ";            //箱子break;case 4:cout << "G ";            //目标break;case 0:cout << "  ";            //空气break;}}cout << endl;}
}void findP()
{for (int i = 0; i < width; i++){for (int j = 0; j < lenth; j++){if (map[i][j] == 2){x = i;y = j;}if (map[i][j] == 4){box++;}}}
}void moveUP()
{if (map[x-1][y] == 0){map[x-1][y] = map[x][y];map[x][y] = 0;}if (map[x - 1][y] == 3){if (map[x - 2][y] == 0){map[x - 2][y] = map[x - 1][y];map[x - 1][y] = map[x][y];map[x][y] = 0;}else if (map[x - 2][y] == 4){box--;map[x - 2][y] = map[x - 1][y];map[x - 1][y] = map[x][y];map[x][y] = 0;}}x = x - 1;y = y;
}void moveDown()
{if (map[x + 1][y] == 0){map[x + 1][y] = map[x][y];map[x][y] = 0;}if (map[x + 1][y] == 3){if (map[x + 2][y] == 0){map[x + 2][y] = map[x + 1][y];map[x + 1][y] = map[x][y];map[x][y] = 0;}else if (map[x + 2][y] == 4){map[x + 2][y] = map[x + 1][y];map[x + 1][y] = map[x][y];map[x][y] = 0;box--;}}x = x + 1;y = y;
}void moveRight()
{if (map[x][y+1] == 0){map[x][y+1] = map[x][y];map[x][y] = 0;}if (map[x][y+1] == 3){if (map[x][y+2] == 0){map[x ][y+2] = map[x][y+1];map[x ][y+1] = map[x][y];map[x][y] = 0;}else if (map[x][y+2] == 4){map[x][y + 2] = map[x][y + 1];map[x][y + 1] = map[x][y];map[x][y] = 0;box--;}}x = x;y = y + 1;
}void moveLeft()
{if (map[x][y - 1] == 0){map[x][y - 1] = map[x][y];map[x][y] = 0;}if (map[x][y - 1] == 3){if (map[x][y - 2] == 0){map[x][y - 2] = map[x][y - 1];map[x][y - 1] = map[x][y];map[x][y] = 0;}else if (map[x][y - 2] == 4){map[x][y - 2] = map[x][y - 1];map[x][y - 1] = map[x][y];map[x][y] = 0;box--;}}x = x;y = y - 1;
}
int main()
{findP();while(true){	system("cls");if (box == 0){break;}drawMap();char tap;cin >> tap;switch (tap){case 'w':moveUP();break;case 's':moveDown();break;case 'd':moveRight();break;case 'a':moveLeft();break;}}cout << "U WIN!!!!!!!!!!" << endl;system("pause");
}

http://www.ppmy.cn/news/237143.html

相关文章

【珍藏版】震撼发布2017年Android百大框架排行榜

一.榜单介绍 排行榜包括四大类&#xff1a; 单一框架&#xff1a;仅提供路由、网络层、UI层、通信层或其他单一功能的框架 混合开发框架&#xff1a;提供开发hybrid app、h5与webview结合能力、web app能力的框架 企业级开源项目&#xff1a;可以独立运行的app&#xff0c;有…

Java实现推箱子小游戏

Java实现推箱子小游戏&#xff08;ideamySQL&#xff09; 就是我们学校实训有个推箱子的小游戏&#xff0c;一开始只是完成任务&#xff0c;然后……【想法越来越多&#xff0c;我的第一个小游戏就诞生了&#xff0c;虽然可能就我一个人玩了&#xff0c;但是很高兴能和你分享制…

整理了百大框架排行榜

快速索引 框架名称  上榜关键字1.Retrofit  网络2.okhttp网络3.Butter Knife代码模板4.MPAndroidChart图表5.glide图片6.leakcanary内存7.Android-Universal-Image-Loader图片8.EventBus 事件消息9.zxing条码扫描10.picasso图片11.lottie-android动画12.fresco图片13.RxAnd…

五子棋游戏代码(完整版)

编程实现控制台版并支持两人对战的五子棋游戏。 &#xff08;1&#xff09;绘制棋盘 - 写一个成员方法实现 &#xff08;2&#xff09;提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。 &#xff08;3&#xff09;每当一方下棋后判断是否获胜 - 写一个成员方法…

c语言小游戏----2048

1、2048游戏规则 控制所有方块向同一个方向运动&#xff0c;两个相同数字方块撞在一起之后合并成为他们的和&#xff0c;每次操作之后会随机生成一个2或者4&#xff0c;最终得到一个“2048”的方块即胜利。 2、简介 此游戏是笔者大一初学c语言时某次周三上午的上机实验&…

html5+JavaScript实现贪吃蛇游戏(可查看排行榜和个人历史记录)

先看结果截图&#xff08;界面很丑&#xff0c;但是主要是为了贪吃蛇游戏算法设计和历史记录、排行榜功能的实现&#xff0c;希望以后不被产品经理打&#xff0c;哈哈&#xff09; 功能描述&#xff1a; 1.开始游戏页面之前输入玩家姓名 2.历史记录&#xff1a;可以查看之…

游戏异常测试思路和常见测试点

1.游戏异常测试背景和目的 1.1背景 游戏本身具有一种玩具的属性&#xff0c;游戏测试除了基础功能和业务逻辑要求的玩法以外&#xff0c;更偏注重的是可玩性和用户体验&#xff0c;对局公平性和平衡性 而且游戏上下文关联性比较强&#xff0c;往往其中某一个环节出现异常问题&a…

三星S7 Edge怎么打开usb调试呢

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 1、打开设定→→更多→→关于设备→→内部…