Python乌龟游戏

2024-09-30 06:10:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个游戏,一只乌龟四处游走,吃点东西。应该出现一个点。当乌龟越过这个圆点时,被吃掉的圆点会消失,而一个新的随机点会出现。另外,海龟的大小每次都应该稍微增长。到目前为止,我有这个:

from turtle import *
from random import randrange

FRAMES_PER_SECOND = 10
bgcolor('black')


def turnRight():
    global turtle

    turtle.right(15)

def turnLeft():
    global turtle

    turtle.left(15)

def dotGood():
    x = randrange(-250, 250)
    y = randrange(-250, 250)
    pen1 = Pen()
    pen1.hideturtle()
    pen1.penup()
    pen1.goto(x, y)

    pen1.dot(10, "red")

def eaten(z):
    global turtle
    global moving

    if turtle == dotGood():
        z = z + .25

def move():
    global turtle
    global moving


    if moving:
        for i in range(1):
            turtle.penup()
            turtle.shape('turtle')

            size = .5
            eaten(size)
            turtle.shapesize(size, size, size)

            turtle.color('green')
            turtle.forward(10)
            ontimer(move, 10 // FRAMES_PER_SECOND)

def start():
    global moving

    moving = True
    move()

def stop():
    global moving

    moving = False


def border():
    pen1 = Pen()
    pen1.color("yellow")
    pen1.pensize(3)
    pen1.hideturtle()
    pen1.speed(0)
    pen1.penup()
    pen1.goto(-275, -275)
    pen1.pendown()
    for i in range(4):
        pen1.fd(550)
        pen1.left(90)


def main():
    border()
    dotGood()
    global turtle


    turtle = Turtle()



    onkey(turnRight, "Right")
    onkey(turnLeft, "Left")
    onkey(start, "Up")
    onkey(stop, "Down")
    listen()



if __name__ == "__main__":
    main()

现在,所有的圆点都在不断地繁殖,而不是一次一个,乌龟经过一个圆点时不会生长,乌龟经过一个圆点时,圆点也不会消失。我能做些什么来解决这个问题?在


Tags: sizemoveifmaindefglobalturtlemoving
2条回答

实施中的问题:

通过使食物成为dot(),你没有办法干净地删除它,而是使用一个圆形的海龟和stamp(),因为它返回一个可以通过clearstamp()干净删除的图章ID。在

为了更好地处理,事件处理程序应该在处理当前事件时阻止新事件。在

您不了解global的用途,您需要它来实现某些功能,但没有您声明的那样频繁。在

你的乌龟移动太快,无法控制。如果你没有代码来控制它在屏幕的边界内,它很容易丢失。在

以下代码尚未完成,但实现了基本功能:您可以移动乌龟,吃了食物就消失了,新的食物出现了,乌龟在吃食物时明显变胖了:

from turtle import Turtle, Screen
from random import randrange

FRAMES_PER_SECOND = 10
WIDTH, HEIGHT = 500, 500
STAMP_SIZE = 20
DOT_SIZE = 10

def turnRight():
    screen.onkey(None, 'Right')
    turtle.right(15)
    screen.onkey(turnRight, 'Right')

def turnLeft():
    screen.onkey(None, 'Left')
    turtle.left(15)
    screen.onkey(turnLeft, 'Left')

def dotGood(food):
    x = randrange(DOT_SIZE - WIDTH//2, WIDTH//2 - DOT_SIZE)
    y = randrange(DOT_SIZE - HEIGHT//2, HEIGHT//2 - DOT_SIZE)

    food.goto(x, y)

    return ((x, y), food.stamp())

def eaten(food):
    global dot

    ((x, y), stamp_id) = dot

    if abs(turtle.xcor() - x) < DOT_SIZE and  abs(turtle.ycor() - y) < DOT_SIZE:
        food.clearstamp(stamp_id)
        dot = dotGood(food)

        return True

    return False

def move():
    global score

    if not moving:
        return

    if eaten(food):
        score += 1
        turtle.shapesize((STAMP_SIZE + 5 * score) / STAMP_SIZE)

    turtle.forward(1)

    screen.ontimer(move, 10 // FRAMES_PER_SECOND)

def start():
    global moving

    moving = True
    move()

def stop():
    global moving

    moving = False

screen = Screen()
screen.setup(WIDTH, HEIGHT)
screen.bgcolor('black')

turtle = Turtle(shape='turtle')
turtle.speed('slowest')
turtle.color('green')
turtle.penup()

food = Turtle(shape='circle', visible=False)
food.speed('fastest')
food.turtlesize(DOT_SIZE / STAMP_SIZE)
food.color('red')
food.penup()

# globals

moving = False

dot = dotGood(food)

score = 0

screen.onkey(turnRight, 'Right')
screen.onkey(turnLeft, 'Left')
screen.onkey(start, 'Up')
screen.onkey(stop, 'Down')
screen.listen()

screen.mainloop()

为了使示例更简单,我放弃了边界代码。在

  1. eated函数中的z是局部的,每次调用它都会错过它。在
  2. dotGood不返回任何与海龟比较的内容。我想你需要保留最后一个x,y可以和当前的海龟位置进行比较。乌龟不等于画画。在

相关问题 更多 >

    热门问题