p4.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import random
  2. class P4:
  3. # requiert deux algorithmes ainsi que la largeur et la longueur de la matrice
  4. def __init__(self,j1,j2,L,l):
  5. self.m=self.__matrice([],L,l)
  6. self.mp=(L,l)
  7. # ordre aleatoire des joueurs, s'inverse tour par tour
  8. self.ordre=random.sample([[j1,1],[j2,2]],k=2)
  9. # ordonne si le programme doit fonctionner
  10. self.sig=True
  11. # etats du jeu : Nouveau Joueur, Pion Joueur, Verification Pion, Changement Joueur
  12. self.stock=["NJ","PJ","VP","CJ"]
  13. # etats pouvant etre acceder par l'utilisateur
  14. self.state=[self.stock[0],(),"J"+str(self.ordre[0][1])]
  15. # le match est fini ou non, avec le potentiel vainqueur
  16. self.match=[True,""]
  17. # coeur du programme a mettre a jour
  18. def update(self):
  19. # lance seulement si le match n'est pas termine et que la pause n'est pas active
  20. if self.sig and self.match[0]:
  21. if self.stock[0]=="CJ":
  22. self.__inverse()
  23. # informe un nouveau joueur
  24. self.state[2]="J"+str(self.ordre[0][1])
  25. elif self.stock[0]=="PJ":
  26. self.__placer()
  27. elif self.stock[0]=="VP":
  28. self.__detection()
  29. # comportement similaire a une file pour self.stock, sauf que les elements ne s'enlevent jamais
  30. self.state[0]=self.stock[0]
  31. self.stock.append(self.stock.pop(0))
  32. else:
  33. pass
  34. """ Fonctions utilitaires """
  35. def get_state(self):
  36. return self.state[0],self.state[1],self.state[2]
  37. def get_match(self):
  38. return self.match[0],self.match[1]
  39. def get_matrice(self):
  40. return self.m
  41. def pause(self,arg):
  42. self.sig=arg
  43. """ Fonctions privees, elles ne peuvent pas etre accede """
  44. # place le pion en fonction des pieces existantes, puis, renvoit ses coordonnees
  45. def __placer(self):
  46. a=0
  47. x=self.ordre[0][0](self.m,self.ordre[0][1])
  48. # remet a la derniere colonne si x est trop grand
  49. if x>=self.mp[1]:
  50. x=self.mp[1]-1
  51. for i in range(self.mp[0]):
  52. # la piece tombe tant qu'elle ne rencontre rien
  53. if self.m[i][x]==0:
  54. a+=1
  55. else:
  56. break
  57. # regle un probleme avec a=0
  58. if self.m[a-1][x]!=0 and a==0:
  59. pass
  60. else:
  61. self.m[a-1][x],self.state[1]=self.ordre[0][1],(a-1,x)
  62. # inverse l'ordre des joueurs
  63. def __inverse(self):
  64. self.ordre[0],self.ordre[1]=self.ordre[1],self.ordre[0]
  65. # creer une matrice
  66. def __matrice(self,m,y,x):
  67. for i in range(y):
  68. m.append([])
  69. for j in range(x):
  70. m[i].append(0)
  71. return m
  72. def __detection(self):
  73. """ Detection en ligne """
  74. ligne=[]
  75. ligne_str=""
  76. for ele in self.m[self.state[1][0]]:
  77. ligne.append(str(ele))
  78. # transformation de la liste en str pour une utilisation optimale
  79. ligne_str=ligne_str.join(ligne)
  80. if "1111" in ligne_str:
  81. self.match[1]="J1"
  82. self.match[0]=False
  83. if "2222" in ligne_str:
  84. self.match[1]="J2"
  85. self.match[0]=False
  86. """ Detection en colonne """
  87. colonne=[]
  88. # boucle recuperant la colonne du pion
  89. for ele in self.m:
  90. colonne.append(str(ele[self.state[1][1]]))
  91. colonne_str=""
  92. # transformation de la liste en str pour une utilisation optimale
  93. colonne_str=colonne_str.join(colonne)
  94. if "1111" in colonne_str:
  95. self.match[1]="J1"
  96. self.match[0]=False
  97. if "2222" in colonne_str:
  98. self.match[1]="J2"
  99. self.match[0]=False
  100. """ Detection en diagonale de gauche a droite puis de droite a gauche """
  101. f=[lambda x: x+1,lambda x: x-1]
  102. ac=[(1,1),(0,0),(0,1),(1,0)]
  103. # compteur incrementer pour chaque pion successif du joueur sur la diagonale
  104. cpt=0
  105. for o in range(4):
  106. i=self.state[1][0]
  107. j=self.state[1][1]
  108. # parcourt
  109. while i>=0 and j>=0 and i<self.mp[0] and j<self.mp[1]:
  110. if self.m[i][j]!=self.m[self.state[1][0]][self.state[1][1]]:
  111. break
  112. cpt=cpt+1
  113. i=f[ac[o][0]](i)
  114. j=f[ac[o][1]](j)
  115. if o==1:
  116. cpt=0
  117. if cpt>=5:
  118. self.match[1]="J"+str(self.m[self.state[1][0]][self.state[1][1]])
  119. self.match[0]=False
  120. break
  121. """ Detection egalite """
  122. if self.match[0]:
  123. cpt=0
  124. for i in range(self.mp[1]):
  125. lig=0
  126. if self.m[0][i]!=0:
  127. cpt=cpt+1
  128. if cpt>=self.mp[1]:
  129. self.match[1]="EGALITE"
  130. self.match[0]=False