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

Programmation multimédia/Jeux Python Discussion :

bataille navale avec pygame [Python 2.X]


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut bataille navale avec pygame
    bonjour,

    Pour mon problème, pygame et python seront spécifique à mon cas mais, je pense, pourra aider pour d'autre langage.

    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    import pygame
    from pygame.locals import *
    pygame.display.init()
    continuer = False
    def fenetre(): 
     
     
        while 1:
     
     
            fond = pygame.image.load("grille.jpg")
            fenetre = pygame.display.set_mode((720, 501))
            fenetre.blit(fond, (0,0))
            pygame.display.flip()
            for event in pygame.event.get():  
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                    continuer = True
            pygame.mouse.get_pressed()
            coordonne = pygame.mouse.get_pos()
            print(coordonne)
     
     
     
     
    fenetre()
    Ce (bout) de code est un début de bataille navale,
    Comment créer une "adresse" pour chaque case du quadrillage afin de pouvoir tirer sur des coordonnées précises type 1A, 6C
    je pensais le faire en récupérant les coordonnés de la souris et selon afficher la croix sur la case mais ça veut dire qu'il faut 2 conditions (coordonnés + savoir si le bouton gauche est pressé) + la fonction pour afficher l'image x 100 pour chaque cases donc 300 lignes de code pour presque rien...
    de plus je n'ai pas de moyen de récupérer les coordonné vraiment précisément, je le fait avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pygame.mouse.get_pressed()
            coordonne = pygame.mouse.get_pos()
            print(coordonne)
    mon affaire est un poil compliqué à expliquer veillez m'en excuser.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 136
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    En effet, je ne suis pas sur de bien comprendre le souci.
    Je vais partir du principe que vous avez une grille de 10x10.

    Pour passer des coordonnées chiffre|lettre vers les coordonnées classiques X/Y sur la grille, il suffit :
    • de prendre le chiffre. En effet, vous pouvez l'utiliser tel quel.
    • de prendre la lettre et de faire un petit calcul simple : il faut savoir qu'en informatique, ce que l'on appelle une lettre, ce n'est qu'un nombre. Par exemple, pour la lettre 'a', c'est le nombre 97. Chaque caractère correspond à un nombre (voir la table ASCII). Pour faire la conversion, vous devez utiliser la fonction ord(). Ok, mais ce n'est pas tout. Là, vous récupérez un nombre qui sera un truc comme 65. Alors que pour 'A', vous voulez un 0. Pour 'B' vous voulez 1. La chance que nous avons, c'est que dans la table ASCII, A et B (et C et...) se suivent. Du coup, nous pouvons faire : CHAR - ord('A') et on obtiendra pour CHAR == A -> 0 ; CHAR == B -> 1 et ainsi de suite.



    Pour l'utilisation de la souris. Bah ... si coordonne = pygame.mouse.get_pos() donne un résultat précis (le pixel sur lequel vous cliquez, relatif au coin haut gauche). Ensuite, si on dit que chacun de vos cases fait N pixels, il suffit de faire une opération du style : click_x / N , et on obtient la case sur laquelle on a cliqué.

    Voilà
    Bonne continuation.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut Re:
    Effectivement ce n'est pas ça, je cherche a creer un quadrillage sur lequel le joueur pourra cliquer dessus et marquer la case pour positionner ses bateaux

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    il faut récupérer l'événement MOUSEBUTTONUP et regarder si c'est le button 1 qui est relaché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while 1:
        ev = event.wait()
        if ev.type == MOUSEBUTTONUP and ev.button == 1:
            x,y = ev.pos # recupere la position de la souris

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut Re:
    On pour savoir si il clique droit, mais comment savoir dans quelle case?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    tu connais la position de la grille, ses dimensions et la position de la souris, il suffit de calculer, c'est des maths.

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je plussoie les explications données précédemment, comme ça semblait ne pas suffire et que je m'ennuyais ferme je t'ai fait un dessin

    Nom : bla.png
