Class: Berlin::Fake::State

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(from_json) ⇒ State

Returns a new instance of State.



263
264
265
266
267
268
# File 'lib/ai/fake.rb', line 263

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 Attribute Details

#stateObject

Returns the value of attribute state.



262
263
264
# File 'lib/ai/fake.rb', line 262

def state
  @state
end

Instance Method Details

#apply_moves(moves) ⇒ Object



270
271
272
273
274
275
276
277
278
279
280
281
# File 'lib/ai/fake.rb', line 270

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



299
300
301
302
303
304
305
306
307
# File 'lib/ai/fake.rb', line 299

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



309
310
311
# File 'lib/ai/fake.rb', line 309

def inspect
  as_json
end

#remove_soldiers(move) ⇒ Object



283
284
285
286
287
288
289
290
291
292
293
# File 'lib/ai/fake.rb', line 283

def remove_soldiers(move)
  origin = @state[move.from]
  if origin.player_id != move.player_id
    puts  "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
    puts "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



295
296
297
# File 'lib/ai/fake.rb', line 295

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

#winner?Boolean

Returns:

  • (Boolean)


313
314
315
# File 'lib/ai/fake.rb', line 313

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