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 =
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
Instance Method Summary collapse
-
#==(other) ⇒ Object
Vergleicht zwei Spielbretter.
-
#add_field(field) ⇒ Object
Fügt ein Feld dem Spielbrett hinzu.
- #clear ⇒ Object
- #clone ⇒ Object
- #deployed_pieces(color) ⇒ Object
-
#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 ⇒ Object
-
#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 ⇒ Object
-
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus.
Constructor Details
#initialize(fields = []) ⇒ Board
Erstellt ein neues leeres Spielbrett.
26 27 28 29 |
# File 'lib/software_challenge_client/board.rb', line 26 def initialize(fields = []) @fields = Board.empty_game_field fields.each{ |f| add_field(f) } end |
Instance Attribute Details
Class Method Details
.empty_game_field ⇒ Object
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/software_challenge_client/board.rb', line 31 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
18 19 20 21 |
# File 'lib/software_challenge_client/board.rb', line 18 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.
52 53 54 |
# File 'lib/software_challenge_client/board.rb', line 52 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.
59 60 61 |
# File 'lib/software_challenge_client/board.rb', line 59 def add_field(field) @fields[field.x + SHIFT][field.y + SHIFT] = field end |
#clear ⇒ Object
42 43 44 |
# File 'lib/software_challenge_client/board.rb', line 42 def clear @fields = [] end |
#clone ⇒ Object
101 102 103 |
# File 'lib/software_challenge_client/board.rb', line 101 def clone Marshal.load(Marshal.dump(self)) end |
#deployed_pieces(color) ⇒ Object
97 98 99 |
# File 'lib/software_challenge_client/board.rb', line 97 def deployed_pieces(color) pieces.select { |p| p.color == color } end |
#field(x, y) ⇒ Field
Zugriff auf die Felder des Spielfeldes
68 69 70 71 |
# File 'lib/software_challenge_client/board.rb', line 68 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.
81 82 83 |
# File 'lib/software_challenge_client/board.rb', line 81 def field_at(coordinates) field(coordinates.x, coordinates.y) end |
#field_list ⇒ Object
46 47 48 |
# File 'lib/software_challenge_client/board.rb', line 46 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
89 90 91 |
# File 'lib/software_challenge_client/board.rb', line 89 def fields_of_color(color) field_list.select{ |f| f.color == color } end |
#pieces ⇒ Object
93 94 95 |
# File 'lib/software_challenge_client/board.rb', line 93 def pieces field_list.map(&:pieces).flatten end |
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus. Hier steht R für einen roten Fisch, B für einen blauen, ~ für ein leeres Feld und O für ein Kraken-Feld.
108 109 110 |
# File 'lib/software_challenge_client/board.rb', line 108 def to_s field_list.sort_by(&:z).map{ |f| f.obstructed ? 'OO' : f.empty? ? '--' : f.pieces.last.to_s }.join end |