chasse_au_tresor.py

Created by adam-y

Created on May 01, 2023

8.07 KB

Projet libre de NSI


from random import randint
from kandinsky import fill_rect as fr
from kandinsky import draw_string as ds
from ion import keydown

jaune = (255, 181, 49)
rouge = (249, 65, 68)
orange = (243, 114, 44)
vert = (144, 190, 109)
violet = (148, 113, 222)

choix = 0

plateau_sup = [[0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0]]

plateau_inf = [["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"]]

choix_couleurs = {0: ('Facile', 128, 70, vert),
                  1: ('Moyen', 133, 100, orange),
                  2: ('Difficile', 115, 130, rouge),
                  3: ('Tutoriel', 118, 160, jaune)}

vies = [3]
nb_piques = [11]
nb_fausses = [3]
cases_retournees = []
cases_marquees = []

# détecte quand l'utilisateur relâche une touche
# tiré de https://my.numworks.com/python/cent20/menu
def attente(touches):
  while True:
    for nb in touches:
      if keydown(nb):
        while keydown(nb):
          True
        return nb

def curseur(x, y, c):
  fr(70 + 35 * x, 31 + 35 * y, 35, 1, c)
  fr(70 + 35 * x, 31 + 35 * y, 1, 35, c)
  fr(70 + 35 * x, 66 + 35 * y, 35, 1, c)
  fr(105 + 35 * x, 31 + 35 * y, 1, 35, c)

# aide : https://my.numworks.com/python/schraf/demineur
def grille():
  for i in range(6):
    if i < 6:
      fr(70, 31 + 35 * i, 176, 1, 'black')
    fr(70 + 35 * i, 31, 1, 176, 'black')

# affiche les cases marquées et retournées
def affiche():
  for coord1 in cases_marquees:
    fr(71 + 35 * coord1[0], 32 + 35 * coord1[1], 35, 2, rouge)
    fr(71 + 35 * coord1[0], 32 + 35 * coord1[1], 2, 35, rouge)
    fr(71 + 35 * coord1[0], 64 + 35 * coord1[1], 35, 2, rouge)
    fr(103 + 35 * coord1[0], 32 + 35 * coord1[1], 2, 35, rouge)
  for coord2 in cases_retournees:
    if plateau_inf[coord2[0]][coord2[1]] == 'V':
      couleur = vert
    elif plateau_inf[coord2[0]][coord2[1]] == 'O':
      couleur = orange
    elif plateau_inf[coord2[0]][coord2[1]] == 'R':
      couleur = rouge
    elif plateau_inf[coord2[0]][coord2[1]] == 'S':
      couleur = 'grey'
    fr(71 + 35 * coord2[0], 32 + 35 * coord2[1], 34, 34, couleur)

# vérifie l'état de la partie (gagné, perdu, etc.)
def verif(x, y):
  if plateau_inf[x][y] == 'X':
    fr(80, 60, 160, 100, 'black')
    ds("Bien joué !", 110, 100, 'white', 'black')
    attente([4, 52, 17])
    menu()
  elif plateau_inf[x][y] == 'S':
    vies[0] -= 1
    if vies[0] < 1:
      fr(90, 10, 130, 15, 'white')
      fr(80, 60, 160, 100, 'black')
      ds("Perdu !", 130, 100, 'white', 'black')
      attente([4, 52, 17])
      menu()

# réinitialise la partie
def reset():
  for x in range(5):
    for y in range(5):
      plateau_sup[x][y] = 0
      plateau_inf[x][y] = 'V'
  cases_retournees.clear()
  cases_marquees.clear()
  vies[0] = 3

def menu():
  global choix
  fr(0, 0, 320, 240, 'white')
  fr(0, 200, 320, 40, violet)
  ds('Chasse au trésor', 80, 20, 'black')
  ds('-----------------', 75, 40, 'black')
  ds("Code by nsi.xyz/chasse-au-tresor", 0, 202,'white', violet)
  while True:
    for i in range(4):
      texte, x, y, couleur = choix_couleurs[i]
      ds(texte, x, y, couleur if i == choix else 'black') # affichage des options
    touche = attente([1, 2, 4, 52])   
    if touche == 1 and choix > 0:
      choix -= 1
    elif touche == 2 and choix < 3:
      choix += 1
    elif touche == 4 or touche == 52:
      if choix == 0:
        nb_piques[0] = 11
        jeu()
      if choix == 1:
        nb_piques[0] = 13
        jeu()
      if choix == 2:
        nb_piques[0] = 15
        jeu()
      if choix == 3:
        tutoriel()

