software_challenge_client 21.0.2 → 22.0.3

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 +55 -255
  16. data/lib/software_challenge_client/game_state.rb +18 -73
  17. data/lib/software_challenge_client/move.rb +41 -0
  18. data/lib/software_challenge_client/piece.rb +56 -35
  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 +49 -114
  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
@@ -4,6 +4,7 @@ require_relative './util/constants'
4
4
  require_relative 'player'
5
5
  require_relative 'board'
6
6
  require_relative 'condition'
7
+ require_relative 'color'
7
8
 
8
9
  # Ein Spielzustand. Wird vom Server an die Computerspieler übermittelt und
9
10
  # enthält alles, was der Computerspieler wissen muss, um einen Zug zu machen.
@@ -14,53 +15,32 @@ class GameState
14
15
  # @!attribute [rw] turn
15
16
  # @return [Integer] Aktuelle Zugnummer (von 0 beginnend)
16
17
  attr_accessor :turn
18
+
17
19
  # @!attribute [rw] round
18
20
  # @return [Integer] Aktuelle Rundennummer (von 1 beginnend)
19
21
  attr_accessor :round
20
22
 
21
- # @!attribute [rw] startColor
22
- # @return [Color] Die Farbe, die zuerst legen darf
23
- attr_accessor :start_color
24
- # @!attribute [rw] current_color_index
25
- # @return [Color] Der jetzige Index in der Zug Reihenfolge der Farben.
26
- attr_accessor :current_color_index
27
- # @!attribute [rw] ordered_colors
28
- # @return [Array<Color>] Ein Array aller Farben die ziehen können in
29
- # der Reihenfolge in der sie drankommen
30
- attr_accessor :ordered_colors
31
-
32
- # @!attribute [r] undeployed_blue_pieces
33
- # @return [Array<PieceShape>] Die blauen, nicht gesetzten Spielsteine
34
- attr_accessor :undeployed_blue_pieces
35
-
36
- # @!attribute [r] undeployed_yellow_pieces
37
- # @return [Array<PieceShape>] Die gelben, nicht gesetzten Spielsteine
38
- attr_accessor :undeployed_yellow_pieces
39
-
40
- # @!attribute [r] undeployed_red_pieces
41
- # @return [Array<PieceShape>] Die roten, nicht gesetzten Spielsteine
42
- attr_accessor :undeployed_red_pieces
43
-
44
- # @!attribute [r] undeployed_green_pieces
45
- # @return [Array<PieceShape>] Die grünen, nicht gesetzten Spielsteine
46
- attr_accessor :undeployed_green_pieces
47
-
48
23
  # @!attribute [r] player_one
49
24
  # @return [Player] Der erste Spieler
50
25
  attr_reader :player_one
26
+
51
27
  # @!attribute [r] player_two
52
28
  # @return [Player] Der zweite Spieler
53
29
  attr_reader :player_two
30
+
31
+ # @!attribute [rw] start_team
32
+ # @return [Team] Der Spieler der zuerst zieht
33
+ attr_accessor :start_team
34
+
54
35
  # @!attribute [rw] board
55
36
  # @return [Board] Das aktuelle Spielbrett
56
37
  attr_accessor :board
57
- # @!attribute [rw] startPiece
58
- # @return [PieceShape] Der Stein, der im ersten Zug von allen Farben gelegt werden muss
59
- attr_accessor :start_piece
38
+
60
39
  # @!attribute [rw] last_move
61
40
  # @return [Move] Der zuletzt gemachte Zug (ist nil vor dem ersten Zug, also
62
41
  # bei turn == 0)
63
42
  attr_accessor :last_move
43
+
64
44
  # @!attribute [rw] condition
65
45
  # @return [Condition] Gewinner und Gewinngrund, falls das Spiel bereits
66
46
  # entschieden ist, sonst nil.
@@ -73,67 +53,37 @@ class GameState
73
53
 
