from math import *
import random as rd
import numpy as np
import matplotlib.pyplot as plt

def demineur(n,n_b):
    """ Entrée : taille du plateau de jeu : nxn
    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)
    Tc = remplissage(Tc)
    Ta = creation_affichage(n)
    affichage(Ta)
    while fin_de_jeu(Ta,n_b) == 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"""
    Tc = np.zeros([n,n],dtype='int')
    b = 0
    while b<n_b:
        l = rd.randint(0,n-1)
        c = rd.randint(0,n-1)
        if Tc[l,c] == 0:
            Tc[l,c] = 9
            b=b+1
    return Tc

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"""
    (n,n)=np.shape(Tc)
    for i in range(n):
        for j in range(n):
            if Tc[i,j]==0:
                c = 0
                for k in range(i-1,i+2):
                    for l in range(j-1,j+2):
                        if 0<=k<=n-1 and 0<=l<=n-1:
                            if Tc[k,l] == 9 :
                                c = c+1
                Tc[i,j] = c
    return Tc

def creation_affichage(n):
    """ Entrée: entier = taille du tableau
    Sortie : tableau Ta = tableau qui sera affiché (-1 = case cachée)"""
    Ta = np.ones([n,n],dtype='int')*(-1)
    return Ta


def fin_de_jeu(Ta,n_b):
    """ 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))
    while Ta[l,c]!=-1:
        [(x,y)] = plt.ginput(1,30)
        l,c = int(round(y)),int(round(x))
    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)
    for i in range(n):
        for j in range(n):
            if Ta[i,j]> 0 :
                plt.text(j,i,str(Ta[i,j]))
    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"""


