"""
Dimensions des cases : 146 px
Dimension du plateau: 585 px
"""

from numpy import array
from random import randint, choice
import pygame

"""
Définition de l'objet: Taquin()
"""

class Taquin:
    def __init__(self):
        self.plateau = array( [ [1,2,3,4], [5,6,7,8] , [9,10,11,12], [13,14,15,0] ] )
        self.directions = [] # liste des mouvements utilisés pour mélanger le taquin
        
    def __str__(self):
        return self.plateau.__str__()
        
    def poszero(self):
        for y in range(4):
            for x in range(4):
                if self.plateau[y][x] == 0: return y,x
                
    def possible_mouvements(self):
        i,j = self.poszero()
        impossible = []
        possible = ['L' , 'R' , 'U' , 'D']
        if i == 0:
            impossible.append('D')
        if i == 3:
            impossible.append('U')
        if j == 0:
            impossible.append('R')
        if j == 3:
            impossible.append('L')
        
        return [ i for i in possible if i not in impossible ]
        
    def down(self):
        i,j = self.poszero()
        if i != 0:
            self.plateau[i][j] = self.plateau[i-1][j]
            self.plateau[i-1][j] = 0
            
    def up(self):
        i,j = self.poszero()
        if i != 3:
            self.plateau[i][j] = self.plateau[i+1][j]
            self.plateau[i+1][j] = 0
            
    def left(self):
        i,j = self.poszero()
        if j != 3:
            self.plateau[i][j] = self.plateau[i][j+1]
            self.plateau[i][j+1] = 0
            
    def right(self):
        i,j = self.poszero()
        if j != 0:
            self.plateau[i][j] = self.plateau[i][j-1]
            self.plateau[i][j-1] = 0
            
    def mix(self):
        for _ in range( 10, 100 ):
            direction = choice( self.possible_mouvements() )
            self.directions.append(direction)
            match direction:
                case 'L' : self.left()
                case 'R' : self.right()
                case 'U' : self.up()
                case _ : self.down()
                
    def graphicplate(self, screen, win = False):
        for y in range(4):
            for x in range(4):
                if self.plateau[y][x] != 0:
                    #screen.blit(self.case, (16+x*146, 16+y*146))
                    screen.blit(self.numbers[self.plateau[y][x]], (16+x*146, 16+y*146))
        if win:
            screen.blit(self.win, (16, 16))
                
    def play(self):
        T.mix()
        pygame.init()
        screen = pygame.display.set_mode((610, 610))
        pygame.display.set_caption('Le jeu du Taquin - Stéphane Pasquet - mathweb.fr')
        self.fond = pygame.image.load('fond.png').convert_alpha()
        self.one = pygame.image.load('1.png').convert_alpha()
        self.two = pygame.image.load('2.png').convert_alpha()
        self.three = pygame.image.load('3.png').convert_alpha()
        self.four = pygame.image.load('4.png').convert_alpha()
        self.five = pygame.image.load('5.png').convert_alpha()
        self.six = pygame.image.load('6.png').convert_alpha()
        self.seven = pygame.image.load('7.png').convert_alpha()
        self.eight = pygame.image.load('8.png').convert_alpha()
        self.nine = pygame.image.load('9.png').convert_alpha()
        self.ten = pygame.image.load('10.png').convert_alpha()
        self.eleven = pygame.image.load('11.png').convert_alpha()
        self.twelve = pygame.image.load('12.png').convert_alpha()
        self.thirteen = pygame.image.load('13.png').convert_alpha()
        self.fourteen = pygame.image.load('14.png').convert_alpha()
        self.fiveteen = pygame.image.load('15.png').convert_alpha()
        self.win = pygame.image.load('win.png').convert_alpha()
        self.numbers = [ '' , self.one , self.two , self.three , self.four , self.five , self.six , self.seven , self.eight , self.nine, \
                                self.ten , self.eleven , self.twelve , self.thirteen , self.fourteen , self.fiveteen ]
        green = (9,44,28)
        running = True
        
        
        while running:
            screen.fill( green )
            screen.blit(self.fond, (16, 16))
            
            if (self.plateau == array( [ [1,2,3,4], [5,6,7,8] , [9,10,11,12], [13,14,15,0] ] )).all():
                self.graphicplate(screen, win = True)
            else:
                self.graphicplate(screen)
                
            
            # Fermeture de la fenêtre
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP:
                        self.up()
                    elif event.key == pygame.K_DOWN:
                        self.down()
                    elif event.key == pygame.K_LEFT:
                        self.left()
                    elif event.key == pygame.K_RIGHT:
                        self.right()
                
            pygame.display.flip()
            
        pygame.quit()
                  
        
if __name__ == "__main__":
    T = Taquin()
    T.play()