74
54
  # Erstellt einen neuen leeren Spielstand.
75
55
  def initialize
76
- @current_color = Color::RED
77
- @start_color = Color::RED
78
56
  @board = Board.new
79
57
  @turn = 0
80
- @undeployed_blue_pieces = PieceShape.to_a
81
- @undeployed_yellow_pieces = PieceShape.to_a
82
- @undeployed_red_pieces = PieceShape.to_a
83
- @undeployed_green_pieces = PieceShape.to_a
84
- @start_piece = GameRuleLogic.get_random_pentomino
85
58
  end
86
59
 
87
60
  # Fügt einen Spieler zum Spielzustand hinzu.
88
61
  #
89
62
  # @param player [Player] Der hinzuzufügende Spieler.
90
63
  def add_player(player)
91
- if player.type == PlayerType::ONE
64
+ case player.color
65
+ when Color::RED
92
66
  @player_one = player
93
- elsif player.type == PlayerType::TWO
67
+ when Color::BLUE
94
68
  @player_two = player
95
69
  end
96
70
  end
97
71
 
98
72
  # @return [Player] Spieler, der gerade an der Reihe ist.
99
73
  def current_player
100
- turn % 2 == 0 ? player_one : player_two
74
+ turn.even? ? player_one : player_two
101
75
  end
102
76
 
103
77
  # @return [Player] Spieler, der gerade nicht an der Reihe ist.
104
78
  def other_player
105
- turn % 2 == 0 ? player_two : player_one
79
+ turn.even? ? player_two : player_one
106
80
  end
107
81
 
108
- # @return [PlayerType] Typ des Spielers, der gerade nicht an der Reihe ist.
109
- def other_player_type
82
+ # @return [Team] Typ des Spielers, der gerade nicht an der Reihe ist.
83
+ def other_team
110
84
  other_player.type
111
85
  end
112
86
 
113
- # @return [Color] Farbe, der gerade an der Reihe ist.
114
- def current_color
115
- ordered_colors[current_color_index]
116
- end
117
-
118
- # @return [Array<PieceShape>] Array aller Shapes, der gegebenen Farbe, die noch nicht gelegt wurden
119
- def undeployed_pieces(color)
120
- case color
121
- when Color::RED
122
- undeployed_red_pieces
123
- when Color::BLUE
124
- undeployed_blue_pieces
125
- when Color::YELLOW
126
- undeployed_yellow_pieces
127
- when Color::GREEN
128
- undeployed_green_pieces
129
- end
130
- end
131
-
132
- # @return [Array<PieceShape>] Array aller Shapes, der gegebenen Farbe, die schon gelegt wurden
133
- def deployed_pieces(color)
134
- board.deployed_pieces(color)
135
- end
136
-
137
87
  # @return [Bool] Ob diese gamestate in der ersten Runde ist
138
88
  def is_first_move?
139
89
  round == 1
@@ -153,11 +103,6 @@ class GameState
153
103
  !condition.nil?
154
104
  end
155
105
 
156
- # Entfernt die jetzige Farbe aus der Farbrotation
157
- def remove_active_color
158
- ordered_colors.delete current_color
159
- end
160
-
161
106
  # @return [Player] Der Spieler, der das Spiel gewonnen hat, falls dies schon
162
107
  # entschieden ist. Sonst false.
163
108
  def winner
@@ -207,6 +152,6 @@ class GameState
207
152
 
208
153
  # @return [Array<Field>] Alle Felder mit Blöcken des Spielers, der gerade an der Reihe ist.
209
154
  def own_fields
210
- board.fields_of_color(current_color)
155
+ board.fields_of_color(current_player.color)
211
156
  end
212
157
  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,59 +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
- attr_reader :coords
19
+ # @!attribute [rw] tower_height
20
+ # @return [Integer] Die Anzahl Spielsteine übereinander inklusive des obersten
21
+ attr_accessor :height
26
22
 
