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
-
#blue ⇒ Player
readonly
Der blaue Spieler.
-
#board ⇒ Board
Das aktuelle Spielbrett.
-
#condition ⇒ Condition
Gewinner und Gewinngrund, falls das Spiel bereits entschieden ist, sonst nil.
-
#current_player_color ⇒ PlayerColor
Die Farbe des Spielers, der den nächsten Zug machen darf, der also gerade an der Reihe ist.
-
#last_move ⇒ Move
Der zuletzt gemachte Zug (ist nil vor dem ersten Zug, also bei turn == 0).
-
#red ⇒ Player
readonly
Der rote Spieler.
-
#start_player_color ⇒ PlayerColor
Die Farbe des Spielers, der den ersten Zug im Spiel machen darf.
-
#turn ⇒ Integer
Aktuelle Zugnummer (von 0 beginnend).
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#add_player(player) ⇒ Object
Fügt einen Spieler zum Spielzustand hinzu.
-
#current_player ⇒ Player
Spieler, der gerade an der Reihe ist.
-
#deep_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 Spielzustand.
-
#other_player ⇒ Player
Spieler, der gerade nicht an der Reihe ist.
-
#other_player_color ⇒ PlayerColor
Farbe des Spielers, der gerade nicht an der Reihe ist.
-
#own_fields ⇒ Array<Field>
Alle Felder mit Fischen des Spielers, der gerade an der Reihe ist.
-
#perform!(move) ⇒ Object
Führt einen Zug auf dem Spielzustand aus.
-
#points_for_player(player) ⇒ Integer
Ermittelt die Punkte eines Spielers.
-
#possible_moves ⇒ Array<Move>
Alle regelkonformen Züge, die der aktuelle Spieler gerade machen könnte.
-
#round ⇒ Integer
Aktuelle Runde (von 0 beginnend).
-
#switch_current_player ⇒ Object
Wechselt den Spieler, der aktuell an der Reihe ist.
-
#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
#initialize ⇒ GameState
Erstellt einen neuen Spielzustand.
52 53 54 55 56 57 |
# File 'lib/software_challenge_client/game_state.rb', line 52 def initialize @current_player_color = PlayerColor::RED @start_player_color = PlayerColor::RED @board = Board.new @turn = 0 end |
Instance Attribute Details
#blue ⇒ Player (readonly)
Returns Der blaue Spieler.
33 34 35 |
# File 'lib/software_challenge_client/game_state.rb', line 33 def blue @blue end |
#board ⇒ Board
Returns Das aktuelle Spielbrett.
36 37 38 |
# File 'lib/software_challenge_client/game_state.rb', line 36 def board @board end |
#condition ⇒ Condition
Returns Gewinner und Gewinngrund, falls das Spiel bereits entschieden ist, sonst nil.
44 45 46 |
# File 'lib/software_challenge_client/game_state.rb', line 44 def condition @condition end |
#current_player_color ⇒ PlayerColor
Returns Die Farbe des Spielers, der den nächsten Zug machen darf, der also gerade an der Reihe ist.
27 28 29 |
# File 'lib/software_challenge_client/game_state.rb', line 27 def current_player_color @current_player_color end |
#last_move ⇒ Move
Returns Der zuletzt gemachte Zug (ist nil vor dem ersten Zug, also bei turn == 0).
40 41 42 |
# File 'lib/software_challenge_client/game_state.rb', line 40 def last_move @last_move end |
#red ⇒ Player (readonly)
Returns Der rote Spieler.
30 31 32 |
# File 'lib/software_challenge_client/game_state.rb', line 30 def red @red end |
#start_player_color ⇒ PlayerColor
Returns Die Farbe des Spielers, der den ersten Zug im Spiel machen darf.
23 24 25 |
# File 'lib/software_challenge_client/game_state.rb', line 23 def start_player_color @start_player_color end |
#turn ⇒ Integer
Returns Aktuelle Zugnummer (von 0 beginnend).
19 20 21 |
# File 'lib/software_challenge_client/game_state.rb', line 19 def turn @turn end |
Instance Method Details
#==(other) ⇒ Object
128 129 130 131 132 133 134 135 136 137 |
# File 'lib/software_challenge_client/game_state.rb', line 128 def ==(other) turn == other.turn && start_player_color == other.start_player_color && current_player_color == other.current_player_color && red == other.red && blue == other.blue && board == other.board && lastMove == other.lastMove && condition == other.condition end |
#add_player(player) ⇒ Object
Fügt einen Spieler zum Spielzustand hinzu.
62 63 64 65 66 67 68 |
# File 'lib/software_challenge_client/game_state.rb', line 62 def add_player(player) if player.color == PlayerColor::RED @red = player elsif player.color == PlayerColor::BLUE @blue = player end end |
#current_player ⇒ Player
Returns Spieler, der gerade an der Reihe ist.
71 72 73 74 |
# File 'lib/software_challenge_client/game_state.rb', line 71 def current_player return red if current_player_color == PlayerColor::RED return blue if current_player_color == PlayerColor::BLUE end |
#deep_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.
142 143 144 |
# File 'lib/software_challenge_client/game_state.rb', line 142 def deep_clone Marshal.load(Marshal.dump(self)) end |
#field(x, y) ⇒ Object
Zugriff auf ein Feld des Spielbrettes. Siehe Board#field.
47 48 49 |
# File 'lib/software_challenge_client/game_state.rb', line 47 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.
102 103 104 |
# File 'lib/software_challenge_client/game_state.rb', line 102 def game_ended? !condition.nil? end |
#other_player ⇒ Player
Returns Spieler, der gerade nicht an der Reihe ist.
77 78 79 80 |
# File 'lib/software_challenge_client/game_state.rb', line 77 def other_player return blue if current_player_color == PlayerColor::RED return red if current_player_color == PlayerColor::BLUE end |
#other_player_color ⇒ PlayerColor
Returns Farbe des Spielers, der gerade nicht an der Reihe ist.
83 84 85 |
# File 'lib/software_challenge_client/game_state.rb', line 83 def other_player_color PlayerColor.opponent_color(current_player_color) end |
#own_fields ⇒ Array<Field>
Returns Alle Felder mit Fischen des Spielers, der gerade an der Reihe ist.
152 153 154 155 156 |
# File 'lib/software_challenge_client/game_state.rb', line 152 def own_fields board.fields_of_type( PlayerColor.field_type(current_player_color) ) end |
#perform!(move) ⇒ Object
Führt einen Zug auf dem Spielzustand aus. Das Spielbrett wird entsprechend modifiziert.
96 97 98 |
# File 'lib/software_challenge_client/game_state.rb', line 96 def perform!(move) move.perform!(self) 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.
124 125 126 |
# File 'lib/software_challenge_client/game_state.rb', line 124 def points_for_player(player) GameRuleLogic.swarm_size(board, player) end |
#possible_moves ⇒ Array<Move>
Returns Alle regelkonformen Züge, die der aktuelle Spieler gerade machen könnte.
159 160 161 162 163 |
# File 'lib/software_challenge_client/game_state.rb', line 159 def possible_moves own_fields.map do |f| GameRuleLogic.possible_moves(board, f, current_player_color) end.flatten end |
#round ⇒ Integer
Returns Aktuelle Runde (von 0 beginnend).
88 89 90 |
# File 'lib/software_challenge_client/game_state.rb', line 88 def round turn / 2 end |
#switch_current_player ⇒ Object
Wechselt den Spieler, der aktuell an der Reihe ist.
147 148 149 |
# File 'lib/software_challenge_client/game_state.rb', line 147 def switch_current_player @current_player_color = other_player_color end |
#winner ⇒ Player
Returns Der Spieler, der das Spiel gewonnen hat, falls dies schon entschieden ist. Sonst false.
108 109 110 |
# File 'lib/software_challenge_client/game_state.rb', line 108 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.
114 115 116 |
# File 'lib/software_challenge_client/game_state.rb', line 114 def winning_reason condition.nil? ? nil : condition.reason end |