Class: Board
- Inherits:
-
Object
- Object
- Board
- Includes:
- Constants
- Defined in:
- lib/software_challenge_client/board.rb
Overview
Ein Spielbrett fuer Ostseeschach
Constant Summary
Constants included from Constants
Constants::BOARD_SIZE, Constants::GAME_IDENTIFIER, Constants::ROUND_LIMIT
Instance Attribute Summary collapse
-
#fields ⇒ Array<Array<Field>>
readonly
Ein Feld wird an der Position entsprechend seiner x und y Coordinates im Array gespeichert.
Class Method Summary collapse
-
.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.
-
#field(x, y) ⇒ Field
Zugriff auf die Felder des Spielfeldes.
-
#field_at(coords) ⇒ Field
Zugriff auf die Felder des Spielfeldes über ein Koordinaten-Paar.
-
#field_list ⇒ Array
Liste aller Felder.
- #fields_of_team(team) ⇒ Object
-
#in_bounds?(coords) ⇒ Boolean
Ob die gegebenen Koordinaten auf dem Board liegen oder nicht.
-
#initialize(fields = []) ⇒ Board
constructor
Erstellt ein neues leeres Spielbrett.
-
#neighbors_of(field) ⇒ Object
Die Felder um dem gegebenen Feld.
-
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus.
Constructor Details
#initialize(fields = []) ⇒ Board
Erstellt ein neues leeres Spielbrett.
21 22 23 24 |
# File 'lib/software_challenge_client/board.rb', line 21 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.
27 28 29 30 31 32 33 |
# File 'lib/software_challenge_client/board.rb', line 27 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.
131 132 133 |
# File 'lib/software_challenge_client/board.rb', line 131 def ==(other) field_list == other.field_list end |
#[](coords) ⇒ Object
Returns Das Feld an den gegebenen Koordinaten.
79 80 81 |
# File 'lib/software_challenge_client/board.rb', line 79 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.
46 47 48 |
# File 'lib/software_challenge_client/board.rb', line 46 def add_field(field) @fields[field.x][field.y] = field end |
#clear ⇒ Object
Entfernt alle Felder des Spielfeldes
36 37 38 |
# File 'lib/software_challenge_client/board.rb', line 36 def clear @fields = [] end |
#clone ⇒ Object
Returns eine unabhaengige Kopie des Spielbretts.
136 137 138 |
# File 'lib/software_challenge_client/board.rb', line 136 def clone Marshal.load(Marshal.dump(self)) end |
#field(x, y) ⇒ Field
Zugriff auf die Felder des Spielfeldes
56 57 58 |
# File 'lib/software_challenge_client/board.rb', line 56 def field(x, y) fields.dig(x, y) # NOTE that #dig requires ruby 2.3+ end |
#field_at(coords) ⇒ Field
Zugriff auf die Felder des Spielfeldes über ein Koordinaten-Paar.
bei #field.
68 69 70 |
# File 'lib/software_challenge_client/board.rb', line 68 def field_at(coords) field(coords.x, coords.y) end |
#field_list ⇒ Array
Returns Liste aller Felder.
73 74 75 |
# File 'lib/software_challenge_client/board.rb', line 73 def field_list @fields.flatten.reject(&:nil?) end |
#fields_of_team(team) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/software_challenge_client/board.rb', line 83 def fields_of_team(team) fields = [] (0...BOARD_SIZE).to_a.map do |x| (0...BOARD_SIZE).to_a.map do |y| f = field(x,y) if (!f.piece.nil? && f.piece.team == team) fields << f end end end fields end |
#in_bounds?(coords) ⇒ Boolean
Returns Ob die gegebenen Koordinaten auf dem Board liegen oder nicht.
125 126 127 |
# File 'lib/software_challenge_client/board.rb', line 125 def in_bounds?(coords) coords.x >= 0 && coords.y >= 0 && coords.x < BOARD_SIZE && coords.y < BOARD_SIZE end |
#neighbors_of(field) ⇒ Object
Returns Die Felder um dem gegebenen Feld.
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/software_challenge_client/board.rb', line 100 def neighbors_of(field) coords = [] c = Coordinates.oddr_to_doubled(field.coords) Direction.each { |d| disp = d.to_vec() x = c.x + disp.x y = c.y + disp.y oddr_coords = Coordinates.doubled_to_oddr_int(x, y) if !in_bounds?(oddr_coords) next end coords.push(oddr_coords) } coords.map{ |x| self.field_at(x) }.to_a end |
#to_s ⇒ Object
Gibt eine textuelle Repräsentation des Spielbrettes aus.
141 142 143 144 145 146 147 148 |
# File 'lib/software_challenge_client/board.rb', line 141 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 |