很簡單...
這篇文章很可能包含錯誤或有人不同意的觀點。這只是我做這件事的方法,如果你有其他(或更好的)方法,也請分享。
我決定分享我的方法(之一),即如何在控制檯中為文字 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 位置,則告訴英雄‘您不能再前進了’,並將英雄的位置設定為它之前的位置。”