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.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/Dockerfile +1 -1
- data/README.md +1 -1
- data/RELEASES.md +8 -0
- data/bin/console +0 -0
- data/bin/setup +0 -0
- data/develop.sh +0 -0
- data/example/main.rb +0 -0
- data/example/start.bat +0 -0
- data/generate-authors.sh +0 -0
- data/lib/software_challenge_client/board.rb +11 -61
- data/lib/software_challenge_client/color.rb +13 -3
- data/lib/software_challenge_client/field.rb +30 -11
- data/lib/software_challenge_client/game_rule_logic.rb +61 -254
- data/lib/software_challenge_client/game_state.rb +153 -232
- data/lib/software_challenge_client/move.rb +41 -0
- data/lib/software_challenge_client/piece.rb +55 -63
- data/lib/software_challenge_client/piece_type.rb +16 -0
- data/lib/software_challenge_client/player.rb +12 -6
- data/lib/software_challenge_client/protocol.rb +201 -266
- data/lib/software_challenge_client/runner.rb +1 -1
- data/lib/software_challenge_client/team.rb +25 -0
- data/lib/software_challenge_client/util/constants.rb +2 -3
- data/lib/software_challenge_client/version.rb +1 -1
- data/lib/software_challenge_client.rb +3 -6
- data/lib/update_client_module.sh +0 -0
- data/push_image_production.sh +12 -0
- data/release.sh +0 -0
- metadata +7 -10
- data/lib/software_challenge_client/coordinate_set.rb +0 -92
- data/lib/software_challenge_client/piece_shape.rb +0 -109
- data/lib/software_challenge_client/player_type.rb +0 -14
- data/lib/software_challenge_client/rotation.rb +0 -22
- data/lib/software_challenge_client/set_move.rb +0 -24
- 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
|
-
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
#
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
#
|
28
|
-
#
|
29
|
-
attr_accessor :
|
30
|
-
|
31
|
-
# @!attribute [rw]
|
32
|
-
# @return [
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
#
|
37
|
-
#
|
38
|
-
attr_accessor :
|
39
|
-
|
40
|
-
# @!attribute [
|
41
|
-
# @return [
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
#
|
57
|
-
#
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
#
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
#
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
#
|
79
|
-
def
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
#
|
84
|
-
def
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
#
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
#
|
109
|
-
def
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
# @return [
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
# @return [
|
124
|
-
def
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
def
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
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
|
-
|
5
|
+
include Constants
|
6
|
+
|
7
|
+
# @!attribute [rw] Color
|
6
8
|
# @return [Color]
|
7
|
-
|
9
|
+
attr_accessor :color
|
8
10
|
|
9
|
-
# @!attribute [r]
|
10
|
-
# @return [
|
11
|
-
attr_reader :
|
11
|
+
# @!attribute [r] Typ des Spielsteins
|
12
|
+
# @return [PieceType]
|
13
|
+
attr_reader :type
|
12
14
|
|
13
|
-
# @!attribute [
|
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
|
-
|
17
|
+
attr_accessor :position
|
24
18
|
|
25
|
-
# @!attribute [
|
26
|
-
# return [
|
27
|
-
|
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
|
30
|
-
def initialize(color,
|
23
|
+
# Erstellt einen neuen Spielstein.
|
24
|
+
def initialize(color, type, position = Coordinates.origin, height = 0)
|
31
25
|
@color = color
|
32
|
-
@
|
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
|
-
#
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
71
|
-
|
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} #{
|
70
|
+
"#{color.key} #{type.key} at #{position}"
|
76
71
|
end
|
77
72
|
|
78
|
-
|
79
|
-
|
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
|
-
|
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]
|
11
|
-
# @return [
|
12
|
-
attr_reader :
|
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 [
|
19
|
+
# @param type [Color] Rot oder blau
|
16
20
|
# @param name [String] Name
|
17
|
-
|
18
|
-
|
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)
|