Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.63 KB | None | 0 0
  1. def load_fichier_lettres(nom_fichier_lettres):
  2. """Cette fonction ouvre et lit un fichier texte dont le nom est fourni en argument.
  3. Ce fichier contient 26 lignes (une pour
  4. chaque lettre de l'alphabet). Chaque ligne
  5. est composée d'une lettre, d'un nombre
  6. d'occurences de cette lettre dans le jeu
  7. et des points que la lettre rapporte au
  8. joueur s'il la place, chacun séparé par
  9. un espace. (cf fin de la page 2 de l'énoncé
  10. pour voir un extrait du fichier
  11. (lettres.txt)).
  12. Elle renvoie ensuite deux dictionnaires dont
  13. les clés sont les lettres contenues dans le
  14. fichier texte et les valeurs sont respectivement
  15. le nombre d'occurences et les points que la lettre
  16. rapporte.
  17. Arguments :
  18. - nom_fichier_lettres (str) : Un chaine de caractère
  19. qui représente le nom du fichier texte à ouvrir
  20. Valeurs de retour (dans cet ordre):
  21. - dict : un dictionnaire avec comme clés les lettres contenues dans le fichier et
  22. comme valeur le nombre d'occurences de
  23. cette lettre
  24. - dict : un dictionnaire avec comme clés
  25. les lettres contenues dans le fichier et
  26. comme valeur les points associés à chaque lettre
  27. """
  28. f = open(nom_fichier_lettres, "r")
  29. fichier = f.readlines()
  30. f.close()
  31. dict_occ = {}
  32. dict_pts = {}
  33. for i in range(len(fichier)):
  34. fichier[i] = fichier[i].split()
  35. dict_occ[fichier[i][0]] = int(fichier[i][1])
  36. dict_pts[fichier[i][0]] = int(fichier[i][2])
  37. return dict_occ, dict_pts
  38.  
  39.  
  40. def load_fichier_dico(nom_fichier_dico):
  41. """ Renvoie une liste de 15 sets dont chaque set contient tous les mots de longueur (l+1)
  42. Arguments :
  43. - nom_fichier_dico (str) : Un chaine de caractère
  44. qui représente le nom du fichier texte à ouvrir
  45. Valeurs de retour (dans cet ordre):
  46. - list : une liste de 15 ensembles d'indice i tel que l'ensemble i contient tous les mots de longueur i+1
  47. """
  48. f = open(nom_fichier_dico, "r")
  49. fichier = f.readlines()
  50. f.close()
  51. mots_scrabble = list()
  52. for i in range(15):
  53. mots_scrabble.append(set())
  54. for i in range(len(fichier)):
  55. fichier[i] = fichier[i].strip()
  56. if len(fichier[i]) <= len(mots_scrabble):
  57. mots_scrabble[len(fichier[i]) - 1].add(str(fichier[i]))
  58. return mots_scrabble
  59.  
  60.  
  61. def pioche_init(occurences_lettres):
  62. """ Cette fonction renvoie une chaine de
  63. caractères (str) contenant toutes les
  64. lettres disponibles lors de
  65. l'initialisation du jeu, classées dans l'ordre alphabétique.
  66. Arguments:
  67. - occurences_lettres (dict) : dictionnaire ayant comme clés
  68. toutes les lettres de l'alphabet
  69. et comme valeur, le nombre de fois (int)
  70. que chaque lettre devra être ajoutée
  71. à la pioche
  72. Valeur de retour:
  73. - str : une chaine de caractère contenant toutes les lettres de la pioche classées dans l'ordre
  74. alphabétique.
  75. """
  76. pioche = []
  77. lettres = list(occurences_lettres.keys())
  78. occurences = list(occurences_lettres.values())
  79. for i in range(len(occurences_lettres)):
  80. for j in range(occurences[i]):
  81. pioche.append(lettres[i])
  82. pioche.sort()
  83. return pioche
  84.  
  85.  
  86. def remplir_chevalet(chevalet, sachet):
  87. """Cette fonction tire des lettres du sachet jusqu'a ce que le chevalet soit rempli ou jusqu'a ce qu'il n'y ait plus de lettres."""
  88. while len(chevalet) < 7 and len(sachet) > 0:
  89. chevalet.append(sachet[-1])
  90. del sachet[-1]
  91. return chevalet
  92.  
  93.  
  94. def plateau_init(dimensions):
  95. """Cette fonction va créer le plateau
  96. de jeu. Le plateau de jeu consiste
  97. en une liste de nb_lignes sous-listes,
  98. chacune de longueur nb_colonnes, où
  99. chaque élément représente une case
  100. du plateau grâce à la valeur "_"
  101. (underscore).
  102. Si nb_lignes = nb_colonnes = 3, on aura
  103. par exemple:
  104. plateau = [["_", "_", "_"], ["_", "_", "_"],["_", "_", "_"]]
  105. Arguments:
  106. - dimensions (tuple) : un tuple de deux nombres
  107. entiers et positifs. Le premier élément est le
  108. nombre de lignes (nb_lignes (int)) et le deuxième
  109. élément est le nombre de colonnes (nb_colonnes (int))
  110. Valeur de retour:
  111. - liste: la liste de sous-listes qui représente le plateau"""
  112. return [['_'] * dimensions[1] for i in range(dimensions[0])]
  113.  
  114.  
  115. def propose_mot(msg_position_ligne, msg_position_colonne, msg_direction, msg_mot):
  116. """Cette fonction demande au joueur où et quel mot
  117. il désire placer.
  118. La séquence d'inputs et de vérification
  119. est la suivante:
  120. 1. Demander le numéro de la ligne de la
  121. première lettre du mot à placer. Utilisez comme
  122. argument de la fonction input() : msg_position_ligne
  123. 1.1 Tant que le joueur n'entre pas un numéro de ligne valide
  124. (un caractère convertible en un nombre entier compris entre 0
  125. et NB_lIGNE-1), retourner en 1.
  126. 2. Demander le numéro de la colonne de la
  127. première lettre du mot à placer. Utilisez comme
  128. argument de la fonction input() : msg_position_colonne
  129. 2.1 Tant que le joueur n'entre pas un numéro de colonne valide(un caractère
  130. convertible en un nombre entier compris entre 0 et NB_COLONNE-1),
  131. retourner en 2.
  132. 3. Demander la direction du mot à placer ("h" ou "v"). Utilisez comme
  133. argument de la fonction input() : msg_direction
  134. 3.1 Tant que le joueur n'entre pas une direction valide(le caractère "h" ou "v"),
  135. retourner en 3.
  136. 4. Demander le mot à placer. Utilisez comme
  137. argument de la fonction input() : msg_mot
  138. 4.1 Tant que le joueur n'entre pas un mot valide(uniquement des lettres en majuscule
  139. ou minuscule), retourner en 4.
  140. Attention, si le mot à placer s'appuie sur une ou
  141. plusieurs lettres présentes sur le plateau, il faut
  142. préciser tout le mot qui sera formé et pas seulement
  143. les lettres à placer. Par exemple, partons de la situation
  144. initial suivante:
  145. plateau = [["_", "_", "_"], ["_", "_", "S"],["_", "_", "_"]]
  146. lettres = ['A','N','Z','Y','W','U','V']
  147. Si on veut placer le mot "ANS" avec les lettres "A", "N",
  148. à la position (1,0), avec comme direction "h"
  149. il faut proposer le mot "ANS" et non pas "AN" à placer.
  150. De même, imaginons que nous partons de la deuxième situation
  151. initiale suivante :
  152. plateau = [["_", "_", "_","_"], ["D", "_", "_", "_"],["E","_", "_", "_"]]
  153. lettres = ['A','N','S','Y','W','U','V']
  154. Si on veut placer le mot "ANS" avec les lettres "A", "N","S",
  155. à la position (1,1), avec comme direction "h". Le mot final sera "DANS".
  156. Il faut alors proposer "DANS" comme mot, et non pas "ANS".
  157. Arguments :
  158. - msg_position_ligne (str) : une chaine de caractère à afficher à l'écran
  159. du joueur lors de l'input pour lui demander quelle est le numéro
  160. de ligne de la première lettre de son mot.
  161. - msg_position_colonne (str) : une chaine de caractère à afficher à l'écran
  162. du joueur lors de l'input pour lui demander quelle est le numéro
  163. de colonne de la première lettre de son mot.
  164. - msg_direction (str) : une chaine de caractère à afficher à l'écran
  165. du joueur lors de l'input pour lui demander quelle est la
  166. direction pour son mot ("h" = horizontale ou "v" = verticale)
  167. - msg_mot (str) : une chaine de caractère à afficher à l'écran
  168. du joueur lors de l'input pour lui demander quel mot le joueur
  169. désire placer
  170. Valeurs de retour (dans cet ordre):
  171. - (str): une chaine de caractère en MAJUSCULE qui indique le mot à placer
  172. - tuple: un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  173. et le numéro de la colonne (c) de la première lettre du mot à placer
  174. - (str): un charactère ("h" ou "v") qui indique la direction du mot
  175. """
  176. l, c, d, m = '', '', '', ''
  177. while l.isdigit() == False or int(l) < 0 or 14 < int(l):
  178. l = input(msg_position_ligne)
  179. while c.isdigit() == False or int(c) < 0 or 14 < int(c):
  180. c = input(msg_position_colonne)
  181. while d != 'H' and d != 'h' and d != 'V' and d != 'v':
  182. d = input(msg_direction)
  183. while not m.isalpha():
  184. m = input(msg_mot)
  185. return m.upper(), (int(l), int(c)), d.lower()
  186.  
  187.  
  188. def verif_premier_tour(coup):
  189. """Cette fonction retourne True si le mot à placer passe bien par la case (7,7).
  190. On considère que le mot à placer ne dépasse pas des bornes du plateau
  191. et ne fait pas plus de 7 lettres. On considère également que cette fonction ne
  192. sera appelée qu'au premier tour. Le plateau est donc totalement vide.
  193.  
  194. Arguments :
  195. - coup (tuple): un tuple à 3 éléments:
  196. - mot (str): une chaine de caractère en majuscule qui indique le mot à placer
  197. - pos (tuple) : un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  198. et le numéro de la colonne (c) de la première lettre du mot à placer
  199. - dir (str) : un charactère (h ou v) qui indique la direction du mot
  200. Valeurs de retour :
  201. - bool : True ou False
  202. """
  203. mot = coup[0]
  204. l, c = coup[1]
  205. pos = [l, c]
  206. res = False
  207. if coup[2] == 'h' and pos[0] == 7:
  208. for i in range(len(mot)):
  209. if pos[1] == 7:
  210. res = True
  211. else:
  212. pos[1] += 1
  213. elif coup[2] == 'v' and pos[1] == 7:
  214. for i in range(len(mot)):
  215. if pos[0] == 7:
  216. res = True
  217. else:
  218. pos[0] += 1
  219. return res
  220.  
  221. def verif_bornes(coup, dimensions):
  222. """Cette fonction renvoie True si le mot à placer ne dépasse pas les des bornes du plateau de jeu. False, sinon.
  223. Arguments :
  224. - coup (tuple): un tuple à 3 éléments:
  225. - mot (str): une chaine de caractère en majuscule qui indique le mot à placer
  226. - pos (tuple) : un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  227. et le numéro de la colonne (c) de la première lettre du mot à placer
  228. - dir (str) : un charactère (h ou v) qui indique la direction du mot
  229. - dimensions (tuple) : un tuple de deux nombres entiers et positifs. Le premier élément est le nombre de lignes (
  230. Valeurs de retour:
  231. - bool (True ou False)
  232. """
  233. mot = coup[0]
  234. l, c = coup[1]
  235. res = True
  236. if coup[2] == 'h' and c + len(mot) > dimensions[1]:
  237. res = False
  238. elif coup[2] == 'v' and l + len(mot) > dimensions[0]:
  239. res = False
  240. return res
  241.  
  242. def verif_mot(mot, dictionnaire):
  243. """Cette fonction renvoie True si le mot à placer est bien un mot du dictionnaire. False sinon.
  244. Arguments :
  245. - mot (str): une chaine de caractères en majuscule qui indique le mot à placer
  246. - dico (list) : une liste dont chaque élément d'indice i, est un set de mots du dictionnaire de
  247. longueur (i+1). Par exemple, dico[3] pointe vers un set de tous les mots à 4 lettres.
  248. Valeurs de retour :
  249. - bool (True ou False)"""
  250. return len(mot)-1 < len(dictionnaire) and mot in dictionnaire[len(mot) - 1]
  251.  
  252. def verif_emplacement(coup, plateau):
  253. """Cette fonction renvoie True si le mot à placer n'entre pas en conflit avec d'autres lettres déjà placées auparavant sur le plateau, qui ne correspondent pas aux lettres du mot.
  254. Sinon, la fonction renvoie False.
  255. On pré-suppose que le mot ne dépasse pas des bornes du plateau.
  256. Arguments :
  257. - coup (tuple): un tuple à 3 éléments:
  258. - mot (str): une chaine de caractère en majuscule qui indique le mot à placer
  259. - pos (tuple) : un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  260. et le numéro de la colonne (c) de la première lettre du mot à placer
  261. - dir (str) : un charactère (h ou v) qui indique la direction du mot
  262. - plateau (liste): une liste de sous-listes qui représentent
  263. chacune une ligne du plateau de jeu.
  264. Elles contiennent chacune, soit un underscore pour
  265. indiquer que la case est vide, soit une lettre
  266. si elle a déjà été placée là auparavant.
  267. Valeurs de retour:
  268. - bool (True ou False)"""
  269. dimensions = (len(plateau), len(plateau[0]))
  270. mot = coup[0]
  271. l, c = coup[1]
  272. place = 0
  273. for i in range(len(mot)):
  274. if coup[2] == 'h' and verif_bornes(coup, dimensions):
  275. if plateau[l][c + i] == '_' or plateau[l][c + i] == mot[i]:
  276. place += 1
  277. elif coup[2] == 'v' and verif_bornes(coup, dimensions):
  278. if plateau[l + i][c] == '_' or plateau[l + i][c] == mot[i]:
  279. place += 1
  280. return place == len(mot)
  281.  
  282. def verif_lettres_joueur(plateau, lettres_joueur, coup):
  283. """
  284. Cette fonction renvoie True:
  285. - Si le mot à placer appartient au lettres du joueur (lettres_joueurs) ou
  286. - Si une ou plusieurs lettres manquent mais sont déjà placées à la place
  287. adéquate sur le plateau (plateau).
  288. Sinon, la fonction renvoie False.
  289. On pré-suppose que le mot ne dépasse pas des bornes du plateau
  290. Arguments :
  291. - plateau (liste) : une liste de sous-listes qui représentent
  292. chacune une ligne du plateau de jeu.
  293. Elles contiennent chacune, soit un underscore pour
  294. indiquer que la case est vide, soit une lettre
  295. si elle a déjà été placée là auparavant.
  296. - lettres_joueur (liste) : une liste qui contient chacune
  297. des lettres que le joueur possède sur son chevalet.
  298. Toutes ces lettres sont en MAJUSCULE.
  299. - coup (tuple): un tuple à 3 éléments:
  300. - mot (str): une chaine de caractère en majuscule qui indique le mot à placer
  301. - pos (tuple) : un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  302. et le numéro de la colonne (c) de la première lettre du mot à placer
  303. - dir (str) : un charactère (h ou v) qui indique la direction du mot
  304. Valeurs de retour:
  305. - bool (True ou False)
  306. """
  307. mot = coup[0]
  308. l, c = coup[1]
  309. string = str()
  310. lettres_a_placer= 0
  311. for i in range(len(mot)):
  312. if coup[2] == 'h':
  313. if mot[i] == plateau[l][c+i] or mot[i] in lettres_joueur:
  314. string += mot[i]
  315. if plateau[l][c+i] == '_':
  316. lettres_a_placer += 1
  317. elif coup[2] == 'v':
  318. if mot[i] == plateau[l+i][c] or mot[i] in lettres_joueur:
  319. string += mot[i]
  320. if plateau[l+i][c] == '_':
  321. lettres_a_placer += 1
  322. return string == mot and lettres_a_placer != 0
  323.  
  324. def mot_accepte(plateau, lettres_joueur, coup, dictionnaire, tour):
  325. """Cette fonction renvoie True si chacune des fonctions suivantes renvoient True:
  326. verif_premier_tour (uniquement au premier tour)
  327. verif_lettres_joueur
  328. verif_mot
  329. verif_bornes
  330. verif_emplacement
  331. Sinon, la fonction renvoie False. Vous devez donc également définir les 5 fonctions ci- dessus pour pouvoir les a
  332. Arguments :
  333. - lettres_joueur (liste) : une liste contenant les lettres du joueur
  334. - plateau (liste): une liste de sous-listes qui représentent
  335. chacune une ligne du plateau de jeu.
  336. Elles contiennent chacune, soit un underscore pour
  337. indiquer que la case est vide, soit une lettre
  338. si elle a déjà été placée là auparavant.
  339. - coup (tuple): un tuple à 3 éléments:
  340. - mot (str): une chaine de caractère en majuscule qui indique le mot à placer
  341. - pos (tuple) : un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  342. et le numéro de la colonne (c) de la première lettre du mot à placer
  343. - dir (str) : un charactère (h ou v) qui indique la direction du mot
  344. - tour (int) : un entier qui représente le tour du jeu (tour = 1 représente le premier tour)
  345. - dictionnaire (list) : une liste dont chaque élément d'indice i, est un set de mots du dictionnaire de
  346. longueur (i+1). Par exemple, dico[3] pointe vers un set de tous les mots à 4 lettres.
  347. Valeurs de retour:
  348. - bool (True ou False)
  349. """
  350. res = False
  351. mot = coup[0]
  352. tour_verifie = True
  353. if tour == 1:
  354. if verif_premier_tour(coup):
  355. if verif_emplacement(coup, plateau):
  356. if verif_lettres_joueur(plateau, lettres_joueur, coup):
  357. if verif_mot(mot, dictionnaire):
  358. res = True
  359. else:
  360. if verif_emplacement(coup, plateau):
  361. if verif_lettres_joueur(plateau, lettres_joueur, coup):
  362. if verif_mot(mot, dictionnaire):
  363. if len(mots_perpendiculaires(coup, plateau, dico)) != 0 and (utilise_lettre_plateau(coup,plateau) or len(mots_perpendiculaires(coup, plateau, dico)) > 1):
  364. res = True
  365. return res
  366.  
  367. def compte_points(mots, points_lettres):
  368. """Cette fonction calcule et renvoie le score associé à un mot
  369. Arguments :
  370. - mot (str) : une chaine de caractère en majuscule qui indique le mot à placer
  371. - points_lettres (dict) : un dictionnaire contenant
  372. comme clés les différentes lettres de l'alphabet,
  373. en majuscule; et comme valeur, les points
  374. associées à chaque lettre.
  375. Par exemple:
  376. points_lettres = {"A" : 1, "B": 3}, si on ne considère
  377. que les deux premières lettres de l'alphabet
  378. Valeur de retour:
  379. - int : points associés au mot placé.
  380. """
  381. score = 0
  382. for i in range(len(mots)):
  383. score += points_lettres[mots[i]]
  384. return score
  385.  
  386.  
  387. def placer_mot(coup, plateau):
  388. """ Cette fonction modifie le plateau de
  389. sorte que les lettres du mot à placer soient insérées au bon endroit dans la liste de sous-listes qui représente le plateau;
  390. cette fonction renvoie ensuite les lettres du mot à placer qui sont déjà présentes sur le plateau
  391. à l'endroit exact où cette lettre devrait etre placée (et qu'il ne faut donc pas retirer du chevalet du joueur par la suite)
  392. Arguments:
  393. - coup (tuple): un tuple à 3 éléments:
  394. - mot (str): une chaine de caractère en majuscule qui indique le mot à placer
  395. - pos (tuple) : un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  396. et le numéro de la colonne (c) de la première lettre du mot à placer
  397. - dir (str) : un charactère (h ou
  398. - plateau (liste) : une liste de sous-listes
  399. qui représentent chacune une ligne du plateau
  400. de jeu. Elles contiennent chacune, soit un
  401. underscore pour indiquer que la case est vide,
  402. soit une lettre si elle a déjà été placée là
  403. auparavant.
  404. v) qui indique la direction du mot
  405. Valeur de retour:
  406. - str : chaine de caractères contenant les lettres déjà présentes sur le plateau à
  407. l'emplacement du mot (qu'il ne faut donc pas retirer du chevalet du joueur)
  408. Exemple:
  409. >>> plateau = [["_", "_", "A","R"],
  410. ["_", "_", "_","_"],
  411. ["_", "_", "_","_"],
  412. ["_", "_", "_","_"]]
  413. >>> mot = "BAR"
  414. >>> position = (0,1)
  415. >>> direction = "h"
  416. >>> coup = mot,position,direction
  417. >>> lettres_presentes = placer_mot(plateau,coup)
  418. >>> print(plateau)
  419. >>> [["_", "B", "A","R"],
  420. ["_", "_", "_","_"],
  421. ["_", "_", "_","_"],
  422. ["_", "_", "_","_"]]
  423. >>> print(lettres_presentes)
  424. >>> "AR"
  425. """
  426. deja_presentes = str()
  427. l, c = coup[1]
  428. if coup[2] == 'h':
  429. for i in range(len(coup[0])):
  430. if plateau[l][c + i] == coup[0][i]:
  431. deja_presentes += coup[0][i]
  432. else:
  433. plateau[l][c + i] = coup[0][i]
  434. elif coup[2] == 'v':
  435. for i in range(len(coup[0])):
  436. if plateau[l + i][c] == coup[0][i]:
  437. deja_presentes += coup[0][i]
  438. else:
  439. plateau[l + i][c] = coup[0][i]
  440. return deja_presentes
  441.  
  442.  
  443. def mots_perpendiculaires(coup, plateau, dico):
  444. """
  445. Lorsqu'un mot est placé sur le plateau de jeu, il est possible qu'il soit adjacent à des lettres déjà
  446. présentes sur le plateau. De nouveaux mots perpendiculaires au mot à placer sont alors formés.
  447. 3 cas sont possibles:
  448. - Si aucun mot perpendiculaire n'est formé, cette fonction
  449. renvoie une liste contenant un élément : le mot à placer.
  450. - S'il existe des mots perpendiculaires et qu'ils appartiennet
  451. TOUS au dictionnaire, cette fonction renvoie la liste contenant tous
  452. les nouveaux mots formés (le mot à placer et les nouveaux mots
  453. perpendiculaires), triés dans l'ordre alphabétique.
  454. - S'il existe des mots perpendiculaires et qu'au moins un d'entre
  455. eux n'existe pas dans le dictionnaire, la fonction renvoie une
  456. liste vide [].
  457. On considère que le mot à placer respecte bien les bornes du plateau et
  458. qu'il n'y a pas de conflit entre les lettres que le joueur veut placer
  459. sur le plateau et les lettres existantes, aux positions qui seront
  460. utilisées pour ces lettres. Autrement dit, pour chaque lettre à placer,
  461. soit la case est vide, soit la lettre à placer est déjà présente.
  462. Ceci n'est pas à tester dans la fonction, mais c'est un pré-requis à
  463. son utilisation.
  464. -Arguments:
  465. - coup (tuple): un tuple à 3 éléments:
  466. - mot (str): une chaine de caractère en majuscule qui indique le mot à placer
  467. - pos (tuple) : un tuple d'entiers (l,c) qui indiquent le numéro de ligne (l),
  468. et le numéro de la colonne (c) de la première lettre du mot à placer
  469. - dir (str) : un charactère ("h" ou "v") qui indique la direction du mot
  470. - plateau (liste) : une liste de 15 sous-listes
  471. qui représentent chacune une ligne du plateau
  472. de jeu. Elles contiennent chacune, soit un
  473. underscore pour indiquer que la case est vide,
  474. soit une lettre si elle a déjà été placée là
  475. auparavant.
  476. - dico (list) : une liste dont chaque élément d'indice i, est un set de mots du dictionnaire de
  477. longueur (i+1). Par exemple, dico[3] pointe vers un set de tous les mots à 4 lettres.
  478. - Valeurs de retour:
  479. - liste de chaine de caractères
  480. """
  481. l, c = coup[1]
  482. liste, liste_triee = list(), list()
  483. for i in range(len(coup[0])):
  484. x = 1
  485. mot_forme, contre_mot_forme = str(), str()
  486. if coup[2] == 'h':
  487. if plateau[l][c + i] == '_':
  488. while l + x <= 14 and plateau[l + x][c + i] != '_':
  489. mot_forme += plateau[l + x][c + i]
  490. x += 1
  491. x = 1
  492. while l - x >= 0 and plateau[l - x][c + i] != '_':
  493. contre_mot_forme += plateau[l - x][c + i]
  494. x += 1
  495. mot_forme = contre_mot_forme[::-1] + coup[0][i] + mot_forme
  496. if len(mot_forme) > 1:
  497. liste.append(mot_forme)
  498. elif coup[2] == 'v':
  499. if plateau[l + i][c] == "_":
  500. while c + x <= 14 and plateau[l + i][c + x] != '_':
  501. mot_forme += plateau[l + i][c + x]
  502. x += 1
  503. x = 1
  504. while c - x >= 0 and plateau[l + i][c - x] != '_':
  505. contre_mot_forme += plateau[l + i][c - x]
  506. x += 1
  507. mot_forme = contre_mot_forme[::-1] + coup[0][i] + mot_forme
  508. if len(mot_forme) > 1:
  509. liste.append(mot_forme)
  510. for i in liste:
  511. if i in dico[len(i) - 1]:
  512. liste_triee.append(i)
  513. if len(liste) == 0:
  514. res = [coup[0]]
  515. elif len(liste) == len(liste_triee):
  516. liste.append(coup[0])
  517. liste.sort()
  518. res = liste
  519. else:
  520. res = list()
  521. return res
  522.  
  523.  
  524. def utilise_lettre_plateau(coup,plateau):
  525. """
  526. Cette fonction renvoie True si le mot à placer utilise une ou plusieurs lettres déjà présentes sur le plateau de jeu.
  527. Elle renvoie False sinon
  528. Arguments:
  529. - coup (tuple) : à 3 éléments :
  530. - mot (str) : une chaine de caractère en majuscule
  531. qui indique le mot à placer
  532. - direction (str) : un charactère (h ou v) qui
  533. indique la direction du mot
  534. - position (tuple) : un tuple d'entiers (l,c) qui
  535. indiquent le numéro de ligne (l),
  536. et le numéro de la colonne (c) de la première lettre
  537. du mot à placer
  538. - plateau (liste) : une liste de 15 sous-listes
  539. qui représentent chacune une ligne du plateau
  540. de jeu. Elles contiennent chacune, soit un
  541. underscore pour indiquer que la case est vide,
  542. soit une lettre si elle a déjà été placée là
  543. auparavant.
  544. - Valeurs de retour:
  545. - bool (True / False)
  546. """
  547. lettre_plateau_utilisees = 0
  548. l, c = coup[1]
  549. for i in range(len(coup[0])):
  550. if coup[2]=='h':
  551. if plateau[l][c+i]!='_':
  552. lettre_plateau_utilisees += 1
  553. if coup[2]=='v':
  554. if plateau[l+i][c]!='_':
  555. lettre_plateau_utilisees += 1
  556. return lettre_plateau_utilisees != 0
  557.  
  558.  
  559. def play(partie_en_cours):
  560. """I. Intialisation des outils nécéssaires pour commencer une partie"""
  561. """1. Charger le dictionnaire, les lettres, leurs occurences, les points de chaque lettre, et le sachet"""
  562. dico = load_fichier_dico("dico.txt")
  563. occurences, points = load_fichier_lettres('lettres.txt')
  564. sachet = pioche_init(occurences)
  565. import random
  566. random.shuffle(sachet)
  567.  
  568. """2. Initialiser le plateau de jeu"""
  569. plateau = plateau_init((15, 15))
  570. tour = 0
  571.  
  572. """3. Nombre de joueurs, noms des joueurs et initialisation de leurs scores et chevalets"""
  573. nombre_de_joueurs = int(input("A combien veuillez vous jouer? "))
  574. noms = list()
  575. chevalets = list()
  576. scores = list()
  577. for i in range(nombre_de_joueurs):
  578. noms.append(input("Entrez le nom du joueur " + str(i + 1) + ':'+" "))
  579. chevalets.append(list())
  580. scores.append(0)
  581.  
  582.  
  583. """II. Code nécéssaire à chaque tour"""
  584. while partie_en_cours:
  585. """a. on affiche le plateau"""
  586. for i in range(len(plateau)):
  587. print(i,plateau[i])
  588.  
  589. """b. on affiche le chevalet et le score du joueur qui doit jouer"""
  590. tour += 1
  591. joueur = (tour - 1) % nombre_de_joueurs # joueur est un entier qui varie entre [0;nombre de joueurs] en fonction de la valeur de 'tour'
  592. remplir_chevalet(chevalets[joueur], sachet)
  593. print("C'est ton tour,", noms[joueur], " !")
  594. print("Ton score :", scores[joueur])
  595. print("Tes lettres :", chevalets[joueur])
  596.  
  597. """c. on permet au joueur de placer son mot, tout en verifiant si son coup respecte les règles"""
  598. coup = propose_mot("Veuillez entrer la ligne de la première lettre de votre mot ","Veuillez entrer la colonne de la première lettre de votre mot ","Veuillez entrer la direction de votre mot (H ou V) ", "Veuillez entrer le mot à jouer ")
  599. while not mot_accepte(plateau, chevalets[joueur], coup, dico, tour):
  600. coup = propose_mot("Veuillez entrer la ligne de la première lettre de votre mot ","Veuillez entrer la colonne de la première lettre de votre mot ","Veuillez entrer la direction de votre mot (H ou V) ", "Veuillez entrer le mot à jouer ")
  601.  
  602. """d. on vérifie si certains mots perpendiculaires sont formés"""
  603. mots_perp = mots_perpendiculaires(coup, plateau, dico)
  604.  
  605. """e. on ajoute les points du coup du joueur à son score en tenant compte des mots perpendiculaires formés"""
  606. for i in range(len(mots_perp)):
  607. scores[joueur] += compte_points(mots_perp[i], points)
  608.  
  609. """f. on place le mot"""
  610. print(noms[joueur]," : ",scores[joueur])
  611. deja_sur_plateau = placer_mot(coup, plateau)
  612.  
  613. """g. on retire les lettres utilisées du chevalet"""
  614. for i in range(len(deja_sur_plateau)):
  615. chevalets[joueur].append(deja_sur_plateau[i])
  616. for i in range(len(coup[0])):
  617. if coup[0][i] in chevalets[joueur]:
  618. del chevalets[joueur][chevalets[joueur].index(coup[0][i])]
  619.  
  620. """h. on rempli le chevalet"""
  621. remplir_chevalet(chevalets[joueur], sachet)
  622.  
  623. """i. si le sachet est vide, la partie se termine"""
  624. if len(chevalets[joueur]) == 0:
  625. partie_en_cours = False
  626. print("FIN DE LA PARTIE, MERCI")
  627. for i in range(nombre_de_joueurs):
  628. print(noms[i],scores[i])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement