Class: Board

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

Class Method Summary collapse

Instance Method Summary collapse

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

#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 CubeCoordinates im Array gespeichert.

Returns:

  • (Array<Array<Field>>)

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



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

def fields
  @fields
end

Class Method Details

.empty_game_fieldArray

Returns leere Felder entsprechend des Spielbrettes angeordnet.

Returns:

  • (Array)

    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

Parameters:

  • radius (Integer)

    Radius des 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.

Parameters:

  • field (Field)

    Das einzufügende 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

#clearObject

Entfernt alle Felder des Spielfeldes



47
48
49
# File 'lib/software_challenge_client/board.rb', line 47

def clear
  @fields = []
end

#cloneObject

Returns eine unabhaengige Kopie des Spielbretts.

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.

Parameters:

Returns:

  • (Array)

    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

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.



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.

Parameters:

  • coordinates (CubeCoordinates)

    X- und Y-Koordinate als Paar, sonst wie

Returns:

See Also:



87
88
89
# File 'lib/software_challenge_client/board.rb', line 87

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

#field_listArray

Returns Liste aller Felder.

Returns:

  • (Array)

    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

Parameters:

Returns:

  • (Array<Field>)

    Alle Felder der angegebenen Farbe die das Spielbrett enthält.



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

#piecesArray

Returns Liste aller Spielsteine, die auf dem Spielbrett platziert wurden.

Returns:

  • (Array)

    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_sObject

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