scripteur78

Untitled

May 13th, 2023
980
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.56 KB | None | 0 0
  1. # game.py :
  2.  
  3. import pygame
  4. import random
  5. from agent import *
  6. import tensorflow as tf
  7. import numpy as np
  8.  
  9. # Définition des constantes
  10. WINDOW_SIZE = 400
  11. GRID_SIZE = 4
  12. CELL_SIZE = WINDOW_SIZE // GRID_SIZE
  13. BACKGROUND_COLOR = (187, 173, 160)
  14. CELL_COLORS = {
  15.     0: (205, 193, 180),
  16.     2: (238, 228, 218),
  17.     4: (237, 224, 200),
  18.     8: (242, 177, 121),
  19.     16: (245, 149, 99),
  20.     32: (246, 124, 95),
  21.     64: (246, 94, 59),
  22.     128: (237, 207, 114),
  23.     256: (237, 204, 97),
  24.     512: (237, 200, 80),
  25.     1024: (237, 197, 63),
  26.     2048: (237, 194, 46)
  27. }
  28.  
  29. # Initialisation de Pygame
  30. pygame.init()
  31. window = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE))
  32. pygame.display.set_caption("2048")
  33.  
  34. # Fonction pour initialiser la grille
  35. def init_grid():
  36.     grid = [[0] * GRID_SIZE for _ in range(GRID_SIZE)]
  37.     return grid
  38.  
  39. # Fonction pour ajouter une nouvelle tuile à la grille
  40. def add_new_tile(grid):
  41.     empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if grid[i][j] == 0]
  42.     if empty_cells:
  43.         row, col = random.choice(empty_cells)
  44.         grid[row][col] = random.choice([2, 4])
  45.  
  46. # Fonction pour afficher la grille
  47. def draw_grid(grid):
  48.     window.fill(BACKGROUND_COLOR)
  49.     for row in range(GRID_SIZE):
  50.         for col in range(GRID_SIZE):
  51.             cell_value = grid[row][col]
  52.             cell_color = CELL_COLORS.get(cell_value, (255, 255, 255))
  53.             pygame.draw.rect(window, cell_color, (col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE))
  54.             if cell_value != 0:
  55.                 font = pygame.font.Font(None, 50)
  56.                 text = font.render(str(cell_value), True, (0, 0, 0))
  57.                 text_rect = text.get_rect(center=(col * CELL_SIZE + CELL_SIZE // 2, row * CELL_SIZE + CELL_SIZE // 2))
  58.                 window.blit(text, text_rect)
  59.     pygame.display.update()
  60.  
  61. # Fonction pour déplacer les tuiles vers la gauche
  62. def move_left(grid):
  63.     for row in range(GRID_SIZE):
  64.         merged_row = False  # Indicateur pour la fusion dans la ligne
  65.         for col in range(1, GRID_SIZE):
  66.             if grid[row][col] != 0:
  67.                 value = grid[row][col]
  68.                 i = col - 1
  69.                 while i >= 0 and grid[row][i] == 0:
  70.                     grid[row][i] = value
  71.                     grid[row][i + 1] = 0
  72.                     i -= 1
  73.                 if i >= 0 and grid[row][i] == value and not merged_row:
  74.                     grid[row][i] *= 2
  75.                     grid[row][col] = 0
  76.                     merged_row = True  # Indiquer la fusion dans la ligne
  77.  
  78. # Fonction pour inverser la grille
  79. def transpose_grid(grid):
  80.     grid[:] = [list(row) for row in zip(*grid)]
  81.  
  82. # Fonction pour inverser les lignes de la grille
  83. def reverse_grid(grid):
  84.     for row in grid:
  85.         row.reverse()
  86.  
  87.  
  88.  
  89. # Fonction pour mettre à jour la grille en fonction de la touche pressée
  90. def update_grid(grid, key):
  91.     if key == pygame.K_LEFT:
  92.         move_left(grid)
  93.     elif key == pygame.K_RIGHT:
  94.         # Ajouter le code pour le mouvement vers la droite
  95.         reverse_grid(grid)
  96.         move_left(grid)
  97.         reverse_grid(grid)
  98.     elif key == pygame.K_UP:
  99.         # Ajouter le code pour le mouvement vers le haut
  100.         transpose_grid(grid)
  101.         move_left(grid)
  102.         transpose_grid(grid)
  103.     elif key == pygame.K_DOWN:
  104.         # Ajouter le code pour le mouvement vers le bas
  105.         transpose_grid(grid)
  106.         reverse_grid(grid)
  107.         move_left(grid)
  108.         reverse_grid(grid)
  109.         transpose_grid(grid)
  110.  
  111.  
  112.  
  113. # Fonction pour vérifier si aucun mouvement n'est possible
  114. def is_game_over(grid):
  115.     for row in range(GRID_SIZE):
  116.         for col in range(GRID_SIZE):
  117.             if grid[row][col] == 0:
  118.                 return False
  119.             if col < GRID_SIZE - 1 and grid[row][col] == grid[row][col + 1]:
  120.                 return False
  121.             if row < GRID_SIZE - 1 and grid[row][col] == grid[row + 1][col]:
  122.                 return False
  123.     return True
  124.  
  125. # Fonction principale pour jouer au jeu
  126. def play_game():
  127.     grid = init_grid()
  128.     add_new_tile(grid)
  129.     draw_grid(grid)
  130.     while True:
  131.         for event in pygame.event.get():
  132.             if event.type == pygame.QUIT:
  133.                 pygame.quit()
  134.                 return
  135.             elif event.type == pygame.KEYDOWN:
  136.                 if event.key == pygame.K_q:
  137.                     pygame.quit()
  138.                     return
  139.                 elif event.key in [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN]:
  140.                     prev_grid = [row[:] for row in grid]  # Copie de la grille précédente
  141.                     update_grid(grid, event.key)
  142.                     if grid != prev_grid:
  143.                         add_new_tile(grid)
  144.                     draw_grid(grid)
  145.                     if is_game_over(grid):
  146.                         grid = init_grid()
  147.                         add_new_tile(grid)
  148.                         draw_grid(grid)
  149.  
  150.  
  151.  
  152. # Appel de la fonction principale pour commencer le jeu
  153. play_game()
  154.  
  155. # agent.py :
  156.  
  157. import pygame
  158. from game import *
  159. import tensorflow as tf
  160. import numpy as np
  161.  
  162. MOUVES = [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN]
  163.  
  164. def get_model():
  165.     model = tf.keras.models.Sequential([
  166.         tf.keras.layers.Dense(128, activation='relu'),
  167.         tf.keras.layers.Dense(128, activation='relu'),
  168.         tf.keras.layers.Dense(4, activation='softmax')
  169.     ])
  170.     model.compile(optimizer='adam',
  171.                   loss='categorical_crossentropy',
  172.                   metrics=['accuracy'])
  173.     return model
  174.  
  175. def get_data():
  176.     X = []
  177.     y = []
  178.     for i in range(1000):
  179.         grid = init_grid()
  180.         while True:
  181.             prev_grid = [row[:] for row in grid]
  182.             key = np.random.choice(MOUVES)
  183.             update_grid(grid, key)
  184.             if grid != prev_grid:
  185.                 X.append(grid)
  186.                 y.append(MOUVES.index(key))
  187.                 break
  188.     X = np.array(X)
  189.     y = tf.keras.utils.to_categorical(y)
  190.     return X, y
  191.  
  192. def train_model(model, X, y):
  193.     model.fit(X, y, epochs=10)
  194.  
  195. def play_game(model):
  196.     grid = init_grid()
  197.     add_new_tile(grid)
  198.     draw_grid(grid)
  199.     while True:
  200.         for event in pygame.event.get():
  201.             if event.type == pygame.QUIT:
  202.                 pygame.quit()
  203.                 return
  204.             elif event.type == pygame.KEYDOWN:
  205.                 if event.key == pygame.K_q:
  206.                     pygame.quit()
  207.                     return
  208.                 elif event.key in MOUVES:
  209.                     prev_grid = [row[:] for row in grid]
  210.                     update_grid(grid, event.key)
  211.                     if grid != prev_grid:
  212.                         add_new_tile(grid)
  213.                     draw_grid(grid)
  214.                     if is_game_over(grid):
  215.                         pygame.quit()
  216.                         return
  217.                     X = np.array([grid])
  218.                     y = model.predict(X)
  219.                     key = MOUVES[np.argmax(y)]
  220.                     prev_grid = [row[:] for row in grid]
  221.                     update_grid(grid, key)
  222.                     if grid != prev_grid:
  223.                         add_new_tile(grid)
  224.                     draw_grid(grid)
  225.                     if is_game_over(grid):
  226.                         pygame.quit()
  227.                         return
  228.  
  229. def main():
  230.     pygame.init()
  231.     window = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE))
  232.     pygame.display.set_caption("2048")
  233.     model = get_model()
  234.     X, y = get_data()
  235.     train_model(model, X, y)
  236.     play_game(model)
  237.  
  238. if __name__ == '__main__':
  239.     main()
  240.  
Advertisement
Add Comment
Please, Sign In to add comment