2012-11-29 47 views
1

我正在做一個蛇遊戲。我有兩個班,snakefood。當我打電話給snake->move()時,它需要檢查是否有衝突,爲此目的它需要知道什麼是food的位置,因此需要一個指向food的指針。 food具有將其移動到新的隨機位置move->setNewPosition()的功能,該位置需要知道snake的位置,以便它在移動時不與蛇相撞。爲此,它需要一個指向snake的指針。是否可以同時初始化兩個需要相互指示的類?

因此,對於這兩個類,我需要提供一個指向其他類必須被初始化的指針。但要初始化其他課程,我需要初始化其他課程等。有什麼辦法可以同時初始化兩個需要相互指示的類嗎?

如果不是,那麼更好的構建我的程序的方法將允許我檢查另一個類的座標?

回答

2

,如果我不誤解你,創建init功能的遊戲循環之前調用啓動:

void initSnake() 
{ 
    auto snake = new Snake(); 
    auto food = new Food(); 
    snake->setFood(food); 
    food->setSnake(snake); 
} 
+0

注:若沒有動態分配可以使用的指針。 –

0

一種選擇是將有一個Manager類兩者發送它們的請求,這將使更有意義(但並不能解決你的特定問題)。

不過,如果你有class Aclass B,並且每一個都需要對方,你可以做到以下幾點:他們

A *a = new A; 
B *b = new B; 
// check a and b to make sure they are not NULL 
a->set_b(b); 
b->set_a(a); 
1

您可以定義一個基類,它有以下方法:

virtual void setPosition(const int x, const int y) 
virtual void getPosition(int &x, int &y) const 

蛇也應該使用它們,只要你需要覆蓋它們。現在,如果您將另一個對象作爲Base類型的參數,那麼兩個類都可以直接調用對方的和getPosition

另一種方式是;在你main()功能全,或任何你定義你的蛇:

int main() 
{ 
    Snake* s = new Snake; 
    Food* f = new Food; 
    Snake->setLocation(0,0); // Wherever you want the snake to start from 
} 

,每當你創建一個新的食物,給它蛇的位置:f->setRandomLocation(snake->getLocation())其中參數將座標哪裏都不把它。

1

他們只需要找到其他蛇和食物的位置,當他們的移動功能被調用時。在初始化時不需要知道它們的存在!

因此,您可以收集蛇和食物的集合,並將這些集合的引用傳遞給任何新創建的蛇和食物。首先創建這些集合。

你可以通過另一個類來做到這一點,也許,它也可以作爲一個工廠。

class GameManager; 

class Snake 
{ 
    friend class GameManager; 

    public: 
     int getX() { return _x; } 
     int getY() { return _y; } 

     void setPosition(int x, y) { /* ... */ } 

    private: 
     Snake(GameManager* manager, int x, int y) : _manager(manager), _x(x), _y(y) {} 

     GameManager* _manager; 
     int _x, _y; 
}; 

class GameManager 
{ 
    public: 
     const std::vector<Snake*>& Snakes() { return _snakes; } 

     Snake* SpawnSnake(int x, int y) 
     { 
      Snake* newSnake = new Snake(this, x, y); 
      snakes.push_back(newSnake); 
      return snake; 
     } 

    private: 
     std::vector<Snake*> _snakes; 
}; 

(只是一個例子,代碼沒有經過測試,看它是否實際編譯。E & OE)

GameManager確保所有創建的蛇都在蛇矢量中找到,因爲Snake構造函數是私有的。每條蛇可以調用_manager.Snakes()獲得一個包含遊戲中所有其他蛇的矢量,然後它可以單獨查詢它們的位置。這很容易推廣到支持食品。

這與其他答案中建議的「構造初始化」模式相比有一個小優點,它可以確保當你得到一個新的Snake對象時,它實際上已經可以使用了......這個例子不完全是RAII,但它需要最少的努力才能使其具有合理的異常安全性。

0

MMN,不知道我怎麼你的遊戲作品,但假設會有很多食物的對象?

也許一個想法是創建一個Collision類接受一個蛇播放器和存儲所有食品球員在比賽中。 所以碰撞的構造看起來像這樣

Collison(Snake &snake, Vector<Food*> &foods) 
{ 

} 

的碰撞類也將有一個碰撞更新循環,你在你的代碼中調用的地方..如果蛇對象與食品物體相撞這個循環會檢查。 。你可以做任何你想做的事情..從foods vector刪除食物改變食物的位置,不管。

collison.UpdateCollisions() ; 
0

我建議打破的,而不是在罵它的循環依賴,:使這兩個移動功能以環境(即一個東西它可以與碰撞列表)作爲參數。

相關問題