def tutoriel():
  fr(0, 0, 320, 240, 'white')
  ds("Votre but est de trouver la", 5, 0, 'black')
  ds("case qui cache le trésor.", 5, 15, 'black')
  ds("Un chiffre indique le nombre", 5, 40, 'black')
  ds("de cases adjacentes qui cachent", 5, 55, 'black')
  ds("un pique (4 max).", 5, 70, 'black')
  ds("Une case retournée affiche :", 5, 95, 'black')
  ds("- vert : loin du trésor,", 10, 110, 'black')
  ds("- vert", 10, 110, vert)
  ds("- orange : 2-4 cases du trésor,", 10, 125, 'black')
  ds("- orange", 10, 125, orange)
  ds("- rouge : 1-2 cases du trésor,", 10, 140, 'black')
  ds("- rouge", 10, 140, rouge)
  ds("Tombez sur plus de trois piques", 5, 165, 'black')
  ds("et vous perdez.", 5, 180, 'black')
  ds("/!\\ Trois couleurs sont fausses.", 5, 205, 'black')
  attente([4, 52, 17])
  menu()

# aide : https://my.numworks.com/python/schraf/demineur
def jeu():
  x, y = 0, 0
  reset()
  init_plateau()
  fr(0, 0, 320, 240, 'white')
  grille()
  while True:
    fr(100, 10, 130, 15, 'white')
    ds("<3\t" * vies[0], 88, 8, 'black')
    affiche()
    for a in range(0, 5):
      for b in range(0, 5):
        couleur = 'white'
        if (a, b) in cases_retournees:
          if plateau_inf[a][b] == 'V':
            couleur = vert
          elif plateau_inf[a][b] == 'O':
            couleur = orange
          elif plateau_inf[a][b] == 'R':
            couleur = rouge
          elif plateau_inf[a][b] == 'S':
            couleur = 'grey'
        ds(str(plateau_sup[a][b]), 83 + 35 * a, 41 + 35 * b, 'black', couleur) # affiche les chiffres
    while True:
      curseur(x, y, jaune)
      x_bis, y_bis = x, y
      touche = attente([0, 1, 2, 3, 4, 52, 17])
      if touche == 4 or touche == 52:
        if (x, y) not in cases_retournees:
          cases_retournees.append((x, y)) # retourne une case
          verif(x, y)
          break
      elif touche == 17:
        if (x, y) not in cases_marquees:
          cases_marquees.append((x, y)) # marque une case
        break
      elif x > 0 and touche == 0:
        x -= 1
      elif x < 4 and touche == 3:
        x += 1
      elif y > 0 and touche == 1:
        y -= 1
      elif y < 4 and touche == 2:
        y += 1
      curseur(x_bis, y_bis, 'black')
        

def init_plateau():
  # -------------------- plateau inférieur
  # placement du trésor
  tresor_x = randint(0, 4)
  tresor_y = randint(0, 4)  
  plateau_inf[tresor_x][tresor_y] = "X"
  # placement des cases rouges et orange
  tresor_x, tresor_y = randint(0, 4), randint(0, 4)
  plateau_inf[tresor_x][tresor_y] = "X"
  for i in range(tresor_x-2, tresor_x+3):
    for j in range(tresor_y-2, tresor_y+3):
      if 0 <= i <= 4 and 0 <= j <= 4 and (i, j) != (tresor_x, tresor_y):
        if abs(tresor_x-i) <= 1 and abs(tresor_y-j) <= 1:
          plateau_inf[i][j] = "R"
        elif abs(tresor_x-i) <= 2 and abs(tresor_y-j) <= 2:
          plateau_inf[i][j] = "O"
  # placement des piques
  for _ in range(nb_piques[0]):
    while True:
      pique_x = randint(0, 4)
      pique_y = randint(0, 4)
      if plateau_inf[pique_x][pique_y] != "S" and plateau_inf[pique_x][pique_y] != "X":
        plateau_inf[pique_x][pique_y] = "S"
        break
  # placement des fausses couleurs
  for _ in range(nb_fausses[0]):
    fausses_originales = []
    while True:
      fausse_x = randint(0, 4)
      fausse_y = randint(0, 4)
      if plateau_inf[fausse_x][fausse_y] != "S" and plateau_inf[fausse_x][fausse_y] != "X":
        if (fausse_x, fausse_y) not in fausses_originales:
          fausses_originales.append((fausse_x, fausse_y))
          while True:
            espace_nouv = randint(0, 2)
            if espace_nouv == 0 and plateau_inf[fausse_x][fausse_y] != "V":
              plateau_inf[fausse_x][fausse_y] = "V"
              break
            elif espace_nouv == 1 and plateau_inf[fausse_x][fausse_y] != "O":
              plateau_inf[fausse_x][fausse_y] = "O"
              break
            elif espace_nouv == 2 and plateau_inf[fausse_x][fausse_y] != "R":
              plateau_inf[fausse_x][fausse_y] = "R"
              break
          break
  # -------------------- plateau supérieur
  for ligne in range(0, 5):
    for colonne in range(0, 5):
      if plateau_inf[ligne][colonne] == "S":
        if ligne < 4: plateau_sup[ligne + 1][colonne] += 1
        if colonne < 4: plateau_sup[ligne][colonne + 1] += 1
        if ligne > 0: plateau_sup[ligne - 1][colonne] += 1
        if colonne > 0: plateau_sup[ligne][colonne - 1] += 1

menu()