Jeu en Tour par Tour
jober123
Messages postés
9
Date d'inscription
Statut
Membre
Dernière intervention
-
jober123 Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
jober123 Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
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:
En revanche, si je met des touches différentes ça fonctionne, comme par exemple:
Merci pour votre aide, si vous trouver le problème, j'aimerai bien la solution car ça me prend la tête!!
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 différentes ça fonctionne, comme par exemple:
turtle.listen() 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")
Merci pour votre aide, si vous trouver le problème, j'aimerai bien la solution car ça me prend la tête!!
A voir également:
- Jeu en Tour par Tour
- Comment réinitialiser une tour d'ordinateur - Guide
- 94 jeu - Télécharger - Puzzle & Réflexion
- 94 degrés jeu - Télécharger - Divers Jeux
- Jeu zuma - Télécharger - Jeux vidéo
- Carte tour de france 2025 - Guide
6 réponses
Bonjour à tous les 2.
En python il y a un truc primordial c’est l’indentation. Pour qu’elle soit préservée sur le site il faut utiliser les balises de codes.
Hydros, tu a essayé mais pas correctement.
Donc pour tous les deux, voici un petit tuto pour vos prochains posts https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
En python il y a un truc primordial c’est l’indentation. Pour qu’elle soit préservée sur le site il faut utiliser les balises de codes.
Hydros, tu a essayé mais pas correctement.
Donc pour tous les deux, voici un petit tuto pour vos prochains posts https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Salut,
Sans le code complet, c'est assez difficile de te dire ce qu'il ne va pas (surtout que je n'ai pas l'habitude de python) mais:
En espérant avoir aider...
Sans le code complet, c'est assez difficile de te dire ce qu'il ne va pas (surtout que je n'ai pas l'habitude de python) mais:
- la fonction
range(a[, b [,c]])
permet de générer une suite de nombre entre a et b avec un pas de c. Si tu veux vérifier que c'est bien au tour du joueur, un modulo%
serait plus efficace (ex. tour%nb = 0 alors joueur 1 sinon joueur 2) - sans connaitre le module turtle, il faut surement que tu attendes la fin du tour du joueur 1 avant de lancer celui du joueur 2
- le listen doit surement se placer à la fin des event (définir les touches puis lancer l'écoute des évènements)
En espérant avoir aider...
Bonjour, et merci pour vos réponses.J'ai déja introduit in range, mais au sein des persos, pour que leur compétence de mouvements ne soient associées qu'à certains tours.
using System: import turtle import keyboard fen=turtle.Screen() fen.bgcolor("brown") #MAP, fenêtre de fond fen.title("Strategy Game") fen.setup (700,700) nb_tours = 0 #commence au tour 0 def finir_tour(touche): global nb_tours if touche.name == "space": #définition de la fonction tour par tour nb_tours += 1 print("La partie est au tour : " +str(nb_tours)) keyboard.on_press(finir_tour) class Pen(turtle.Turtle): def __init__(self): #définition des murs sur la carte turtle.Turtle.__init__(self) self.shape("square") self.color("black") self.penup() self.speed(0) class Player1(turtle.Turtle): def __init__(self): turtle.Turtle.__init__(self) self.shape("circle") #création du player 1, fonctions: à certains tours self.color("blue") self.penup() self.speed(0) def go_up(self): move_to_x= player1.xcor() move_to_y= player1.ycor() + 24 if (move_to_x, move_to_y) not in walls: if nb_tours in range (0,400,2): self.goto(move_to_x, move_to_y) def go_down(self): move_to_x= player1.xcor() move_to_y= player1.ycor() - 24 if (move_to_x, move_to_y) not in walls: if nb_tours in range (0,400,2): self.goto(move_to_x, move_to_y) def go_right(self): move_to_x= player1.xcor() + 24 move_to_y= player1.ycor() if (move_to_x, move_to_y) not in walls: if nb_tours in range (0,400,2): self.goto(move_to_x, move_to_y) def go_left(self): move_to_x= player1.xcor() - 24 move_to_y= player1.ycor() if (move_to_x, move_to_y) not in walls: if nb_tours in range (0,400,2): self.goto(move_to_x, move_to_y) class Player2(turtle.Turtle): def __init__(self): turtle.Turtle.__init__(self) self.shape("circle") self.color("blue") self.penup() self.speed(0) def go_up(self): move_to_x= player2.xcor() #création du player 1, mouvements: à certains tours move_to_y= player2.ycor() + 24 if (move_to_x, move_to_y) not in walls: if nb_tours in range (1,400,2): self.goto(move_to_x, move_to_y) def go_down(self): move_to_x= player2.xcor() move_to_y= player2.ycor() - 24 if (move_to_x, move_to_y) not in walls: if nb_tours in range (1,400,2): self.goto(move_to_x, move_to_y) def go_right(self): move_to_x= player2.xcor() + 24 move_to_y= player2.ycor() if (move_to_x, move_to_y) not in walls: if nb_tours in range (1,400,2): self.goto(move_to_x, move_to_y) def go_left(self): move_to_x= player2.xcor() - 24 move_to_y= player2.ycor() if (move_to_x, move_to_y) not in walls: if nb_tours in range (1,400,2): self.goto(move_to_x, move_to_y) levels=[""] level_1= [ "XXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXX", "XX P Y X X X XX", "XX X X X XX", "XX L X X X XX", "XX XXXXXXX XX", "XX X X XX", "XX XXXX XX", "XXXXX XXXXXXX XXXX XXX", "XX X XXXXXXX X XX", #je dessine la map "XX X X X X X XX", "XX X X X XX", "XX X XX XXX XXXXXX", "XX X XX", "XX XXXXXXXXXXXX XX", "XX X X X XX XX", "XX X X X X XX", "XX XX X X XX", "XX X X X XX", "XXXXX XXXXXXXX XXXX XX", "XX XX", "XX X K M X XXXX", "XX X J X XX", "XXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXX", ] levels.append(level_1) def setup_maze(level): for y in range(len(level)): for x in range (len(level[y])): character=level[y][x] screen_x=-288+(x*24) screen_y=288-(y*24) if character=="X": pen.goto(screen_x, screen_y) pen.stamp() walls.append((screen_x, screen_y)) if character=="K": player1.goto(screen_x, screen_y) pen.stamp() if character=="Y": player2.goto(screen_x, screen_y) pen.stamp() pen=Pen() player1=Player1() player2= Player2() if nb_tours in range (0,400,2): 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") elif 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") #le problème est juste au dessus, si jamais je ne met pas de boucle et que je met des touches différentes, tout fonctionne, mais j'aimerais bien qu'ils puissent tous deux être jouable avec les flêches du clavier! walls=[] setup_maze(levels[1]) print(walls) fen.tracer(0) while True: fen.update()
Merci pour votre aide!
Si j'ai bien compris, il faut faire un test et non un if. Entendez vous par 'test' la fonction try?
Sinon, j'ai essayé de créer une fonction mouvement, mais je n'arrive pas à l'écrire de manière à ce qu'elle concerne plusierurs turtles à la fois. Faut-il, si je fais cette fonction, qu'elle soit située en dehors des classes des joueurs, et dans ce cas là créer une liste contenant tout les joueurs pour dire que, n'importe quel joueur appelant la fonction aller en haut, par exemple, y aille?
Si j'ai bien compris, il faut faire un test et non un if. Entendez vous par 'test' la fonction try?
Sinon, j'ai essayé de créer une fonction mouvement, mais je n'arrive pas à l'écrire de manière à ce qu'elle concerne plusierurs turtles à la fois. Faut-il, si je fais cette fonction, qu'elle soit située en dehors des classes des joueurs, et dans ce cas là créer une liste contenant tout les joueurs pour dire que, n'importe quel joueur appelant la fonction aller en haut, par exemple, y aille?
C'est fait: Je n'ai plus qu'un player, le compteur de tour, la carte, et la définition des mouvements du Player.
Saurais-tu maintenant comment rajouter un autre joueur, avec les même caractéristiques (sauf peut-être l'apparence), et avec qui le jeu se ferait en alternance, l'un durant les tours pairs, et l'autre durant les tours impairs?
Saurais-tu maintenant comment rajouter un autre joueur, avec les même caractéristiques (sauf peut-être l'apparence), et avec qui le jeu se ferait en alternance, l'un durant les tours pairs, et l'autre durant les tours impairs?
import turtle import keyboard fen=turtle.Screen() fen.bgcolor("brown") fen.title("Strategy Game") fen.setup (700,700) nb_tours = 0 def finir_tour(touche): global nb_tours if touche.name == "space": nb_tours += 1 print("La partie est au tour : " +str(nb_tours)) keyboard.on_press(finir_tour) class Pen(turtle.Turtle): def __init__(self): turtle.Turtle.__init__(self) self.shape("square") self.color("black") self.penup() self.speed(0) class Player(turtle.Turtle): def __init__(self): turtle.Turtle.__init__(self) self.shape("circle") self.color("blue") self.penup() self.speed(0) def go_up(self): move_to_x= player.xcor() move_to_y= player.ycor() + 24 if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) def go_down(self): move_to_x= player.xcor() move_to_y= player.ycor() - 24 if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) def go_right(self): move_to_x= player.xcor() + 24 move_to_y= player.ycor() if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) def go_left(self): move_to_x= player.xcor() - 24 move_to_y= player.ycor() if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) levels=[""] level_1= [ "XXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXX", "XX X X X X X XX", "XX X X X XX", "XX X X X X XX", "XX XXXXXXX XX", "XX X X XX", "XX XXXX XX", "XXXXX XXXXXXX XXXX XXX", "XX X XXXXXXX X XX", "XX X X X X X XX", "XX X X X XX", "XX X XX XXX XXXXXX", "XX X XX", "XX XXXXXXXXXXXX XX", "XX X X X XX XX", "XX X X X X XX", "XX XX X X XX", "XX X X X XX", "XXXXX XXXXXXXX XXXX XX", "XX XX", "XX X X X X XXXX", "XX X J X XX", "XXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXX", ] levels.append(level_1) def setup_maze(level): for y in range(len(level)): for x in range (len(level[y])): character=level[y][x] screen_x=-288+(x*24) screen_y=288-(y*24) if character=="X": pen.goto(screen_x, screen_y) pen.stamp() walls.append((screen_x, screen_y)) if character=="J": player.goto(screen_x, screen_y) pen.stamp() pen=Pen() player=Player() turtle.listen() turtle.onkey(player.go_left, "Left") turtle.onkey(player.go_right, "Right") turtle.onkey(player.go_down, "Down") turtle.onkey(player.go_up, "Up") walls=[] setup_maze(levels[1]) print(walls) fen.tracer(0) while True: fen.update()
avant d'ajouter un joueur supplémentaire, préparons-nous:
1) simplifions, utilisons également "onkey" pour activer la fonction finir_tour, et supprimons l'utilisation de keyboard
2) créons une nouvelle variable pour le joueur qui est occupé à jouer, par exemple "currentplayer"
3) créons quatre nouvelles fonctions, hors de la classe Player, une pour chacun des mouvements. ces fonctions appelleront la fonction correspondant au mouvement pour le joueur qui est occupé à jouer
4) modifions les appels à onkey pour appeler les nouvelles fonctions
1) simplifions, utilisons également "onkey" pour activer la fonction finir_tour, et supprimons l'utilisation de keyboard
2) créons une nouvelle variable pour le joueur qui est occupé à jouer, par exemple "currentplayer"
3) créons quatre nouvelles fonctions, hors de la classe Player, une pour chacun des mouvements. ces fonctions appelleront la fonction correspondant au mouvement pour le joueur qui est occupé à jouer
4) modifions les appels à onkey pour appeler les nouvelles fonctions
J'ai suivi vos instructions en considérant pour l'instant, puisqu'il n' y a qu'un seul joueur,que le currentplayer correspond au seul player. J'ai également modifier le passage de tour, en utilisant sous vos conseils onkey. Désormais dans la class player, il n'y a plus que la définition de son apparence et, en dehors de sa classe, après le traçage de la carte, j'ai rajouté les 4 fonctions, devant s'activer avec les onkey qui, désormais, désignent le currentplayer.
Problème: la carte ne s'affiche même plus.
Sauriez vous pourquoi?
Problème: la carte ne s'affiche même plus.
Sauriez vous pourquoi?
import turtle import keyboard fen=turtle.Screen() fen.bgcolor("brown") fen.title("Strategy Game") fen.setup (700,700) nb_tours = 0 def finir_tour(touche): global nb_tours nb_tours += 1 #fonction passage de tour print("La partie est au tour : " +str(nb_tours)) class Pen(turtle.Turtle): def __init__(self): turtle.Turtle.__init__(self) self.shape("square") self.color("black") self.penup() self.speed(0) class Player(turtle.Turtle): def __init__(self): turtle.Turtle.__init__(self) self.shape("circle") self.color("blue") #classe de mon unique player, qui est jusqu'ici que défini par son apparence self.penup() self.speed(0) levels=[""] level_1= [ "XXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXX", "XX X X X X X XX", "XX X X X XX", "XX X X X X XX", "XX XXXXXXX XX", "XX X X XX", "XX XXXX XX", "XXXXX XXXXXXX XXXX XXX", "XX X XXXXXXX X XX", "XX X X X X X XX", "XX X X X XX", #dessin de la carte "XX X XX XXX XXXXXX", "XX X XX", "XX XXXXXXXXXXXX XX", "XX X X X XX XX", "XX X X X X XX", "XX XX X X XX", "XX X X X XX", "XXXXX XXXXXXXX XXXX XX", "XX XX", "XX X X X X XXXX", "XX X J X XX", "XXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXX", ] levels.append(level_1) def setup_maze(level): for y in range(len(level)): for x in range (len(level[y])): character=level[y][x] screen_x=-288+(x*24) #création à l'ordi de cette carte screen_y=288-(y*24) if character=="X": pen.goto(screen_x, screen_y) pen.stamp() walls.append((screen_x, screen_y)) if character=="J": player.goto(screen_x, screen_y) pen.stamp() pen=Pen() player=Player() currentplayer=player #dès qu'il y aura un autre joueur, je changerai cette variable en fonction du numéro du tour def go_up(self): move_to_x= currentplayer.xcor() move_to_y= currentplayer.ycor() + 24 if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) def go_down(self): #voilà mes cartes fonction qui, si j'ai compris, doivent bouger le currentplayer move_to_x= currentplayer.xcor() move_to_y= currentplayer.ycor() - 24 if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) def go_right(self): move_to_x= currentplayer.xcor() + 24 move_to_y= currentplayer.ycor() if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) def go_left(self): move_to_x= currentplayer.xcor() - 24 move_to_y= currentplayer.ycor() if (move_to_x, move_to_y) not in walls: self.goto(move_to_x, move_to_y) turtle.listen() turtle.onkey(currentplayer.go_left, "Left") turtle.onkey(currentplayer.go_right, "Right") turtle.onkey(currentplayer.go_down, "Down") #Voilà les instructions renvoyant aux fonctions de mouvement turtle.onkey(currentplayer.go_up, "Up") #et à la fonction de passage de tour !! turtle.onkey(currentplayer.finir_tour, "space") walls=[] setup_maze(levels[1]) print(walls) fen.tracer(0) while True: fen.update()
Tu n’obtiens aucun message d'erreur? Bizarre...
1) il n'y avait rien à changer dans la déclaration de la classe.
2) les quatre nouvelles fonctions (avec 4 nouveaux noms, pour ne pas confondre), hors de la classe Player, une pour chacun des mouvements. doivent simplement appeler la fonction de la classe Player correspondant au mouvement pour le joueur qui est occupé à jouer
3) modifier les appels à onkey pour appeler les nouvelles fonctions
1) il n'y avait rien à changer dans la déclaration de la classe.
2) les quatre nouvelles fonctions (avec 4 nouveaux noms, pour ne pas confondre), hors de la classe Player, une pour chacun des mouvements. doivent simplement appeler la fonction de la classe Player correspondant au mouvement pour le joueur qui est occupé à jouer
3) modifier les appels à onkey pour appeler les nouvelles fonctions
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
tu tentes de faire un exercice compliqué sans avoir pris le temps d'acquérir les compétences de base: pourquoi?
comment écrit-on, en python, un appel à une fonction?
comment écrit-on, en python, un appel à une fonction?