software_challenge_client 22.1.0.1 → 23.0.2
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 +15 -15
- data/.rspec +3 -3
- data/.rubocop.yml +11 -11
- data/.ruby-version +1 -1
- data/.stickler.yml +7 -7
- data/.vscode/launch.json +40 -40
- data/.vscode/settings.json +9 -9
- data/AUTHORS +6 -6
- data/CODE_OF_CONDUCT.md +13 -13
- data/Dockerfile +3 -3
- data/Gemfile +5 -5
- data/Guardfile +45 -45
- data/README.md +172 -147
- data/RELEASES.md +144 -140
- data/Rakefile +7 -7
- data/bin/console +15 -15
- data/bin/setup +7 -7
- data/develop.sh +3 -3
- data/example/client.rb +35 -35
- data/example/main.rb +42 -42
- data/example/start.bat +2 -2
- data/generate-authors.sh +19 -19
- data/lib/software_challenge_client/board.rb +149 -127
- data/lib/software_challenge_client/client_interface.rb +19 -19
- data/lib/software_challenge_client/condition.rb +27 -27
- data/lib/software_challenge_client/coordinates.rb +71 -45
- data/lib/software_challenge_client/debug_hint.rb +17 -17
- data/lib/software_challenge_client/direction.rb +41 -0
- data/lib/software_challenge_client/field.rb +70 -69
- data/lib/software_challenge_client/game_rule_logic.rb +206 -141
- data/lib/software_challenge_client/game_state.rb +57 -24
- data/lib/software_challenge_client/invalid_move_exception.rb +15 -15
- data/lib/software_challenge_client/logging.rb +26 -26
- data/lib/software_challenge_client/move.rb +37 -41
- data/lib/software_challenge_client/network.rb +126 -126
- data/lib/software_challenge_client/piece.rb +43 -81
- data/lib/software_challenge_client/player.rb +31 -31
- data/lib/software_challenge_client/protocol.rb +103 -54
- data/lib/software_challenge_client/runner.rb +36 -36
- data/lib/software_challenge_client/team.rb +23 -25
- data/lib/software_challenge_client/util/constants.rb +9 -9
- data/lib/software_challenge_client/version.rb +5 -5
- data/lib/software_challenge_client.rb +23 -25
- data/lib/update_client_module.sh +15 -15
- data/push_image_production.sh +12 -12
- data/release.sh +9 -9
- data/software_challenge_client.gemspec +41 -41
- metadata +3 -5
- data/lib/software_challenge_client/color.rb +0 -26
- data/lib/software_challenge_client/has_hints.rb +0 -11
- data/lib/software_challenge_client/piece_type.rb +0 -16
@@ -1,45 +1,71 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Einfache kartesische Koordinaten
|
4
|
-
class Coordinates
|
5
|
-
include Comparable
|
6
|
-
attr_reader :x, :y
|
7
|
-
|
8
|
-
# Erstellt neue leere Koordinaten.
|
9
|
-
def initialize(x, y)
|
10
|
-
@x = x
|
11
|
-
@y = y
|
12
|
-
end
|
13
|
-
|
14
|
-
def ==(other)
|
15
|
-
x == other.x && y == other.y
|
16
|
-
end
|
17
|
-
|
18
|
-
# Gibt die Ursprungs-Koordinaten (0, 0) zurück.
|
19
|
-
def self.origin
|
20
|
-
Coordinates.new(0, 0)
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
#
|
38
|
-
def
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Einfache kartesische Koordinaten
|
4
|
+
class Coordinates
|
5
|
+
include Comparable
|
6
|
+
attr_reader :x, :y
|
7
|
+
|
8
|
+
# Erstellt neue leere Koordinaten.
|
9
|
+
def initialize(x, y)
|
10
|
+
@x = x
|
11
|
+
@y = y
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==(other)
|
15
|
+
x == other.x && y == other.y
|
16
|
+
end
|
17
|
+
|
18
|
+
# Gibt die Ursprungs-Koordinaten (0, 0) zurück.
|
19
|
+
def self.origin
|
20
|
+
Coordinates.new(0, 0)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Konvertiert (x, y) in das doubled Koordinatensystem.
|
24
|
+
# @param x [Integer] X-Koordinate aus dem odd-r System
|
25
|
+
# @param y [Integer] Y-Koordinate aus dem odd-r System
|
26
|
+
def self.oddr_to_doubled(c)
|
27
|
+
self.oddr_to_doubled_int(c.x, c.y)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Konvertiert c in das doubled Koordinatensystem.
|
31
|
+
# @param c [Coordinates] Koordinaten aus dem odd-r System
|
32
|
+
def self.oddr_to_doubled_int(x, y)
|
33
|
+
Coordinates.new(x * 2 + y % 2, y)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Konvertiert c in das odd-r Koordinatensystem.
|
37
|
+
# @param c [Coordinates] Koordinaten aus dem doubled System
|
38
|
+
def self.doubled_to_oddr(c)
|
39
|
+
self.doubled_to_oddr_int(c.x, c.y)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Konvertiert (x, y) in das doubled Koordinatensystem.
|
43
|
+
# @param x [Integer] X-Koordinate aus dem doubled System
|
44
|
+
# @param y [Integer] Y-Koordinate aus dem doubled System
|
45
|
+
def self.doubled_to_oddr_int(x, y)
|
46
|
+
Coordinates.new((x / 2.0).ceil() - y % 2, y)
|
47
|
+
end
|
48
|
+
|
49
|
+
def <=>(other)
|
50
|
+
xComp = x <=> other.x
|
51
|
+
yComp = y <=> other.y
|
52
|
+
if xComp == 0
|
53
|
+
yComp
|
54
|
+
else
|
55
|
+
xComp
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def +(other)
|
60
|
+
Coordinates.new(x + other.x, y + other.y)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Gibt eine textuelle Repräsentation der Koordinaten aus.
|
64
|
+
def to_s
|
65
|
+
"(#{x}, #{y})"
|
66
|
+
end
|
67
|
+
|
68
|
+
def inspect
|
69
|
+
to_s
|
70
|
+
end
|
71
|
+
end
|
@@ -1,17 +1,17 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
# Ein Hinweis, der zu einem Zug hinzugefügt werden kann. Z.B. zu
|
5
|
-
# Diagnosezwecken. Der Hinweis wird in der grafischen Oberfläche angezeigt und
|
6
|
-
# in Replay-Dateien gespeichert.
|
7
|
-
class DebugHint
|
8
|
-
# @!attribute [r] content
|
9
|
-
# @return [String] Der Text des Hinweises.
|
10
|
-
attr_reader :content
|
11
|
-
|
12
|
-
# Erstellt einen neuen Hinweis.
|
13
|
-
# @param content [Object] Inhalt des Hinweises. Wird zu String konvertiert.
|
14
|
-
def initialize(content)
|
15
|
-
@content = content.to_s
|
16
|
-
end
|
17
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Ein Hinweis, der zu einem Zug hinzugefügt werden kann. Z.B. zu
|
5
|
+
# Diagnosezwecken. Der Hinweis wird in der grafischen Oberfläche angezeigt und
|
6
|
+
# in Replay-Dateien gespeichert.
|
7
|
+
class DebugHint
|
8
|
+
# @!attribute [r] content
|
9
|
+
# @return [String] Der Text des Hinweises.
|
10
|
+
attr_reader :content
|
11
|
+
|
12
|
+
# Erstellt einen neuen Hinweis.
|
13
|
+
# @param content [Object] Inhalt des Hinweises. Wird zu String konvertiert.
|
14
|
+
def initialize(content)
|
15
|
+
@content = content.to_s
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'typesafe_enum'
|
4
|
+
|
5
|
+
# Eine der sechs Richtungen im hexagonalen Koordinatensystem:
|
6
|
+
#
|
7
|
+
# TOPLEFT,
|
8
|
+
# TOPRIGHT,
|
9
|
+
# RIGHT,
|
10
|
+
# BOTTOMRIGHT,
|
11
|
+
# BOTTOMLEFT,
|
12
|
+
# LEFT
|
13
|
+
#
|
14
|
+
# Zugriff z.B. mit Direction::BOTTOMLEFT
|
15
|
+
class Direction < TypesafeEnum::Base
|
16
|
+
new :TOPLEFT, 'tl'
|
17
|
+
new :TOPRIGHT, 'tr'
|
18
|
+
new :RIGHT, 'r'
|
19
|
+
new :BOTTOMRIGHT, 'br'
|
20
|
+
new :BOTTOMLEFT, 'bl'
|
21
|
+
new :LEFT, 'l'
|
22
|
+
|
23
|
+
# @return [Coordinates] Gibt den zugehörigen Vector als Koordinate zurück
|
24
|
+
def to_vec
|
25
|
+
if self.key == :TOPLEFT
|
26
|
+
Coordinates.new(-1, -1)
|
27
|
+
elsif self.key == :TOPRIGHT
|
28
|
+
Coordinates.new(1, -1)
|
29
|
+
elsif self.key == :RIGHT
|
30
|
+
Coordinates.new(2, 0)
|
31
|
+
elsif self.key == :BOTTOMRIGHT
|
32
|
+
Coordinates.new(1, 1)
|
33
|
+
elsif self.key == :BOTTOMLEFT
|
34
|
+
Coordinates.new(-1, 1)
|
35
|
+
elsif self.key == :LEFT
|
36
|
+
Coordinates.new(-2, 0)
|
37
|
+
else
|
38
|
+
Coordinates.new(0, 0)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,69 +1,70 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
# Ein Feld des Spielfelds. Ein Spielfeld ist durch die Koordinaten eindeutig
|
5
|
-
# identifiziert.
|
6
|
-
class Field
|
7
|
-
# @!attribute [r]
|
8
|
-
# @return [Coordinates] die X-Y-Koordinaten des Feldes
|
9
|
-
attr_reader :
|
10
|
-
|
11
|
-
# @!attribute [rw] piece
|
12
|
-
# @return [Piece] das Piece auf diesem Feld, falls vorhanden, sonst nil
|
13
|
-
attr_accessor :piece
|
14
|
-
|
15
|
-
#
|
16
|
-
#
|
17
|
-
|
18
|
-
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# @return [
|
33
|
-
def
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
# @return [Integer]
|
38
|
-
def
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
# @return [
|
43
|
-
def
|
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
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Ein Feld des Spielfelds. Ein Spielfeld ist durch die Koordinaten eindeutig
|
5
|
+
# identifiziert.
|
6
|
+
class Field
|
7
|
+
# @!attribute [r] coords
|
8
|
+
# @return [Coordinates] die X-Y-Koordinaten des Feldes
|
9
|
+
attr_reader :coords
|
10
|
+
|
11
|
+
# @!attribute [rw] piece
|
12
|
+
# @return [Piece] das Piece auf diesem Feld, falls vorhanden, sonst nil
|
13
|
+
attr_accessor :piece
|
14
|
+
|
15
|
+
# @!attribute [rw] fishes
|
16
|
+
# @return [Integer] die Menge an Fischen auf dem Feld
|
17
|
+
attr_accessor :fishes
|
18
|
+
|
19
|
+
# Erstellt ein neues leeres Feld.
|
20
|
+
#
|
21
|
+
# @param x [Integer] X-Koordinate
|
22
|
+
# @param y [Integer] Y-Koordinate
|
23
|
+
# @param color [Color] Farbe des Spielsteins, der das Feld überdeckt, nil falls kein Spielstein es überdeckt
|
24
|
+
def initialize(x, y, piece = nil, fishes = 0)
|
25
|
+
@piece = piece
|
26
|
+
@fishes = fishes
|
27
|
+
@coords = Coordinates.new(x, y)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Vergleicht zwei Felder. Felder sind gleich, wenn sie gleiche Koordinaten und
|
31
|
+
# den gleichen Spielstein haben.
|
32
|
+
# @return [Boolean] true bei Gleichheit, sonst false.
|
33
|
+
def ==(other)
|
34
|
+
!other.nil? && coords == other.coords && piece == other.piece
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [Integer] X-Koordinate des Felds
|
38
|
+
def x
|
39
|
+
coords.x
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [Integer] Y-Koordinate des Felds
|
43
|
+
def y
|
44
|
+
coords.y
|
45
|
+
end
|
46
|
+
|
47
|
+
# @return [Team] Team des Pieces auf dem Feld
|
48
|
+
def team
|
49
|
+
if piece.nil?
|
50
|
+
nil
|
51
|
+
else
|
52
|
+
piece.team
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [Boolean] true, wenn auf dem Feld kein Spielstein und keine Fische sind, sonst false
|
57
|
+
def empty?
|
58
|
+
piece.nil? && fishes == 0
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [Boolean] true, wenn auf dem Feld kein Spielstein und mindestens ein Fisch ist, sonst false
|
62
|
+
def free?
|
63
|
+
piece.nil? && fishes != 0
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [String] Textuelle Darstellung des Feldes.
|
67
|
+
def to_s
|
68
|
+
piece.nil? ? fishes.to_s : piece.to_ss
|
69
|
+
end
|
70
|
+
end
|