software_challenge_client 21.2.0 → 22.1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/Dockerfile +1 -1
  4. data/README.md +1 -1
  5. data/RELEASES.md +8 -0
  6. data/bin/console +0 -0
  7. data/bin/setup +0 -0
  8. data/develop.sh +0 -0
  9. data/example/main.rb +0 -0
  10. data/example/start.bat +0 -0
  11. data/generate-authors.sh +0 -0
  12. data/lib/software_challenge_client/board.rb +11 -61
  13. data/lib/software_challenge_client/color.rb +13 -3
  14. data/lib/software_challenge_client/field.rb +30 -11
  15. data/lib/software_challenge_client/game_rule_logic.rb +61 -254
  16. data/lib/software_challenge_client/game_state.rb +153 -232
  17. data/lib/software_challenge_client/move.rb +41 -0
  18. data/lib/software_challenge_client/piece.rb +55 -63
  19. data/lib/software_challenge_client/piece_type.rb +16 -0
  20. data/lib/software_challenge_client/player.rb +12 -6
  21. data/lib/software_challenge_client/protocol.rb +201 -266
  22. data/lib/software_challenge_client/runner.rb +1 -1
  23. data/lib/software_challenge_client/team.rb +25 -0
  24. data/lib/software_challenge_client/util/constants.rb +2 -3
  25. data/lib/software_challenge_client/version.rb +1 -1
  26. data/lib/software_challenge_client.rb +3 -6
  27. data/lib/update_client_module.sh +0 -0
  28. data/push_image_production.sh +12 -0
  29. data/release.sh +0 -0
  30. metadata +7 -10
  31. data/lib/software_challenge_client/coordinate_set.rb +0 -92
  32. data/lib/software_challenge_client/piece_shape.rb +0 -109
  33. data/lib/software_challenge_client/player_type.rb +0 -14
  34. data/lib/software_challenge_client/rotation.rb +0 -22
  35. data/lib/software_challenge_client/set_move.rb +0 -24
  36. data/lib/software_challenge_client/skip_move.rb +0 -13