27
- # Erstellt einen neuen leeren Spielstein.
28
- 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)
29
25
  @color = color
30
- @kind = kind
31
- @rotation = rotation
32
- @is_flipped = is_flipped
26
+ @type = type
33
27
  @position = position
28
+ @height = height
29
+ end
30
+
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
34
56
 
35
- @coords = coords_priv
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
36
59
  end
37
60
 
38
61
  def ==(other)
39
- color == other.color &&
40
- kind == other.kind &&
41
- rotation == other.rotation &&
42
- is_flipped == other.is_flipped &&
43
- position == other.position
62
+ !other.nil? &&
63
+ color == other.color &&
64
+ position == other.position &&
65
+ type == other.type
44
66
  end
45
67
 
68
+ # @return [String] Gibt die String-Repräsentation zurück
46
69
  def to_s
47
- "#{color.key} #{kind.key} at #{position} rotation #{rotation.key}#{is_flipped ? ' (flipped)' : ''}"
70
+ "#{color.key} #{type.key} at #{position}"
48
71
  end
49
72
 
50
- def inspect
51
- 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]}"
52
76
  end
53
77
 
54
- private
55
- def coords_priv
56
- kind.transform(@rotation, @is_flipped).transform do |it|
57
- Coordinates.new(it.x + @position.x, it.y + @position.y)
58
- end.coordinates
78
+ def inspect
79
+ to_s
59
80
  end
60
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)
@@ -2,8 +2,8 @@
2
2
  # frozen_string_literal: true
3
3
  require 'socket'
4
4
  require_relative 'board'
5
- require_relative 'set_move'
6
- require_relative 'skip_move'
5
+ require_relative 'move'
6
+ require_relative 'piece_type'
7
7
  require_relative 'player'
8
8
  require_relative 'network'
9
9
  require_relative 'client_interface'
@@ -61,26 +61,23 @@ class Protocol
61
61
  case name
62
62
  when 'board'
63
63
  logger.debug @gamestate.board.to_s
64
- when 'color'
65
- if @context[:color] == :ordered_colors
66
- @gamestate.ordered_colors << Color.to_a.find {|s| s.key == @context[:last_text].to_sym }
64
+ when 'startTeam'
65
+ @gamestate.add_player(Player.new(Color::RED, "ONE", 0))
66
+ @gamestate.add_player(Player.new(Color::BLUE, "TWO", 0))
67
+ if @context[:last_text] == "ONE"
68
+ @gamestate.start_team = @gamestate.player_one
69
+ else
70
+ @gamestate.start_team = @gamestate.player_two
67
71
  end
68
- when 'shape'
69
- case @context[:piece_target]
70
- when :blue_shapes
71
- last = @context[:last_text]
72
- arr = PieceShape.to_a
73
- shape = arr.find {|s| s.key == @context[:last_text].to_sym }
74
- @gamestate.undeployed_blue_pieces << shape
75
- when :yellow_shapes
76
- shape = PieceShape.to_a.find {|s| s.key == @context[:last_text].to_sym }
77
- @gamestate.undeployed_yellow_pieces << shape
78
- when :red_shapes
79
- shape = PieceShape.to_a.find {|s| s.key == @context[:last_text].to_sym }
80
- @gamestate.undeployed_red_pieces << shape
81
- when :green_shapes
82
- shape = PieceShape.to_a.find {|s| s.key == @context[:last_text].to_sym }
83
- @gamestate.undeployed_green_pieces << shape
72
+ when 'team'
73
+ @context[:team] = @context[:last_text]
74
+ when 'int'
75
+ if @context[:team] == "ONE"
76
+ logger.info 'Got player one amber'
77
+ @gamestate.player_one.amber = @context[:last_text].to_i
78
+ else
79
+ logger.info 'Got player two amber'
80
+ @gamestate.player_two.amber = @context[:last_text].to_i
84
81
  end
