Class: Berlin::Fake::State

Inherits:
Object
  • Object
show all
Defined in:
lib/ai/fake.rb

Instance Method Summary collapse

Constructor Details

#initialize(from_json) ⇒ State

Returns a new instance of State.



161
162
163
164
165
166
# File 'lib/ai/fake.rb', line 161

def initialize(from_json)
  @state = from_json.inject({}) do |h, node|
    h[node['node_id']] = NodeState.new(node['node_id'], node['player_id'], node['number_of_soldiers'])
    h
  end
end

Instance Method Details

#apply_moves(moves) ⇒ Object



168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/ai/fake.rb', line 168

def apply_moves(moves)
  conflicts = {}
  errors    = []
  puts "[Moves]"
  moves.each do |move|
    conflict = (conflicts[move.to] ||= ConflictState.new(move.to))
    remove_soldiers(move)
    conflict.add_soldiers(move.player_id, move.number_of_soldiers)
  end

  conflicts.each { |node_id, conflict| conflict.process(@state[node_id]) }
end

#as_jsonObject



197
198
199
200
201
202
203
204
205
# File 'lib/ai/fake.rb', line 197

def as_json
  @state.map do |node_id, node_state|
    {
      'node_id'             => node_state.node_id,
      'player_id'           => node_state.player_id,
      'number_of_soldiers'  => node_state.number_of_soldiers
    }
  end
end

#inspectObject



207
208
209
# File 'lib/ai/fake.rb', line 207

def inspect
  as_json
end

#remove_soldiers(move) ⇒ Object



181
182
183
184
185
186
187
188
189
190
191
# File 'lib/ai/fake.rb', line 181

def remove_soldiers(move)
  origin = @state[move.from]
  if origin.player_id != move.player_id
    errors << "Trying to move #{move.number_of_soldiers} soldiers from ##{move.from}. Node ##{move.from} belongs to #{origin.player_id}"
  elsif origin.number_of_soldiers < move.number_of_soldiers
    errors << "Trying to move #{move.number_of_soldiers} soldiers from ##{move.from}. Only #{origin.number_of_soldiers} soldiers available"
  else
    origin.number_of_soldiers -= move.number_of_soldiers
    puts "\t[#{move.player_id}] Moves #{move.number_of_soldiers} soldiers from ##{move.from} to ##{move.to}"
  end
end

#spawn(node_ids) ⇒ Object



193
194
195
# File 'lib/ai/fake.rb', line 193

def spawn(node_ids)
  node_ids.each { |id| @state[id].number_of_soldiers += 1 if @state[id].player_id }
end

#winner?Boolean

Returns:

  • (Boolean)


211
212
213
# File 'lib/ai/fake.rb', line 211

def winner?
  @state.map{ |node_id, node_state| node_state.player_id }.compact.length == 1
end