Forum Linux.débutant Jeu en tour par tour

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
1
mai
2020

Bonjour à tous,
Je me suis dernièrement mis à faire du Python, avec l'idée de créer un jeu jouable en tour par tour, sans intelligence artificielle, avec 2 personnages (player 1 et player 2).
J'ai créé la carte, les 2 persos apparaissant bien dessus, et un compteur de tour augmentant de 1 chaque fois la barre d'espace pressée (l'idée étant qu'un personnage joue et bouge durant les tours pairs, et l'autre durant les tours impairs). Les personnages sont définis pour pouvoir bouger dans les 4 directions, et cela marche si les touches ordononant les mouvements sont différentes d'un perso à l'autre. Sauf que j'aimerais qu'ils puissent bouger avec les mêmes touches (si jamais je voulais par exemple qu'il y ait 10 persos, ce serait plus pratique).
J'ai donc essayer de créer une boucle pour permettre cela, mais elle ne fonctionne pas: le premier à jouer se déplace bien dès que c'est son tour, mais pour l'autre, c'est comme si aucune commande ne lui était affecté…

Voici la boucle:
if nb_tours in range (0,400,2): (partie à 400 tours, commençant au tour 0)
turtle.listen()
turtle.onkey(player1.go_left,"Left")
turtle.onkey(player1.go_right,"Right")
turtle.onkey(player1.go_down,"Down")
turtle.onkey(player1.go_up,"Up")

if nb_tours in range (1,400,2):
turtle.listen()
turtle.onkey(player2.go_left,"Left")
turtle.onkey(player2.go_right,"Right")
turtle.onkey(player2.go_down,"Down")
turtle.onkey(player2.go_up,"Up")

En revanche, si je met des touches differentes ça fonctionne, comme par exemple:

turtle.onkey(player1.go_left,"q")
turtle.onkey(player1.go_right,"d")
turtle.onkey(player1.go_down,"s")
turtle.onkey(player1.go_up,"z")
turtle.onkey(player2.go_left,"Left")
turtle.onkey(player2.go_right,"Right")
turtle.onkey(player2.go_down,"Down")
turtle.onkey(player2.go_up,"Up")

Si vous trouvez la solution à mon problème, ce serait très sympa!

  • # J'ai un un gros doute...

    Posté par  (site web personnel) . Évalué à 6.

    … sur le fait que tu doives utiliser un if sur un range (qu'on utilise 99% du temps avec un for).

    Avec quelques print dans ton code tu pourrais voir ce qui se passe et trouver tes bugs seul (ce qui est 90% du travail d'un codeur haha).

    Bonne chance !

    • [^] # Re: J'ai un un gros doute...

      Posté par  . Évalué à 1. Dernière modification le 02 mai 2020 à 09:55.

      Salut,

      Oui, c'est douteux. D'autant plus qu'en général (mais ce n'est peut-être pas le cas ici, ça peut être en tours limités), on voit plus du while(True).

      Matricule 23415

      • [^] # Re: J'ai un un gros doute...

        Posté par  . Évalué à 1.

        C'est probablement pas optimal, mais ça marche.

        >>> 1 in range(0, 400, 2)
        False
        >>> 1 in range(1, 400, 2)
        True
        >>> 2 in range(0, 400, 2)
        True
        
        • [^] # Re: J'ai un un gros doute...

          Posté par  . Évalué à 1. Dernière modification le 02 mai 2020 à 13:29.

          Salut,

          C'est probablement pas optimal, mais ça marche.

          Mouais, ok.

          Il doit manquer du code englobant et un peu de mise en forme ;)

          Matricule 23415

          • [^] # Re: J'ai un un gros doute...

            Posté par  . Évalué à 1. Dernière modification le 02 mai 2020 à 13:36.

            Oui, il manque la boucle, manifestement :D

            edit : et l'indentation

            edit edit : d'ailleurs l'OP, l'indentation est bien présente dans le source, oui ?

            • [^] # Re: J'ai un un gros doute...

              Posté par  . Évalué à 1.

              edith !

              Ok -> []

              Pour l'OP : il faut peut-être regarder du côté des restes des divisions euclidiennes pour faire marcher ton idée.

              Donc pour une session à X joueurs pour Y tours, ça boucle sur X*Y et le reste de la division te dis à qui jouer. Non ?

              Matricule 23415

  • # Une hypothèse

    Posté par  . Évalué à 2.

    Là, comme ça, sans rien savoir, ça pourrait être que turtle.onkey définit une callback sur la touche frappée, définissant une fois pour toute le comportement de la touche. Et donc, il n'y a que le second joueur pour laquelle cette fonction a été appelée qui marche.

    Dans cette hypothèse, une solution serait de réaffecter les callback seulement sur le bon joueur au bon tour, ou alors de faire une fonction qui va faire bouger la bonne tortue pour callback.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.