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