Class: Board

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

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_piecesArray<PieceShape>

Returns Die blauen, gesetzten Spielsteine.

Returns:

  • (Array<PieceShape>)

    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_piecesArray<PieceShape>

Returns Die grünen, gesetzten Spielsteine.

Returns:

  • (Array<PieceShape>)

    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_piecesArray<PieceShape>

Returns Die roten, gesetzten Spielsteine.

Returns:

  • (Array<PieceShape>)

    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_piecesArray<PieceShape>

Returns Die gelben, gesetzten Spielsteine.

Returns:

  • (Array<PieceShape>)

    Die gelben, gesetzten Spielsteine



23
24
25
# File 'lib/software_challenge_client/board.rb', line 23

def deployed_yellow_pieces
  @deployed_yellow_pieces
end

#fieldsArray<Array<Field>> (readonly)

Note:

Besser über die #field Methode auf Felder zugreifen.

Returns Ein Feld wird an der Position entsprechend seiner x und y Coordinates im Array gespeichert.

Returns:

  • (Array<Array<Field>>)

    Ein Feld wird an der Position entsprechend seiner x und y Coordinates im Array gespeichert.



15
16
17
# File 'lib/software_challenge_client/board.rb', line 15

def fields
  @fields
end

Class Method Details

.contains(position) ⇒ Object

Returns Ob die gegebenen Koordinaten auf dem board liegen.

Parameters:

  • position (Coordinates)

    Die zu überprüfenden Koordinaten

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_fieldArray

Returns leere Felder entsprechend des Spielbrettes angeordnet.

Returns:

  • (Array)

    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.

Parameters:

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.

Parameters:

  • field (Field)

    Das einzufügende Feld.



68
69
70
# File 'lib/software_challenge_client/board.rb', line 68

def add_field(field)
  @fields[field.x][field.y] = field
end

#clearObject

Entfernt alle Felder des Spielfeldes



49
50
51
# File 'lib/software_challenge_client/board.rb', line 49

def clear
  @fields = []
end

#cloneObject

Returns eine unabhaengige Kopie des Spielbretts.

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.

Parameters:

  • color (Color)

    Die Farbe der Steine

Returns:

  • (Array<PieceShape>)

    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

Parameters:

  • x (Integer)

    Die X-Koordinate des Feldes.

  • y (Integer)

    Die Y-Koordinate des Feldes.

Returns:

  • (Field)

    Das Feld mit den gegebenen Koordinaten. Falls das Feld nicht exisitert, wird nil zurückgegeben.



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.

Parameters:

  • coordinates (Coordinates)

    X- und Y-Koordinate als Paar, sonst wie

Returns:

See Also:



90
91
92
# File 'lib/software_challenge_client/board.rb', line 90

def field_at(coordinates)
  field(coordinates.x, coordinates.y)
end

#field_listArray

Returns Liste aller Felder.

Returns:

  • (Array)

    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

Parameters:

  • color (Color)

    Die Farbe der Felder

Returns:

  • (Array<Field>)

    Eine Liste aller felder, die die gegebene Farbe haben



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.

Parameters:

  • it (Coordinates)

    Die zu untersuchenden Koordinaten

Returns:

  • (Boolean)

    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_sObject

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