GameOfGame/src/game/prisonner_duel_contest.cr

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