software_challenge_client 21.2.0 → 22.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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)