@@ -1,232 +1,153 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './util/constants'
4
- require_relative 'player'
5
- require_relative 'board'
6
- require_relative 'condition'
7
-
8
- # Ein Spielzustand. Wird vom Server an die Computerspieler übermittelt und
9
- # enthält alles, was der Computerspieler wissen muss, um einen Zug zu machen.
10
- #
11
- # Um eine Liste der gerade möglichen Züge zu bekommen, gibt es die Methode
12
- # {GameState#possible_moves}.
13
- class GameState
14
- # @!attribute [rw] turn
15
- # @return [Integer] Aktuelle Zugnummer (von 0 beginnend)
16
- attr_accessor :turn
17
-
18
- # @!attribute [rw] round
19
- # @return [Integer] Aktuelle Rundennummer (von 1 beginnend)
20
- attr_accessor :round
21
-
22
- # @!attribute [rw] startColor
23
- # @return [Color] Die Farbe, die zuerst legen darf
24
- attr_accessor :start_color
25
-
26
- # @!attribute [rw] valid_colors
27
- # @return [Array<Color>] Ein Array aller Farben die ziehen können in
28
- # der Reihenfolge in der sie drankommen
29
- attr_accessor :valid_colors
30
-
31
- # @!attribute [rw] ordered_colors
32
- # @return [Array<Color>] Ein Array aller Farben in
33
- # der Reihenfolge in der sie drankommen
34
- attr_accessor :ordered_colors
35
-
36
- # @!attribute [r] undeployed_blue_pieces
37
- # @return [Array<PieceShape>] Die blauen, nicht gesetzten Spielsteine
38
- attr_accessor :undeployed_blue_pieces
39
-
40
- # @!attribute [r] undeployed_yellow_pieces
41
- # @return [Array<PieceShape>] Die gelben, nicht gesetzten Spielsteine
42
- attr_accessor :undeployed_yellow_pieces
43
-
44
- # @!attribute [r] undeployed_red_pieces
45
- # @return [Array<PieceShape>] Die roten, nicht gesetzten Spielsteine
46
- attr_accessor :undeployed_red_pieces
47
-
48
- # @!attribute [r] undeployed_green_pieces
49
- # @return [Array<PieceShape>] Die grünen, nicht gesetzten Spielsteine
50
- attr_accessor :undeployed_green_pieces
51
-
52
- # @!attribute [r] player_one
53
- # @return [Player] Der erste Spieler
54
- attr_reader :player_one
55
-
56
- # @!attribute [r] player_two
57
- # @return [Player] Der zweite Spieler
58
- attr_reader :player_two
59
-
60
- # @!attribute [rw] board
61
- # @return [Board] Das aktuelle Spielbrett
62
- attr_accessor :board
63
-
64
- # @!attribute [rw] startPiece
65
- # @return [PieceShape] Der Stein, der im ersten Zug von allen Farben gelegt werden muss
66
- attr_accessor :start_piece
67
-
68
- # @!attribute [rw] last_move
69
- # @return [Move] Der zuletzt gemachte Zug (ist nil vor dem ersten Zug, also
70
- # bei turn == 0)
71
- attr_accessor :last_move
72
-
73
- # @!attribute [rw] condition
74
- # @return [Condition] Gewinner und Gewinngrund, falls das Spiel bereits
75
- # entschieden ist, sonst nil.
76
- attr_accessor :condition
77
-
78
- # Zugriff auf ein Feld des Spielbrettes. Siehe {Board#field}.
79
- def field(x, y)
80
- board.field(x, y)
81
- end
82
-
83
- # Erstellt einen neuen leeren Spielstand.
84
- def initialize
85
- @ordered_colors = [Color::BLUE, Color::YELLOW, Color::RED, Color::GREEN]
86
- @board = Board.new
87
- @turn = 0
88
- @undeployed_blue_pieces = PieceShape.to_a
89
- @undeployed_yellow_pieces = PieceShape.to_a
90
- @undeployed_red_pieces = PieceShape.to_a
91
- @undeployed_green_pieces = PieceShape.to_a
92
- @start_piece = GameRuleLogic.get_random_pentomino
93
- @start_color = Color::BLUE
94
- end
95
-
96
- # Fügt einen Spieler zum Spielzustand hinzu.
97
- #
98
- # @param player [Player] Der hinzuzufügende Spieler.
99
- def add_player(player)
100
- case player.type
101
- when PlayerType::ONE
102
- @player_one = player
103
- when PlayerType::TWO
104
- @player_two = player
105
- end
106
- end
107
-
108
- # @return [Player] Spieler, der gerade an der Reihe ist.
109
- def current_player
110
- turn.even? ? player_one : player_two
111
- end
112
-
113
- # @return [Player] Spieler, der gerade nicht an der Reihe ist.
114
- def other_player
115
- turn.even? ? player_two : player_one
116
- end
117
-
118
- # @return [PlayerType] Typ des Spielers, der gerade nicht an der Reihe ist.
119
- def other_player_type
120
- other_player.type
121
- end
122
-
123
- # @return [Color] Der jetzige Index in der Zug Reihenfolge der Farben.
124
- def current_color_index
125
- turn % 4
126
- end
127
-
128
- # @return [Color] Farbe, der gerade an der Reihe ist.
129
- def current_color
130
- ordered_colors[current_color_index]
131
- end
132
-
133
- # @return [Color] Farbe des aktuellen Spielers, die gerade nicht an der Reihe ist.
134
- def other_color
135
- Color.find_by_ord((current_color.ord + 2) % 4)
136
- end
137
-
138
- # @return [Array<PieceShape>] Array aller Shapes, der gegebenen Farbe, die noch nicht gelegt wurden
139
- def undeployed_pieces(color)
140
- case color
141
- when Color::RED
142
- undeployed_red_pieces
143
- when Color::BLUE
144
- undeployed_blue_pieces
145
- when Color::YELLOW
146
- undeployed_yellow_pieces
147
- when Color::GREEN
148
- undeployed_green_pieces
149
- end
150
- end
151
-
152
- # @return [Array<PieceShape>] Array aller Shapes, der gegebenen Farbe, die schon gelegt wurden
153
- def deployed_pieces(color)
154
- board.deployed_pieces(color)
155
- end
156
-
157
- # @return [Bool] Ob diese gamestate in der ersten Runde ist
158
- def is_first_move?
159
- round == 1
160
- end
161
-
162
- # Führt einen Zug auf dem Spielzustand aus. Das Spielbrett wird entsprechend
163
- # modifiziert.
164
- #
165
- # @param move [Move] Der auszuführende Zug.
166
- def perform!(move)
167
- GameRuleLogic.perform_move(self, move)
168
- end
169
-
170
- # @return [Boolean] true, falls das Spiel bereits geendet hat, false bei noch
171
- # laufenden Spielen.
172
- def game_ended?
173
- !condition.nil?
174
- end
175
-
176
- # Entfernt die jetzige Farbe aus der Farbrotation
177
- def remove_active_color
178
- ordered_colors.delete current_color
179
- end
180
-
181
- # @return [Player] Der Spieler, der das Spiel gewonnen hat, falls dies schon
182
- # entschieden ist. Sonst false.
183
- def winner
184
- condition.nil? ? nil : condition.winner
185
- end
186
-
187
- # @return [String] Der Grund, warum das Spiel beendet wurde, nil falls das
188
- # Spiel noch läuft.
189
- def winning_reason
190
- condition.nil? ? nil : condition.reason
191
- end
192
-
193
- # Ermittelt die Punkte eines Spielers. Wenn das Spiel durch Erreichen des
194
- # Rundenlimits beendet wird, hat der Spieler mit den meisten Punkten gewonnen.
195
- #
196
- # @param player [Player] Der Spieler, dessen Punkte berechnet werden sollen.
197
- # @return [Integer] Die Punkte des Spielers
198
- def points_for_player(_player)
199
- # TODO
200
- -1
201
- end
202
-
203
- def ==(other)
204
- turn == other.turn &&
205
- start_color == other.start_color &&
206
- current_color == other.current_color &&
207
- blue == other.blue &&
208
- yellow == other.yellow &&
209
- red == other.red &&
210
- green == other.green &&
211
- board == other.board &&
212
- lastMove == other.lastMove &&
213
- condition == other.condition
214
- end
215
-
216
- # Erzeugt eine Kopie des Spielzustandes. Änderungen an dieser Kopie
217
- # beeinflussen den originalen Spielzustand nicht. Die Kopie kann also zum
218
- # testen von Spielzügen genutzt werden.
219
- def clone
220
- Marshal.load(Marshal.dump(self))
221
- end
222
-
223
- # Wechselt den Spieler, der aktuell an der Reihe ist.
224
- def switch_current_player
225
- @current_player_color = other_player_color
226
- end
227
-
228
- # @return [Array<Field>] Alle Felder mit Blöcken des Spielers, der gerade an der Reihe ist.
229
- def own_fields
230
- board.fields_of_color(current_color)
231
- end
232
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './util/constants'
4
+ require_relative 'player'
5
+ require_relative 'board'
6
+ require_relative 'condition'
7
+ require_relative 'color'
8
+
9
+ # Ein Spielzustand. Wird vom Server an die Computerspieler übermittelt und
10
+ # enthält alles, was der Computerspieler wissen muss, um einen Zug zu machen.
11
+ #
12
+ # Um eine Liste der gerade möglichen Züge zu bekommen, gibt es die Methode
13
+ # {GameState#possible_moves}.
14
+ class GameState
15
+ # @!attribute [rw] turn
16
+ # @return [Integer] Aktuelle Zugnummer (von 0 beginnend)
17
+ attr_accessor :turn
18
+
19
+ # @!attribute [r] player_one
20
+ # @return [Player] Der erste Spieler
21
+ attr_reader :player_one
22
+
23
+ # @!attribute [r] player_two
24
+ # @return [Player] Der zweite Spieler
25
+ attr_reader :player_two
26
+
27
+ # @!attribute [rw] start_team
28
+ # @return [Team] Der Spieler der zuerst zieht
29
+ attr_accessor :start_team
30
+
31
+ # @!attribute [rw] board
32
+ # @return [Board] Das aktuelle Spielbrett
33
+ attr_accessor :board
34
+
35
+ # @!attribute [rw] last_move
36
+ # @return [Move] Der zuletzt gemachte Zug (ist nil vor dem ersten Zug, also
37
+ # bei turn == 0)
38
+ attr_accessor :last_move
39
+
40
+ # @!attribute [rw] condition
41
+ # @return [Condition] Gewinner und Gewinngrund, falls das Spiel bereits
42
+ # entschieden ist, sonst nil.
43
+ attr_accessor :condition
44
+
45
+ # Zugriff auf ein Feld des Spielbrettes. Siehe {Board#field}.
46
+ def field(x, y)
47
+ board.field(x, y)
48
+ end
49
+
50
+ # Erstellt einen neuen leeren Spielstand.
51
+ def initialize
52
+ @board = Board.new
53
+ @turn = 0
54
+ end
55
+
56
+ # Fügt einen Spieler zum Spielzustand hinzu.
57
+ #
58
+ # @param player [Player] Der hinzuzufügende Spieler.
59
+ def add_player(player)
60
+ case player.color
61
+ when Color::RED
62
+ @player_one = player
63
+ when Color::BLUE
64
+ @player_two = player
65
+ end
66
+ end
67
+
68
+ # @return [Player] Spieler, der gerade an der Reihe ist.
69
+ def current_player
70
+ turn.even? ? player_one : player_two
71
+ end
72
+
73
+ # @return [Player] Spieler, der gerade nicht an der Reihe ist.
74
+ def other_player
75
+ turn.even? ? player_two : player_one
76
+ end
77
+
78
+ # @return [Team] Typ des Spielers, der gerade nicht an der Reihe ist.
79
+ def other_team
80
+ other_player.type
81
+ end
82
+
83
+ # @return [Integer] Aktuelle Rundennummer (von 1 beginnend)
84
+ def round
85
+ turn / 2 + 1
86
+ end
87
+
88
+ # @return [Bool] Ob diese gamestate in der ersten Runde ist
89
+ def is_first_move?
90
+ round == 1
91
+ end
92
+
93
+ # Führt einen Zug auf dem Spielzustand aus. Das Spielbrett wird entsprechend
94
+ # modifiziert.
95
+ #
96
+ # @param move [Move] Der auszuführende Zug.
97
+ def perform!(move)
98
+ GameRuleLogic.perform_move(self, move)
99
+ end
100
+
101
+ # @return [Boolean] true, falls das Spiel bereits geendet hat, false bei noch
102
+ # laufenden Spielen.
103
+ def game_ended?
104
+ !condition.nil?
105
+ end
106
+
107
+ # @return [Player] Der Spieler, der das Spiel gewonnen hat, falls dies schon
108
+ # entschieden ist. Sonst false.
109
+ def winner
110
+ condition.nil? ? nil : condition.winner
111
+ end
112
+
113
+ # @return [String] Der Grund, warum das Spiel beendet wurde, nil falls das
114
+ # Spiel noch läuft.
115
+ def winning_reason
116
+ condition.nil? ? nil : condition.reason
117
+ end
118
+
119
+ # Ermittelt die Punkte eines Spielers. Wenn das Spiel durch Erreichen des
120
+ # Rundenlimits beendet wird, hat der Spieler mit den meisten Punkten gewonnen.
121
+ #
122
+ # @param player [Player] Der Spieler, dessen Punkte berechnet werden sollen.
123
+ # @return [Integer] Die Punkte des Spielers
124
+ def points_for_player(_player)
125
+ # TODO
126
+ -1
127
+ end
128
+
129
+ def ==(other)
130
+ turn == other.turn &&
131
+ start_color == other.start_color &&
132
+ current_color == other.current_color &&
133
+ blue == other.blue &&
134
+ yellow == other.yellow &&
135
+ red == other.red &&
136
+ green == other.green &&
137
+ board == other.board &&
138
+ lastMove == other.lastMove &&
139
+ condition == other.condition
140
+ end
141
+
142
+ # Erzeugt eine Kopie des Spielzustandes. Änderungen an dieser Kopie
143
+ # beeinflussen den originalen Spielzustand nicht. Die Kopie kann also zum
144
+ # testen von Spielzügen genutzt werden.
145
+ def clone
146
+ Marshal.load(Marshal.dump(self))
147
+ end
148
+
149
+ # @return [Array<Field>] Alle Felder mit Blöcken des Spielers, der gerade an der Reihe ist.
150
+ def own_fields
151
+ board.fields_of_color(current_player.color)
152
+ end
153
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'has_hints'
4
+
5
+ # Ein Move repräsentiert eine Bewegung eines Steins auf dem Spielbrett
6
+ class Move
7
+ include HasHints
8
+
9
+ # @!attribute [r] Koordinaten von dem der Spielstein in diesem Zug wegbewegt wird
10
+ # @return [Coordinates]
11
+ attr_reader :from
12
+
13
+ # @!attribute [r] Koordinaten zu denen der Spielstein in diesem Zug hinbewegt wird
14
+ # @return [Coordinates]
15
+ attr_reader :to
16
+
17
+ # Erstellt ein neuen Zug.
18
+ def initialize(from, to)
19
+ @from = from
20
+ @to = to
21
+ @hints = []
22
+ end
23
+
24
+ def piece(gamestate)
25
+ gamestate.board.field_at(from).piece
26
+ end
27
+
28
+ def piece_t(gamestate)
29
+ gamestate.board.field_at(to).piece
30
+ end
31
+
32
+ def ==(other)
33
+ from == other.from &&
34
+ to == other.to
35
+ end
36
+
37
+ # @return [String] Gibt die String-Repräsentation zurück
38
+ def to_s
39
+ "Move(#{from}->#{to})"
40
+ end
41
+ end
@@ -2,88 +2,80 @@
2
2
 
