je viens ici car j'ai un problème et je n'arrive pas à avancer à cause de ça malgré plusieurs moments de réflexion. Mon but est de créer une sorte de Puissance4, d'abord simplement directement sous python, puis ensuite avec une interface graphique. N'étant pas très doué en programmation, je bug presque dès le début. Testez le programme que je vous envoie, ça affiche une matrice de la taille demandée, puis ça place le premier élément là où vous le voulez. Là où je bloque c'est quand le deuxième joueur veut jouer et rajouter son propre "jeton". En fait mon programme n'affiche que l'élément du deuxième joueur en enlevant celui du 1er. Je me doute que c'est un problème dans la deuxième boucle dans le "else"de la fonction "placer_element". Il faudrait mettre "si je suis au bon endroit je mets le jeton du joueur, sinon je laisse comme c'est". Justement c'est ce "je laisse comme c'est" qui me pose problème. Comment faire ? Ne faites pas trop attention au contenu, c'est un peu brouillon et je compte simplifier par la suite mais c'est normal. Et biensur, le deuxième joueur n'aura pas les memes jetons que le 1er etc etc... ce que je veux pour le moment, c'est juste COMMENT GARDER l'élement du 1er joueur pour afficher les 2 élements après que les 2 joueurs aient joué. Il doit y avoir une astuce et je ne la trouve pas. Désolé, ça doit paraître stupide pour certains d'entre vous...
voici mon code:
def matrice(n,p):
col_sep, row_sep = '|', "\n%s+\n" % ('+---'*n)
rows = []
alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
i=0
t=''
while (i<n):
t+= ' ' + alphabet[i] + ' '
i+=1
print t
for q in range(1, p+1):
cols = []
for r in range(1, n+1):
cols += [" "]
#print "## q:%d cols:%r" % (q, cols)
rows += ["%s%s%s" % (col_sep, col_sep.join(cols), col_sep)]
#print "## p:%d rows:%r" % (p, rows)
return "%s%s%s" % (row_sep, row_sep.join(rows), row_sep)
#---------------------------------------------------------------------------
def placer_element(n,p,p1):
col_sep, row_sep = '|', "\n%s+\n" % ('+---'*n)
rows = []
alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
i=0
t=''
while (i<n):
t+= ' ' + alphabet[i] + ' '
i+=1
print t
j=0
while (j<=len(alphabet)) and (p1!=alphabet[j]):
j+=1
for q in range(1, p+1):
cols = []
for r in range(1, n+1):
if (q==p)and (r==j+1):
cols+=[" X "]
else:
cols+=[" "]
#print "## q:%d cols:%r" % (q, cols)
rows += ["%s%s%s" % (col_sep, col_sep.join(cols), col_sep)]
#print "## p:%d rows:%r" % (p, rows)
return "%s%s%s" % (row_sep, row_sep.join(rows), row_sep)
#-----------------------------------------------------------------------------
# ------------------------------------------------------------------------------
def main():
"""main program of the "tabmul" module"""
#print "%s\n%s%s\n%s" % ('='*80, __doc__, __usage__, '='*80)
while True :
try:
line = raw_input("<> Enter number of colonnesXlignes : ")
#line=int(line)
if line == '': break
colonnes,lignes=line.split('X')
lignes=int(lignes)
colonnes=int(colonnes)
s=matrice(colonnes,lignes)
print s
except ValueError:
print "Respectez la consigne et la sythaxe exigée"
player1 = raw_input(" <> Player 1 : ")
if player1=='':break
#player1=int(player1)
t=placer_element(colonnes, lignes, player1)
print t
player1 = raw_input("<> Player 2 : ")
if player1=='':break
t=placer_element(colonnes,lignes,player1)
print t
print "Ciao"
# ------------------------------------------------------------------------------
if __name__ == '__main__':
main()
# ==============================================================================
Le message qui suit est une réponse automatique activée par un modérateur.
Les réponses automatiques permettent d'éviter aux modérateurs d'avoir à répéter de nombreuses fois la même chose, et donc de leur faire gagner beaucoup de temps.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter le modérateur en question par MP.
Merci d'utiliser les balises de code
Bonjour,
Les forums du Site du Zér0 disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source.
Vous avez posté un code source sans utiliser cette fonctionnalité. Pourriez-vous éditer votre message en entourant votre code des balises <code > et </code > ?
Cela aura pour effet de "colorer" votre code et donc d'en faciliter grandement la lecture. Vous aurez ainsi beaucoup plus de chances d'avoir des réponses.
Voici un exemple de code non coloré avec la balise "citation" (mauvais exemple) :
Citation
int main(int argc, char *argv[])
{
long choixOperation;
printf("Choisissez l'operation a effectuer");
/* etc. */
}
Voici maintenant le même code coloré, si vous aviez utilisé la balise "code" (bon exemple) :
int main(int argc, char *argv[])
{
long choixOperation;
printf("Choisissez l'operation a effectuer");
/* etc. */
}
C'est plus clair n'est-ce pas ?
N'hésitez pas à éditer votre message pour changer la balise afin de colorer votre code.
Mmmh... Je ne suis pas rentré dans ton code (je crois que je n'ai pas le niveau de toute façon), mais une approche POO serait pas mal pour ce genre de programme...
De plus l'indentation est pas terrible terrible.
Sur-ce je laisse d'autre plus compétent que moi te répondre, bonne chance
A mon avis tu t'y prends mal. Tu devrais séparer complètement ton affichage et ton jeu en tant que tel.
Donc par exemple, tu crées une liste de booléens à deux dimensions, dans lequel tu effectues tes changements selon ce qu'a entré le joueur, puis quand tout est bon tu passes cette liste à une fonction qui a pour seul et unique but d'afficher ton jeu.
Tes fonctions doivent avoir un seul et rôle, sinon ça va vite devenir n'importe quoi.
Après, comme l'a dit ShikiSokuZeku, tu pourrais avoir une approche un peu plus orientée objet de la chose, et créer une classe Jeu avec ton tableau, et les méthodes qui vont avec (donc placer un nouveau jeton etc..).
Edit : Ah, désolé en fait le jeu étant un puissance 4 il faut pouvoir différencier les jetons donc une liste de booléens n'est pas ce qu'il y a de plus approprié, mais tu peux simplement faire une liste d'entiers avec 0 pour une case vide, 1 pour les jetons du joueur 1 et 2 pour les jetons du joueur 2, ou quelque chose comme ça.
placer_element() redessine une matrice vierge à chaque fois avant de placer le pion ...
de plus ta matrice n'a pas d'existance.
suggestion:
comme le dit Shaddan,
d'abord maitriser la manipulation de listes, la POO est optionnelle.
Puis, créer une fonction autonome pour visualiser ton jeu.
je partirai plutôt d'une liste de listes vides ...
[[],[],[],[],...]
avec [].insert(0,pion) et une variable longeur_max ça devrait le faire
je partirai plutôt d'une liste de listes vides ...
[[],[],[],[],...]
avec [].insert(0,pion) et une variable longeur_max ça devrait le faire
En effet j'y avais pas pensé mais ça devrait être beaucoup plus simple de poser les jetons en s'y prenant comme ça. Par contre plutôt que insert, append me parait plus clair :
merci pour vos réponses, je vais essayer de prendre en considération vos conseils. Je voulais savoir autre chose en passant. Comment initialise-t-on (déclare-t-on) une liste de listes (tableau à 2 dimensions). Genre en C++ il me semble que c'est : liste[6][5] pour créer un tableau de 6 lignes et 5 colonnes mais comment fait-on en Python ?
merci pour vos réponses, je vais essayer de prendre en considération vos conseils. Je voulais savoir autre chose en passant. Comment initialise-t-on (déclare-t-on) une liste de listes (tableau à 2 dimensions). Genre en C++ il me semble que c'est : liste[6][5] pour créer un tableau de 6 lignes et 5 colonnes mais comment fait-on en Python ?
ça ne se 'déclare' pas, ça s'affecte.
malistedelistes = [[1,2,6,5,8],[6,8,4,3,2],[8,7,4,5,0]] # genre matrice
je me suis amusé à en faire un.
j'ai mis quelque coms, si ça peut t'aider.
class Grid:
def __init__(self,haute,large,ligne):
'''
haute = hauteur de la grille
large = largeur de la grille <= 26
ligne = nombre de pions a aligner pour gagner
'''
# genere 4 matrices ...
# 1 grille verticale, 1 horiontale, et les 2 diagonales
self.haute = haute
self.large = large if large <= 26 else 26
self.ligne = ligne
self.alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[:self.large] # pour l'affichage
self.horiz = [bytearray(' '*self.large) for _ in range(self.haute)]
self.verti = [bytearray(' '*self.haute) for _ in range(self.large)]
self.diag1 = [bytearray(' '*(self.haute)) for _ in range(self.large+self.haute-1)]
self.diag2 = [bytearray(' '*(self.haute)) for _ in range(self.large+self.haute-1)]
def put_at(self,lettre_colonne,pion):
'''
lettre_colonne = lettre alphabetique representant la colonne dans laquelle poser le pion
pion doit etre un caractere unique, 1 caractere pour chaque jouer
'''
# retourne 1 si le pion ne peut etre place
# retourne 0 si le pion a ete place
# retourne pion si le pion place donne la victoire
# les 4 matrices sont updatees a chaque fois qu'un pion peut etre place
# en verifiant si c'est gagnant
try:
lettre_colonne = self.alpha.index(lettre_colonne.upper())
y = self.verti[lettre_colonne].rfind(' ') # teste s'il reste de la place dans la colonne
y = y/(y>-1) # sinon genere une erreur
except: return 1 # plus de place dans cette rangee ou entree non valide
self.verti[lettre_colonne][y] = pion
if self.ligne*pion in self.verti[lettre_colonne]: return pion # place gagnant
self.horiz[y][lettre_colonne] = pion
if self.ligne*pion in self.horiz[y]: return pion
self.diag1[y+lettre_colonne][y] = pion
if self.ligne*pion in self.diag1[y+lettre_colonne]: return pion
self.diag2[lettre_colonne-y+self.haute-1][y] = pion
if self.ligne*pion in self.diag2[lettre_colonne-y+self.haute-1]: return pion
return 0 # pion place
def show(self):
print self.alpha.replace('',' ')
for _ in self.horiz:
print _.replace('','|')
print '-'*(self.large*2+1)
grid = Grid(8,8,4)
grid.show()
player = ['x','o'] # caracteres utilises pour chaque joueur
c = 0 # joueur 'x' commence
while True:
state = grid.put_at(raw_input("joueur '"+player[c]+"' : "),player[c])
grid.show()
if state == player[c]:
print "joueur '"+player[c]+"' gagne"
break
elif not state:
c = not c
Dans ce cas là, comment créer une liste de liste de dimension n*p ?
je jeterai un coup d'oeil à ton code, mais comme je n'en suis qu'au début des classes, je pense que j'aurai du mal à comprendre la totalité, mais merci quand meme!
qui te donnera une liste de n*p cases remplies de 0.
Problème tableau 2 dimensions
× 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.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.