• 文章
  • 我在控制台制作游戏地图的方法
发布
2010年3月16日

我在控制台制作游戏地图的方法。

评分:3.1/5 (119 票)
*****
很简单...

这篇文章很可能包含错误或有人不同意的观点。这只是我做这件事的方法,如果你有其他(或更好的)方法,也请分享。

我决定分享我的方法(之一),即如何在控制台中为文本 RPG 制作游戏地图/世界。

在阅读了各种论坛上的帖子后,我看到一个常见问题是“如何制作游戏地图”。在控制台中制作游戏地图的一种方法是使用双重嵌套 for 循环来绘制一个 x*x 网格(参见地下城爬行者帖子),然后将用文本表示的对象放置在该网格上,并在玩家移动时重绘网格/地图以及更新的值。真麻烦。

这是一种更简单、更直接的方法。

我的示例将使用坐标系统来表示游戏世界,并将事件/对象/战斗等放置在各种 X/Y 坐标值处。

首先,使用类

假设您有一个 Character 类。在您的 main() 函数中,您创建了一个名为 Hero 的新 Character。您的 Character 类可能如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Character{

public:

    int getXCoord();
    void setXCoord(int xCoord);

    int getYCoord();
    void setYCoord(int yCoord);

private:
    int itsXCoord;
    int itsYCoord;

};


然后在您的 main() 函数中,您将放入:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include "Character.h"
using namespace std;

int main()
{
Character Hero;
Hero.setXCoord(0);
Hero.setYCoord(0);

return 0;
}


好的,现在我们有了一个 Hero,它的 X/Y 值是 0,0。这样做的目的是您可以创建一个移动函数或循环,然后 +/- 更改 x 或 y 坐标值。使用此系统,它会像这样:

您发现自己身处一片森林。您可以向北/南/西/东移动。然后玩家选择一个选项,程序会更改 X/Y 的值。假设玩家决定向北移动。您的程序将在 X 值上加 1。现在您在 1.0。这有什么用?它很有用,因为它允许您创建一个虚拟无限大小的世界,并在特定的 X/Y 位置设置条件事件。例如:如果玩家移动到您世界的 3/-2 位置,那么可能会发生战斗。
1
2
3
if (Hero.getXCoord() == 3 && Hero.getYCoord() == -2){
orcAmbush(); // don;t bother trying to compile this, orcAmbush has not been declared, used as an example
}


现在假设我们要移动。您已经告诉玩家他们身处*插入背景故事*,并且您输出了当前位置(0,0)。然后您希望玩家能够围绕您的世界移动。有两种方法可以做到这一点:使用 playerMove(); 函数或循环/嵌套 if 系列。我将使用后者,因为在 main 范围之外使用 playerMover 函数需要指针,而且……算了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include "Character.h"
using namespace std;

int main()
{
int move;
Character Hero;
Hero.setXCoord(0);
Hero.setYCoord(0);
cout << "You are at :" << Hero.getXCoord() << ", " << Hero.getYCoord() << endl;
cout << "You find yourself in a clearing. Make a move\n";
cout << "1)North 2)South 3)East 4)West: ";
cin >> move;
if (move == 1){
    Hero.setXCoord(Hero.getXCoord()+1);
}
if (move == 2){
    Hero.setXCoord(Hero.getXCoord()-1);
}
if (move == 3){
    Hero.setYCoord(Hero.getYCoord()-1);
}
if (move == 4){
    Hero.setYCoord(Hero.getYCoord()+1);
}

cout << "Currently you are at: " << Hero.getXCoord() << ", " << Hero.getYCoord();

return 0;
}


当然,这只允许一次移动,但您也可以在循环或函数中使用这种类型的设置。

现在,在不使用类的情况下执行所有这些操作,这要简单得多,但对玩家可以做什么的限制也更大(因为您失去了类)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;

int main()
{
int move;
int xCoord = 0;
int yCoord = 0;

cout << "You are at :" xCoord << yCoord <, endl;
cout << "You find yourself in a clearing. Make a move\n";
cout << "1)North 2)South 3)East 4)West: ";
cin >> move;
if (move == 1){
    xCoord++;
    }
    
/*repeat for rest of choices*/

return 0;
}


这种方法要短得多,但限制较多,因为如果您想将 x/y 分配给玩家类,您就无法真正做太多事情。不过我想展示这两种方法。

老实说,在我非专业的观点中,制作这种类型的地图/网格/世界最好的方法是使用类并拥有一个 movePlayer() 函数。我想写出来,但现在是凌晨 4:40,我无法集中精力……

附注:.cpp 文件是
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Character.h"

    int Character::getXCoord(){
    return itsXCoord;
    }

    int Character::setXCoord(int xCoord){
    itsXCoord = xCoord;
    }

    int Character::getYCoord(){
        return itsYCoord;
    }

    int Character::setYCoord(int yCoord){
        itsYCoord = yCoord;
    }

嗯,这个主要是为了户外地图。我觉得这样更容易制作非常大的地图,但对于有墙壁的小房间,字符网格可能效果更好。

至于第二点,我想如果我有一个钥匙,比如在 0,4 的位置,那么我会有一个 if 语句和一个布尔值跟着它。如果 Hero 的位置是 0,4,那么 hasGoldKey = true,removeGoldKey = true(或者另一种方式是 removeGoldKey();)。我想有很多对象可能会有点混乱……

如前所述,这只是众多方法中的一种,我敢肯定还有很多很多方法。

附注:对于墙壁之类的东西,您可以使用“如果英雄在 0,5 位置,则告诉英雄‘您不能再前进了’,并将英雄的位置设置为它之前的位置。”