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

Tkinter Python Discussion :

Projet de bataille navale


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut Projet de bataille navale
    Bonjour à tous,

    Dans le cadre de ma première année de Licence Informatique, je dois réaliser une bataille navale en python. J'ai bien avancé mais j'ai un problème qui subsiste : quand je place les bateaux de l'ordinateur aléatoirement, malgré une fonction test, je me retrouve avec des bateaux qui se chevauche. Je vous met les deux fonctions qui pause problème :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    def place_o(): #Fonction qui choisit les coordonnées des bateaux de l'ordinateur
        global bateauxActifsOrdi
        global test
        for y in dico_bat.values():
            orien=randint(0,1) #orientation du bateau: 0=vertical, 1=horizontal
            if orien==0:
                a,b=randint(0,(nbcase-1)-y),randint(0,nbcase-1) 
                while test==False:
                    res=est_placable(orien,a,b,y)
                    test,a,b=res[0],res[1],res[2]
                for i in range (0,y):
                    bateauxActifsOrdi+=[[a+i,b]]
            else:
                a,b=randint(0,nbcase-1),randint(0,(nbcase-1)-y)
                while test==False:
                    res=est_placable(orien,a,b,y)
                    test,a,b=res[0],res[1],res[2]
                for i in range (0,y):
                    bateauxActifsOrdi+=[[a,b+i]]
     
    def afficheBat():
        for i in range(len(bateauxActifsOrdi)):
            a=bateauxActifsOrdi[i][0]
            b=bateauxActifsOrdi[i][1]
            can.create_rectangle(x1+case*b,y1+case*a,x1+case*(b+1),y1+case*(a+1),fill="red")
     
    def est_placable(z,x,y,taille): #Fonction qui teste si un bateau en recouvrira un autre
        global test
        test=False
        if z==0:
            for i in range (0,taille):
                if [x+i,y] in bateauxActifsOrdi:
                    x,y=randint(0,(nbcase-1)-taille),randint(0,nbcase-1)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
        else:
            for i in range (0,taille):
                if [x,y+i] in bateauxActifsOrdi:
                    x,y=randint(0,nbcase-1),randint(0,(nbcase-1)-taille)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
    Si vous pouviez m'expliquer d'où vient le problème, et m'aiguillez sur une solution se serait parfait!
    Merci d'avance.

    Cordialement,
    Clemissile

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Le problème vient de cette construction dans la fonction "est_placable":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            for i in range (0,taille):
                if [x+i,y] in bateauxActifsOrdi:
                    x,y=randint(0,(nbcase-1)-taille),randint(0,nbcase-1)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
    Essayez de relire ces lignes en vous demandant comment elles peuvent bien faire le boulot que vous en attendez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut
    Salut,

    En relisant ces lignes je pense que le problème peut venir du "if" au niveau du [x+i,y] mais je ne vois pas comment le modifier pour obtenir le résultat escompté... Si le problème ne provient pas de là, je ne sais pas d'où cela peut provenir.
    Merci de votre réponse.

    Cordialement,
    Clemissile

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par clemissile Voir le message
    En relisant ces lignes je pense que le problème peut venir du "if" au niveau du [x+i,y] mais je ne vois pas comment le modifier pour obtenir le résultat escompté... Si le problème ne provient pas de là, je ne sais pas d'où cela peut provenir.
    Ah ben déjà, expliquez ce qu'est le résultat escompté car, à priori, cette fonction ne devrait retourner qu'un booléen.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut
    Salut,

    Cette fonction doit tester si un bateau en recouvre un autre, si c'est le cas, elle doit retirer de nouvelles coordonnées et les re-tester, d'où le randint et l'appel de la fonction dans le if, et si le bateau n'en recouvre aucun on retourne True et les valeurs x,y qui ont changé ou non.

    Cordialement,
    Clemissile

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par clemissile Voir le message
    Cette fonction doit tester si un bateau en recouvre un autre, si c'est le cas, elle doit retirer de nouvelles coordonnées et les re-tester, d'où le randint et l'appel de la fonction dans le if, et si le bateau n'en recouvre aucun on retourne True et les valeurs x,y qui ont changé ou non.
    Vous lui donnez bien trop de responsabilités avant de vous assurer que sa fonction de base est assurée!
    Il faut essayez d'exécuter le code comme le ferait la machine en essayant des cas de figures.
    Exemple supposons que (1,2) ne soit pas dans bateauxActifsOrdi mais que (2, 2) le soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in range (0,taille):
                if [x+i,y] in bateauxActifsOrdi:
                    x,y=randint(0,(nbcase-1)-taille),randint(0,nbcase-1)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
    la première itération passe dans le "else" et retournera [True, 1, 2] sans avoir fait quoi que ce soit pour le suivant.

    Ce n'est pas ce que vous voulez mais c'est néanmoins ce que vous avez écrit

    Pour le reste, essayez un peu de jouer à la machine pour voir...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. projet de bataille navale
    Par tropicthunder dans le forum Général Python
    Réponses: 1
    Dernier message: 22/04/2015, 16h26
  2. Bataille navale projet
    Par lorli911 dans le forum Général Python
    Réponses: 2
    Dernier message: 01/04/2015, 15h44
  3. bataille navale, un projet bateau (haha)
    Par Dendrite dans le forum Débuter
    Réponses: 11
    Dernier message: 26/01/2010, 16h18
  4. Projet de bataille navale
    Par hichamtimberlake dans le forum C
    Réponses: 1
    Dernier message: 23/05/2009, 13h22
  5. [LG]Programme Bataille Navale en Pascal
    Par RaFaL dans le forum Langage
    Réponses: 21
    Dernier message: 10/06/2003, 21h22

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