Class: GameState
- Inherits:
-
Object
- Object
- GameState
- Defined in:
- lib/software_challenge_client/game_state.rb
Overview
Ein Spielzustand. Wird vom Server an die Computerspieler übermittelt und enthält alles, was der Computerspieler wissen muss, um einen Zug zu machen.
Um eine Liste der gerade möglichen Züge zu bekommen, gibt es die Methode #possible_moves.
Instance Attribute Summary collapse
-
#board ⇒ Board
Das aktuelle Spielbrett.
-
#condition ⇒ Condition
Gewinner und Gewinngrund, falls das Spiel bereits entschieden ist, sonst nil.
-
#current_player ⇒ Player
Der Spieler, der akutell dran ist.
-
#myself_player ⇒ Player
Der Spieler, der von diesem Skript gesteuert wird.
-
#player_one ⇒ Player
readonly
Der erste Spieler.
-
#player_two ⇒ Player
readonly
Der zweite Spieler.
-
#start_player ⇒ Player
Der Spieler der zuerst zieht.
-
#turn ⇒ Integer
Aktuelle Zugnummer (von 0 beginnend).
Instance Method Summary collapse
-
#==(other) ⇒ Object
TODO: Fix.
-
#add_player(player) ⇒ Object
Fügt einen Spieler zum Spielzustand hinzu.
-
#can_move?(player) ⇒ Boolean
Überprüft ob der gegebene Spieler ziehen könnte oder blockiert ist.
-
#clone ⇒ Object
Erzeugt eine Kopie des Spielzustandes.
-
#field(x, y) ⇒ Object
Zugriff auf ein Feld des Spielbrettes.
-
#game_ended? ⇒ Boolean
True, falls das Spiel bereits geendet hat, false bei noch laufenden Spielen.
-
#initialize ⇒ GameState
constructor
Erstellt einen neuen leeren Spielstand.
-
#is_first_round? ⇒ Bool
Ob diese gamestate in der ersten Runde ist.
-
#not_player(p) ⇒ Player
Der Spieler, der nicht p ist.
-
#other_player ⇒ Player
Spieler, der gerade nicht an der Reihe ist.
-
#other_team ⇒ Team
Typ des Spielers, der gerade nicht an der Reihe ist.
-
#own_fields ⇒ Array<Field>
Alle Felder mit Blöcken des Spielers, der gerade an der Reihe ist.
-
#perform!(move) ⇒ Object
Führt einen Zug auf dem Spielzustand aus.
-
#player_from_team(team) ⇒ Player
Findet den Spieler für ein Team.
-
#points_for_player(player) ⇒ Integer
Ermittelt die Punkte eines Spielers.
-
#round ⇒ Integer
Aktuelle Rundennummer (von 1 beginnend).
-
#winner ⇒ Player
Der Spieler, der das Spiel gewonnen hat, falls dies schon entschieden ist.
-
#winning_reason ⇒ String
Der Grund, warum das Spiel beendet wurde, nil falls das Spiel noch läuft.
Constructor Details
Instance Attribute Details
#board ⇒ Board
Returns Das aktuelle Spielbrett.
32 33 34 |
# File 'lib/software_challenge_client/game_state.rb', line 32 def board @board end |
#condition ⇒ Condition
Returns Gewinner und Gewinngrund, falls das Spiel bereits entschieden ist, sonst nil.
45 46 47 |
# File 'lib/software_challenge_client/game_state.rb', line 45 def condition @condition end |
#current_player ⇒ Player
Returns Der Spieler, der akutell dran ist.
36 37 38 |
# File 'lib/software_challenge_client/game_state.rb', line 36 def current_player @current_player end |
#myself_player ⇒ Player
Returns Der Spieler, der von diesem Skript gesteuert wird.
40 41 42 |
# File 'lib/software_challenge_client/game_state.rb', line 40 def myself_player @myself_player end |
#player_one ⇒ Player (readonly)
Returns Der erste Spieler.
20 21 22 |
# File 'lib/software_challenge_client/game_state.rb', line 20 def player_one @player_one end |
#player_two ⇒ Player (readonly)
Returns Der zweite Spieler.
24 25 26 |
# File 'lib/software_challenge_client/game_state.rb', line 24 def player_two @player_two end |
#start_player ⇒ Player
Returns Der Spieler der zuerst zieht.
28 29 30 |
# File 'lib/software_challenge_client/game_state.rb', line 28 def start_player @start_player end |
#turn ⇒ Integer
Returns Aktuelle Zugnummer (von 0 beginnend).
16 17 18 |
# File 'lib/software_challenge_client/game_state.rb', line 16 def turn @turn end |
Instance Method Details
#==(other) ⇒ Object
TODO: Fix
162 163 164 165 166 167 168 169 170 171 172 173 |
# File 'lib/software_challenge_client/game_state.rb', line 162 def ==(other) turn == other.turn && myself_player == other.myself_player && current_player == other.current_player && blue == other.blue && yellow == other.yellow && red == other.red && green == other.green && board == other.board && lastMove == other.lastMove && condition == other.condition end |
#add_player(player) ⇒ Object
Fügt einen Spieler zum Spielzustand hinzu.
61 62 63 64 65 66 67 68 |
# File 'lib/software_challenge_client/game_state.rb', line 61 def add_player(player) case player.team when Team::ONE @player_one = player when Team::TWO @player_two = player end end |
#can_move?(player) ⇒ Boolean
Überprüft ob der gegebene Spieler ziehen könnte oder blockiert ist
123 124 125 126 127 128 129 130 131 132 |
# File 'lib/software_challenge_client/game_state.rb', line 123 def can_move?(player) can = false for f in board.fields_of_team(player.team) do n = board.neighbors_of(f) can &= n.any? { |x| x.free? } end can end |
#clone ⇒ Object
Erzeugt eine Kopie des Spielzustandes. Änderungen an dieser Kopie beeinflussen den originalen Spielzustand nicht. Die Kopie kann also zum testen von Spielzügen genutzt werden.
178 179 180 |
# File 'lib/software_challenge_client/game_state.rb', line 178 def clone Marshal.load(Marshal.dump(self)) end |
#field(x, y) ⇒ Object
Zugriff auf ein Feld des Spielbrettes. Siehe Board#field.
48 49 50 |
# File 'lib/software_challenge_client/game_state.rb', line 48 def field(x, y) board.field(x, y) end |
#game_ended? ⇒ Boolean
Returns true, falls das Spiel bereits geendet hat, false bei noch laufenden Spielen.
136 137 138 |
# File 'lib/software_challenge_client/game_state.rb', line 136 def game_ended? !condition.nil? end |
#is_first_round? ⇒ Bool
Returns Ob diese gamestate in der ersten Runde ist.
107 108 109 |
# File 'lib/software_challenge_client/game_state.rb', line 107 def is_first_round? round == 1 end |
#not_player(p) ⇒ Player
Returns Der Spieler, der nicht p ist.
76 77 78 79 80 81 82 |
# File 'lib/software_challenge_client/game_state.rb', line 76 def not_player(p) if p == player_one player_two else player_one end end |
#other_player ⇒ Player
Returns Spieler, der gerade nicht an der Reihe ist.
71 72 73 |
# File 'lib/software_challenge_client/game_state.rb', line 71 def other_player current_player == player_one ? player_two : player_one end |
#other_team ⇒ Team
Returns Typ des Spielers, der gerade nicht an der Reihe ist.
85 86 87 |
# File 'lib/software_challenge_client/game_state.rb', line 85 def other_team other_player.type end |
#own_fields ⇒ Array<Field>
Returns Alle Felder mit Blöcken des Spielers, der gerade an der Reihe ist.
183 184 185 |
# File 'lib/software_challenge_client/game_state.rb', line 183 def own_fields board.fields_of_team(current_player.team) end |
#perform!(move) ⇒ Object
Führt einen Zug auf dem Spielzustand aus. Das Spielbrett wird entsprechend modifiziert.
115 116 117 |
# File 'lib/software_challenge_client/game_state.rb', line 115 def perform!(move) GameRuleLogic.perform_move(self, move) end |
#player_from_team(team) ⇒ Player
Findet den Spieler für ein Team.
93 94 95 96 97 98 99 |
# File 'lib/software_challenge_client/game_state.rb', line 93 def player_from_team(team) if team == Team::ONE @player_one else @player_two end end |
#points_for_player(player) ⇒ Integer
Ermittelt die Punkte eines Spielers. Wenn das Spiel durch Erreichen des Rundenlimits beendet wird, hat der Spieler mit den meisten Punkten gewonnen.
157 158 159 |
# File 'lib/software_challenge_client/game_state.rb', line 157 def points_for_player(player) player.nil? ? 0 : player.fishes end |
#round ⇒ Integer
Returns Aktuelle Rundennummer (von 1 beginnend).
102 103 104 |
# File 'lib/software_challenge_client/game_state.rb', line 102 def round turn / 2 + 1 end |
#winner ⇒ Player
Returns Der Spieler, der das Spiel gewonnen hat, falls dies schon entschieden ist. Sonst false.
142 143 144 |
# File 'lib/software_challenge_client/game_state.rb', line 142 def winner condition.nil? ? nil : condition.winner end |
#winning_reason ⇒ String
Returns Der Grund, warum das Spiel beendet wurde, nil falls das Spiel noch läuft.
148 149 150 |
# File 'lib/software_challenge_client/game_state.rb', line 148 def winning_reason condition.nil? ? nil : condition.reason end |