C++ 推箱子小游戏(VS2017)
程序员文章站
2024-03-19 18:09:04
...
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<Windows.h>
#include<amp_graphics.h>
int row, col;
int k = 0;
int dest[8][9] = { 0 };
int map[2][8][9] = { {
{ 0, 0, 0, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 4, 1, 0, 0, 0 },
{ 1, 1, 1, 1, 2, 1, 0, 0, 0 },
{ 1, 4, 0, 2, 3, 1, 1, 1, 0 },
{ 1, 1, 1, 2, 0, 2, 4, 1, 0 },
{ 0, 0, 1, 0, 1, 1, 1, 1, 0 },
{ 0, 0, 1, 4, 1, 1, 1, 1, 0 },
{ 0, 0, 1, 1, 1, 0, 0, 0, 0 }
},
{
{ 0, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 4, 4, 4, 1, 0 },
{ 0, 1, 0, 3, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 2, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 2, 1, 0, 1 },
{ 1, 0, 2, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0 }
} };
void init()
{
printf("*************************\n");
printf("推箱子小游戏\n");
printf("基础操作wsad\n");
printf("*************************\n");
}
void showMap()
{
init();//操作介绍
//遍历数组,打印形状
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 9; ++j)
switch (map[k][i][j])
{
case 0:
printf(" ");//空地0
break;
case 1:
printf("■");//墙1
break;
case 2:
printf("○");//箱子2
break;
case 3:
printf("♀");//人3
break;
case 4:
printf("□");//目的地4
break;
//case 5:
// printf("●");//
// break;
case 6:
printf("●");//箱子+目的地 2+4=6
break;
case 7:
printf("♀"); //人+目的地7 3+4=7
break;
default:
break;
}
printf("\n");
}
}
//游戏规则
//向上
void playGameUp()
{
//如果向上是墙1,不可以走
if (map[k][row - 1][col] == 1)
return;
//如果向上是箱子,并且箱子上面是墙或者是箱子,不可以走
if (map[k][row - 1][col] == 2 && (map[k][row - 2][col] == 1 || map[k][row - 2][col] == 2))
return;
//下面是可以走的情形
//(1)如果向上走是空地0,可以走
if (map[k][row - 1][col] == 0 || map[k][row - 1][col] == 4)
{
map[k][row][col] -= 3;
map[k][row - 1][col] += 3;
}
//(2)如果上走是目的地
/*if (map[row - 1][col] == 4)
{
map[row][col] -= 3;
map[row - 1][col] = 7;
}*/
//发现上面俩段代码可以合到一起
//下面俩段代码也可以合到一起
//(3)如果向上是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子上面是(3)空地或者(4)目的地,人和箱子同时走
if ((map[k][row - 1][col] == 2 || map[k][row - 1][col] == 6) && (map[k][row - 2][col] == 0 || map[k][row - 2][col] == 4))
{
map[k][row][col] -= 3;
map[k][row - 1][col] += 1;
map[k][row - 2][col] += 2;
}
row--;
}
//接下来,向下走,左走,右走,代码基本差不多
//向下走
void playGameDown()
{
//如果向下是墙,不可以走
if (map[k][row + 1][col] == 1)
return;
//如果向下是箱子,并且箱子下面是墙或者是箱子,不可以走
if (map[k][row + 1][col] == 2 && (map[k][row + 2][col] == 1 || map[k][row + 2][col] == 2))
return;
//(1)如果向下走是空地0,可以走 (2)如果向下走是目的地
if (map[k][row + 1][col] == 0 || map[k][row + 1][col] == 4)
{
map[k][row][col] -= 3;
map[k][row + 1][col] += 3;
}
//(3)如果向下是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子下面是(3)空地或者(4)目的地,人和箱子同时走
if ((map[k][row + 1][col] == 2 || map[k][row + 1][col] == 6) && (map[k][row + 2][col] == 0 || map[k][row + 2][col] == 4))
{
map[k][row][col] -= 3;
map[k][row + 1][col] += 1;
map[k][row + 2][col] += 2;
}
row++;
}
//向左走
void playGameLeft()
{
//如果向左是墙,不可以走
if (map[k][row][col - 1] == 1)
return;
//如果向左是箱子,并且箱子左面是墙或者是箱子,不可以走
if (map[k][row][col - 1] == 2 && (map[k][row][col - 2] == 1 || map[k][row][col - 2] == 2))
return;
//(1)如果向左走是空地0,可以走(2)如果向左走是目的地
if (map[k][row][col - 1] == 0 || map[k][row][col - 1] == 4)
{
map[k][row][col] -= 3;
map[k][row][col - 1] += 3;
}
//(3)如果向左是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子左面是(3)空地或者(4)目的地,人和箱子同时走
if ((map[k][row][col - 1] == 2 || map[k][row][col - 1] == 6) && (map[k][row][col - 2] == 0 || map[k][row][col - 2] == 4))
{
map[k][row][col] -= 3;
map[k][row][col - 1] += 1;
map[k][row][col - 2] += 2;
}
col--;
}
void playGameRight()
{
//如果向右是墙1,不可以走
if (map[k][row][col + 1] == 1)
return;
//如果向右是箱子,但是箱子右面是墙或者是箱子,不可以走
if (map[k][row][col + 1] == 2 && (map[k][row][col + 2] == 1 || map[k][row][col + 2] == 2))
return;
//(1)如果向右走是空地0,可以走(2)如果右走是目的地
if (map[k][row][col + 1] == 0 || map[k][row][col + 1] == 4)
{
map[k][row][col] -= 3;
map[k][row][col + 1] += 3;
}
//(3)如果向右是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子右面是(3)空地或者(4)目的地,人和箱子同时走
if ((map[k][row][col + 1] == 2 || map[k][row][col + 1] == 6) && (map[k][row][col + 2] == 0 || map[k][row][col + 2] == 4))
{
map[k][row][col] -= 3;
map[k][row][col + 1] += 1;
map[k][row][col + 2] += 2;
}
col++;
}
void getOpCh()
{
char op;
op = _getche();
switch (op)
{
case 'w':
playGameUp();
break;
case 's':
playGameDown();
break;
case 'a':
playGameLeft();
break;
case 'd':
playGameRight();
break;
default:
break;
}
}
int main()
{
while (1)
{
//是否全堵通关的标志
// bool all = false; //假设没有全部通关
system("cls");
showMap();
//获取人的位置
for (int i = 0; i < 8; ++i)
for (int j = 0; j < 9; ++j)
{
if (map[k][i][j] == 3)
{
row = i;
col = j;
break;
}
}
//获取目的的坐标点
for (int i = 0; i < 8; ++i)
for (int j = 0; j < 9; ++j)
if (map[k][i][j] == 4)
dest[i][j] = 4;
while (1)
{
//进入手动推箱子
getOpCh();
system("cls");
showMap();
//判断一下是否过关
bool next = true;
for (int i = 0; i < 8; ++i)
for (int j = 0; j < 9; ++j)
{
if (dest[i][j])
{
if (map[k][i][j] != 6)
next = false;
}
}
//判断一下,是否过关
if (next)
{
k++;
memset(dest, 0, sizeof(dest));
//关卡只有2个,当k==2,表示全部通关
if (k == 2)
{
MessageBox(NULL, TEXT("您已全部通关,非常厉害"), TEXT("hehe"), MB_OK);
exit(0); //全部通关
}
else
{
MessageBox(NULL, TEXT("您已通关"), TEXT("hehe"), MB_OK);
break;
}
}
}
}
return 0;
}
效果图:
上一篇: tensorflow 入门
下一篇: 求求你,不要再使用!=null判空了