Class: GameState

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initializeGameState

Erstellt einen neuen leeren Spielstand.



53
54
55
56
# File 'lib/software_challenge_client/game_state.rb', line 53

def initialize
  @board = Board.new
  @turn = 0
end

Instance Attribute Details

#boardBoard

Returns Das aktuelle Spielbrett.

Returns:

  • (Board)

    Das aktuelle Spielbrett



32
33
34
# File 'lib/software_challenge_client/game_state.rb', line 32

def board
  @board
end

#conditionCondition

Returns Gewinner und Gewinngrund, falls das Spiel bereits entschieden ist, sonst nil.

Returns:

  • (Condition)

    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_playerPlayer

Returns Der Spieler, der akutell dran ist.

Returns:

  • (Player)

    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_playerPlayer

Returns Der Spieler, der von diesem Skript gesteuert wird.

Returns:

  • (Player)

    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_onePlayer (readonly)

Returns Der erste Spieler.

Returns:

  • (Player)

    Der erste Spieler



20
21
22
# File 'lib/software_challenge_client/game_state.rb', line 20

def player_one
  @player_one
end

#player_twoPlayer (readonly)

Returns Der zweite Spieler.

Returns:

  • (Player)

    Der zweite Spieler



24
25
26
# File 'lib/software_challenge_client/game_state.rb', line 24

def player_two
  @player_two
end

#start_playerPlayer

Returns Der Spieler der zuerst zieht.

Returns:

  • (Player)

    Der Spieler der zuerst zieht



28
29
30
# File 'lib/software_challenge_client/game_state.rb', line 28

def start_player
  @start_player
end

#turnInteger

Returns Aktuelle Zugnummer (von 0 beginnend).

Returns:

  • (Integer)

    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.

Parameters:

  • player (Player)

    Der hinzuzufügende Spieler.



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

Parameters:

  • player (Player)

    Der Spieler.

Returns:

  • (Boolean)

    true, falls der Spieler ziehen könnte



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

#cloneObject

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.

Returns:

  • (Boolean)

    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.

Returns:

  • (Bool)

    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.

Returns:

  • (Player)

    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_playerPlayer

Returns Spieler, der gerade nicht an der Reihe ist.

Returns:

  • (Player)

    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_teamTeam

Returns Typ des Spielers, der gerade nicht an der Reihe ist.

Returns:

  • (Team)

    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_fieldsArray<Field>

Returns Alle Felder mit Blöcken des Spielers, der gerade an der Reihe ist.

Returns:

  • (Array<Field>)

    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.

Parameters:

  • move (Move)

    Der auszuführende Zug.



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.

Parameters:

  • team (Team)

    Das Team

Returns:

  • (Player)

    Der zugehörige Spieler



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.

Parameters:

  • player (Player)

    Der Spieler, dessen Punkte berechnet werden sollen.

Returns:

  • (Integer)

    Die Punkte des Spielers



157
158
159
# File 'lib/software_challenge_client/game_state.rb', line 157

def points_for_player(player)
  player.nil? ? 0 : player.fishes
end

#roundInteger

Returns Aktuelle Rundennummer (von 1 beginnend).

Returns:

  • (Integer)

    Aktuelle Rundennummer (von 1 beginnend)



102
103
104
# File 'lib/software_challenge_client/game_state.rb', line 102

def round
  turn / 2 + 1
end

#winnerPlayer

Returns Der Spieler, der das Spiel gewonnen hat, falls dies schon entschieden ist. Sonst false.

Returns:

  • (Player)

    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_reasonString

Returns Der Grund, warum das Spiel beendet wurde, nil falls das Spiel noch läuft.

Returns:

  • (String)

    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