p4.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import random
  2. class P4:
  3. def __init__(self,j1,j2,L,l):
  4. self.m=self.__matrice([],L,l)
  5. self.mp=(L,l)
  6. self.ordre=random.sample([[j1,1],[j2,2]],k=2)
  7. self.sig=True
  8. # Nouveau Joueur, Pion Joueur, Verification Pion, Changement Joueur
  9. self.stock=["NJ","PJ","VP","CJ"]
  10. self.state=[self.stock[0],(),"j1"]
  11. self.match=[True,""]
  12. # coeur du programme
  13. def update(self):
  14. if self.sig and self.match[0]:
  15. if self.stock[0]=="CJ":
  16. self.__inverse()
  17. if self.ordre[0][1]==1:
  18. self.state[2]="j1"
  19. else:
  20. self.state[2]="j2"
  21. elif self.stock[0]=="PJ":
  22. self.__placer()
  23. elif self.stock[0]=="VP":
  24. self.__detection()
  25. self.state[0]=self.stock[0]
  26. self.stock.append(self.stock.pop(0))
  27. else:
  28. pass
  29. def get_state(self):
  30. return self.state[0],self.state[1],self.state[2]
  31. def get_match(self):
  32. return self.match[0],self.match[1]
  33. def get_matrice(self):
  34. return self.m
  35. def pause(self,arg):
  36. self.sig=arg
  37. """ Fonctions privees """
  38. # place le pion et renvoie ses coordonnees
  39. def __placer(self):
  40. a=0
  41. x=self.ordre[0][0](self.m,self.ordre[0][1])
  42. # remet a la derniere colonne si x est trop grand
  43. if x>=self.mp[1]:
  44. x=self.mp[1]-1
  45. for i in range(self.mp[0]):
  46. if self.m[i][x]==0:
  47. a+=1
  48. else:
  49. break
  50. if self.m[a-1][x]!=0 and a==0:
  51. pass
  52. else:
  53. self.m[a-1][x],self.state[1]=self.ordre[0][1],(a-1,x)
  54. # inverse l'ordre des joueurs
  55. def __inverse(self):
  56. self.ordre[0],self.ordre[1]=self.ordre[1],self.ordre[0]
  57. # creer une matrice
  58. def __matrice(self,m,y,x):
  59. for i in range(y):
  60. m.append([])
  61. for j in range(x):
  62. m[i].append(0)
  63. return m
  64. def __detection(self):
  65. #---------------Detection en ligne------------------
  66. ligne=[]
  67. ligne_str=""
  68. for ele in self.m[self.state[1][0]]:
  69. ligne.append(str(ele))
  70. ligne_str=ligne_str.join(ligne) #transformation de la liste en str pour utiliser in
  71. if "1111" in ligne_str:
  72. self.match[1]="J1"
  73. self.match[0]=False
  74. if "2222" in ligne_str:
  75. self.match[1]="J2"
  76. self.match[0]=False
  77. #---------------Detection en colonne-----------------
  78. colonne=[]
  79. for ele in self.m: #boucle recuperant la colonne du pion
  80. colonne.append(str(ele[self.state[1][1]]))
  81. colonne_str=""
  82. colonne_str=colonne_str.join(colonne) #transformation de la liste en str pour utiliser in
  83. if "1111" in colonne_str:
  84. self.match[1]="J1"
  85. self.match[0]=False
  86. if "2222" in colonne_str:
  87. self.match[1]="J2"
  88. self.match[0]=False
  89. #-----------Detection en diagonale de gauche a droite-----------
  90. i=self.state[1][0]
  91. j=self.state[1][1]
  92. cpt=0 #Compteur incrementer pour chaque pion successif du joueur sur la diagonale
  93. while i>=0 and j>=0 and i<self.mp[0] and j<self.mp[1]: #parcourt des antecedents du pion sur la diagonale pour detecter une diagonale gagnante
  94. if self.m[i][j]!=self.m[self.state[1][0]][self.state[1][1]]:
  95. break
  96. cpt=cpt+1
  97. i=i-1
  98. j=j-1
  99. i=self.state[1][0]
  100. j=self.state[1][1]
  101. while i>=0 and j>=0 and i<self.mp[0] and j<self.mp[1]: #parcourt des successeur du pion sur la diagonale pour detecter une diagonale gagnante
  102. if self.m[i][j]!=self.m[self.state[1][0]][self.state[1][1]]:
  103. break
  104. cpt=cpt+1
  105. i=i+1
  106. j=j+1
  107. if cpt>=5:
  108. self.match[1]="J"+str(self.m[self.state[1][0]][self.state[1][1]])
  109. self.match[0]=False
  110. #-----------Detection en diagonale de droite a gauche-----------
  111. i=self.state[1][0]
  112. j=self.state[1][1]
  113. cpt=0
  114. while i>=0 and j>=0 and i<self.mp[0] and j<self.mp[1]: #parcourt des antecedents du pion sur la diagonale pour detecter une diagonale gagnante
  115. if self.m[i][j]!=self.m[self.state[1][0]][self.state[1][1]]:
  116. break
  117. cpt=cpt+1
  118. i=i+1
  119. j=j-1
  120. i=self.state[1][0]
  121. j=self.state[1][1]
  122. while i>=0 and j>=0 and i<self.mp[0] and j<self.mp[1]: #parcourt des successeur du pion sur la diagonale pour detecter une diagonale gagnante
  123. if self.m[i][j]!=self.m[self.state[1][0]][self.state[1][1]]:
  124. break
  125. cpt=cpt+1
  126. i=i-1
  127. j=j+1
  128. if cpt>=5:
  129. self.match[1]="J"+str(self.m[self.state[1][0]][self.state[1][1]])
  130. self.match[0]=False
  131. #--------------Detection degalite---------------
  132. if self.match[0]:
  133. cpt=0
  134. for i in range(7):
  135. lig = 0 # Variable ligne
  136. if self.m[0][i] != 0:
  137. cpt=cpt+1
  138. if cpt>=7:
  139. self.match[1]="Egalite"
  140. self.match[0]=False
  141. #----------------Aucune detection----------------
  142. else:
  143. pass