2015-02-17 10:35:01 +01:00
|
|
|
#!/usr/bin/python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
"""
|
|
|
|
TP AP1
|
|
|
|
Licence SESI 1ère année
|
|
|
|
Univ. Lille 1
|
|
|
|
|
|
|
|
IA bataille navale
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
__author__ = 'BEAUSSART Jean-loup & PREUD\'HOMME Geoffrey'
|
|
|
|
__date_creation__ = 'Mon, 16 Feb 2015 19:30:54 +0100'
|
|
|
|
|
|
|
|
import bataille_navale as BN
|
2015-02-17 10:37:28 +01:00
|
|
|
from random import randint
|
|
|
|
|
2015-02-17 10:35:01 +01:00
|
|
|
|
|
|
|
def jouerIA(nom, descr, niveau):
|
|
|
|
"""
|
2015-02-17 11:49:47 +01:00
|
|
|
str, str → ()
|
2015-02-17 10:35:01 +01:00
|
|
|
procédure de jeu complet de bataille navale,
|
|
|
|
le nom du joueur est donné par le paramètre nom,
|
|
|
|
et le jeu est décrit dans le fichier descr.
|
|
|
|
|
|
|
|
CU : le fichier jeu doit exister et être conforme
|
|
|
|
à un fichier de description.
|
|
|
|
"""
|
|
|
|
jeu = BN.cree_jeu(descr)
|
|
|
|
BN.decrire_le_jeu(jeu)
|
|
|
|
nbre_tirs = 0
|
|
|
|
res = False
|
|
|
|
while not BN.tous_coules(jeu):
|
2015-02-22 12:59:51 +01:00
|
|
|
BN.afficher_jeu(jeu)
|
2015-02-17 10:35:01 +01:00
|
|
|
tir = choisir_tir(jeu, res, niveau)
|
|
|
|
nbre_tirs += 1
|
|
|
|
nav, res = BN.analyse_un_tir(jeu, tir)
|
|
|
|
if res == BN.RATE:
|
|
|
|
print("raté.")
|
|
|
|
elif res == BN.TOUCHE:
|
|
|
|
print(nav + " touché.")
|
|
|
|
else:
|
|
|
|
print(nav + " coulé.")
|
2015-02-22 12:59:51 +01:00
|
|
|
BN.sauver_result(nom+' (IA)', descr, nbre_tirs)
|
|
|
|
# On rajoute IA dans les scores pour repérér les tricheurs
|
2015-02-17 10:35:01 +01:00
|
|
|
print("Terminé en %d tirs" % nbre_tirs)
|
|
|
|
|
|
|
|
def choisir_tir(jeu, res, niveau):
|
2015-02-17 11:10:23 +01:00
|
|
|
niveaux = [choisir_tir_1, choisir_tir_2, choisir_tir_3]
|
2015-02-17 10:37:28 +01:00
|
|
|
fonction = niveaux[niveau - 1]
|
2015-02-17 11:10:23 +01:00
|
|
|
tir = fonction(jeu, res)
|
|
|
|
print('Tir chosi :', tir)
|
|
|
|
return tir
|
2015-02-17 10:37:28 +01:00
|
|
|
|
2015-02-17 11:10:23 +01:00
|
|
|
def choisir_tir_1(jeu, res):
|
2015-02-17 11:49:47 +01:00
|
|
|
"""
|
|
|
|
dict, int → (int, int)
|
|
|
|
IA de bas niveau, tire aléatoirement dans la grille
|
2015-02-17 11:31:17 +01:00
|
|
|
"""
|
2015-02-17 10:37:28 +01:00
|
|
|
x = randint(0, jeu['plateau']['larg'])
|
|
|
|
y = randint(0, jeu['plateau']['haut'])
|
|
|
|
return (x, y)
|
2015-02-17 10:35:01 +01:00
|
|
|
|
2015-02-17 10:38:25 +01:00
|
|
|
def choisir_tir_2(jeu, res):
|
2015-02-17 11:49:47 +01:00
|
|
|
"""
|
|
|
|
dict, int → (int, int)
|
|
|
|
IA moyenne, tire aléatoirement mais jamais deux fois au même endroit
|
2015-02-17 11:31:17 +01:00
|
|
|
"""
|
2015-02-17 11:09:28 +01:00
|
|
|
x,y= randint(1, jeu['plateau']['larg']), randint(1, jeu['plateau']['haut'])
|
|
|
|
|
|
|
|
while (x,y) in jeu['coups_joues']:
|
|
|
|
x = randint(1, jeu['plateau']['larg'])
|
|
|
|
y = randint(1, jeu['plateau']['haut'])
|
|
|
|
|
2015-02-17 10:38:25 +01:00
|
|
|
return (x, y)
|
|
|
|
|
2015-02-17 11:31:31 +01:00
|
|
|
def en_bonds(esp, c):
|
2015-02-17 11:49:47 +01:00
|
|
|
"""
|
|
|
|
dict, tuple → bool
|
|
|
|
Indique si la position c est dans l'espace maritime esp
|
|
|
|
"""
|
2015-02-17 11:31:31 +01:00
|
|
|
return not (c[0] > esp['larg'] or c[0] <= 0 or c[1] <= 0 or c[1] > esp['haut'])
|
|
|
|
|
2015-02-17 10:38:25 +01:00
|
|
|
def choisir_tir_3(jeu, res):
|
2015-02-17 11:49:47 +01:00
|
|
|
"""
|
|
|
|
dict, int → (int, int)
|
2015-02-22 12:59:51 +01:00
|
|
|
IA bonne, prend en priorité les cases adjacentes à celles touchées
|
2015-02-17 11:49:47 +01:00
|
|
|
"""
|
2015-02-17 11:31:31 +01:00
|
|
|
# Choix du mode
|
2015-02-22 12:59:51 +01:00
|
|
|
if 'ia' not in jeu: # On crée un dict qui stockera quelques variables utiles
|
2015-02-17 11:13:13 +01:00
|
|
|
jeu['ia'] = dict()
|
2015-02-22 12:59:51 +01:00
|
|
|
jeu['ia']['mode'] = 0 # 0 : aléatoire, 1 : cases adjacentes à la dernière touche
|
|
|
|
#jeu['ia']['cl'] = -1
|
2015-02-17 11:13:13 +01:00
|
|
|
if type(res) == int:
|
|
|
|
if res == BN.COULE:
|
2015-02-22 12:59:51 +01:00
|
|
|
jeu['ia']['mode'] = 0 # Retour en mode aléatoire
|
2015-02-17 11:13:13 +01:00
|
|
|
elif res == BN.TOUCHE:
|
2015-02-22 12:59:51 +01:00
|
|
|
jeu['ia']['d_touche'] = jeu['ia']['d_coup'] # Stockage de a dernière touche
|
2015-02-17 11:13:13 +01:00
|
|
|
jeu['ia']['mode'] = 1
|
|
|
|
|
|
|
|
# Acteur
|
2015-02-22 12:59:51 +01:00
|
|
|
if jeu['ia']['mode'] == 1: # Si en mode adjacent
|
|
|
|
proxi = [(0, 1), (0, -1), (1, 0), (-1, 0)] # Cases de proximité
|
2015-02-17 11:31:31 +01:00
|
|
|
for i in proxi:
|
|
|
|
x = jeu['ia']['d_touche'][0] + i[0]
|
|
|
|
y = jeu['ia']['d_touche'][1] + i[1]
|
2015-02-17 11:13:13 +01:00
|
|
|
coup = (x, y)
|
2015-02-17 11:31:31 +01:00
|
|
|
if coup not in jeu['coups_joues'] and en_bonds(jeu['plateau'], coup):
|
2015-02-22 12:59:51 +01:00
|
|
|
break # Si coup non joué et dans le plateau, on valide
|
|
|
|
if i == proxi[-1]: # Si aucune case adjacente ne fonctionne,
|
|
|
|
# retour en mode aléatoire
|
2015-02-17 11:31:31 +01:00
|
|
|
# (arrive quand 2 navires sont cote à cote)
|
|
|
|
jeu['ia']['mode'] = 0
|
2015-02-17 11:49:47 +01:00
|
|
|
if jeu['ia']['mode'] == 0: # Si en mode aléatoire
|
2015-02-22 12:59:51 +01:00
|
|
|
while True:
|
2015-02-17 11:34:34 +01:00
|
|
|
x = randint(1, jeu['plateau']['larg'])
|
2015-02-22 13:13:20 +01:00
|
|
|
y = randint(1, jeu['plateau']['haut'])
|
2015-02-17 11:13:13 +01:00
|
|
|
coup = (x, y)
|
|
|
|
if coup not in jeu['coups_joues']:
|
|
|
|
break
|
2015-02-22 12:59:51 +01:00
|
|
|
jeu['ia']['d_coup'] = coup # Stockage du dernier coup joué
|
2015-02-17 11:13:13 +01:00
|
|
|
return coup
|
2015-02-17 10:38:25 +01:00
|
|
|
|
2015-02-17 10:35:01 +01:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
import sys
|
|
|
|
if len(sys.argv) != 4:
|
2015-02-17 11:31:17 +01:00
|
|
|
jouerIA('Pirate borgne', '1', 3)
|
2015-02-17 10:35:01 +01:00
|
|
|
else:
|
2015-02-17 11:13:13 +01:00
|
|
|
jouerIA(sys.argv[1], sys.argv[2], int(sys.argv[3]))
|