Code:
# -*- coding: utf-8 -*-
"""
Éditeur de Spyder
Ce script temporaire est sauvegardé ici :
/home/user/.spyder2/.temp.py
"""
from random import *
from copy import *
def generate_player():
# crée la grille de jeu du joueur et place le bateau du joueur à l'emplacement choisi
global playersea
i=0
while i<=4:
playersea.append([0,0,0,0,0])
i=i+1
# on génère la grille vide
print "Entrez la coordonnée X de la queue de votre navire (de 1 à 5):"
xdone=False
while xdone==False:
x=input()-1
if x>=0 and x<=4:
xdone=True
else:
print "Coordonnée invalide - Recommencez:"
# le joueur entre la coordonnée x du premier carre du navire, et on verifie qu'elle est valide
print "Entrez la coordonnée Y de la queue de votre navire (de 1 à 5):"
ydone=False
while ydone==False:
y=input()-1
if y>=0 and y<=4:
ydone=True
else:
print "Coordonnée invalide - Recommencez:"
# le joueur entre la coordonnée y du premier carre du navire, et on verifie qu'elle est valide
playersea[y][x]=1
print "Entrez la direction dans laquelle est orienté votre navire (N,S,E ou O):"
cdone=False
while cdone==False:
cardinal=raw_input()
if cardinal=="N" or cardinal=="S" or cardinal=="E" or cardinal=="O":
cdone=True
else:
print "Direction invalide - Recommencez:"
cdone=False
if (cardinal=="N" and y==0) or (cardinal=="S"and y==4) or (cardinal=="O" and x==0) or (cardinal=="E" and x==4):
print "Ceci vous ferait sortir de la grille de jeu - Recommencez:"
cdone=False
if cardinal=="N":
playersea[y-1][x]=1
elif cardinal=="S":
playersea[y+1][x]=1
elif cardinal=="E":
playersea[y][x+1]=1
elif cardinal=="O":
playersea[y][x-1]=1
# le joueur entre le point cardinal vers lequel pointe le navire, et on verifie qu'il est valide
def generate_enemy():
# crée la grille de jeu adverse et y place aléatoirement le bateau de 2 cases à couler
global enemysea
i=0
while i<=4:
enemysea.append([0,0,0,0,0])
i=i+1
x=randint(0,4)
y=randint(0,4)
enemysea[y][x]=1
# ici on crée le premier carre du bateau aleatoirement
cardinal=["N","S","E","O"]
edge=0
if x==0:
cardinal.remove("O")
edge=edge+1
if y==0:
cardinal.remove("N")
edge=edge+1
if x==4:
cardinal.remove("E")
edge=edge+1
if y==4:
cardinal.remove("S")
edge=edge+1
z=cardinal[randint(0,(3-edge))]
# ces conditions permettent de verifier si le bateau est en bord de grille et bloque adequatement la creation du 2e carre
if z=="N":
enemysea[y-1][x]=1
elif z=="S":
enemysea[y+1][x]=1
elif z=="E":
enemysea[y][x+1]=1
elif z=="O":
enemysea[y][x-1]=1
# et ici on place donc le 2eme carre du bateau
def player_turn():
# fait tirer le joueur aux coordonnées choisies, puis indique s'il a touché un bateau adverse, et garde les coord de tir
global enemysea
done=False
while done==False:
print "Entrez la coordonnée X de votre tir (de 1 à 5):"
xdone=False
while xdone==False:
x=input()-1
if x>=0 and x<=4:
xdone=True
else:
print "Coordonnée invalide - Recommencez:"
# On fait entrer au joueur la coordonnée X de son tir, et on verifie si elle est valide
print "Entrez la coordonnée Y de votre tir (de 1 à 5):"
ydone=False
while ydone==False:
y=input()-1
if y>=0 and y<=4:
ydone=True
else:
print "Coordonnée invalide - Recommencez:"
# On fait entrer au joueur la coordonnée Y de son tir, et on verifie si elle est valide
if isinstance(enemysea[y][x],str)==True:
print "Vous avez déjà tiré là - Recommencez:"
done=False
elif enemysea[y][x]==1:
print "Touché !"
global playershot
playershot=playershot+1
enemysea[y][x]="O"
done=True
elif enemysea[y][x]==0:
print "Raté !"
enemysea[y][x]="+"
done=True
# On verifie si l'endroit du tir a deja été fait, et s'il s'y trouve le bateau adverse ou simplement de l'eau
def enemy_turn():
# fait tirer aleatoirement l'ennemi
global playersea
global enemyshot
if enemyshot==0:
x=randint(0,4)
y=randint(0,4)
# Ici l'IA va simplement tirer aleatoirement
elif enemyshot==1:
i=False
for iy in range(0,5):
for ix in range(0,5):
if playersea[iy][ix]=="O" and i==False:
y=copy(iy)
x=copy(ix)
i==True
cardinal=["N","S","E","O"]
edge=0
if x==0:
cardinal.remove("O")
edge=edge+1
if y==0:
cardinal.remove("N")
edge=edge+1
if x==4:
cardinal.remove("E")
edge=edge+1
if y==4:
cardinal.remove("S")
edge=edge+1
z=cardinal[randint(0,(3-edge))]
if z=="N":
y=y-1
elif z=="S":
y=y+1
elif z=="E":
x=x+1
elif z=="O":
x=x-1
# Ici l'IA va determiner si le tir précédent etait bon, et tire ainsi sur un emplacement adjacent
if playersea[y][x]==1:
print "Vous avez été touché !"
enemyshot=enemyshot+1
playersea[y][x]="O"
elif playersea[y][x]==0:
print "L'ennemi vous a raté !"
playersea[y][x]="+"
def print_maps():
# affiche les cartes apres chaque tour
playersea_shown=deepcopy(playersea)
for y in range(0,5):
for x in range (0,5):
if playersea[y][x]==1:
playersea_shown[y][x]="#"
elif playersea_shown[y][x]==0:
playersea_shown[y][x]="~"
enemysea_shown=deepcopy(enemysea)
for y in range(0,5):
for x in range (0,5):
if enemysea_shown[y][x]==0 or enemysea_shown[y][x]==1:
enemysea_shown[y][x]="~"
# Ici on crée deux listes identiques à celles des grilles dans lequelles on va changer les int en str pour l'affichage
print "Votre grille Grille adverse"
for i in range(0,5):
print " ", " ".join(map(str, playersea_shown[i])), " ", " ".join(map(str, enemysea_shown[i]))
# Les lignes suivent executent le jeu de bataille navale
enemysea=[]
generate_enemy()
playersea=[]
generate_player()
print_maps()
playershot=0
enemyshot=0
while playershot<2 and enemyshot<2:
player_turn()
enemy_turn()
print_maps()
if playershot==2:
print "Gagné !"
else:
print "Perdu !"