#include <stdio.h>
#include <algorithm>
#include <conio.h>
#include <tchar.h>
#include <Windows.h>
#include <stdbool.h>
//人的坐标
typedef struct location {
int x;
int y;
}MAPLOCATION;
MAPLOCATION location = { -1, -1 }; //获取人的位置
//目的地坐标
typedef struct dastination {
int x;
int y;
}dastination;
dastination DStion[100] = { 0 }; //目的地坐标
int DESTINATION = 0; //目的地个数
int customs = 1; //关卡
//0: 空地 1:墙壁 2: 目的地
//3: 箱子 4:人
int MAP[23][10] =
{
{0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 1, 1, 1},
{1, 1, 3, 1, 1, 1, 0, 0, 0, 1},
{1, 4, 0, 0, 3, 0, 0, 3, 0, 1},
{1, 0, 2, 2, 1, 0, 3, 0, 1, 1},
{1, 1, 2, 2, 1, 0, 0, 0, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 1, 0},//第一关 0~7
{0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 4, 0, 1, 1, 1, 0, 0},
{0, 0, 1, 0, 3, 0, 0, 1, 0, 0},
{0, 1, 1, 1, 0, 1, 0, 1, 1, 0},
{0, 1, 2, 1, 0, 1, 0, 0, 1, 0},
{0, 1, 2, 3, 0, 0, 1, 0, 1, 0},
{0, 1, 2, 0, 0, 0, 3, 0, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 1, 0}, //第二关7~15
{0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 1, 1, 0, 0, 1, 0, 4, 1},
{0, 0, 1, 0, 0, 0, 1, 0, 0, 1},
{0, 0, 1, 3, 0, 3, 0, 3, 0, 1},
{0, 0, 1, 0, 3, 1, 1, 0, 0, 1},
{1, 1, 1, 0, 3, 0, 1, 0, 1, 1},
{1, 2, 2, 2, 2, 2, 0, 0, 1, 0},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 0} //第三关15~23
};
void Swap(int *a, int *b); //交换
void map(); //画地图
void GetLocation(); //获取人的位置
void Getdastination(); //获取目的地坐标
void UP(); //上
void below(); //下
void left(); //左
void right(); //右
int main() {
int next;
char KEY;
int flag = 0; //箱子是否全部到达的标志
next:Getdastination();//获取目的地的坐标
while (1) {
GetLocation(); //获取人的位置
map(); //画地图
if (flag == DESTINATION) { //过关
break;
}
flag = 0;
KEY = _getch();
switch (KEY) {
case 'w': case 'W': //上
UP();
break;
case 's': case 'S': //下
below();
break;
case 'a': case 'A': //左
left();
break;
case 'd': case 'D': //右
right();
break;
}
//箱子全部到目的上
for (int i = 0; i < DESTINATION; i++) {
if (MAP[DStion[i].x][DStion[i].y] == 3) {
flag++;
}
}
}
printf("恭喜通关!\n");
customs++; //下一关卡
DESTINATION = 0; //下一关的目的地个数
flag = 0; //重置过关标志位
system("pause");
goto next;
return 0;
}
//画地图
void map() {
system("CLS");
if (customs == 1) { //第一关
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 10; j++) {
switch (MAP[i][j]) {
case 0: //空地
printf(" ");
break;
case 1: //墙壁
printf("■");
break;
case 2: //目的地
printf("○");
break;
case 3: //箱子
printf("□");
break;
case 4: //人
printf("♀");
break;
}
}
printf("\n");
}
}
if (customs == 2) { //第二关
for (int i = 7; i < 15; i++) {
for (int j = 0; j < 10; j++) {
switch (MAP[i][j]) {
case 0: //空地
printf(" ");
break;
case 1: //墙壁
printf("■");
break;
case 2: //目的地
printf("○");
break;
case 3: //箱子
printf("□");
break;
case 4: //人
printf("♀");
break;
}
}
printf("\n");
}
}
if (customs == 3) { //第三关
for (int i = 15; i < 23; i++) {
for (int j = 0; j < 10; j++) {
switch (MAP[i][j]) {
case 0: //空地
printf(" ");
break;
case 1: //墙壁
printf("■");
break;
case 2: //目的地
printf("○");
break;
case 3: //箱子
printf("□");
break;
case 4: //人
printf("♀");
break;
}
}
printf("\n");
}
}
}
//交换
void Swap(int *a, int *b) {
int c;
c = *a;
*a = *b;
*b = c;
}
//获得人的位置
void GetLocation() {
if (customs == 1) {
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 10; j++) {
if (MAP[i][j] == 4) {
location.x = i;
location.y = j;
}
}
}
}
if (customs == 2) {
for (int i = 7; i < 15; i++) {
for (int j = 0; j < 10; j++) {
if (MAP[i][j] == 4) {
location.x = i;
location.y = j;
}
}
}
}
if (customs == 3) {
for (int i = 15; i < 23; i++) {
for (int j = 0; j < 10; j++) {
if (MAP[i][j] == 4) {
location.x = i;
location.y = j;
}
}
}
}
}
//获得目的地坐标
void Getdastination() {
if (customs == 1) {
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 10; j++) {
if (MAP[i][j] == 2) {
DStion[DESTINATION].x = i;
DStion[DESTINATION].y = j;
DESTINATION++;
}
}
}
}
if (customs == 2) {
for (int i = 7; i < 15; i++) {
for (int j = 0; j < 10; j++) {
if (MAP[i][j] == 2) {
DStion[DESTINATION].x = i;
DStion[DESTINATION].y = j;
DESTINATION++;
}
}
}
}
if (customs == 3) {
for (int i = 15; i < 23; i++) {
for (int j = 0; j < 10; j++) {
if (MAP[i][j] == 2) {
DStion[DESTINATION].x = i;
DStion[DESTINATION].y = j;
DESTINATION++;
}
}
}
}
}
//什么情况可以移动
/*
1.人的上面或 下面 或 左面 或 右面 是空地
2.人的上面或 下面 或 左面 或 右面 是目的地
3.人的上面或 下面 或 左面 或 右面 是箱子,箱子的上面或 下面 或 左面 或 右面是空地
4.人的上面或 下面 或 左面 或 右面 是箱子,箱子的上面或 下面 或 左面 或 右面是目的地
*/
//上
void UP() {
int flag = true;
//遍历4个目的地
for (int i = 0; i < DESTINATION; i++) {
//判断当前自己的位置是不是目的
if (location.x == DStion[i].x && location.y == DStion[i].y) {
flag = false;
break;
}
}
//人站在的位置不是目的地
if (flag) {
//人的上面是空地或者是目的地可以向上走
if (MAP[location.x - 1][location.y] == 0 || MAP[location.x - 1][location.y] == 2) {
//人上面的位置是空地
if (MAP[location.x - 1][location.y] == 0)
Swap(&MAP[location.x - 1][location.y], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
//人上面的位置是目的地
else {
//离开,当前位置还原
MAP[location.x][location.y] = 0;
//新的位置
MAP[location.x - 1][location.y] = 4;
}
return;
}
//人的上面是箱子,箱子上面是空地或者是目的地
if (MAP[location.x - 1][location.y] == 3 && (MAP[location.x - 2][location.y] == 0 || MAP[location.x - 2][location.y] == 2)) {
//如果箱子上面是空地
if (MAP[location.x - 2][location.y] == 0) {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x - 1][location.y] = 4; //人向上移动一格
MAP[location.x - 2][location.y] = 3; //箱子也向上移动一格
}
else {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x - 1][location.y] = 4; //人向上移动一格
MAP[location.x - 2][location.y] = 3; //箱子也向上移动一格
}
}
}
//人当前的位置是目的地
else {
//人的上面是空地或者是目的地可以向上走
if (MAP[location.x - 1][location.y] == 0 || MAP[location.x - 1][location.y] == 2) {
//人上面的位置是空地
if (MAP[location.x - 1][location.y] == 0) {
//人离开,当前目的还原
MAP[location.x][location.y] = 2;
// 新的位置
MAP[location.x - 1][location.y] = 4;
}
//人上面的位置是目的地
else {
Swap(&MAP[location.x - 1][location.y], &MAP[location.x][location.y]); //目的地与目的地交换
}
return;
}
//人的上面是箱子,箱子上面是空地或者是目的地
if (MAP[location.x - 1][location.y] == 3 && (MAP[location.x - 2][location.y] == 0 || MAP[location.x - 2][location.y] == 2)) {
//如果箱子上面是空地
if (MAP[location.x - 2][location.y] == 0) {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x - 1][location.y] = 4; //人向上移动一格
MAP[location.x - 2][location.y] = 3; //箱子也向上移动一格
}
else {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x - 1][location.y] = 4; //人向上移动一格
MAP[location.x - 2][location.y] = 3; //箱子也向上移动一格
}
}
}
}
void below() { //下
int flag = true;
//遍历4个目的地
for (int i = 0; i < DESTINATION; i++) {
//判断当前自己的位置是不是目的
if (location.x == DStion[i].x && location.y == DStion[i].y) {
flag = false;
break;
}
}
//人站在的位置不是目的地
if (flag) {
//人的下面是空地或者是目的地可以向上走
if (MAP[location.x + 1][location.y] == 0 || MAP[location.x + 1][location.y] == 2) {
//人下面的位置是空地
if (MAP[location.x + 1][location.y] == 0)
Swap(&MAP[location.x + 1][location.y], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
//人下面的位置是目的地
else {
//离开,当前位置还原
MAP[location.x][location.y] = 0;
//新的位置
MAP[location.x + 1][location.y] = 4;
}
return;
}
//人的下面是箱子,箱子下面是空地或者是目的地
if (MAP[location.x + 1][location.y] == 3 && (MAP[location.x + 2][location.y] == 0 || MAP[location.x + 2][location.y] == 2)) {
//如果箱子下面是空地
if (MAP[location.x + 2][location.y] == 0) {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x + 1][location.y] = 4; //人向下移动一格
MAP[location.x + 2][location.y] = 3; //箱子也向下移动一格
}
else {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x + 1][location.y] = 4; //人向下移动一格
MAP[location.x + 2][location.y] = 3; //箱子也向下移动一格
}
}
}
//人当前的位置是目的地
else {
//人的下面是空地或者是目的地可以向下走
if (MAP[location.x + 1][location.y] == 0 || MAP[location.x + 1][location.y] == 2) {
//人下面的位置是空地
if (MAP[location.x + 1][location.y] == 0) {
//人离开,当前目的还原
MAP[location.x][location.y] = 2;
// 新的位置
MAP[location.x + 1][location.y] = 4;
}
//人下面的位置是目的地
else {
Swap(&MAP[location.x + 1][location.y], &MAP[location.x][location.y]); //目的地与目的地交换
}
return;
}
//人的下面是箱子,箱子下面是空地或者是目的地
if (MAP[location.x + 1][location.y] == 3 && (MAP[location.x + 2][location.y] == 0 || MAP[location.x + 2][location.y] == 2)) {
//如果箱子下面是空地
if (MAP[location.x + 2][location.y] == 0) {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x + 1][location.y] = 4; //人向上移动一格
MAP[location.x + 2][location.y] = 3; //箱子也向上移动一格
}
else {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x + 1][location.y] = 4; //人向上移动一格
MAP[location.x + 2][location.y] = 3; //箱子也向上移动一格
}
}
}
}
void left() { //左
int flag = true;
//遍历4个目的地
for (int i = 0; i < DESTINATION; i++) {
//判断当前自己的位置是不是目的
if (location.x == DStion[i].x && location.y == DStion[i].y) {
flag = false;
break;
}
}
//人站在的位置不是目的地
if (flag) {
//人的左面是空地或者是目的地可以向左走
if (MAP[location.x][location.y - 1] == 0 || MAP[location.x][location.y - 1] == 2) {
//人左面的位置是空地
if (MAP[location.x][location.y - 1] == 0)
Swap(&MAP[location.x][location.y - 1], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
//人左面的位置是目的地
else {
//离开,当前位置还原
MAP[location.x][location.y] = 0;
//新的位置
MAP[location.x][location.y-1] = 4;
}
return;
}
//人的左面是箱子,箱子左面是空地或者是目的地
if (MAP[location.x][location.y - 1] == 3 && (MAP[location.x][location.y - 2] == 0 || MAP[location.x][location.y - 2] == 2)) {
//如果箱子左面是空地
if (MAP[location.x][location.y - 2] == 0) {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x][location.y - 1] = 4; //人向下移动一格
MAP[location.x][location.y - 2] = 3; //箱子也向下移动一格
}
else {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x][location.y - 1] = 4; //人向下移动一格
MAP[location.x][location.y - 2] = 3; //箱子也向下移动一格
}
}
}
//人当前的位置是目的地
else {
//人的左面是空地或者是目的地可以向左走
if (MAP[location.x][location.y - 1] == 0 || MAP[location.x][location.y - 1] == 2) {
//人左面的位置是空地
if (MAP[location.x][location.y - 1] == 0) {
//人离开,当前目的还原
MAP[location.x][location.y] = 2;
// 新的位置
MAP[location.x][location.y - 1] = 4;
}
//人左面的位置是目的地
else {
Swap(&MAP[location.x][location.y - 1], &MAP[location.x][location.y]); //目的地与目的地交换
}
return;
}
//人的左面是箱子,箱子左面是空地或者是目的地
if (MAP[location.x][location.y - 1] == 3 && (MAP[location.x][location.y - 2] == 0 || MAP[location.x][location.y - 2] == 2)) {
//如果箱子左面是空地
if (MAP[location.x][location.y - 2] == 0) {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x][location.y - 1] = 4; //人向上移动一格
MAP[location.x][location.y - 2] = 3; //箱子也向上移动一格
}
else {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x][location.y - 1] = 4; //人向上移动一格
MAP[location.x][location.y - 2] = 3; //箱子也向上移动一格
}
}
}
}
void right() { //右
int flag = true;
//遍历4个目的地
for (int i = 0; i < DESTINATION; i++) {
//判断当前自己的位置是不是目的
if (location.x == DStion[i].x && location.y == DStion[i].y) {
flag = false;
break;
}
}
//人站在的位置不是目的地
if (flag) {
//人的右面是空地或者是目的地可以向右走
if (MAP[location.x][location.y + 1] == 0 || MAP[location.x][location.y + 1] == 2) {
//人右面的位置是空地
if (MAP[location.x][location.y + 1] == 0)
Swap(&MAP[location.x][location.y + 1], &MAP[location.x][location.y]); //当前的位置与上一个位置进行交换
//人右面的位置是目的地
else {
//离开,当前位置还原
MAP[location.x][location.y] = 0;
//新的位置
MAP[location.x][location.y + 1] = 4;
}
return;
}
//人的右面是箱子,箱子右面是空地或者是目的地
if (MAP[location.x][location.y + 1] == 3 && (MAP[location.x][location.y + 2] == 0 || MAP[location.x][location.y + 2] == 2)) {
//如果箱子右面是空地
if (MAP[location.x][location.y + 2] == 0) {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x][location.y + 1] = 4; //人向右移动一格
MAP[location.x][location.y + 2] = 3; //箱子也向右移动一格
}
else {
MAP[location.x][location.y] = 0; //还原当前的空地
MAP[location.x][location.y + 1] = 4; //人向右移动一格
MAP[location.x][location.y + 2] = 3; //箱子也向右移动一格
}
}
}
//人当前的位置是目的地
else {
//人的左面是空地或者是目的地可以向右走
if (MAP[location.x][location.y + 1] == 0 || MAP[location.x][location.y + 1] == 2) {
//人右面的位置是空地
if (MAP[location.x][location.y + 1] == 0) {
//人离开,当前目的还原
MAP[location.x][location.y] = 2;
// 新的位置
MAP[location.x][location.y + 1] = 4;
}
//人右面的位置是目的地
else {
Swap(&MAP[location.x][location.y + 1], &MAP[location.x][location.y]); //目的地与目的地交换
}
return;
}
//人的右面是箱子,箱子右面是空地或者是目的地
if (MAP[location.x][location.y + 1] == 3 && (MAP[location.x][location.y + 2] == 0 || MAP[location.x][location.y + 2] == 2)) {
//如果箱子右面是空地
if (MAP[location.x][location.y + 2] == 0) {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x][location.y + 1] = 4; //人向右移动一格
MAP[location.x][location.y + 2] = 3; //箱子也向右移动一格
}
else {
MAP[location.x][location.y] = 2; //还原当前的目的地
MAP[location.x][location.y + 1] = 4; //人向右移动一格
MAP[location.x][location.y + 2] = 3; //箱子也向右移动一格
}
}
}
}
手敲推箱子小游戏
最新推荐文章于 2024-10-08 05:59:13 发布
这是一个用C++编写的迷宫游戏,包含三个关卡,地图由不同符号表示,如空地、墙壁、目的地和人物。玩家通过键盘控制人物移动,将箱子移动到目的地以过关。游戏检测箱子是否全部到达目的地来判断是否通关,并在通关后进入下一关。
摘要由CSDN通过智能技术生成