3
3
  # Ein Spielstein mit Ausrichtung, Koordinaten und Farbe
4
4
  class Piece
5
- # @!attribute [r] Farbe
5
+ include Constants
6
+
7
+ # @!attribute [rw] Color
6
8
  # @return [Color]
7
- attr_reader :color
9
+ attr_accessor :color
8
10
 
9
- # @!attribute [r] Form
10
- # @return [PieceShape]
11
- attr_reader :kind
11
+ # @!attribute [r] Typ des Spielsteins
12
+ # @return [PieceType]
13
+ attr_reader :type
12
14
 
13
- # @!attribute [r] Drehung
14
- # @return [Rotation]
15
- attr_reader :rotation
16
-
17
- # @!attribute [r] Ob der Stein an der Y-Achse gespiegelt ist
18
- # @return [Boolean]
19
- attr_reader :is_flipped
20
-
21
- # @!attribute [r] Koordinaten
15
+ # @!attribute [rw] Koordinaten
22
16
  # @return [Coordinates]
23
- attr_reader :position
17
+ attr_accessor :position
24
18
 
25
- # @!attribute [r] Ein Array der Positionsdaten aller Bestandteile von dem Stein in Board Koordinaten, also schon ggf. gedreht und um position versetzt.
26
- # return [Array<Coordinates>]
27
- attr_reader :coords
19
+ # @!attribute [rw] tower_height
20
+ # @return [Integer] Die Anzahl Spielsteine übereinander inklusive des obersten
21
+ attr_accessor :height
28
22
 
