• 文章
  • 我在控制檯製作遊戲地圖的方法
釋出
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 位置,則告訴英雄‘您不能再前進了’,並將英雄的位置設定為它之前的位置。”