Class: Move

Inherits:
Object
  • Object
show all
Defined in:
lib/software_challenge_client/move.rb

Overview

Ein Spielzug. Er ist definiert durch das Koordinatenpaar des Ausgangsfeldes (ein Fisch des Spielers, der den Zug machen will) und eine Bewegungsrichtung.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(x, y, direction) ⇒ Move

Erstellt einen neuen Zug.

Parameters:

  • x (Integer)
  • y (Integer)
  • direction (Direction)


27
28
29
30
31
32
# File 'lib/software_challenge_client/move.rb', line 27

def initialize(x, y, direction)
  @x = x
  @y = y
  @direction = direction
  @hints = []
end

Instance Attribute Details

#directionDirection (readonly)

Returns Die Richtung, in die bewegt werden soll.

Returns:

  • (Direction)

    Die Richtung, in die bewegt werden soll.



17
18
19
# File 'lib/software_challenge_client/move.rb', line 17

def direction
  @direction
end

#hintsArray<DebugHint> (readonly)

Returns Hinweise, die an den Zug angeheftet werden sollen. Siehe DebugHint.

Returns:

  • (Array<DebugHint>)

    Hinweise, die an den Zug angeheftet werden sollen. Siehe DebugHint.



21
22
23
# File 'lib/software_challenge_client/move.rb', line 21

def hints
  @hints
end

#xInteger (readonly)

Returns X-Koordinate des Fisches, der bewegt werden soll. Die Spalte ganz links auf dem Spielbrett hat X-Koordinate 0, die ganz rechts 9.

Returns:

  • (Integer)

    X-Koordinate des Fisches, der bewegt werden soll. Die Spalte ganz links auf dem Spielbrett hat X-Koordinate 0, die ganz rechts 9.



8
9
10
# File 'lib/software_challenge_client/move.rb', line 8

def x
  @x
end

#yInteger (readonly)

Returns Y-Koordinate des Fisches, der bewegt werden soll. Die Zeile ganz unten auf dem Spielbrett hat Y-Koordinate 0, die ganz oben 9.

Returns:

  • (Integer)

    Y-Koordinate des Fisches, der bewegt werden soll. Die Zeile ganz unten auf dem Spielbrett hat Y-Koordinate 0, die ganz oben 9.



12
13
14
# File 'lib/software_challenge_client/move.rb', line 12

def y
  @y
end

Instance Method Details

#==(other) ⇒ Object



39
40
41
# File 'lib/software_challenge_client/move.rb', line 39

def ==(other)
  x == other.x && y == other.y && direction == other.direction
end

#add_hint(hint) ⇒ Object

Parameters:



35
36
37
# File 'lib/software_challenge_client/move.rb', line 35

def add_hint(hint)
  @hints.push(hint)
end

#from_fieldCoordinates

Returns Die Koordinaten des Ausgangsfeldes des Zuges als Koordinatenpaar.

Returns:

  • (Coordinates)

    Die Koordinaten des Ausgangsfeldes des Zuges als Koordinatenpaar.



48
49
50
# File 'lib/software_challenge_client/move.rb', line 48

def from_field
  Coordinates.new(x, y)
end

#perform!(gamestate) ⇒ Object

Führt den Zug in dem gegebenen Spielzustand aus. Sollte dabei gegen Spielregeln verstossen werden, wird eine InvalidMoveException geworfen.

Parameters:



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/software_challenge_client/move.rb', line 61

def perform!(gamestate)
  if GameRuleLogic.valid_move?(self, gamestate.board, gamestate.current_player_color)
    type = gamestate.board.field(x, y).type
    target = GameRuleLogic.move_target(self, gamestate.board)
    gamestate.board.change_field(x, y, FieldType::EMPTY)
    gamestate.board.change_field(target.x, target.y, type)
  else
    raise InvalidMoveException.new('Invalid move', self)
  end
  # change the state to the next turn
  gamestate.last_move = self
  gamestate.turn += 1
  gamestate.switch_current_player
  gamestate.condition = GameRuleLogic.winning_condition(gamestate)
end

#target_field(speed) ⇒ Coordinates

Ermittelt die Koordinaten des Zielfeldes des Zuges mit einer gegebenen Zugweite.

Parameters:

  • speed (Integer)

    Die Zugweite. Entspricht normalerweise der Anzahl der Fische auf der Bewegungslinie.

Returns:

  • (Coordinates)

    Koordinaten des Zielfeldes. Eventuell ausserhalb des Spielbrettes.



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

def target_field(speed)
  direction.translate(from_field, speed)
end

#to_sObject



43
44
45
# File 'lib/software_challenge_client/move.rb', line 43

def to_s
  "Move: (#{x},#{y}) #{direction}"
end

#valid?(gamestate) ⇒ Boolean

Überprüft, ob der Zug in dem gegebenen Spielzustand regelkonform ausgeführt werden kann.

Parameters:

Returns:

  • (Boolean)


55
56
57
# File 'lib/software_challenge_client/move.rb', line 55

def valid?(gamestate)
  GameRuleLogic.valid_move?(self, gamestate.board, gamestate.current_player_color)
end