Videos streaming images jeux et buzz
Connexion






Perdu le mot de passe ?

Inscrivez-vous maintenant !
Menu Principal
Communauté




clemator7113
Problème code Python : 3eme version =D
 1  #1
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
Anciens posts :
Citation :


1 : Salut à tous ! Je débute en python (je suis en cours d'ISN au lycée) et j'ai un petit problème sur mon code... Je définis une fonction avec des if a gogo, puis lorsque je veux définir une autre fonction en dessous, le shell me dit que'il y a un problème d'indentation. Après plusieurs tests sur mon code, j'ai compris que ma deuxième fonction était considérée comme la suite du dernier if de la fonction d'avant... Du coup, j'aimerai savoir s'il y a un moyen de "stopper" la définition de la fonction, histoire que la définition d'après ne soit pas dans la première... Merci d'avance ! Si besoin, je mettrais un screen de mon code, mais pour l'instant, je n'ai pas le temps, j'attends les coms pour savoir s'il faut que je le fasse !

2 : Bon, maintenant, j'ai un autre problème, et comme mon prof ne répond pas et que je ne peux pas le voir la semaine prochaine, je le pose ici, parce que vous êtes crô forts !
Le problème, c'est que j'affiche ma liste qui correspond au plateau en console, mais la liste s'affiche en linéaire... Y aurait-il un moyen de forcer un retour à la ligne à chaque 'valeur' de la liste, histoire que ça ressemble plus à ça :

Citation :

[[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0]]


Je dirais que ça, ça se fait dans la fonction qui créé le plateau en visuel : plateau_console()
ou dans la fonction qui place l'ennemi sur ce plateau (et qui print le plateau) : ennemi_visuel().
Mais je suis pas sûr !





[EDIT]
J'ai enlevé le code du premier post, il est sur mon dernier com



Merci d'avance !

Contribution le : 16/03/2016 17:55

Edité par clemator7113 sur 18/3/2016 11:51:35
Edité par clemator7113 sur 18/3/2016 11:55:48
Edité par clemator7113 sur 18/3/2016 11:56:41
Edité par clemator7113 sur 2/5/2016 15:29:56
Edité par clemator7113 sur 2/5/2016 15:30:09
Edité par clemator7113 sur 2/5/2016 15:46:24
Signaler

Asmodeus
 0  #2
Je masterise !
Inscrit: 19/02/2014 16:35
Post(s): 2113
Karma: 1085
@clemator7113 c'est pas un screen du code qu'il faut mais juste un copier coller avec les balises
[*code] ton code [*/code]
sans les étoiles

Fais juste attention au fait que l'indentation est très importante dans python, donc à chaque fois que tu finis un if ou une fonction, il faut descendre d'un niveau d'indentation.

Contribution le : 16/03/2016 18:15
Signaler

clemator7113
 0  #3
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
@Asmodeus
voilà 🙂
Je précise que c'est un jeu ou on commence en bas du plateau et on doit monter en haut, en évitant les ennemis (un seul ennemi est presque fini de codé et les perso, c'est pas moi qui m'en occupe ^^)

Du coup, le problème est au niveau de la partie "ennemis", j'ai une définition d'une fonction, puis un commentaire et la définition suivante est considérée automatiquement comme la suite de la première définition (idem pour la 3eme)
voir au dessus

D'ailleurs, si vous avez des commentaires à faire sur le code (sur la façon dont c'est commenté par exemple, que je ne respecte pas les conventions ou un truc du genre, je suis preneur 🙂

Et au fait, faites pas attention à la qualité ^^ je débute ^^

Contribution le : 16/03/2016 18:35

Edité par clemator7113 sur 18/3/2016 11:54:01
Signaler

-Flo-
 0  #4
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15182
Karma: 12550
@clemator7113 : Avec Python, l'indentation est très importante. C'est elle, et seulement elle, qui permet de définir où commence et se termine un bloc d'instructions comme la définition d'une fonction, un if, une boucle, etc.

Le problème dans ton code se situe donc au niveau de la partie "Ennemis", où toutes tes fonctions sont indentées les unes par rapport aux autres.

Pour simplifier, dans ton cas précis, à chaque fois que tu passes à la définition d'une nouvelle fonction, tu dois revenir complètement à gauche, sans laisser d'espace devant ta ligne "def".

Contribution le : 16/03/2016 18:43
Signaler

clemator7113
 0  #5
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
J'ai essayé aussi, mais quand je la met complètement à gauche, j'ai un message d'erreur "unexpected indentation" ou un truc du genre ^^

[edit]
J'ai ça comme erreur... et quand je reviens à l'indentation qu'Idle me propose (cf mon commentaire d'avant) j'ai plus mes fonctions définies puisque l'indentation pue...

