Class: Board
- Inherits:
-
Object
- Object
- Board
- Includes:
- Constants
- Defined in:
- lib/software_challenge_client/board.rb
Overview
Ein Spielbrett fuer Blokus
Constant Summary
Constants included from Constants
Constants::BOARD_SIZE, Constants::GAME_IDENTIFIER, Constants::ROUND_LIMIT, Constants::TOTAL_PIECE_SHAPES
Instance Attribute Summary collapse
-
#deployed_blue_pieces ⇒ Array<PieceShape>
Die blauen, gesetzten Spielsteine.
-
#deployed_green_pieces ⇒ Array<PieceShape>
Die grünen, gesetzten Spielsteine.
-
#deployed_red_pieces ⇒ Array<PieceShape>
Die roten, gesetzten Spielsteine.
-
#deployed_yellow_pieces ⇒ Array<PieceShape>
Die gelben, gesetzten Spielsteine.
-
#fields ⇒ Array<Array<Field>>
readonly
Ein Feld wird an der Position entsprechend seiner x und y Coordinates im Array gespeichert.
Class Method Summary collapse
-
.contains(position) ⇒ Object
Ob die gegebenen Koordinaten auf dem board liegen.
-
.empty_game_field ⇒ Array
Leere Felder entsprechend des Spielbrettes angeordnet.
Instance Method Summary collapse
-
#==(other) ⇒ Object
Vergleicht zwei Spielbretter.
-
#[](coords) ⇒ Object
Das Feld an den gegebenen Koordinaten.
-
#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<PieceShape>
Eine Liste aller Steintypen, die die gegebene Farbe noch nicht gespielt hat.
-
#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, fields = [Coordinates.new(0, 0), Coordinates.new(0, BOARD_SIZE - 1), Coordinates.new(BOARD_SIZE - 1, BOARD_SIZE - 1), Coordinates.new(BOARD_SIZE - 1, 0)].filter { |it| field_at(it).color == color }) ⇒ Array<Field>
Alle Felder einer bestimmten Farbe.
-
#in_bounds?(it) ⇒ Boolean
Ob die gegebenen Koordinaten auf dem Board liegen oder nicht.
-
#initialize(fields = []) ⇒ Board
constructor
Erstellt ein neues leeres Spielbrett.
-
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus.
Constructor Details
#initialize(fields = []) ⇒ Board
Erstellt ein neues leeres Spielbrett.
34 35 36 37 |
# File 'lib/software_challenge_client/board.rb', line 34 def initialize(fields = []) @fields = Board.empty_game_field fields.each { |f| add_field(f) } end |
Instance Attribute Details
#deployed_blue_pieces ⇒ Array<PieceShape>
Returns Die blauen, gesetzten Spielsteine.
19 20 21 |
# File 'lib/software_challenge_client/board.rb', line 19 def deployed_blue_pieces @deployed_blue_pieces end |
#deployed_green_pieces ⇒ Array<PieceShape>
Returns Die grünen, gesetzten Spielsteine.
31 32 33 |
# File 'lib/software_challenge_client/board.rb', line 31 def deployed_green_pieces @deployed_green_pieces end |
#deployed_red_pieces ⇒ Array<PieceShape>
Returns Die roten, gesetzten Spielsteine.
27 28 29 |
# File 'lib/software_challenge_client/board.rb', line 27 def deployed_red_pieces @deployed_red_pieces end |
#deployed_yellow_pieces ⇒ Array<PieceShape>
Returns Die gelben, gesetzten Spielsteine.
23 24 25 |
# File 'lib/software_challenge_client/board.rb', line 23 def deployed_yellow_pieces @deployed_yellow_pieces end |
Class Method Details
.contains(position) ⇒ Object
Returns Ob die gegebenen Koordinaten auf dem board liegen.
173 174 175 176 |
# File 'lib/software_challenge_client/board.rb', line 173 def self.contains(position) position.x >= 0 && position.x < BOARD_SIZE && position.y >= 0 && position.y < BOARD_SIZE end |
.empty_game_field ⇒ Array
Returns leere Felder entsprechend des Spielbrettes angeordnet.
40 41 42 43 44 45 46 |
# File 'lib/software_challenge_client/board.rb', line 40 def self.empty_game_field (0...BOARD_SIZE).to_a.map do |x| (0...BOARD_SIZE).to_a.map do |y| Field.new(x, y) end end end |
Instance Method Details
#==(other) ⇒ Object
Vergleicht zwei Spielbretter. Gleichheit besteht, wenn zwei Spielbretter die gleichen Felder enthalten.
60 61 62 |
# File 'lib/software_challenge_client/board.rb', line 60 def ==(other) field_list == other.field_list end |
#[](coords) ⇒ Object
Returns Das Feld an den gegebenen Koordinaten.
157 158 159 |
# File 'lib/software_challenge_client/board.rb', line 157 def [](coords) field_at(coords) end |
#add_field(field) ⇒ Object
Fügt ein Feld dem Spielbrett hinzu. Das übergebene Feld ersetzt das an den Koordinaten bestehende Feld.
68 69 70 |
# File 'lib/software_challenge_client/board.rb', line 68 def add_field(field) @fields[field.x][field.y] = field end |
#clear ⇒ Object
Entfernt alle Felder des Spielfeldes
49 50 51 |
# File 'lib/software_challenge_client/board.rb', line 49 def clear @fields = [] end |
#clone ⇒ Object
Returns eine unabhaengige Kopie des Spielbretts.
151 152 153 |
# File 'lib/software_challenge_client/board.rb', line 151 def clone Marshal.load(Marshal.dump(self)) end |
#deployed_pieces(color) ⇒ Array<PieceShape>
Returns Eine Liste aller Steintypen, die die gegebene Farbe noch nicht gespielt hat.
137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/software_challenge_client/board.rb', line 137 def deployed_pieces(color) case color when Color::RED deployed_red_pieces when Color::BLUE deployed_blue_pieces when Color::YELLOW deployed_yellow_pieces when Color::GREEN deployed_green_pieces end end |
#field(x, y) ⇒ Field
Zugriff auf die Felder des Spielfeldes
78 79 80 |
# File 'lib/software_challenge_client/board.rb', line 78 def field(x, y) fields.dig(x, y) # NOTE that #dig requires ruby 2.3+ end |
#field_at(coordinates) ⇒ Field
Zugriff auf die Felder des Spielfeldes über ein Koordinaten-Paar.
bei #field.
90 91 92 |
# File 'lib/software_challenge_client/board.rb', line 90 def field_at(coordinates) field(coordinates.x, coordinates.y) end |
#field_list ⇒ Array
Returns Liste aller Felder.
54 55 56 |
# File 'lib/software_challenge_client/board.rb', line 54 def field_list @fields.flatten.reject(&:nil?) end |
#fields_of_color(color, fields = [Coordinates.new(0, 0), Coordinates.new(0, BOARD_SIZE - 1), Coordinates.new(BOARD_SIZE - 1, BOARD_SIZE - 1), Coordinates.new(BOARD_SIZE - 1, 0)].filter { |it| field_at(it).color == color }) ⇒ Array<Field>
Alle Felder einer bestimmten Farbe
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/software_challenge_client/board.rb', line 100 def fields_of_color(color, fields = [Coordinates.new(0, 0), Coordinates.new(0, BOARD_SIZE - 1), Coordinates.new(BOARD_SIZE - 1, BOARD_SIZE - 1), Coordinates.new(BOARD_SIZE - 1, 0)].filter { |it| field_at(it).color == color }) copy = Array.new(fields) copy.each do |field| [Coordinates.new(1, 0), Coordinates.new(1, -1), Coordinates.new(0, -1), Coordinates.new(-1, -1), Coordinates.new(-1, 0), Coordinates.new(-1, 1), Coordinates.new(0, 1), Coordinates.new(1, 1)].each do |neighbor| new_field = field + neighbor next unless Board.contains(new_field) && @fields[new_field.x][new_field.y].color == color fields << new_field unless fields.include?(new_field) end end if copy.count == fields.count fields else fields_of_color(color, fields) end end |
#in_bounds?(it) ⇒ Boolean
Returns Ob die gegebenen Koordinaten auf dem Board liegen oder nicht.
131 132 133 |
# File 'lib/software_challenge_client/board.rb', line 131 def in_bounds?(it) it.x >= 0 && it.y >= 0 && it.x < BOARD_SIZE && it.y < BOARD_SIZE end |
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus.
162 163 164 165 166 167 168 169 |
# File 'lib/software_challenge_client/board.rb', line 162 def to_s "\n" + (0...BOARD_SIZE).to_a.map do |y| (0...BOARD_SIZE).to_a.map do |x| @fields[x][y].to_s end.join(' ') end.join("\n") end |