opale/learning.py

141 lines
5.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import statistics
import sys
from opale.carte import *
from opale.game import Game
max_importance = None
mean_importance = {
Chasseresse: 7,
DragonCorail: 7,
Pearl: 7,
Witch: 7,
DragonPetrified: 7,
Golem: 7,
Guardian: 7,
Horser: 7,
City: 7,
}
values_importance = {
Chasseresse: [7],
DragonCorail: [7],
Pearl: [7],
Witch: [7],
DragonPetrified: [7],
Golem: [7],
Guardian: [7],
Horser: [7],
City: [7],
}
borne_min_importance = {
Chasseresse: 14,
DragonCorail: 14,
Pearl: 14,
Witch: 14,
DragonPetrified: 14,
Golem: 14,
Guardian: 14,
Horser: 14,
City: 14,
}
borne_max_importance = {
Chasseresse: 0,
DragonCorail: 0,
Pearl: 0,
Witch: 0,
DragonPetrified: 0,
Golem: 0,
Guardian: 0,
Horser: 0,
City: 0,
}
NB_ROUND = 999
seed_range = random.randrange(1000000000)
dum_range = seed_range + min(NB_ROUND/10, 99)
for seed in range(seed_range, seed_range + NB_ROUND):
sys.stdout.write("\r%d/%d - %s " % (seed - seed_range, NB_ROUND, {k.__name__: int(mean_importance[k]*100)/100 for k in mean_importance.keys()}))
max_score_diff = 0
for i in range(100):
random.seed(seed)
game = Game(None, None)
random.seed()
if seed > dum_range and i > 50:
newImportance = {
Chasseresse: random.randint(int(borne_min_importance[Chasseresse]),int(borne_max_importance[Chasseresse]+1)),
DragonCorail: random.randint(int(borne_min_importance[DragonCorail]),int(borne_max_importance[DragonCorail]+1)),
Pearl: random.randint(int(borne_min_importance[Pearl]),int(borne_max_importance[Pearl]+1)),
Witch: random.randint(int(borne_min_importance[Witch]),int(borne_max_importance[Witch]+1)),
DragonPetrified: random.randint(int(borne_min_importance[DragonPetrified]),int(borne_max_importance[DragonPetrified]+1)),
Golem: random.randint(int(borne_min_importance[Golem]),int(borne_max_importance[Golem]+1)),
Guardian: random.randint(int(borne_min_importance[Guardian]),int(borne_max_importance[Guardian]+1)),
Horser: random.randint(int(borne_min_importance[Horser]),int(borne_max_importance[Horser]+1)),
City: random.randint(int(borne_min_importance[City]),int(borne_max_importance[City]+1)),
}
z = i % 10
if z == 0:
newImportance[Chasseresse] = random.randint(0,14)
elif z == 1:
newImportance[DragonCorail] = random.randint(0,14)
elif z == 2:
newImportance[Pearl] = random.randint(0,14)
elif z == 3:
newImportance[Witch] = random.randint(0,14)
elif z == 4:
newImportance[DragonPetrified] = random.randint(0,14)
elif z == 5:
newImportance[Golem] = random.randint(0,14)
elif z == 6:
newImportance[Guardian] = random.randint(0,14)
elif z == 7:
newImportance[Horser] = random.randint(0,14)
elif z == 8:
newImportance[City] = random.randint(0,14)
else:
newImportance = {
Chasseresse: random.randint(0,14),
DragonCorail: random.randint(0,14),
Pearl: random.randint(0,14),
Witch: random.randint(0,14),
DragonPetrified: random.randint(0,14),
Golem: random.randint(0,14),
Guardian: random.randint(0,14),
Horser: random.randint(0,14),
City: random.randint(0,14),
}
game.player1.importance = lambda: newImportance
game.player2.base_importance = lambda t: mean_importance[t]
def play_turn():
return game.current_player.play_turn(game.play_round)
while not game.isFinished():
play_turn()
play_turn()
if game.player1.get_score() > game.player2.get_score():
#print("Fight %d.%d: \033[93mP1\033[0m: \033[1m%d\033[0m pts vs. \033[93mP2\033[0m: \033[1m%d\033[0m pts" % (seed-seed_range, i, game.player1.get_score(), game.player2.get_score()))
if game.player1.get_score() - game.player2.get_score() > max_score_diff:
max_score_diff = game.player1.get_score() - game.player2.get_score()
max_importance = newImportance
for t in mean_importance.keys():
values_importance[t].append(max_importance[t])
mean_importance[t] = statistics.mean(values_importance[t])
if seed >= dum_range:
if borne_min_importance[t] > mean_importance[t]:
borne_min_importance[t] = mean_importance[t]
if borne_max_importance[t] < mean_importance[t]:
borne_max_importance[t] = mean_importance[t]
print()
print("\nMax importance (diff=%d): %s" % (max_score_diff, max_importance))
print("\nBornes: %s" % ({t: "%s - %s" % (borne_min_importance[t], borne_max_importance[t]) for t in mean_importance}))
print("\nMean importance: %s" % (mean_importance))