29
- # Erstellt einen neuen leeren Spielstein.
30
- def initialize(color, kind, rotation = Rotation::NONE, is_flipped = false, position = Coordinates.origin)
23
+ # Erstellt einen neuen Spielstein.
24
+ def initialize(color, type, position = Coordinates.origin, height = 0)
31
25
  @color = color
32
- @kind = kind
33
- @rotation = rotation
34
- @is_flipped = is_flipped
26
+ @type = type
35
27
  @position = position
36
-
37
- @coords = coords_priv
38
- end
39
-
40
- # Dreht den Stein
41
- def rotate!(rotation)
42
- @rotation = @rotation.rotate(rotation)
43
- @coords = coords_priv
28
+ @height = height
44
29
  end
45
30
 
46
- # Flipped den Stein
47
- def flip!(f = true)
48
- @is_flipped = @is_flipped ^ f
49
- @coords = coords_priv
50
- end
51
-
52
- # Setzt den Stein auf eine Position
53
- def locate!(position)
54
- @position = position
55
- @coords = coords_priv
56
- end
57
-
58
- # Verschiebt den Stein
59
- def move!(shift)
60
- @position = position + shift
61
- @coords = coords_priv
62
- end
63
-
64
- # Gibt die Fläche der transformierten Steinform von diesem Stein zurück
65
- def area()
66
- CoordinateSet.new(coords).area
31
+ # Berechnet die Koordinaten zu denen sich dieser Spielstein bewegen könnte.
32
+ #
33
+ # @return [Array<Coordinates>] Die Zielkoordinaten
34
+ def target_coords
35
+ xdir = 0
36
+ if color == Color::RED
37
+ xdir = 1
38
+ else
39
+ xdir = -1
40
+ end
41
+
42
+ case type
43
+ when PieceType::Herzmuschel
44
+ coords = [Coordinates.new(xdir,-1), Coordinates.new(xdir,1)]
45
+ when PieceType::Moewe
46
+ coords = [Coordinates.new(1,0), Coordinates.new(-1,0), Coordinates.new(0,1),
47
+ Coordinates.new(0,-1)]
48
+ when PieceType::Seestern
49
+ coords = [Coordinates.new(xdir,0), Coordinates.new(1,1), Coordinates.new(-1,1),
50
+ Coordinates.new(1,-1), Coordinates.new(-1,-1)]
51
+ when PieceType::Robbe
52
+ coords = [Coordinates.new(-1,2), Coordinates.new(1,2), Coordinates.new(-2,1),
53
+ Coordinates.new(2,1), Coordinates.new(-1,-2), Coordinates.new(1,-2),
54
+ Coordinates.new(-2,-1), Coordinates.new(2,-1)]
55
+ end
56
+
57
+ coords.map{ |x| x + position }.to_a
58
+ coords.map{ |x| x + position }.select{ |c| c.x >= 0 && c.y >=0 && c.x < BOARD_SIZE && c.y < BOARD_SIZE}.to_a
67
59
  end