ipfs QmdKAAkWTBvkJkLWYmWNevJA1rQVCQ3GUyqvZbP2wvuEwx

Contribution le : 16/03/2016 18:48
Signaler

-Flo-
 0  #6
Je poste trop
Inscrit: 08/01/2005 13:41
Post(s): 15182
Karma: 12550
@clemator7113 : Parce que je vois aussi que tu définis une fonction dans laquelle tu n'écris aucune instruction (ligne "def ennemi_visuel(G):"). Du coup Python s'attend à une instruction indentée, mais trouve à la place une nouvelle définition de fonction au même niveau d'indentation.

Il faut soit que tu ajoutes au moins une instruction à cette fonction, ou soit que tu la commentes (ou la supprimes) pour ne pas qu'elle soit prise en compte.

Contribution le : 16/03/2016 18:51
Signaler

clemator7113
 0  #7
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
YAY ! Merci @-Flo- !!!
C'était juste la fonction d'avant qui foutait tout en l'air ! Je l'ai commentée et tout est revenu dans l'ordre !
Du coup, maintenant, mon code fonctionne, ou presque ! Enfin, j'ai plus d'erreur !

Merci encore !

Contribution le : 16/03/2016 19:02
_________________
_____________________________________

Des fois il vaut mieux ne rien et dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
Signaler

clemator7113
 0  #8
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
Bon, comme j'ai posé une autre question, j'up mon post, je sais pas trop si j'ai le droit, si c'est pas le cas, promis je le ferai plus ! ❤

Contribution le : 18/03/2016 11:55
_________________
_____________________________________

Des fois il vaut mieux ne rien et dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
Signaler

Skity
 0  #9
Je masterise !
Inscrit: 29/12/2013 23:48
Post(s): 2024
Karma: 521
Citation :

@clemator7113 a écrit:
Bon, comme j'ai posé une autre question, j'up mon post, je sais pas trop si j'ai le droit, si c'est pas le cas, promis je le ferai plus ! <3


Hello 🙂

Un petit premier truc que je ne comprends pas trop:

def plateau_console(F):
    for i in range (len(F)):
        for k in range (len(F[0])):
            F[i][k]=0
    #print(F,'\n')
    return 


Si c'est une fonction (méthode) qui affiche bêtement le tableau, pourquoi elle retourne quelque chose ?

Sinon je pense qu'il suffit que tu rajoutes un print("\n") dans ton premier for et que tu utilises un buffer (variable tampon) pour mettre tout ton affichage dedans et l'afficher à la fin 🙂
Sinon, comme Python c'est puissant, tu peux utiliser les headers pour formater ton output vraiment comme tu le souhaites car print() ajoute un retour à la ligne par défaut:

LAYOUT = "{!s:10} {!s:14} {!s:4} {!s:10}"

yourList = ["Ford","Mustang",1966,"Red"]

print LAYOUT.format("Brand","Modell","Year","Color")
print LAYOUT.format(*yourList)


Site --> http://linguistics.berkeley.edu/plab/guestwiki/index.php?title=Output_formatting_in_Python

Sinon tu peux essayer ça dans un premier temps 🙂

#creation du plateau (visuel en console)
def plateau_console(F):
    print "== Affiche plateau =="
    endDisplay="";
    for i in range (len(F)):
        for k in range (len(F[i])):
            F[i][k]=0
            endDisplay += str(F[i][k]) + ", "
        endDisplay += "\n"
    print endDisplay
    print "## Affiche plateau ##"
    return F

Contribution le : 18/03/2016 13:51
Signaler

clemator7113
 0  #10
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
Bon...
Quand dans ma fonction je met :
def ennemi_visuel():
    global plateau_visuel
    plateau_visuel = plateau_visuel.replace('\n','')
    plateau_visuel = plateau_visuel.replace(' ','')
    print(plateau_visuel)
    plateau_visuel = list(plateau_visuel)
    print(plateau_visuel)
    #return plateau_visuel
    plateau_visuel[PEx][PEy] = 'M'
    print(platmonstr[PEx][PEy])
    plateau_visuel = str(plateau_visuel)
    print(plateau_visuel)


J'ai ce message d'erreur :
File "C:\Users\Clement\Desktop\Projet final.py", line 77, in ennemi_visuel
    plateau_visuel[PEx][PEy]='M'
