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.
44 45 46 47 48 49 |
# File 'lib/software_challenge_client/game_state.rb', line 44 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.
27 28 29 |
# File 'lib/software_challenge_client/game_state.rb', line 27 def blue @blue end |
#board ⇒ Board
Returns Das aktuelle Spielbrett.
30 31 32 |
# File 'lib/software_challenge_client/game_state.rb', line 30 def board @board end |
#condition ⇒ Condition
Returns Gewinner und Gewinngrund, falls das Spiel bereits entschieden ist, sonst nil.
36 37 38 |
# File 'lib/software_challenge_client/game_state.rb', line 36 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.
21 22 23 |
# File 'lib/software_challenge_client/game_state.rb', line 21 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).
33 34 35 |
# File 'lib/software_challenge_client/game_state.rb', line 33 def last_move @last_move end |
#red ⇒ Player (readonly)
Returns Der rote Spieler.
24 25 26 |
# File 'lib/software_challenge_client/game_state.rb', line 24 def red @red end |
#start_player_color ⇒ PlayerColor
Returns Die Farbe des Spielers, der den ersten Zug im Spiel machen darf.
18 19 20 |
# File 'lib/software_challenge_client/game_state.rb', line 18 def start_player_color @start_player_color end |
#turn ⇒ Integer
Returns Aktuelle Zugnummer (von 0 beginnend).
15 16 17 |
# File 'lib/software_challenge_client/game_state.rb', line 15 def turn @turn end |
Instance Method Details
#==(other) ⇒ Object
114 115 116 117 118 119 120 121 122 123 |
# File 'lib/software_challenge_client/game_state.rb', line 114 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.
54 55 56 57 58 59 60 |
# File 'lib/software_challenge_client/game_state.rb', line 54 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.
63 64 65 66 |
# File 'lib/software_challenge_client/game_state.rb', line 63 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.
126 127 128 |
# File 'lib/software_challenge_client/game_state.rb', line 126 def deep_clone Marshal.load(Marshal.dump(self)) end |
#field(x, y) ⇒ Object
Zugriff auf ein Feld des Spielbrettes. Siehe Board#field.
39 40 41 |
# File 'lib/software_challenge_client/game_state.rb', line 39 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.
92 93 94 |
# File 'lib/software_challenge_client/game_state.rb', line 92 def game_ended? !condition.nil? end |
#other_player ⇒ Player
Returns Spieler, der gerade nicht an der Reihe ist.
69 70 71 72 |
# File 'lib/software_challenge_client/game_state.rb', line 69 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.
75 76 77 |
# File 'lib/software_challenge_client/game_state.rb', line 75 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.
136 137 138 139 140 |
# File 'lib/software_challenge_client/game_state.rb', line 136 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.
87 88 89 |
# File 'lib/software_challenge_client/game_state.rb', line 87 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.
110 111 112 |
# File 'lib/software_challenge_client/game_state.rb', line 110 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.
143 144 145 146 147 |
# File 'lib/software_challenge_client/game_state.rb', line 143 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).
80 81 82 |
# File 'lib/software_challenge_client/game_state.rb', line 80 def round turn / 2 end |
#switch_current_player ⇒ Object
Wechselt den Spieler, der aktuell an der Reihe ist.
131 132 133 |
# File 'lib/software_challenge_client/game_state.rb', line 131 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.
97 98 99 |
# File 'lib/software_challenge_client/game_state.rb', line 97 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.
102 103 104 |
# File 'lib/software_challenge_client/game_state.rb', line 102 def winning_reason condition.nil? ? nil : condition.reason end |