Affichages : 4983
Taille : 68,9 Ko

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 136
    Billets dans le blog
    150
    Par défaut
    Je vais sauvegarder cette image quelque part, je pense qu'elle va m'être très souvent utile.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut re:
    merci pour tout, j'ai résolu mon problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def case():
     
        x, y = pygame.mouse.get_pos()
        x = x  / 42
        y = y /44 
        print(x , y)
        return y, x
    vu que dans ma surface pygame je n'ai pas de marge je ne la soustrait pas

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut re: condition clique droit
    re:

    concernant la condition pour obtenir un clique droit, j'ai tout essayé celle fournit dans la doc officiel, celles de plusieurs tutos et celle de Josmiley mais rien ni fait mon code ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if event.type == MOUSEBUTTONUP and event.button == 1:
                print("true") #voir si la condition est remplie edit: non
                croix = pygame.image.load("croix.png")
                fenetre.blit(croix, (x_bis*42,y_bis*44)) #largeur et longeur d'une case
                pygame.display.flip()
    pour le moment je ne cherche même pas à voir apparaître ma croix.png mais juste le "true" de mon print...


    Cordialement ,bastien

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 136
    Billets dans le blog
    150
    Par défaut
    Le bouton du clic droit, n'est ce pas le bouton 2 ?
    Enfin, c'est marqué dans la documentation et puis, je croyais que la SDL/pygame définissait des constantes, pour les différents clics.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut re:
    les constantes sont importées et que ce soit clique gauche ou droit j'ai tout essayer

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 755
    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 755
    Par défaut
    Citation Envoyé par 1bastien1 Voir le message
    concernant la condition pour obtenir un clique droit, j'ai tout essayé celle fournit dans la doc officiel, celles de plusieurs tutos et celle de Josmiley mais rien ni fait mon code ne fonctionne pas
    1 va pour LEFT, RIGHT devrait être 3.
    Je ne crois pas que ces constantes soient définies dans pygame.locals.

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

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    normalement le bouton droit c'est 3, 2 c'est le clic de molette, 4 un cran de molette vers le haut et 5 vers le bas.
    1bastien1, poste ton code teste en entier stp.

  15. #15
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut re: code entier
    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
    47
    48
    49
    50
    51
    52
    #INSTALLATION DES BATEAUX
    """ 1 porte-avions (5 cases)
        1 croiseur (4 cases)
        1 contre-torpilleurs (3 cases)
        1 sous-marin (3 cases)
        1 torpilleur (2 cases)
    """
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
    first_case = 1 , 1
    import pygame
    from pygame.locals import *
    pygame.display.init()
    continuer = False
    def fenetre(): 
     
     
        while 1:
     
     
            fond = pygame.image.load("grille.jpg")
            fenetre = pygame.display.set_mode((720, 501))
            fenetre.blit(fond, (0,0))
            pygame.display.flip()
            for event in pygame.event.get():  
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                    continuer = True
            case()
     
     
     
    def case():
     
        x, y = pygame.mouse.get_pos()
        x_bis = (x - 10 )/ 42 #une petite marge
        y_bis = (y - 6) /44 
        print(x_bis , y_bis)
        for event in pygame.event.get():
         if event.type == KEYDOWN:
            #if event.type == MOUSEBUTTONDOWN and event.button == 1:
                print("true") #voir si la condition est remplie edit: la condition quelle quelle soit n est jamais remplie    
                """croix = pygame.image.load("croix.png")
                croix.blit(croix, (x_bis*42,y_bis*44)) #largeur et longeur d'une case
                pygame.display.flip()"""
     
    def coordonnes():
        coordonne = pygame.mouse.get_pos()
        print(coordonne)
     
    fenetre()
    quel que soit la condition (comme une touche pressée) elle n'est pas remplie
    je pense donc à une erreur externe à la condition, quelle qu'elle soit

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    c'est clairement une mauvaise construction du code. Peu de chance que case() accroche un événement.
    Faut plutôt penser à distribuer les événements aux fonctions.
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: break
            case(event)
            # d'autres fonctions
        else: continue
        break
    pygame.quit()
     
    def case(event):
        if event.type == pygame.KEYDOWN: print(event.key)
        elif event.type == pygame.MOUSEBUTTONUP: print(event.pos)

  17. #17
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut re: mauvais code
    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
     
    import pygame, sys
    from pygame.locals import *
    pygame.display.init()
     
     
    while 1:
     
     
                fond = pygame.image.load("grille.jpg")
                fenetre = pygame.display.set_mode((720, 501))
                fenetre.blit(fond, (0,0))
                pygame.display.flip() 
    def autre():
        x, y = pygame.mouse.get_pos()
        x_bis = (x - 10 )/ 42 #la petite marge
        y_bis = (y - 6) /44 
        print(x_bis , y_bis)
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN and event.button == 1 and 0<x_bis<11 and 0<y_bis<11:
                croix = pygame.image.load("croix.png")
                fenetre.blit(croix, (x_bis*42,y_bis*44)) #largeur et longeur d'une case
                pygame.display.flip()
            elif event.type == KEYDOWN and event.key == K_RETURN:
                break
                coordonne = pygame.mouse.get_pos()
                print(coordonne)
            elif event.type == QUIT:  sys.exit()
    une petite révision du code:
    ma croix (.png) apparaît bien mais disparaît aussitôt..

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

Discussions similaires

  1. Bataille navale client/serveur avec Lobby d'attente
    Par hannibal974 dans le forum Général Java
    Réponses: 24
    Dernier message: 21/05/2015, 17h42
  2. Problème avec une grille de bataille navale
    Par Marty_and_Doc dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 18/01/2015, 13h51
  3. bataille navale
    Par keenurives dans le forum C
    Réponses: 7
    Dernier message: 21/11/2005, 12h15
  4. [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