很简单...
这篇文章很可能包含错误或有人不同意的观点。这只是我做这件事的方法,如果你有其他(或更好的)方法,也请分享。
我决定分享我的方法(之一),即如何在控制台中为文本 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 位置,则告诉英雄‘您不能再前进了’,并将英雄的位置设置为它之前的位置。”