from math import *
import random as rd
# attention randint(a,b) renvoie un entier aléatoire
# dans l'intervalle [a,b] avec b inclu
import numpy as np
import matplotlib.pyplot as plt

def demineur(n,n_b):
    """ Entrée : taille du plateau de jeu : n
    nb de bombes cachées : n_b
    Attention il faut n_b < n**2
    Sortie : une chaine de caractères"""
    Tc = placement_bombes(n,n_b)
    print(Tc) # on triche ! A enlever à la fin.
    Tc = remplissage(Tc)
    Ta = creation_affichage(n)
    affichage(Ta)
    while fin_de_jeu(...) == False:
        l,c = clic(Ta)
        Ta[l,c] = Tc[l,c]
        #if Tc[l,c] == 0:
            # Ta = tache_huile(...) # à faire en dernier
        affichage(Ta)
    if Tc[l,c] == 9:
        plt.title('Perdu')
        return('Perdu...')
    else:
        plt.title('Gagné !')
        return('Gagné !')

########################
## Fonctions secondaires
########################

def placement_bombes(n,n_b):
    """ Entrée: la taille du plateau de jeu (carré) et le nombre de bombes
    Sortie: un tableau avec des 0 dans les cases vides
    et 9 dans les cases avec une bombe"""

def remplissage(Tc):
    """ Entrée: un tableau avec seulement les bombes placées
    Sortie: Tc complété avec le nb de bombes ds les cases voisines"""

def creation_affichage(n):
    """ Entrée: entier = taille du tableau
    Sortie : tableau Ta = tableau qui sera affiché (-1 = case cachée)"""

def decompte_bombes_voisines(Tc,i,j):
    """Entrée : le tableau caché et les coordonnées d'une case
    Sortie : le nombre de bombes voisines de la case"""

# def fin_de_jeu(...):
#     """ Entrée : ... à vous de voir
#     Sortie : booléen (True si partie finie)"""


#######################
## Fonctions graphiques
#######################

def clic(Ta):
    """ récupère les coordonnées cartésiennes du clic de la souris sur la figure
    si la case a déjà été découverte le clic n'est pas valable
    Sortie : renvoie le numéro de ligne et le numéro de colonne"""
    [(x,y)] = plt.ginput(1,30)
    l,c = int(round(y)),int(round(x))
    # A VOUS d'ajouter une vérification (la case a-t-elle été déjà découverte)
    return (l,c)

def affichage(Ta):
    """ Entrée : le tableau Ta à afficher
    but : Image avec une grille pour séparer les cases """
    palette = plt.matplotlib.colors.ListedColormap(['black','white','cyan','blue','green','greenyellow','yellow','orange','tomato','deeppink', 'red'])
    n,n=np.shape(Ta)
    plt.close()
    plt.imshow(Ta,cmap=palette,clim=(-1,9))
    for i in range(n+1):
        plt.plot([-0.5,n-0.5],[-0.5+i,-0.5+i],'w',lw=2)
        plt.plot([-0.5+i,-0.5+i],[-0.5,n-0.5],'w',lw=2)
    # A VOUS d'ajouter l'affichage du contenu des cases (si != 0 et de -1)
    plt.show()

##########################################################
## Pour les plus rapides = on découvre tous les 0 contigus
##########################################################

# def tache_huile(...):
#     """ Entrée : à vous de choisir
#     Sortie : Ta est modifié avec la découverte de toutes les cases vides
#     contigues à la case initiale et toutes les cases contigües aux cases
#     contenant des 0"""


