IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Résoudre "Out Of Range" suivant plusieurs cas [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Par défaut Résoudre "Out Of Range" suivant plusieurs cas
    Bonjour à tous

    Je suis en train de programmer un jeu de Monopoly sur python 3.3.2, et je rencontre un problème pour terminer la fonction "Avancement".
    J'ai crée cette fonction pour simuler le déplacement d'un joueur sur les 40 cases du Monopoly.
    Concrètement, je fais évoluer aléatoirement un petit "1" dans une liste de taille 40.

    Voici la fonction :
    Nom : Avancement.png
Affichages : 1792
Taille : 13,1 Ko

    Si l'image ne s'affiche pas, Voici la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    def Avancement(L,Position): # L est ma liste simulant les 40 cases
        k=0
        if (Position!=0):
            k=Position
            L[Position]="-"
        x=Dés() # Dés() est ma fonction qui génère aléatoirement un entier entre 2 et 12
        if (Position<28): 
            L[k+x]=1
            Position=k+x
            AffichageListe(L)
        else: # Cette condition permet d'éviter "list index out of range"
            k=0
            L[k+x]=1
            Position=k+x
            AffichageListe(L)
        return Position
     
    a=Avancement(Aj1,0) # Ici, je simule le parcours sur 20 lancés de dés
    for k in range(20):
        b=a
        a=Avancement(Aj1,b)
    Et ce qui apparait dans la console ( Je remplacerai par la suite les "-" par des "0" ) :

    ( - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )
    ( - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )
    ( - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - )
    ( - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - )
    ( - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - )
    ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - )
    ( - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )
    ( - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - ) etc ...

    Mon problème, c'est qu'avec cette méthode, la probabilité de tomber sur les 12 dernières cases du Monopoly est moins importante.
    Comment puis-je donc faire ?

    Je vous remercie par avance de votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Amateur
    Inscrit en
    Janvier 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 24
    Par défaut
    Hello!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if position+x < 40: #ou 39
        position = position+x
    else:
        position = position+x-40 #ou 39

  3. #3
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Leododo Voir le message
    Bonjour à tous

    Je suis en train de programmer un jeu de Monopoly sur python 3.3.2, et je rencontre un problème pour terminer la fonction "Avancement".
    J'ai crée cette fonction pour simuler le déplacement d'un joueur sur les 40 cases du Monopoly.
    Concrètement, je fais évoluer aléatoirement un petit "1" dans une liste de taille 40.


    Mon problème, c'est qu'avec cette méthode, la probabilité de tomber sur les 12 dernières cases du Monopoly est moins importante.
    Comment puis-je donc faire ?

    Je vous remercie par avance de votre aide
    Bonsoir,
    Il suffit d'utiliser la fonction mathématique modulo (%) lors du calcul de la nouvelle position!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> 
    >>> 39%40
    39
    >>> 40%40
    0
    >>> 41%40
    1
    >>>
    Clodion

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut
    Il y a plusieurs choses qui me semblent d'abord assez... Inutiles dans ton code ( malgré le fait que je ne sois pas allé dans les détails du fonctionnement ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    k=0
    if (Position != 0):
    .... k=Position
    Pourquoi ne pas plus simplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    k = Position
    if Position != 0 :
    ? Tu n'as pas besoin de gérer k de deux façons différentes... Et de plus tes parenthèses sont inutiles quand ta condition ne possède qu'un seul opérateur. ^^

    Autre point qui me semble inutile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    k = 0
    L[k+x] = 1
    Position = k+x
    Pourquoi ne pas plutôt récrire ce code sans ajouter k, puisqu'il vaut forcément 0 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    k = 0
    L[x] = 1
    Position = x
    Dernier point que je ne comprend pas même si cela ne fait pas réellement parti de ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    for k in range(20):
    .... b = a
    .... a = Avancement(Aj1, b)
    Qu'est ce qui t'interdit de remplacer b par a dans l'appel de ta fonction ( et ainsi de supprimer la variable b de ton code ) ?

    Bon après peut-être moi qui n'ai simplement pas saisi deux trois éléments de ton code... Du coup, je m'en excuse si tout ce que tu as fait est justifié et que je t'oriente vers de fausses indications.



    Après, c'est vrai que la gestion de " index out of ranges " est là très mauvaise... Car encore plus grave qu'une simple probabilité plus faible, tu as là des déplacements qui peuvent dépasser 12 cases, non ?

    ( par exemple on imagine la cas extrême : notre position initiale est 28, et notre déplacement est de 12, alors on se retrouvera sur la case 12, et notre déplacement aura été de 40-28+12 = 24 cases, un peu abusif... )

    Du coup, je pense qu'il va falloir plutôt utiliser une autre condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    if k+x < len(L) :
    .... L[k+x] = 1
    .... Position = k+x
    .... AffichageListe(L)
    else:
    .... x -= 40 - k
    .... L[x] = 1
    .... Position = x
    .... AffichageListe(L)
    Teste ce code à la place de tout ton bloc conditionnel, il me semble que cela devrait fonctionner.


    EDIT : Je n'avais effectivement pas pensé au modulo, il a raison, utilise le modulo plutôt que ce que je viens de te donner, c'est beaucoup plus rapide.

    Désolé pour la mauvaise orientation.

  5. #5
    Membre confirmé
    Homme Profil pro
    Amateur
    Inscrit en
    Janvier 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 24
    Par défaut
    Ah oui les modulos c'est pas bête ça...

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Par défaut
    Merci à vous 3

    J'ai corrigé les lignes inutiles.
    J'ai essayé avec le modulo, et ce qui me donne l'erreur Out Of Range. A moins que je l'ai mal utilisé, ou au mauvais endroit .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def Avancement(L,Position):
        k=Position
        if (Position!=0):
            L[Position]="-"
        x=Dés()
        if (Position%40<40): 
            L[k+x]=1
            Position=k+x
            AffichageListe(L)
        else:
            k=0
            L[k+x]=1
            Position=x
            AffichageListe(L)
        return Position

  7. #7
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Leododo Voir le message
    Merci à vous 3

    J'ai corrigé les lignes inutiles.
    J'ai essayé avec le modulo, et ce qui me donne l'erreur Out Of Range. A moins que je l'ai mal utilisé, ou au mauvais endroit .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def Avancement(L,Position):
        k=Position
        if (Position!=0):
            L[Position]="-"
        x=Dés()
        if (Position%40<40): 
            L[k+x]=1
            Position=k+x
            AffichageListe(L)
        else:
            k=0
            L[k+x]=1
            Position=x
            AffichageListe(L)
        return Position
    Bonjour,
    Heu… Tu n'as pas besoin de la structure if…then!
    position = (position+Des())%40

    doit largement suffire!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> position = 40
    >>> position%40<40
    True
    >>> position = 50
    >>> position%40<40
    True
    >>>
    Clodion

    Bon…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def Avancement(L,Position): # L est ma liste simulant les 40 cases
     
        L[Position-1]="-"
        Position = (Position + Des())%40
        L[Position-1] = "1"
        AffichageListe(L)
        return Position
     
    a=Avancement(Aj1,0) # Ici, je simule le parcours sur 20 lancés de dés
    for k in range(20):
        a=Avancement(Aj1,a)

  8. #8
    Membre confirmé
    Homme Profil pro
    Amateur
    Inscrit en
    Janvier 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 24
    Par défaut
    Tu peux faire un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    from random import randint
     
    liste = ["0" for i in range(40)]
    position = 0
     
    def avancer(maListe, maPosition, monTirage):
     
        maPosition = (maPosition+monTirage)%40
        maListe[maPosition] = str(int(maListe[maPosition])+1)
     
        return maPosition
     
    def tirage():   
     
        nombre = randint(1, 12)
     
        return nombre
     
    while 1:
     
        choix = input("Appuyer sur entrée pour lancer les dés ou sur q pour quitter: ")
     
        if choix == "q":
     
            break
     
        nombre = tirage()
     
        position = avancer(liste, position, nombre)
     
        print(liste)
    J'espère que j'ai pas fait d'erreur...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 12/01/2006, 16h14
  2. [C#] erreur selectetedindex out of range datagrid
    Par mahboub dans le forum ASP.NET
    Réponses: 7
    Dernier message: 31/10/2005, 17h31
  3. Réponses: 10
    Dernier message: 21/09/2004, 16h44
  4. datetime data type resulted in an out-of-range
    Par faamugol dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo