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 =
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.



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

#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_fieldObject



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.

Parameters:

  • field (Field)

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

#clearObject



42
43
44
# File 'lib/software_challenge_client/board.rb', line 42

def clear
  @fields = []
end

#cloneObject



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

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.



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.

Parameters:

  • coordinates (CubeCoordinates)

    X- und Y-Koordinate als Paar, sonst wie

Returns:

See Also:



81
82
83
# File 'lib/software_challenge_client/board.rb', line 81

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

#field_listObject



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

Parameters:

Returns:

  • (Array<Field>)

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



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

#piecesObject



93
94
95
# File 'lib/software_challenge_client/board.rb', line 93

def pieces
  field_list.map(&:pieces).flatten
end

#to_sObject

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