68
60
 
69
61
  def ==(other)
70
- color == other.color &&
71
- coords == other.coords
62
+ !other.nil? &&
63
+ color == other.color &&
64
+ position == other.position &&
65
+ type == other.type
72
66
  end
73
67
 
68
+ # @return [String] Gibt die String-Repräsentation zurück
74
69
  def to_s
75
- "#{color.key} #{kind.key} at #{position} rotation #{rotation.key}#{is_flipped ? ' (flipped)' : ''}"
70
+ "#{color.key} #{type.key} at #{position}"
76
71
  end
77
72
 
78
- def inspect
79
- to_s
73
+ # @return [String] Gibt eine Kurzfassung der String-Repräsentation zurück
74
+ def to_ss
75
+ "#{color.key.to_s[0]}#{type.key.to_s[0]}"
80
76
  end
81
77
 
82
- private
83
-
84
- def coords_priv
85
- kind.transform(@rotation, @is_flipped).transform do |it|
86
- Coordinates.new(it.x + @position.x, it.y + @position.y)
87
- end.coordinates
78
+ def inspect
79
+ to_s
88
80
  end
89
81
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'typesafe_enum'
4
+
5
+ # Die Spielsteintypen. Herzmuschel, Möwe, Seestern und Robbe
6
+ class PieceType < TypesafeEnum::Base
7
+ new :Herzmuschel, 'C'
8
+ new :Moewe, 'G'
9
+ new :Seestern, 'S'
10
+ new :Robbe, 'R'
11
+
12
+ # @return [String] Gibt den color namen zurück
13
+ def to_s
14
+ self.key.to_s
15
+ end
16
+ end
@@ -7,16 +7,22 @@ class Player
7
7
  # @return [String] der Name des Spielers, hat keine Auswirkungen auf das Spiel
8
8
  attr_reader :name
9
9
 
10
- # @!attribute [r] type
11
- # @return [PlayerType] erster (PlayerType::ONE) oder zweiter (PlayerType::TWO) Spieler
12
- attr_reader :type
10
+ # @!attribute [r] color
11
+ # @return [Color] erster (Color::RED) oder zweiter (Color::BLUE) Spieler
12
+ attr_reader :color
13
+
14
+ # @!attribute [rw] amber
15
+ # @return [Integer] Anzahl Bernsteine die dieser Spieler gesammelt hat
16
+ attr_accessor :amber
13
17
 
14
18
  # Konstruktor
15
- # @param type [PlayerType] Erster oder zweiter
19
+ # @param type [Color] Rot oder blau
16
20
  # @param name [String] Name
17
- def initialize(type, name)
18
- @type = type
21
+ # @param amber [Integer] Menge des Bernsteins die der Spieler hat
22
+ def initialize(color, name, amber = 0)
23
+ @color = color
19
24
  @name = name
25
+ @amber = amber
20
26
  end
21
27
 
22
28
  def ==(other)