Class: Board
- Inherits:
-
Object
- Object
- Board
- Includes:
- Constants
- Defined in:
- lib/software_challenge_client/board.rb
Overview
Ein Spielbrett fuer Hive
Constant Summary collapse
- FIELD_AMOUNT =
Anzahl der Felder des fuer Hive verwendeten Spielfeldes
Board.field_amount((BOARD_SIZE + 1)/2)
Constants included from Constants
Constants::BOARD_SIZE, Constants::GAME_IDENTIFIER, Constants::ROUND_LIMIT, Constants::SHIFT, Constants::STARTING_PIECES
Instance Attribute Summary collapse
-
#fields ⇒ Array<Array<Field>>
readonly
Ein Feld wird an der Position entsprechend seiner x und y CubeCoordinates im Array gespeichert.
Class Method Summary collapse
-
.empty_game_field ⇒ Array
Leere Felder entsprechend des Spielbrettes angeordnet.
-
.field_amount(radius) ⇒ Object
Anzahl der Felder eines hexagonalen Spielfeldes.
Instance Method Summary collapse
-
#==(other) ⇒ Object
Vergleicht zwei Spielbretter.
-
#add_field(field) ⇒ Object
Fügt ein Feld dem Spielbrett hinzu.
-
#clear ⇒ Object
Entfernt alle Felder des Spielfeldes.
-
#clone ⇒ Object
Eine unabhaengige Kopie des Spielbretts.
-
#deployed_pieces(color) ⇒ Array
Liste aller Spielsteine eines Spielers, die auf dem Spielbrett platziert wurden.
-
#field(x, y) ⇒ Field
Zugriff auf die Felder des Spielfeldes.
-
#field_at(coordinates) ⇒ Field
Zugriff auf die Felder des Spielfeldes über ein Koordinaten-Paar.
-
#field_list ⇒ Array
Liste aller Felder.
-
#fields_of_color(color) ⇒ Array<Field>
Liefert alle Felder die dem Spieler mit der gegebenen Farbe gehoeren.
-
#initialize(fields = []) ⇒ Board
constructor
Erstellt ein neues leeres Spielbrett.
-
#pieces ⇒ Array
Liste aller Spielsteine, die auf dem Spielbrett platziert wurden.
-
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus.
Constructor Details
#initialize(fields = []) ⇒ Board
Erstellt ein neues leeres Spielbrett.
29 30 31 32 |
# File 'lib/software_challenge_client/board.rb', line 29 def initialize(fields = []) @fields = Board.empty_game_field fields.each{ |f| add_field(f) } end |
Instance Attribute Details
Class Method Details
.empty_game_field ⇒ Array
Returns leere Felder entsprechend des Spielbrettes angeordnet.
35 36 37 38 39 40 41 42 43 44 |
# File 'lib/software_challenge_client/board.rb', line 35 def self.empty_game_field fields = [] (-SHIFT..SHIFT).to_a.each do |x| fields[x + SHIFT] ||= [] ([-SHIFT, -x-SHIFT].max..[SHIFT, -x+SHIFT].min).to_a.each do |y| fields[x + SHIFT][y + SHIFT] = Field.new(x, y) end end fields end |
.field_amount(radius) ⇒ Object
Anzahl der Felder eines hexagonalen Spielfeldes
20 21 22 23 |
# File 'lib/software_challenge_client/board.rb', line 20 def self.field_amount(radius) return 1 if radius == 1 (radius - 1) * 6 + Board.field_amount(radius - 1) end |
Instance Method Details
#==(other) ⇒ Object
Vergleicht zwei Spielbretter. Gleichheit besteht, wenn zwei Spielbretter die gleichen Felder enthalten.
58 59 60 |
# File 'lib/software_challenge_client/board.rb', line 58 def ==(other) field_list == other.field_list end |
#add_field(field) ⇒ Object
Fügt ein Feld dem Spielbrett hinzu. Das übergebene Feld ersetzt das an den Koordinaten bestehende Feld.
65 66 67 |
# File 'lib/software_challenge_client/board.rb', line 65 def add_field(field) @fields[field.x + SHIFT][field.y + SHIFT] = field end |
#clear ⇒ Object
Entfernt alle Felder des Spielfeldes
47 48 49 |
# File 'lib/software_challenge_client/board.rb', line 47 def clear @fields = [] end |
#clone ⇒ Object
Returns eine unabhaengige Kopie des Spielbretts.
111 112 113 |
# File 'lib/software_challenge_client/board.rb', line 111 def clone Marshal.load(Marshal.dump(self)) end |
#deployed_pieces(color) ⇒ Array
Returns Liste aller Spielsteine eines Spielers, die auf dem Spielbrett platziert wurden.
106 107 108 |
# File 'lib/software_challenge_client/board.rb', line 106 def deployed_pieces(color) pieces.select { |p| p.color == color } end |
#field(x, y) ⇒ Field
Zugriff auf die Felder des Spielfeldes
74 75 76 77 |
# File 'lib/software_challenge_client/board.rb', line 74 def field(x, y) return nil if (x < -SHIFT) || (y < -SHIFT) fields.dig(x + SHIFT, y + SHIFT) # NOTE that #dig requires ruby 2.3+ end |
#field_at(coordinates) ⇒ Field
Zugriff auf die Felder des Spielfeldes über ein Koordinaten-Paar.
bei #field.
87 88 89 |
# File 'lib/software_challenge_client/board.rb', line 87 def field_at(coordinates) field(coordinates.x, coordinates.y) end |
#field_list ⇒ Array
Returns Liste aller Felder.
52 53 54 |
# File 'lib/software_challenge_client/board.rb', line 52 def field_list @fields.flatten.select{ |e| !e.nil? } end |
#fields_of_color(color) ⇒ Array<Field>
Liefert alle Felder die dem Spieler mit der gegebenen Farbe gehoeren
95 96 97 |
# File 'lib/software_challenge_client/board.rb', line 95 def fields_of_color(color) field_list.select{ |f| f.color == color } end |
#pieces ⇒ Array
Returns Liste aller Spielsteine, die auf dem Spielbrett platziert wurden.
100 101 102 |
# File 'lib/software_challenge_client/board.rb', line 100 def pieces field_list.map(&:pieces).flatten end |
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus.
116 117 118 |
# File 'lib/software_challenge_client/board.rb', line 116 def to_s field_list.sort_by(&:z).map{ |f| f.obstructed ? 'OO' : f.empty? ? '--' : f.pieces.last.to_s }.join end |