noftaly

ISN 9

May 25th, 2020
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.42 KB | None | 0 0
  1. import random
  2. import time
  3. import math
  4.  
  5. # Mode "développeur" (tester + rapidement: désactive les temps entre les messages et attribue des noms automatiques aux
  6. # joueurs (1, 2, 3, 4))
  7. MODE_DEV = True
  8.  
  9. # Textes des cases mystères
  10. TEXTES_CASES_MYSTERES = ["vous revenez de 2 cases en arrière.",
  11.                          "vous avancez de 2 cases.", "vous pouvez rejouer."]
  12.  
  13. MINIJEUX = ["Quizz", "Dé"]
  14. QUESTIONS_QUIZZ_HISTOIRE = ["Quel est le nom de la célèbre prison assiégée lors de la Révolution le 14 juillet 1789 ? (pas de majuscules)",
  15.                             "Quelle est la date de signature de l'armistice suivantla Seconde Guerre Mondiale ? (jour en chiffre et mois en lettres)"]
  16. REPONSES_HISTOIRE = ["bastille", "8 mai"]
  17. QUESTIONS_QUIZZ_GEOGRAPHIE = ["Quelle est la capitale du Canada ?", "Combien d'États comptent les États-Unis ?",
  18.                                 "Quel pays d'Asie possède sur son drapeau national un dragon blanc ?"]
  19. REPONSES_GEOGRAPHIE = ["ottawa", "50", "bhoutan"]
  20.  
  21. NOMBRE_CASES = 7
  22. NOMBRE_CASES_COLONNES = 6
  23. CASES_COLONNES_AVEC_JEU = [1, 2]
  24. # Nombre de cheval par joueur
  25. NOMBRE_PIONS_PAR_JOUEUR = 2
  26. # Liste de toutes les cases
  27. cases = []
  28. # Liste de tous les pions
  29. joueurs = []
  30.  
  31. gagnant = False
  32.  
  33.  
  34. # Fonction pour lancer le dé (renvoie un nombre entre 1 et 6 inclus)
  35. def lancer_de():
  36.     return random.randint(1, 6)
  37.  
  38.  
  39. def est_nombre(value):
  40.     try:
  41.         return not math.isnan(float(value))
  42.     except ValueError:
  43.         return False
  44.  
  45.  
  46. def demande_nombre(question):
  47.     nombre = input(question)
  48.     while not est_nombre(nombre):
  49.         nombre = input("Entrez un nombre valide (1, 2...) :")
  50.     return int(nombre)
  51.  
  52.  
  53. # Classe d'une case
  54. class Case:
  55.     def __init__(self, id_case, mystere):
  56.         self.mystere = False
  57.         self.id_case = id_case
  58.         if mystere:
  59.             self.text = TEXTES_CASES_MYSTERES[random.randint(0, len(TEXTES_CASES_MYSTERES) - 1)]
  60.  
  61.  
  62. # Class d'un joueur
  63. class Joueur:
  64.     def __init__(self, nom):
  65.         self.nom = nom
  66.         self.a_relance = False
  67.         self.a_gagne = False
  68.         self.pions = []
  69.         self.score = 0
  70.         for i in range(NOMBRE_PIONS_PAR_JOUEUR):
  71.             self.pions.append(Pion(i + 1, self))
  72.         # Nombre de pions qui peuvent encore jouer (qui n'ont pas gagnés). Utilisé pour savoir si on doit lui demander
  73.         # de choisir un pion a bouger en début de tour ou pas. (pas besoin de demander s'il ne lui reste qu'un pion)
  74.         self.nombre_pions_en_jeu = NOMBRE_PIONS_PAR_JOUEUR
  75.  
  76.     def choisir_pion(self):
  77.         # S'il a plusieurs pions en jeu, on lui demande avec le quel il veut jouer
  78.         if self.nombre_pions_en_jeu > 1:
  79.             for pion_joueur in self.pions:
  80.                 if not pion_joueur.a_fini:
  81.                     if pion_joueur.dans_colonne:
  82.                         print("  - Pion", pion_joueur.numero, ": case", pion_joueur.id_case, "|",
  83.                               NOMBRE_CASES_COLONNES - pion_joueur.cases_colonne, "cases restantes avant la fin.")
  84.                     else:
  85.                         print("  - Pion", pion_joueur.numero, ": case", pion_joueur.id_case, "|",
  86.                               pion_joueur.cases_restantes, "cases restantes avant la colonne.")
  87.  
  88.             index_pion = demande_nombre("Choisissez avec quel pion jouer (1, 2, ...) :")
  89.             index_pion -= 1
  90.             pion = joueur.pions[index_pion]
  91.  
  92.         # Sinon il joue avec le seul pion qui n'a pas fini
  93.         else:
  94.             for pion_joueur in joueur.pions:
  95.                 if not pion_joueur.a_fini:
  96.                     pion = pion_joueur
  97.         return pion
  98.  
  99.     def calcul_score(self):
  100.         pion_fini = NOMBRE_PIONS_PAR_JOUEUR - self.nombre_pions_en_jeu
  101.         self.score += pion_fini * 10
  102.  
  103.         for pion_joueur in self.pions:
  104.             if not pion_joueur.a_fini:
  105.                 self.score += pion_joueur.id_case
  106.                 if pion_joueur.dans_colonne:
  107.                     self.score += pion_joueur.cases_colonne * 2
  108.  
  109.  
  110. # Classe d'un pion
  111. class Pion:
  112.     def __init__(self, numero, joueur):
  113.         self.numero = numero
  114.         self.id_case = 0
  115.         self.joueur = joueur
  116.  
  117.         self.cases_restantes = NOMBRE_CASES
  118.         self.cases_colonne = 0
  119.         self.dans_colonne = False
  120.  
  121.         self.a_fini = False
  122.  
  123.     def move(self, de):
  124.         global gagnant
  125.  
  126.         self.id_case += de
  127.  
  128.         # Si on est déjà dans la colonne finale, plus besoin de rien faire.
  129.         if self.dans_colonne:
  130.             self.cases_colonne += de
  131.             if self.cases_colonne == NOMBRE_CASES_COLONNES:
  132.                 print("Bravo, vous êtes arrivé au milieu ! Le pion", pion.numero, "a terminé !")
  133.                 joueur.nombre_pions_en_jeu -= 1
  134.                 self.a_fini = True
  135.                 if joueur.nombre_pions_en_jeu == 0:
  136.                     joueur.a_gagne = True
  137.                     gagnant = self.joueur
  138.  
  139.         else:
  140.             self.cases_restantes -= de
  141.  
  142.             if self.cases_restantes < 0:
  143.                 recul = int(math.fabs(self.id_case - NOMBRE_CASES))
  144.                 self.id_case -= recul * 2
  145.                 self.cases_restantes += recul * 2
  146.                 print("Eh pas si vite ! Vous avez fait un", de,
  147.                       "et avez dépassé le début de la colonne. Vous avez donc avancé de", de - recul, "et reculé de",
  148.                       recul, ". Vous êtes maintenant sur la case", self.id_case, ".")
  149.                 if not MODE_DEV: time.sleep(2)
  150.             else:
  151.                 print("Vous vous êtes déplacé de", mvt, "case(s). Vous êtes maintenant sur la case", self.id_case, ".")
  152.                 if self.cases_restantes == 0:
  153.                     self.id_case += 1
  154.                     self.cases_colonne = 1
  155.                     self.dans_colonne = True
  156.                     print("Vous venez d'entrer dans votre colonne finale ! Bravo.")
  157.                 if not MODE_DEV: time.sleep(2)
  158.  
  159.  
  160. # Création de toutes les cases
  161. for i in range(NOMBRE_CASES):
  162.     # 1 case sur 14 en partant de la 7ème est une case mystère
  163.     if (i + 7) % 14 == 0:
  164.         cases.append(Case(i, True))
  165.     else:
  166.         cases.append(Case(i, False))
  167.  
  168. noms_pris = []
  169. # Création de tous les pions
  170. for i in range(4):
  171.     if MODE_DEV:
  172.         nom = str(i + 1)
  173.     else:
  174.         nom = input("Nom du joueur " + str(i + 1) + " : ")
  175.         while nom in noms_pris:
  176.             nom = input("Ce nom est déjà pris. Choisis un nouveau nom : ")
  177.         noms_pris.append(nom)
  178.     joueurs.append(Joueur(nom))
  179.  
  180.  
  181. # ----- Code pour les tours --------------
  182.  
  183. # Numéro du tour
  184. tour = 1
  185.  
  186. # Boucle infinie (tant que personne n'a gagné)
  187. while not gagnant:
  188.     print("")
  189.     print("")
  190.     print("Le tour", tour, "commence !")
  191.  
  192.     # Pour chaque tour, on fait les 4 joueurs
  193.     for i in range(4):
  194.         joueur = joueurs[i]
  195.  
  196.         print("")
  197.         print("")
  198.         print("Joueur", joueur.nom, "c'est votre tour !")
  199.         print("Vous avez", joueur.nombre_pions_en_jeu, "pions en jeu.")
  200.         pion = joueur.choisir_pion()
  201.  
  202.         if pion.dans_colonne:
  203.             print("Vous utilisez le pion", pion.numero, "(case", pion.id_case, "|",
  204.                   NOMBRE_CASES_COLONNES - pion.cases_colonne, "cases restantes avant la fin)")
  205.         else:
  206.             print("Vous utilisez le pion", pion.numero, "(case", pion.id_case, "|",
  207.                   pion.cases_restantes, "cases restantes avant la colonne)")
  208.  
  209.         if not MODE_DEV: time.sleep(1)
  210.         print("Lancez le dé puis déplacez-vous d'autant de cases que le chiffre indiqué")
  211.         if not MODE_DEV: time.sleep(2)
  212.         mvt = lancer_de()
  213.         print("Vous faites un", mvt, "!")
  214.  
  215.         # Le joueur est dans la colonne
  216.         if pion.dans_colonne:
  217.             # Il faut faire avec le dé le même nombre que le numéro de notre case. Si on est devant la colonne (pas
  218.             # encore dedans) il faut faire 1.
  219.             expecte = pion.cases_colonne
  220.  
  221.             if mvt == expecte:
  222.                 pion.move(1)
  223.             else:
  224.                 print("Vous n'avez pas avancé car il fallait faire un", expecte, "et vous avez fait un", mvt, ".")
  225.                 if not MODE_DEV: time.sleep(1)
  226.                 print("Vous êtes toujours sur la", pion.cases_colonne, "e case de la colonne finale.")
  227.  
  228.             if pion.cases_colonne in CASES_COLONNES_AVEC_JEU:
  229.                 if not MODE_DEV: time.sleep(1)
  230.                 print("Vous allez participer à un mini-jeu !")
  231.                 mini_jeu = MINIJEUX[random.randint(0, len(MINIJEUX) - 1)]
  232.                 if mini_jeu == "Quizz":
  233.                     print("Un quizz est lancé ! Répondez aux questions posées sans majuscules ou ponctuation.")
  234.                     if not MODE_DEV: time.sleep(2)
  235.                     categorie = input("Histoire ou Géographie ? (pas de majuscules)")
  236.                     while categorie not in ['histoire', 'géographie']:
  237.                         categorie = input("Histoire ou Géographie ? (pas de majuscules)")
  238.  
  239.                     if categorie == "histoire":
  240.                         print("Vous avez choisi Histoire. ")
  241.                         num_question_histoire = random.randint(0, len(QUESTIONS_QUIZZ_HISTOIRE)-1)
  242.                         question_histoire = QUESTIONS_QUIZZ_HISTOIRE[num_question_histoire]
  243.                         print(question_histoire)
  244.                         if not MODE_DEV: time.sleep(5)
  245.  
  246.                         for i in range(0, len(joueurs)):
  247.                             adversaire = joueurs[i]
  248.                             reponse_histoire = input("Joueur " + adversaire.nom + ", quelle est votre réponse ?")
  249.                             if reponse_histoire == REPONSES_HISTOIRE[num_question_histoire]:
  250.                                 print("Bien joué vous avez répondu correctement !")
  251.                                 pion_adversaire = pion if adversaire.nom == joueur.nom else adversaire.choisir_pion()
  252.                                 pion_adversaire.move(1)
  253.                             else:
  254.                                 print("Dommage, mauvaise réponse...")
  255.  
  256.                     elif categorie == "géographie":
  257.                         print("Vous avez choisi Géographie. ")
  258.                         num_question_geographie = random.randint(0, len(QUESTIONS_QUIZZ_GEOGRAPHIE)-1)
  259.                         question_geographie = QUESTIONS_QUIZZ_GEOGRAPHIE[num_question_geographie]
  260.                         print(question_geographie)
  261.                         if not MODE_DEV: time.sleep(5)
  262.  
  263.                         for i in range(1, len(joueurs)+1):
  264.                             adversaire = joueurs[i]
  265.                             reponse_geographie = input("Joueur " + adversaire.nom + ", quelle est votre réponse ?")
  266.                             if reponse_geographie == REPONSES_GEOGRAPHIE[num_question_geographie]:
  267.                                 print("Bien joué vous avez répondu correctement !")
  268.                                 pion_adversaire = pion if adversaire.nom == joueur.nom else adversaire.choisir_pion()
  269.                                 pion_adversaire.move(1)
  270.                             else:
  271.                                 print("Dommage, mauvaise réponse...")
  272.  
  273.                 elif mini_jeu == "Dé":
  274.                     # On choisit un adversaire, qui n'est pas le joueur
  275.                     adversaire = joueurs[random.randint(0, len(joueurs) - 1)]
  276.                     while adversaire.nom == joueur.nom:
  277.                         adversaire = joueurs[random.randint(0, len(joueurs) - 1)]
  278.  
  279.                     print("Un Jeu du Dé est lancé !", joueur.nom, "affronte", adversaire.nom)
  280.                     if not MODE_DEV: time.sleep(2)
  281.                     print("Le Jeu du Dé commence, devinez le chiffre sur lequel le dé va tomber ! Le gagnant avancera d'une case.")
  282.                     if not MODE_DEV: time.sleep(2)
  283.  
  284.                     chiffre_mystere = lancer_de()
  285.  
  286.                     # Les joueurs proposent leurs chiffres
  287.                     chiffre_propose1 = demande_nombre(joueur.nom + ", proposez votre prédiction")
  288.  
  289.                     chiffre_propose2 = demande_nombre(adversaire.nom + ", proposez votre prédiction")
  290.  
  291.                     if not MODE_DEV: time.sleep(1)
  292.                     print("Et le chiffre est...")
  293.                     if not MODE_DEV: time.sleep(2)
  294.                     print(chiffre_mystere, "!!!")
  295.                     if not MODE_DEV: time.sleep(1)
  296.  
  297.                     # Si le chiffre est différent chez les deux Joueurs
  298.                     if chiffre_propose1 != chiffre_mystere and chiffre_propose2 != chiffre_mystere:
  299.                         print("Vous avez tous les deux perdus, vous n'avez pas prédis le bon chiffre, c'était une chance sur six aussi !")
  300.                     # Si le chiffre a été prédis par le Joueur 1 mais pas par le Joueur 2
  301.                     elif chiffre_propose1 == chiffre_mystere and chiffre_propose2 != chiffre_mystere:
  302.                         print(joueur.nom, "a réussi à deviner le chiffre du dé !", adversaire.nom, "tu as perdu !")
  303.                         pion.move(1)
  304.                     elif chiffre_propose2 == chiffre_mystere and chiffre_propose1 != chiffre_mystere:
  305.                         print(adversaire.nom, "a réussi à deviner le chiffre du dé !", joueur.nom, "tu as perdu !")
  306.                         if not MODE_DEV: time.sleep(1)
  307.                         pion_adversaire = adversaire.choisir_pion()
  308.                         pion_adversaire.move(1)
  309.  
  310.                     # Si le chiffre est identique chez les deux Joueurs
  311.                     else:
  312.                         print("Vous avez gagné tous les deux ! Vous avez prédis le bon chiffre, quels chanceux vous êtes !")
  313.                         pion.move(1)
  314.                         pion_adversaire = adversaire.choisir_pion()
  315.                         pion_adversaire.move(1)
  316.  
  317.         # Le joueur n'est pas dans la colonne
  318.         else:
  319.             # On bouge le pion (les messages et le check de si on dépasse la case finale sont aussi dans cette méthode)
  320.             pion.move(mvt)
  321.  
  322.             if pion.id_case % 7 == 0:
  323.                 if not MODE_DEV:
  324.                     time.sleep(1)
  325.                 text = TEXTES_CASES_MYSTERES[random.randint(0, len(TEXTES_CASES_MYSTERES) - 1)]
  326.                 print("Vous êtes atteris sur une case mystère,", text)
  327.                 if not MODE_DEV: time.sleep(2)
  328.                 if text == "vous revenez de 2 cases en arrière.":
  329.                     pion.id_case -= 2
  330.                     print("Vous arrivez sur la case", pion.id_case, ".")
  331.                 if text == "vous avancez de 2 cases.":
  332.                     pion.id_case += 2
  333.                     print("Vous arrivez sur la case", pion.id_case, ".")
  334.                 if text == "vous pouvez rejouer.":
  335.                     print("Lancez le dé puis déplacez-vous d'autant de cases que le chiffre indiqué")
  336.                     if not MODE_DEV: time.sleep(2)
  337.                     mvt = lancer_de()
  338.                     print("Vous faites un", mvt, "!")
  339.                     print("Vous arrivez sur la case", pion.id_case, ".")
  340.  
  341.             if not joueur.a_relance:
  342.                 if not MODE_DEV: time.sleep(1)
  343.                 reponse = input("Voulez-vous tenter de relancer les dés (possible qu'une fois dans la partie) ? (oui/non) :")
  344.  
  345.                 if reponse == "oui":
  346.                     joueur.a_relance = True
  347.                     devine = demande_nombre("Prévoyez la valeur du dé entre 1 et 6 :")
  348.  
  349.                     relance = lancer_de()
  350.                     if devine == relance:
  351.                         pion.move(relance)
  352.                     else:
  353.                         print("Dommage vous avez raté votre seul chance de relancer les dés...")
  354.  
  355.         # S'il y a un gagnant, on quitte le "for" qui boucle les 4 joueurs
  356.         if gagnant:
  357.             break
  358.  
  359.     # Quand les 4 joueurs ont joués, on passe au tour suivant
  360.     tour += 1
  361.  
  362. print("")
  363. print("")
  364. print("")
  365. print("")
  366. print("La partie est terminée ! Tous les pions du joueur", gagnant.nom, "sont arrivés ! Il remporte la partie !")
  367. if not MODE_DEV: time.sleep(1)
  368. print("")
  369. print("Voici le classement :")
  370.  
  371.  
  372. for i in range(len(joueurs)):
  373.     joueurs[i].calcul_score()
  374.  
  375. classement = sorted(joueurs, key=lambda j: j.score, reverse=True)
  376.  
  377. for i in range(len(classement)):
  378.     print(i + 1, ":", classement[i].nom, "(" + str(classement[i].nombre_pions_en_jeu), "pion(s) en jeu) [" + str(classement[i].score) + "]")
Add Comment
Please, Sign In to add comment