71 lines
1.6 KiB
Crystal
71 lines
1.6 KiB
Crystal
require "../*"
|
|
require "../ai/*"
|
|
require "../rules_set/*"
|
|
|
|
include GameOfGame
|
|
|
|
ROUNDS = 100
|
|
|
|
all_ai = [
|
|
Cooperative.new,
|
|
Cheater.new,
|
|
GiveAndTake.new,
|
|
Nemesis.new,
|
|
Macron.new,
|
|
Statistician.new
|
|
# TheFool.new,
|
|
] of Ai
|
|
|
|
total_scoring = Hash(Ai, Float64).new
|
|
total_victories = Hash(Ai, Int32).new
|
|
all_ai.each do |ai|
|
|
total_scoring[ai] = 0.0
|
|
total_victories[ai] = 0
|
|
end
|
|
|
|
Indexable.each_cartesian([all_ai, all_ai]) do |current_ai_battle|
|
|
game = Game.new(
|
|
players: current_ai_battle,
|
|
rules: BasicPrisonner.new,
|
|
verbose: false,
|
|
)
|
|
|
|
ROUNDS.times do |i|
|
|
# puts "Play round #{i}"
|
|
game.play
|
|
end
|
|
|
|
battle_name = game.rounds.total.keys.map(&.name).join(" vs ")
|
|
# game.rounds.total.to_a.sort_by {|t| t[1]}.each do |player, total|
|
|
# puts "#{player.name} | #{total.round(1)}"
|
|
# end
|
|
results = game.rounds.total.to_a.sort_by {|t| -t[1]}
|
|
winner = results[0][0]
|
|
looser = results[1][0] if results.size > 1
|
|
winner_score = results[0][1]
|
|
|
|
total_scoring[winner] += winner_score
|
|
if looser
|
|
looser_score = results[1][1]
|
|
total_scoring[looser] += looser_score
|
|
if winner_score == looser_score
|
|
total_victories[looser] += 1
|
|
end
|
|
end
|
|
total_victories[winner] += 1
|
|
|
|
puts "#{battle_name}: Winner is #{winner.name}, scores #{results.map{|t| t[1]}}"
|
|
end
|
|
|
|
puts
|
|
puts "=== Score by victories ==="
|
|
total_victories.to_a.sort_by {|t| -t[1]}.each.with_index do |t, i|
|
|
puts "#{i}. #{t[0].name}: #{t[1]}"
|
|
end
|
|
|
|
puts
|
|
puts "=== Score by points ==="
|
|
total_scoring.to_a.sort_by {|t| -t[1]}.each.with_index do |t, i|
|
|
puts "#{i}. #{t[0].name}: #{t[1]}"
|
|
end
|