c++小程序:推箱子

本人无聊写了个c++推箱子小游戏耍耍。

顺便把教程发了,扩充一下网站内容。不然人家说我是个中二网站(汗-_-||。

本人写法十分低端,没怎么想就开始码,请大佬勿喷。

先打开VS2017创建一个控制台程序。

会看到代码如下

#include “stdafx.h”

int main()

{

return 0;

}

 

创建完成后我们开始构建思路。

首先我们先创建个地图

地图的话我会用一个三维数组来创建。即

 

//地图编辑器 0为空地 1为箱子,3为墙壁,4为目标点,7为箱子与目标点重合,6为人与目标点重合

p[2][10][10] = int Map[2][10][10] =

{

{

// 第一关{ 5,5,5,5,5,5,5,5,5,5 },

{ 5,5,5,5,3,3,3,3,3,5 },

{ 5,5,5,5,3,4,5,4,3,5 },

{ 5,5,5,5,3,1,1,5,3,5 },

{ 5,5,3,3,3,2,5,5,3,5 },

{ 5,3,3,5,5,5,3,3,3,5 },

{ 5,3,5,1,5,5,3,5,5,5 },

{ 5,3,5,5,4,3,3,5,5,5 },

{ 5,3,3,3,3,3,0,5,5,5 },

{ 5,5,5,5,5,5,5,5,5,5 }

},

{

 

//第二关

{ 0,0,0,0,0,0,0,0,0,0 },

{ 0,0,0,0,3,3,3,3,3,0 },

{ 0,0,0,0,3,0,0,4,3,0 },

{ 0,0,0,0,3,0,1,0,3,0 },

{ 0,0,3,3,3,2,0,0,3,0 },

{ 0,3,3,0,0,0,3,3,3,0 },

{ 0,3,0,1,0,0,3,0,0,0 },

{ 0,3,0,0,4,3,3,0,0,0 },

{ 0,3,3,3,3,3,0,0,0,0 },

{ 0,0,0,0,0,0,0,0,0,0 }

}

};

此三维数组应该填的参数为

map[地图关卡][y轴][x轴]

首先我们得明白推箱子的地图机制

因为推箱子只能上下左右移动

基本上推箱子的地图是一个二维的,

即定义上下(y轴)左右(x轴)即可

说的有点抽象。

那我画个图吧。

x轴上的数字越多即地图的宽度越大,

左右活动范围也更广。

y轴同理。

如果你为x轴有十个数字,

那么你的人物左右活动最多可以活动8格(2格为墙

map[地图关卡][y轴][x轴]即使这么来的。

可你这些这是数字呀,没事我们可以循环他里面的元素,用switch

语句打出即可,即

void void DrawMap()
{
for (int i = 0; i < 10; i++)
 {
     for (int j = 0; j < 10; j++)
     {
          switch (Map[0][i][j])
        {
          case 5:
          cout << ”  “;
        break;
          case 3:
          cout << “■”;
        break;
          case 4:
          cout << “○”;
          break;
        case 1:
        cout << “□”;
          break;
          case 2:
          cout << “O”;
          break;
          case 7:
          cout << “●”;
          }
}
cout << endl
 }
}

由于应保持可读性,尽量不在main函数写过多代码,所以将它封装成函数。

之后我们试试效果

在main函数先输入

int main()

{

//设置窗口大小

system(“mode con cols=20 lines=11”);

//窗口名字

SetConsoleTitleA(“推箱子”)

while()

{

 

Drawmap();

getchar()

return 0;

}

}

system(“mode con cols=20 lines=11”);是用来调整控制台窗口大小的,

这样不至于看到旁边黑压压一片

cols长度,lines为宽度 单位为字节

SetConsoleTitleA(“推箱子”)

//注意应包含Windows头文件

顾名思义是干嘛的

至于我们把它放在while函数中是因为,地图每一秒都应该是刷新的,你玩游戏没有游戏画面是静止不动的吧。

然后我们应该为人物写些逻辑了。

首先我们要获取人物的坐标。

这样我们才能修改他,达到移动的目的

void Getgamerposition()

{

int x = 0, y = 0,j, k;

for ( k =0; k < 10; k++)

{

for ( j = 0; j < 10; j++)

{

if (Map[0][k][j] == 2)

{

x = j;

y = k;

break;

}

}

}

gamerposition_x = x;

gamerposition_y = y;

}

因为我们设计人物为2,所以循环遍历map数组,直到发现人物坐标就跳出循坏。

我们设置两个全局变量,用来保存和修改人物坐标

int gamerposition_x  //修改人物x轴

int gamerposition_y  //修改人物y轴

 

 

gamerposition_x = x;

gamerposition_y = y;

通过这两个就将人物坐标保存下来了

之后我们开始写人物移动的逻辑了

这里我诠释了什么叫if暴力版(智商不够用,想不到好写法

这次我在代码里注释讲解

void up()

{

if (Map[0][gamerposition_y – 1][gamerposition_x] == 5)

{

int x = Map[0][gamerposition_y – 1][gamerposition_x];

Map[0][gamerposition_y – 1][gamerposition_x] =

Map[0][gamerposition_y[gamerposition_x];

Map[0][gamerposition_y][gamerposition_x] = x;

}

if (Map[0][gamerposition_y – 1][gamerposition_x] == 1)

{

if (Map[0][gamerposition_y – 2][gamerposition_x] == 5)

{

int y = Map[0][gamerposition_y + 2][gamerposition_x];

Map[0][gamerposition_y – 2][gamerposition_x] =

Map[0][gamerposition_y + 1][gamerposition_x];

Map[0][gamerposition_y -1][gamerposition_x] = y;

int x = Map[0][gamerposition_y – 1][gamerposition_x];

Map[0][gamerposition_y – 1][gamerposition_x] =

Map[0][gamerposition_y][gamerposition_x];

Map[0][gamerposition_y][gamerposition_x] = x;
}
if (Map[0][gamerposition_y – 2][gamerposition_x] == 4)

{

int y = Map[0][gamerposition_y – 2][gamerposition_x];

Map[0][gamerposition_y – 2][gamerposition_x] = 7;

Map[0][gamerposition_y -1][gamerposition_x] = 5;

int x = Map[0][gamerposition_y – 1][gamerposition_x];

Map[0][gamerposition_y – 1][gamerposition_x] =

Map[0][gamerposition_y][gamerposition_x];

Map[0][gamerposition_y][gamerposition_x] = x;

}

}

}

这些是分别在上移遇到什么物体分别做出的判定

例如如果是空地的话,就往上移,即数值交换

例如空地坐标(5,6)所在位置数字为5

而我的坐标(5,5)所在位置数值为2

此时我符合交换条件就

我的坐标(5,6)所在位置数值为2

空地坐标(5,5)所在位置数字为5

实现交换。

其他的同理

例如前面是箱子,

就在判定箱子前面是否有空地等等的逻辑。实现交换达到位移的目的。

其他位置判定也是同理的

下移就y轴减

左移就x轴减

右移就x轴加

然后写好后就可以调用他们了

我们创建一个全局变量用来记录按键

char input=0;

 

然后在main函数的while循坏里

弄一个switch函数来调用他

 

while(true)

{

switch (input)

{

case ‘w’: system(“cls”);

up();

break;

case ‘a’:

system(“cls”);

left();

break;
case ‘s’:

system(“cls”);

down();

break;

case ‘d’:

system(“cls”);

right();

break;

}

}

然后在while里打(switch下面)

 

Getgamerposition();

DrawMap();
input=_getch();
if (Map[0][2][7] == 7 && Map[0][2][5] == 7 && Map[0][7][4] == 7)

{ cout << “you win.” << endl;

break;

}

input=_getch();

为输入按键并将其记入,且无需按回车

需要<conio.h>头文件

if是判断胜利的条件

在里面打目的地的坐标是否为7,(7为箱子和目的地的重合

是的话就胜利。

然后我们调用试试

嗯,大功告成。好累呀。

 

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像