2
votes

Comment vérifier si deux tortues ont les mêmes coordonnées x, y sur les graphiques de tortues?

Lors de mon premier projet sur les tortues, j'ai commencé à coder le jeu "serpent", mais au lieu d'un serpent, c'est juste une tortue qui mange des aliments coordonnés au hasard.

J'ai rencontré un problème en mangeant la nourriture. Je veux dire, il doit y avoir une instruction if qui vérifie si le serpent (c'est-à-dire une tortue) et la nourriture (qui est aussi une tortue) sont dans les mêmes coordonnées XY. Si tel est le cas, commencez par augmenter la taille de la tortue, puis cachez la nourriture, obtenez une autre coordonnée aléatoire pour elle, puis affichez-la à l'écran.

Voici mon code:

from turtle import *
from random import *


def go():
    # the main walking function for the turtle
    turtle.forward(2)


def rotate():
    # to rotate the turtle 90 degrees to the left
    turtle.left(90)


def getfood():
    # get random coordinates for the food
    x = randint(-280, 280)
    y = randint(-280, 280)
    # set the food to the random position
    food.hideturtle()
    food.up()
    food.goto(x, y)
    food.showturtle()


turtle = Turtle()
screen = Screen()
screensize(600, 600)
food = Turtle()
food.shape('circle')
turtle.shape('turtle')
turtle.shapesize(3)
turtleSize = 3
getfood()
while True:
    turtle.up()
    go()
    #  check if the turtle has eaten the food.
    if food.xcor == turtle.xcor and food.ycor() == turtle.ycor():
        turtleSize += 1
        turtle.shapesize(turtleSize)
        getfood()
    # let the player rotate pressing the "a" key
    screen.listen()
    screen.onkeypress(rotate, 'a')

Le problème est juste là, sur la déclaration if où il vérifie si la tortue a mangé la nourriture ou non. L'exécution n'y entre même pas. cela doit être dû à ces méthodes ycor() xcor() et ycor() mais je ne sais pas ce que je devrais utiliser à la place. Voulez-vous me aider? :)


0 commentaires

3 Réponses :


0
votes

if turtle1.pos () == turtle2.pos (): print ('Deux tortues sont ensemble')


1 commentaires

Hmm, vous imprimez (turtle1.pos ()) et imprimez (turtle2.pos ()) en temps réel et voyez si c'est un problème dans la fonction (if) ou est-ce autre chose.



0
votes

Ce que vous pouvez faire est de définir les limites de collision pour la tortue et la nourriture sous la forme d'un rayon et de vérifier si la somme des deux rayons est supérieure à la distance d'une tortue à une autre. Le code suivant devrait fonctionner.

turtle.radius = 10
food.radius = 5
while True:
    turtle.up()
    go()
    #  check if the turtle has eaten the food.
    if (turtle.radius+food.radius)>=food.distance(turtle):
        turtleSize += 1
        turtle.shapesize(turtleSize)
        getfood()
    # let the player rotate pressing the "a" key
    screen.listen()
    screen.onkeypress(rotate, 'a')

ps: vous pouvez définir des valeurs de rayon comme vous le souhaitez. Je viens d'utiliser deux valeurs aléatoires.


1 commentaires

@HosnaH Vous devrez également élargir la limite de la tortue à mesure que la tortue grandit. Et veuillez marquer la réponse comme acceptée si elle a résolu le problème afin qu'elle puisse aider d'autres personnes à l'avenir.



0
votes

Voici quelques points que je voudrais aborder:

  1. Lorsque vous avez seulement besoin d'importer une à deux fonctions d'un module, n'utilisez pas l'astérisque pour importer toutes les fonctions.

  2. Au lieu d'utiliser des fonctions indépendantes sur votre objet tortue, créez une classe. Là, vous pouvez stocker en toute sécurité des attributs dynamiques, par exemple, la taille de la tortue pendant qu'elle mange.

  3. Il est un gaspillage d'efficacité à l' appel screen.onkeypress à l' intérieur du while en boucle; l'appeler une fois avant que la boucle ne soit suffisante.

Voici une réécriture de votre code, avec l'action de manger des aliments implémentée:

from turtle import Turtle, Screen
from random import randint
from time import sleep

class Eater(Turtle):
    def __init__(self, size):
        Turtle.__init__(self)
        self.shapesize(size)
        self.shape('turtle')
        self.penup()
        self.turtleSize = size

    def touched(self, food):
        return self.turtleSize * 10 >= food.distance(self)

    def eat(self, food):
        self.turtleSize += 1
        self.shapesize(self.turtleSize)
        x = randint(-280, 280)
        y = randint(-280, 280)
        food.goto(x, y)

    def go(self):
        self.forward(2)

    def rotate(self):
        self.left(90)

screen = Screen()
screen.setup(600, 600)
screen.tracer(0)

food = Turtle('circle')
food.penup()

turtle = Eater(3)

screen.listen()
screen.onkeypress(turtle.rotate, 'a')

while True:
    sleep(0.01)
    turtle.go()
    if turtle.touched(food):
        turtle.eat(food)
    screen.update()

Production:

entrez la description de l'image ici


0 commentaires