85
82
  end
86
83
  end
@@ -99,7 +96,7 @@ class Protocol
99
96
  when 'data'
100
97
  logger.debug "data(class) : #{attrs['class']}"
101
98
  @context[:data_class] = attrs['class']
102
- if attrs['class'] == 'sc.framework.plugins.protocol.MoveRequest'
99
+ if attrs['class'] == 'moveRequest'
103
100
  @client.gamestate = gamestate
104
101
  move = @client.move_requested
105
102
  sendString(move_to_xml(move))
@@ -116,87 +113,32 @@ class Protocol
116
113
  when 'state'
117
114
  logger.debug 'new gamestate'
118
115
  @gamestate = GameState.new
119
- @gamestate.current_color_index = attrs['currentColorIndex'].to_i
120
116
  @gamestate.turn = attrs['turn'].to_i
121
- @gamestate.round = attrs['round'].to_i
122
- @gamestate.start_piece = PieceShape.to_a.find {|s| s.key == attrs['startPiece'].to_sym }
117
+ @gamestate.round = @gamestate.turn / 2
123
118
  logger.debug "Round: #{@gamestate.round}, Turn: #{@gamestate.turn}"
124
- when 'first'
125
- logger.debug 'new first player'
126
- player = Player.new(PlayerType::ONE, attrs['displayName'])
127
- @gamestate.add_player(player)
128
- @context[:player] = player
129
- @context[:color] = :one
130
- when 'second'
131
- logger.debug 'new second player'
132
- player = Player.new(PlayerType::TWO, attrs['displayName'])
133
- @gamestate.add_player(player)
134
- @context[:player] = player
135
- @context[:color] = :two
136
- when 'orderedColors'
137
- @context[:color] = :ordered_colors
138
- @gamestate.ordered_colors = []
139
119
  when 'board'
140
120
  logger.debug 'new board'
141
121
  @gamestate.board = Board.new()
142
- when 'field'
143
- x = attrs['x'].to_i
144
- y = attrs['y'].to_i
145
- color = Color.find_by_key(attrs['content'].to_sym)
146
- field = Field.new(x, y, color)
147
- @gamestate.board.add_field(field)
148
- @context[:piece_target] = :field
149
- @context[:field] = field
150
- when 'blueShapes'
151
- @context[:piece_target] = :blue_shapes
152
- @gamestate.undeployed_blue_pieces = []
153
- when 'yellowShapes'
154
- @context[:piece_target] = :yellow_shapes
155
- @gamestate.undeployed_yellow_pieces = []
156
- when 'redShapes'
157
- @context[:piece_target] = :red_shapes
158
- @gamestate.undeployed_red_pieces = []
159
- when 'greenShapes'
160
- @context[:piece_target] = :green_shapes
161
- @gamestate.undeployed_green_pieces = []
122
+ when 'pieces'
123
+ @context[:entry] = :pieces
124
+ when 'coordinates'
125
+ @context[:x] = attrs['x'].to_i
126
+ @context[:y] = attrs['y'].to_i
162
127
  when 'piece'
