c++小游戏——推箱子(低级版)
背景描述:
有一个同学做大作业做不完了,让我帮他看看,但是代码没加注释,又全部混在一坨,于是我看了半个小时过后无果,当即狠下心自己写一个。于是花费了两个小时,就有了这篇文章。(第一次写小游戏,贼好玩)
复制代码必看:
1.地图可以自己设置,看define就知道地图构成了
2.地图的规格是7 * 7,不要越界(我自己也没试过)
3.游戏通关判定只有两个箱子和两个终点(不要整多了,不然自己改通关判断)
4.游戏一共是3关,想多一点自己改一下结束条件,自己写几个地图
5.由于是clion上面写的,有可能存在字符编码问题(我自己也没有解决),建议大家也用clion,教程CSDN一搜一大把
6.头文件是万能头,没有的自己改
7.好像没啥补充的了。。。想起了再补充吧
下面是代码:
#include "bits/stdc++.h"
using namespace std;
#define a 0 //
#define b 1 //■
#define c 2 //木
#define d 3 //囗
#define e 5 //困
#define f 6 //人
#define g 9 //囚
int my_map[3][7][7] = { //地图初始化
1,1,1,1,1,1,1,
1,3,0,0,3,0,1,
1,1,0,0,0,1,1,
1,0,0,6,0,0,1,
1,1,2,0,2,0,1,
1,1,0,0,0,0,1,
1,1,1,1,1,1,1,
1,1,1,1,1,1,1,
1,3,2,0,3,0,1,
1,0,0,0,2,1,1,
1,1,0,6,0,0,1,
1,1,0,0,0,0,1,
1,1,0,0,0,1,1,
1,1,1,1,1,1,1,
1,1,1,1,1,1,1,
1,3,2,0,3,0,1,
1,1,0,0,2,1,1,
1,0,0,6,0,0,1,
1,1,0,0,0,0,1,
1,1,0,0,1,1,1,
1,1,1,1,1,1,1
};
int x = 3,y = 3; //初始位置
void drawing_map(int part) { //绘制地图
for(int i = 0;i < 7;i++) {
for(int j = 0;j < 7;j++) {
if(my_map[part][i][j] == 0) {
cout << " ";
} else if(my_map[part][i][j] == 1) {
cout << "■";
} else if(my_map[part][i][j] == 2) {
cout << "木";
} else if(my_map[part][i][j] == 3) {
cout << "口";
} else if(my_map[part][i][j] == 5) {
cout << "困";
} else if(my_map[part][i][j] == 6) {
cout << "人";
} else if(my_map[part][i][j] == 9) {
cout << "囚";
}
}
cout << endl;
}
cout << endl;
}
void step(int *judge,int part) { //每一步操作
char key = getchar(); //键盘输入
switch (key) { //判断输入是什么以及是否正确
case 'D' :
case 'd' :
if (my_map[part][x][y + 1] == 0) { //是否为空
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x][y + 1] = 6;
my_map[part][x][y] = 3;
y++;
} else {
my_map[part][x][y + 1] = 6;
my_map[part][x][y] = 0;
y++;
}
} else if (my_map[part][x][y + 1] == 1) { //是否为墙
cout << "Wrong move!" << endl;
} else if (my_map[part][x][y + 1] == 2) { //是否为木
if (my_map[part][x][y] == 9) { //是否当前为囚
if (my_map[part][x][y + 2] == 0) {
my_map[part][x][y + 2] = 2;
my_map[part][x][y + 1] = 6;
my_map[part][x][y] = 3;
y++;
} else if (my_map[part][x][y + 2] == 3) {
my_map[part][x][y + 2] = 5;
my_map[part][x][y + 1] = 6;
my_map[part][x][y] = 0;
y++;
} else {
cout << "Wrong move!" << endl;
}
} else {
if (my_map[part][x][y + 2] == 0) {
my_map[part][x][y + 2] = 2;
my_map[part][x][y + 1] = 6;
my_map[part][x][y] = 0;
y++;
} else if (my_map[part][x][y + 2] == 3) {
my_map[part][x][y + 2] = 5;
my_map[part][x][y + 1] = 6;
my_map[part][x][y] = 0;
y++;
} else {
cout << "Wrong move!" << endl;
}
}
} else if (my_map[part][x][y + 1] == 3) { //是否为目的地
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x][y + 1] = 9;
my_map[part][x][y] = 9;
y++;
} else {
my_map[part][x][y + 1] = 9;
my_map[part][x][y] = 0;
y++;
}
} else {
cout << "Wrong move!" << endl;
}
break;
case 'w':
case 'W' :
if (my_map[part][x - 1][y] == 0) { //是否为空
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x - 1][y] = 6;
my_map[part][x][y] = 3;
x--;
} else {
my_map[part][x - 1][y] = 6;
my_map[part][x][y] = 0;
x--;
}
} else if (my_map[part][x - 1][y] == 1) { //是否为墙
cout << "Wrong move!" << endl;
} else if (my_map[part][x - 1][y] == 2) { //是否为木
if (my_map[part][x][y] == 9) { //是否当前为囚
if (my_map[part][x - 2][y] == 0) {
my_map[part][x - 2][y] = 2;
my_map[part][x - 1][y] = 6;
my_map[part][x][y] = 3;
x--;
} else if (my_map[part][x - 2][y] == 3) {
my_map[part][x - 2][y] = 5;
my_map[part][x - 1][y] = 6;
my_map[part][x][y] = 0;
x--;
} else {
cout << "Wrong move!" << endl;
}
} else {
if (my_map[part][x - 2][y] == 0) {
my_map[part][x - 2][y] = 2;
my_map[part][x - 1][y] = 6;
my_map[part][x][y] = 0;
x--;
} else if (my_map[part][x - 2][y] == 3) {
my_map[part][x - 2][y] = 5;
my_map[part][x - 1][y] = 6;
my_map[part][x][y] = 0;
x--;
} else {
cout << "Wrong move!" << endl;
}
}
} else if (my_map[part][x - 1][y] == 3) { //是否为目的地
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x - 1][y] = 9;
my_map[part][x][y] = 9;
x--;
} else {
my_map[part][x - 1][y] = 9;
my_map[part][x][y] = 0;
x--;
}
} else {
cout << "Wrong move!" << endl;
}
break;
case 'a' :
case 'A' :
if (my_map[part][x][y - 1] == 0) { //是否为空
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x][y - 1] = 6;
my_map[part][x][y] = 3;
y--;
} else {
my_map[part][x][y - 1] = 6;
my_map[part][x][y] = 0;
y--;
}
} else if (my_map[part][x][y - 1] == 1) { //是否为墙
cout << "Wrong move!" << endl;
} else if (my_map[part][x][y - 1] == 2) { //是否为木
if (my_map[part][x][y] == 9) { //是否当前为囚
if (my_map[part][x][y - 2] == 0) {
my_map[part][x][y - 2] = 2;
my_map[part][x][y - 1] = 6;
my_map[part][x][y] = 3;
y--;
} else if (my_map[part][x][y - 2] == 3) {
my_map[part][x][y - 2] = 5;
my_map[part][x][y - 1] = 6;
my_map[part][x][y] = 0;
y--;
} else {
cout << "Wrong move!" << endl;
}
} else {
if (my_map[part][x][y - 2] == 0) {
my_map[part][x][y - 2] = 2;
my_map[part][x][y - 1] = 6;
my_map[part][x][y] = 0;
y--;
} else if (my_map[part][x][y - 2] == 3) {
my_map[part][x][y - 2] = 5;
my_map[part][x][y - 1] = 6;
my_map[part][x][y] = 0;
y--;
} else {
cout << "Wrong move!" << endl;
}
}
} else if (my_map[part][x][y - 1] == 3) { //是否为目的地
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x][y - 1] = 9;
my_map[part][x][y] = 9;
y--;
} else {
my_map[part][x][y - 1] = 9;
my_map[part][x][y] = 0;
y--;
}
} else {
cout << "Wrong move!" << endl;
}
break;
case 's' :
case 'S' :
if (my_map[part][x + 1][y] == 0) { //是否为空
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x + 1][y] = 6;
my_map[part][x][y] = 3;
x++;
} else {
my_map[part][x + 1][y] = 6;
my_map[part][x][y] = 0;
x++;
}
} else if (my_map[part][x + 1][y] == 1) { //是否为墙
cout << "Wrong move!" << endl;
} else if (my_map[part][x + 1][y] == 2) { //是否为木
if (my_map[part][x][y] == 9) { //是否当前为囚
if (my_map[part][x + 2][y] == 0) {
my_map[part][x + 2][y] = 2;
my_map[part][x + 1][y] = 6;
my_map[part][x][y] = 3;
x++;
} else if (my_map[part][x + 2][y] == 3) {
my_map[part][x + 2][y] = 5;
my_map[part][x + 1][y] = 6;
my_map[part][x][y] = 0;
x++;
} else {
cout << "Wrong move!" << endl;
}
} else {
if (my_map[part][x + 2][y] == 0) {
my_map[part][x + 2][y] = 2;
my_map[part][x + 1][y] = 6;
my_map[part][x][y] = 0;
x++;
} else if (my_map[part][x + 2][y] == 3) {
my_map[part][x + 2][y] = 5;
my_map[part][x + 1][y] = 6;
my_map[part][x][y] = 0;
x++;
} else {
cout << "Wrong move!" << endl;
}
}
} else if (my_map[part][x + 1][y] == 3) { //是否为目的地
if (my_map[part][x][y] == 9) { //是否当前为囚
my_map[part][x + 1][y] = 9;
my_map[part][x][y] = 9;
x++;
} else {
my_map[part][x + 1][y] = 9;
my_map[part][x][y] = 0;
x++;
}
} else {
cout << "Wrong move!" << endl;
}
break;
}
int counter = 0;
for(int i = 0;i < 7;i++) { //判断是否通关
for(int j = 0;j < 7;j++) {
if(my_map[part][i][j] == 5) {
counter++;
}
}
}
if(counter == 2) {
*judge = 1;
}
}
void gaming(int part) { //游戏主体程序
system("cls");
int judge = 0;
cout << "Part " << part + 1 << ": " << endl;
while(judge == 0) {
drawing_map(part);
step(&judge,part);
}
x = 3; //重置!!!很重要
y = 3;
}
int main() {
int part = 0; //关卡计数
while(true) {
if(part == 3) {
cout << "恭喜你通关了!" << endl;
break;
}
gaming(part);
part++;
}
return 0;
}
Ps : 代码中step函数写得很冗余,我自己都看得眼花缭乱,鉴于我水平就那样,将就看吧
(不是屎山!!!可以改动的!!!但是你要有足够的耐心和细致力)