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.
- 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)
|