163
- color = Color.find_by_key(attrs['color'].to_sym)
164
- kind = PieceShape.find_by_key(attrs['kind'].to_sym)
165
- rotation = Rotation.find_by_key(attrs['rotation'].to_sym)
166
- is_flipped = attrs['isFlipped'].downcase == "true"
167
- piece = Piece.new(color, kind, rotation, is_flipped, Coordinates.origin)
168
- case @context[:piece_target]
169
- when :blue_shapes
170
- @gamestate.undeployed_blue_pieces << piece
171
- when :yellow_shapes
172
- @gamestate.undeployed_yellow_pieces << piece
173
- when :red_shapes
174
- @gamestate.green_red_pieces << piece
175
- when :green_shapes
176
- @gamestate.undeployed_green_pieces << piece
177
- when :last_move
178
- @context[:last_move_piece] = piece
179
- else
180
- raise "unknown piece target #{@context[:piece_target]}"
181
- end
182
- when 'lastMove'
183
- type = attrs['class']
184
- if type == 'skipmove'
185
- @gamestate.last_move = SkipMove.new
186
- else
187
- @context[:last_move_type] = type
188
- @context[:piece_target] = :last_move
189
- end
190
- when 'position'
191
- case @context[:piece_target]
192
- when :last_move
193
- x = attrs['x'].to_i
194
- y = attrs['y'].to_i
195
- piece = @context[:last_move_piece]
196
- @gamestate.last_move = SetMove.new(Piece.new(piece.color, piece.kind, piece.rotation, piece.is_flipped, Coordinates.new(x, y)))
197
- end
198
- when 'startColor'
199
- @gamestate.start_color = Color::BLUE
128
+ x = @context[:x]
129
+ y = @context[:y]
130
+ team = Team.find_by_key(attrs['team'].to_sym)
131
+ type = PieceType.find_by_key(attrs['type'].to_sym)
132
+ count = attrs['count'].to_i
133
+ field = Field.new(x, y, Piece.new(team.to_c, type, Coordinates.new(x, y), count))
134
+ @gamestate.board.add_field(field)
135
+ when 'from'
136
+ @context[:from] = Coordinates.new(attrs['x'].to_i, attrs['y'].to_i)
137
+ when 'to'
138
+ from = @context[:from]
139
+ @gamestate.last_move = Move.new(Coordinates.new(from.x, from.y), Coordinates.new(attrs['x'].to_i, attrs['y'].to_i))
140
+ when 'ambers'
141
+ @context[:entry] = :ambers
200
142
  when 'winner'
201
143
  # TODO
202
144
  # winning_player = parsePlayer(attrs)
@@ -240,28 +182,21 @@ class Protocol
240
182
  # @param move [Move] The move to convert to XML.
241
183
  def move_to_xml(move)
242
184
  builder = Builder::XmlMarkup.new(indent: 2)
185
+
186
+ if move.nil?
187
+ raise 'nil moves are not sendable!'
188
+ end
189
+
243
190
  # Converting every the move here instead of requiring the Move
244
191
  # class interface to supply a method which returns the XML
245
192
  # because XML-generation should be decoupled from internal data
246
193
  # structures.
247
- case move
248
- when SetMove
249
- builder.data(class: 'sc.plugin2021.SetMove') do |data|
250
- data.piece(color: move.piece.color, kind: move.piece.kind, rotation: move.piece.rotation, isFlipped: move.piece.is_flipped) do |piece|
251
- piece.position(x: move.piece.position.x, y: move.piece.position.y)
252
- end
253
- move.hints.each do |hint|
254
- data.hint(content: hint.content)
255
- end
256
- end
257
- when SkipMove
258
- builder.data(class: 'sc.plugin2021.SkipMove') do |data|
259
- data.color(@gamestate.current_color.key.to_s)
260
- move.hints.each do |hint|
261
- data.hint(content: hint.content)
262
- end
263
- end
194
+
195
+ builder.data(class: 'move') do |d|
196
+ d.from(x: move.from.x, y: move.from.y)
197
+ d.to(x: move.to.x, y: move.to.y)
264
198
  end
199
+
265
200
  builder.target!
266
201
  end
267
202
  end
@@ -9,7 +9,7 @@ class Runner
9
9
  include Logging
10
10
 
11
11
  def initialize(host, port, client, reservation = nil)
12
- logger.info 'Software Challenge 2021'
12
+ logger.info 'Software Challenge 2022'
13
13
  logger.info 'Ruby Client'
14
14
  logger.info "Host: #{host}"
