Jak rozpoznac do jakiego gracza nalezy jednostka

0

Problem mozliwe, ze jest prosty, ale sprawia mi straszny klopot.
Psze gre strategiczna polegajaca na utworzeniu mapy pol wypelnionych zlotem, na ktorych mozna rozstawiac explorerow.
Kazdy gracz ma liste swoich explorerow oraz sama gra ma liste graczy czyli: humanplayer i computerplayer, gdzie podane nazwy to klasy (obiektowo). W jaki sposob (przy rysowaniu mapy) moge rozpoznac czy na danym polu znajduje sie explorer komputerowego gracza czy prawdziwego (zeby mozna bylo pokazac ich na mapie jako roznych tj. jednostki gracza "#", akomputera "$" dla przykladu)

0

Najprościej chyba będzie dodać stosowne pole do klasy opisującej eksplolera. Albo do tej listy dodać pozycję eksplolerów (niekoniecznie wyświetlaną).

0

Racja. Zakładając, że każde pole to klasa posiadająca metodę getExplorer, możesz w klasie Explorer zrobić np. getPlayer, a później już tylko pole.getExplorer().getPlayer() i gitara.

0

Macie Panowie racje tylko jak to w ifie porownac? tzn. w ten sposob mozna sie dobrac do playera tylko jeszcze trzeba go z czyms porownac i tu powstaje pytanie jak napisac warunek pozwalajacy na okreslenie czy (w skrocie) getPlayer()!=computerplayer.

bo tak jak to sie robi z nullem nie idzie:
if(world->get_field(i,j)->get_explorer()== NULL)

0

A co zwracja funkcja getPlayer()? bo jak nazwę gracza to trzeba by raczej getPlayer()!="computerplayer"

0

dokladne tak;
Player* Explorer::get_player()
{
return this -> player;
}

zapomnialem dodac ze computerplayer i humanplayer dzidzicza z klasy player

0

Można to zrobić na kilka sposobów. Albo tak jak już zostało napisane poprzez explorera dobierać się do właściciela i sprawdzać jego typ. Ale tutaj musiałbyś mieć na klasie player zdefiniowaną metodę np.

playerType GetPlayerType() = 0

Która zwracałaby odpowiednio wartości enuma playerType równe HumanPlayer bądź CPU_Player. I wtedy w ifie przyrównujesz już bezpośrednio do tych wartości.

Innym rozwiązaniem, które wydaje mi się fajniesze jest w konstruktorze explera zaszycie informacji o jego typie (gdy tworzony jest przez gracza), powiedzmy HumanExplorer albo CPU_Explorer. I wtedy w programie już normalnie

if (world->get_field(i,j)->get_explorer()->getType() == Explorer::HumanExplorer) {
   //Human
} else {
   // CPU
}

Ale to tak na szybko więc pewnie coś namieszałem.

0

Zawsze moglby to zrobic poprzez polimorfizm. Miec klase nadrzedna player i podrzedne cpuplayer i humanplayer. W klasie player mialby metode wirtualna isHuman ktora w ponizszych klasach zwracalaby po prostu 1 lub 0 i tyle. Moglby wtedy zrobic kontener graczy i po klopocie.

0

dzieki za dobre pomysly, musze przemyslec ;]

0

Nie panowie, nie. To jest dobry przykład zastosowania polimorfizmu przecież. Masz klasę player, niech posiada wirtualne metody implementowane w odpowiedniej klasie. Na przykład niech posiada metodę GetChar() zwracającą znaczek do wyświetlenia. Takie ify jakieś srify nie będą potrzebne

1 użytkowników online, w tym zalogowanych: 0, gości: 1