TypeError: 'str' object does not support item assignment


Je ne comprend pas pourquoi... Parce que plateau_visuel n'est plus une chaine de caractères à partir du moment ou le l'ai listée avec (list) non ?

Et du coup, quand je dé-commente le "return (plateau_visuel), j'arrive à afficher la liste mais toutes les lignes suivantes sont ignorées....


PS : @Skity, j'ai essayé de comprendre ce qu'étaient des headers, et de ce que j'ai compris, c'est une chaine de caractère qui respecte la mise en forme (une chaine entre '''chaine'''^)... Mais du coup, je ne vois pas le rapport avec ce que tu as écrit en dessous de ta proposition....
Et si non, pour l'instant, j'utilise ta dernière proposition, parce que j'ai compris comment ça marchait ^^

Contribution le : 18/03/2016 23:01
_________________
_____________________________________

Des fois il vaut mieux ne rien et dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
Signaler

Invité
 0  #11
FantômeInvité
@clemator7113
J'y connais rien en python, mais ton objet sera toujours de type str, essaie de récupérer les valeurs dont tu as besoin, au lieu de récupérer l'objet entier, ou assigne le str à un autre objet str si tu veux sauver l’état actuel de l'objet.
EDIT : Et tu devrais utiliser le debugger de ton IDE ( y'en a probablement un ), c'est un outil extrêmement puissant, a utiliser sans modération 🙂

Contribution le : 20/03/2016 11:35
Signaler

Skity
 0  #12
Je masterise !
Inscrit: 29/12/2013 23:48
Post(s): 2024
Karma: 521
@clemator7113
Hello,

Alors il y a 3 sujets, je vais faire dans l'ordre 🙂 :

################################################
### 1- str does not support item assignement ###
################################################

Dans ton code:

def ennemi_visuel():
    global plateau_visuel
    plateau_visuel = plateau_visuel.replace('\n','')
    plateau_visuel = plateau_visuel.replace(' ','')
    print(plateau_visuel)
    plateau_visuel = list(plateau_visuel)
    print(plateau_visuel)
    #return plateau_visuel
    plateau_visuel[PEx][PEy] = 'M'
    print(platmonstr[PEx][PEy])
    plateau_visuel = str(plateau_visuel)
    print(plateau_visuel)


Je ne vois à aucun moment dans ta fonction (méthode) la déclaration PEx et PEy. Ces variables sont-elles globales et/ou public ?

En effet, avec list normalement tu as transformé ton plateau pour le traiter comme tu essayes de faire. Je pense que le problème est plus dû aux variable PExy. (N'hésites pas à coller tout le code si il n'est pas trop trop grand 🙂 )

#######################################
### 2- Késako les format avec print ###
#######################################

Les formats permettent de dire à print comment tu veux afficher ta sortie. Par exemple, pour faire un tableau c'est typetop.

L'exemple que j'ai donné n'est qu'un exemple tiré de monsieur Internet.

Pour l'expliquer un peu mieux, voici un exemple un peu plus clair:

user@VMToto:~$ ./test.py

--------------------------------------------
|Header1        |Header2        |Header3   |
--------------------------------------------
|Value1         |Value2         |Value3    |
|LongMax15      |LongMax15      |LongMax10 |
|LongMax15      |LongMax15      |LongMax10 |
|touch          |mytralala      |ooo Touch |
|my             |dingding       |dong      |
--------------------------------------------


user@VMToto:~$ cat test.py

#!/usr/bin/python
outputFormat="|{!s:15}|{!s:15}|{!s:10}|"
print "--------------------------------------------"
print outputFormat.format("Header1","Header2","Header3")
print "--------------------------------------------"
print outputFormat.format("Value1","Value2","Value3")
print outputFormat.format("LongMax15","LongMax15","LongMax10")
print outputFormat.format("LongMax15","LongMax15","LongMax10")
print outputFormat.format("touch","mytralala","ooo Touch")
print outputFormat.format("my","dingding","dong")
print "--------------------------------------------"




Dans le code, tu vas retrouver ma variable outputFormat qui va définir le format de sortie.
{xxxxx} correspond à un élément qui va être remplacé. Si il y en a plusieurs, c'est dans l'ordre de mise en paramètres passé à la fonction format.
!s défini le type. A la place de "s", j'aurais bien mettre "d","i", ... Je te laisse lire la doc pour les autres types 😉
:15 défini le nombre max de caractères attendu pour l'élément. Dans ton cas, je pense que au lieu du 15 dans mon exemple, je pense que ça serait plutôt ":1" 🙂

###############################
### 3- WTF mes propositions ###
###############################

En fait, je t'ai fais deux propostions. La première est simplement un exemple de Internet avec comment utiliser les formats avec print en Python.
La deuxième proposition (le dernier bout de code) n'est qu'une autre technique de ce que tu cherches à faire. Le problème c'est que c'est un peu moins propre et moins évolutif. Si plus tard tu décides de changer le design de ton tableau, bah ça sera un peu plus compliqué 😉

Voili voilou

Bon courage 😉

Contribution le : 21/03/2016 10:58
Signaler

clemator7113
 0  #13
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
@Skity
@-Flo-
Salut mes sauveurs !
Alors déjà, (parce que j'ai oublié de le dire avant) MERCI BEAUCOUP !
Après, histoire de continuer à être chiant, j'ai un problème... Je mettrais mon code en fin de commentaire, histoire que ça soit à peu près lisible...
Alors voilà.
Je créé mon plateau avec mes pointillés, tout va bien. Je génère aléatoirement la position des ennemis, tout va bien. C'est dans la fonction 'ennemis_visuel' que tout se gâte... J'ai inséré un print() qui sert à rien au milieu de la fonction (celui qui est commenté à droite) pour voir ce qui clochait.
Je m'explique : quand je print la liste 'TAMPON1', je n'ai qu'un seul ennemi qui apparait sur la liste. En revanche, quand je "''.join.plateau_visuel", j'ai 2 ennemis qui apparaissent (un ennemi étant représenté par un M) (on ne voit pas toujours le deuxième, donc s'il n'est pas là, relancez ^^).
Je peux vous dire, si ça peut aider, que les deux M sont 'liés'. Je veux dire par là qu'ils font les mêmes déplacements en même temps. De plus, sur les deux, à chaque fois, l'un est dominant sur l'autre. C'est à dire que l'un respecte les limites définies, alors que l'autre s'en fout complètement : celui qui semble respecter les limites est celui du bas. (celui du haut serait donc un parasite ?)
Je ne comprend absolument pas pourquoi ce deuxième M apparaît... J'ai demandé à mon prof qui m'a répondu 'J'ai déjà eu le problème, mais je ne sais plus comment on le résout"...
Du coup, je vous demande de l'aide :roll: :roll: parce que vous êtes trop forts :coeur: :coeur:
J'espère que j'ai été assez clair dans ma description de problème...

Voilà mon code :

##############################################
# Auteur : Clément VERDIER                   #
# Dernière date de modif : 04/04/2016        #
# Version python : 3.3.3                     #
##############################################






##############################################
#                A FAIRE                     #
##############################################

#Ce putain de deuxième ennemi qui pop de je ne sais où !


###############################################
#                 VARIABLES                   #
###############################################
#import
from random import randint
import time
import os
# Plateau
            #Echelles pour deplacement vertical en positions  [x,0] [x,5] [x,10] [x,15] [x,19]
pla1=[]
pla2=[]
taille = 15
plateau_visuel = ''
# Ennemis
LE=[]
pos1=[]
pos2=[]
pos3=[]

###############################################
#                   PLATEAU                   #
###############################################

#création du plateau (coordonnées)
def plateau(A,B):
    for k in range (taille):
        B=[]
        for i in range (taille):
            B+=[[k,i]]
        print(B)
        A=A+[B]
    return A

#création du plateau (visuel en console)
'''def plateau_console(F):
    for i in range (len(F)):
        for k in range (len(F[0])):
            F[i][k]=0
    #print(F,'\n'))
    return F'''

'''#creation du plateau (visuel en console)
def plateau_console(F):
    global plateau_visuel
    #print ("== Affiche plateau ==")
    plateau_visuel=""
    for i in range (len(F)):
        for k in range (len(F[i])):
            F[i][k]='_ '
            plateau_visuel += str(F[i][k])
        plateau_visuel += "\n"
    #print (plateau_visuel)
    return plateau_visuel
    #print ("## Affiche plateau ##")'''


def plateau_console2(F):
    global plateau_visuel
    liste_plateau = []
    plateau_output_format = ""
    for i in range (len(F)):
        for k in range (len(F[i])):
            liste_plateau += '_'
            plateau_output_format += "{!s:2}"
        plateau_output_format += "\n"
    plateau_visuel = plateau_output_format.format(*liste_plateau)
    return plateau_visuel
###############################################
#                   ENNEMIS                   #
###############################################
        
#Positionnement aléatoire de l'ennemi
'''def pos_aléatoire(C):
    C = [randint(0,9),randint(0,9)]
    PEx = C[0]
    PEy = C[1]
    return C'''
#création et positionnemenbt de x-ennemis
def créa_pos_aléatoire(A):
    for i in range (1):
        A += [[randint(0,taille), randint(0,taille)]]
    return A

#Positionnement de l'ennemi sur le visuel
def ennemi_visuel():
    global plateau_visuel, Liste_ennemis
    plateau_visuel = plateau_visuel.replace('\n','')
    plateau_visuel = plateau_visuel.replace(' ','')
    
    #print(plateau_visuel)
    plateau_visuel = list(plateau_visuel)
    #print(plateau_visuel)
    #return plateau_visuel
    for i in range (len(Liste_ennemis)):
        TAMPON = Liste_ennemis[i][0] * 10
        PE = (TAMPON + Liste_ennemis[i][1])
        plateau_visuel[PE] = 'M'
    print(plateau_visuel) #C'EST CELUI LA DE COMMENTAIRE QUI SERT A RIEN
    TAMPON1 = ''
    for i in range (taille):
        for k in range (taille):
            TAMPON1 += ''.join(plateau_visuel[(i*10)+k])
            TAMPON1 += " "
        TAMPON1 += "\n"
    print(TAMPON1)
#déplacement horizontal
def déplacement_horizontal(A):
    D = randint(0,1)
    if D==0:
        if A[1] != 0 :
            A[1] -= 1
    else :
            if A[1] != taille :
                 A[1] += 1
    return A
    
    
#déplacement vertical
def déplacement_vertical(A):
    D = randint(0,1)
    if D==0:
        if A[0] != 0 :
            A[0] -= 1
    else :
            if A[0] != taille-1 :
                A[0] += 1
    return A

#choix du déplacement dans le cas ou l'ennemi est sur une case echelle
def déplacement_choix(A):
    E=randint(0,1)
    for i in range (len(A)):
        if A[i][1] == 0 or A[i][1] == 5 or A[i][1] == 10 or A[i][1] == 15 or A[i][1] == 19:
            #print('Test pour savoir si déplacement vertic ou horiz')
            if E==0:
                #print('déplacement horizontal')
                déplacement_horizontal(A[i])
            else:
                #print('déplacement vertical')
                déplacement_vertical(A[i])
        else:
            déplacement_horizontal(A[i])
    





###############################################
#                 DEROULEMENT               #
###############################################

######Création du plateau
Plateau=plateau(pla1,pla2)
print()
print()
print()
print()
print('LE PLATEAU')
test=plateau_console2(Plateau)
print(test)
print()
print()
print()

#####Positionnement ennemis
Liste_ennemis = créa_pos_aléatoire(LE)
#print("Ennemi 1 en position",PEx1,PEy1)
#print("Ennemi 2 en position",PEx2,PEy2)
#print("Ennemi 3 en position",PEx3,PEy3)
time.sleep(1)
#os.system("pause")
ennemi_visuel()
for i in range (20): #test du déplacement de l'ennemi (à faire au début de chaque tour)
    #time.sleep(4) 
    time.sleep(1)
    #os.system("pause")
    test=plateau_console2(Plateau)
    déplacement_choix(Liste_ennemis)
    ennemi_visuel()
    #print("Ennemi 1 en position",PEx1,PEy1)
    #print("Ennemi 2 en position",PEx2,PEy2)
    #print("Ennemi 3 en position",PEx3,PEy3)



Merci d'avance !!

Contribution le : 02/05/2016 15:27
Signaler

Invité
 0  #14
FantômeInvité
Citation :
TAMPON1 += ''.join(plateau_visuel[(i*10)+k])


c'est pas (i*taille + k) plutôt?

sinon essaye de print les coordonnées de l'ennemi avant d'afficher ton plateau, pour voir lequel est bien à sa place et lequel ne devrait pas être là

Contribution le : 02/05/2016 17:44
Signaler

clemator7113
 0  #15
Je m'installe
Inscrit: 16/05/2010 16:57
Post(s): 441
@yakow
Oui effectivement, ça doit bien être i*taille, c'est qu'avant, j'avais pas de variable taille et du coup la taille c'était 10 ^^

Contribution le : 09/05/2016 00:50
_________________
_____________________________________

Des fois il vaut mieux ne rien et dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
Signaler


 Haut   Précédent   Suivant






Si vous êtes l'auteur d'un élément de ce site, vous pouvez si vous le souhaitez, le modifier ou le supprimer
Merci de me contacter par mail. Déclaré à la CNIL N°1031721.