15
15
  logger.info "Port: #{port}"
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'typesafe_enum'
4
+
5
+ require_relative 'color'
6
+
7
+ # Erster oder zweiter Spieler:
8
+ #
9
+ # ONE
10
+ # TWO
11
+ #
12
+ # Zugriff z.B. mit Team::ONE
13
+ class Team < TypesafeEnum::Base
14
+ new :ONE, 'Red'
15
+ new :TWO, 'Blue'
16
+
17
+ # @return [Color] Gibt die zugehörige Farbe zurück
18
+ def to_c
19
+ if self.key == :ONE
20
+ Color::RED
21
+ else
22
+ Color::BLUE
23
+ end
24
+ end
25
+ end
@@ -4,7 +4,6 @@
4
4
  # Konstanten zum aktuellen Spiel.
5
5
  module Constants
6
6
  ROUND_LIMIT = 30 # Rundenbegrenzung. Nach Ende der angegebenen Runde endet auch das Spiel.
7
- GAME_IDENTIFIER = 'swc_2021_blokus' # Der Identifikator des Spiels. Für die Kommunikation mit dem Spielserver.
8
- BOARD_SIZE = 20 # Seitenlänge des Spielbretts in Feldern
9
- TOTAL_PIECE_SHAPES = 21
7
+ GAME_IDENTIFIER = 'swc_2022_ostseeschach' # Der Identifikator des Spiels. Für die Kommunikation mit dem Spielserver.
8
+ BOARD_SIZE = 8 # Seitenlänge des Spielbretts in Feldern
10
9
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
  module SoftwareChallengeClient
4
- VERSION = '21.0.2'
4
+ VERSION = '22.0.3'
5
5
  end
@@ -4,7 +4,6 @@ module SoftwareChallengeClient
4
4
  require 'software_challenge_client/client_interface.rb'
5
5
  require 'software_challenge_client/color.rb'
6
6
  require 'software_challenge_client/condition.rb'
7
- require 'software_challenge_client/coordinate_set.rb'
8
7
  require 'software_challenge_client/coordinates.rb'
9
8
  require 'software_challenge_client/debug_hint.rb'
10
9
  require 'software_challenge_client/field.rb'
@@ -13,16 +12,14 @@ module SoftwareChallengeClient
13
12
  require 'software_challenge_client/has_hints.rb'
14
13
  require 'software_challenge_client/invalid_move_exception.rb'
15
14
  require 'software_challenge_client/logging.rb'
15
+ require 'software_challenge_client/move.rb'
16
16
  require 'software_challenge_client/network.rb'
17
17
  require 'software_challenge_client/piece.rb'
18
- require 'software_challenge_client/piece_shape.rb'
18
+ require 'software_challenge_client/piece_type.rb'
19
19
  require 'software_challenge_client/player.rb'
20
- require 'software_challenge_client/player_type.rb'
21
20
  require 'software_challenge_client/protocol.rb'
22
- require 'software_challenge_client/rotation.rb'
23
21
  require 'software_challenge_client/runner.rb'
24
- require 'software_challenge_client/set_move.rb'
25
- require 'software_challenge_client/skip_move.rb'
22
+ require 'software_challenge_client/team.rb'
26
23
  require 'software_challenge_client/util/constants.rb'
27
24
  require 'software_challenge_client/version.rb'
28
25
  end
File without changes
@@ -0,0 +1,12 @@
1
+ #!/bin/bash
2
+
3
+ server=flut
4
+ docker build . -t sc-ruby
5
+ docker tag sc-ruby localhost:5000/sc-ruby
6
+ ssh -M -S ssh-ctrl-socket -fnNT -L 5000:localhost:5000 $server
7
+ ssh -S ssh-ctrl-socket -O check $server || exit 1
8
+ docker login localhost:5000 || exit 1
9
+ docker push localhost:5000/sc-ruby
10
+ ssh -S ssh-ctrl-socket -O exit $server
11
+ ssh $server 'sudo docker pull localhost:5000/sc-ruby'
12
+ ssh $server 'sudo docker tag localhost:5000/sc-ruby sc-ruby'