noftaly

ISN n9

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