suite à ce sujet http://www.siteduzero.com/forum-83-581 [...] mensions.html
j'ai eu une petite idéé d'exercice ... coder un puissance4.
pas bien compliqué jusque là me direz-vous.
Seulement il y a une contrainte:
Il faut coder le jeu de façon à ce qu'il puisse être facilement implanté dans n'importe qu'elle GUI.
Les participants pourront poster leur code et/ou tester le code des autres participant avec leur GUI préférée, et laisser des coms sur la facilité d'utilisation, la qualité des explications, etc ...
je me lance...
le code est accompagné d'un exemple en mode console.
class Puissance4:
'''
Puissance4 possede:
1 methode: put_pawn()
les appels succesifs a put_pawn() font jouer tour a tour tant que Winner est None.
5 attributs qui permettent d'implementer une GUI: Player, Winner, Pawn et Grid
Player, Winner et Pawn ne sont pas essentiels mais apportent une indiquation sur le deroulement du jeu.
Player est le numero du joueur en cours, vaut 1 ou 2.
Winner vaut None tant qu'il n'y a pas de gagnant, sinon vaut Player et suspend le deroulement normal de put_pawn().
Pawn est le pion du joueur en cours.
Grid est une liste de bytearray qui represente la grille de jeu lue horizotalement (voir la doc bytearray).
Grid servira donc pour une interface graphique.
exemple pour une grille 5x3:
Grid=
[
b'00000',
b'00000',
b'00000'
]
Winlist ; c'est la liste des coordonnees des pions places gagnant dans Grid.
'''
def __init__(self,Width,Height,Align,Empty,PawnJ1,PawnJ2):
'''
le jeu s'initialise ainsi:
Width et Height indiquent la taille de la grille de jeu, soit la largeur et la hauteur.
Align indique le nombre de pions a aligner pour gagner.
Empty,PawnJ1 et PawnJ2 sont 3 caracteres correspondant a:
case vide, pion du 1er joueur et pion du 2nd joueur...
vous pouvez indiquer une valeur numerique, par exemple, si vous voulez
que 0 represente case vide:
Empty = '\0'
'''
self.Align = Align
self.Pawns = [PawnJ1,PawnJ2]
self.Empty = Empty
self.Winner = None
self.Run = True
self.Shots = Width*Height
self.Player = 1
self.Pawn = self.Pawns[0]
self.Winlist = ([],[],[],[])
self.Grid = [bytearray(self.Empty*Width) for _ in range(Height)]
self.Grid_verti = [bytearray(self.Empty*Height) for _ in range(Width)]
self.Grid_diag1 = [bytearray(self.Empty*(Height)) for _ in range(Width+Height-1)]
self.Grid_diag2 = [bytearray(self.Empty*(Height)) for _ in range(Width+Height-1)]
def put_pawn(self,Column):
'''
l'argument Column indique la colonne dans laquelle le joueur veut poser son pion.
put_pawn() maintient Player, Pawn et Winner qui indiquent quel joueur joue ou va jouer ...
et s'il y a un gagnant.
'''
if self.Run:
try:
y = self.Grid_verti[Column].rindex(self.Empty)
except: return
self.Shots -= 1
self.Grid[y][Column] = self.Pawn
pos = self.Grid[y].find(self.Align*self.Pawn)
if pos > -1:
self.Winner = self.Player
self.Run = False
while self.Grid[y][pos:pos+1] == self.Pawn:
self.Winlist[0].append((pos,y))
pos+=1
self.Grid_verti[Column][y] = self.Pawn
pos = self.Grid_verti[Column].find(self.Align*self.Pawn)
if pos > -1:
self.Winner = self.Player
self.Run = False
while self.Grid_verti[Column][pos:pos+1] == self.Pawn:
self.Winlist[1].append((Column,pos))
pos+=1
diag = y+Column
self.Grid_diag1[diag][y] = self.Pawn
pos = self.Grid_diag1[diag].find(self.Align*self.Pawn)
if pos > -1:
self.Winner = self.Player
self.Run = False
while self.Grid_diag1[diag][pos:pos+1] == self.Pawn:
self.Winlist[2].append((diag-pos,pos))
pos += 1
diag = Column-y+len(self.Grid)-1
self.Grid_diag2[diag][y] = self.Pawn
pos = self.Grid_diag2[diag].find(self.Align*self.Pawn)
if pos > -1:
self.Winner = self.Player
self.Run = False
while self.Grid_diag2[diag][pos:pos+1] == self.Pawn:
self.Winlist[3].append((Column-y+pos,pos))
pos += 1
if not self.Shots: self.Run = False
if not self.Run: return
self.Pawns.reverse()
self.Pawn = self.Pawns[0]
self.Player = (not self.Player-1)+1
#***************************************************************************************************************
#***************************************************************************************************************
# exemple en mode console
if __name__ == '__main__':
# routine qui affiche la grille
def showgrid():
print ' A B C D E F G'
for _ in game.Grid:
print _.replace('','|')
print '---------------'
# routine qui lit dans quelle colonne poser le pion
askwhere = lambda: 'ABCDEFG'.index(raw_input("joueur "+str(game.Player)+" joue: ").upper())
# arguments pour l'initialisation du jeu
init = largeur,hauteur,alignement,case_vide,pion_joueur_1,pion_joueur_2 = 7,6,4,' ','x','o'
game = Puissance4(*init) # init du jeu
showgrid() # affichage de la grille
while game.Run: # tant qu'il n'y a pas de gagnant ...
game.put_pawn(askwhere()) # poser un pion
showgrid() # affichage de la grille
print "joueur "+game.Winner+" gagne!" if game.Winner else "personne ne gagne"
print game.Winlist
bon code.
Python c'est bon, mangez-en.
[exercice tous GUI] Puissance4
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.