Враги останавливаются, когда я нажимаю клавишу в игре tkinter - PullRequest
0 голосов
/ 28 мая 2019

Для практического программирования я сделал игру на Python с графикой черепах и tkinter.У меня проблема: если я нажимаю клавишу, игровой цикл останавливается, и враги не двигаются.Есть ли решение этой проблемы?

import random
import time
import turtle
from tkinter import *

running = True

#window

wn = Tk()
wn.geometry("900x700")

canvas = Canvas(wn, width=750, height=600)
canvas.pack()
canvas.place(relx=0.5, rely=0.5, anchor=CENTER)


#player

player = turtle.RawTurtle(canvas)

player_speed = 3


#enemies

enemies = []

for enemy in range(5):
    enemies.append((turtle.RawTurtle(canvas), 10))


for enemy in enemies:
    enemy[0].penup()
    enemy[0].speed(0)
    enemy[0].setheading(90)
    enemy[0].goto(enemy_position_x(), enemy_position_y())#random position


#move the player
def move_left(event):
    player.setheading(180)
    player.setx(player.xcor() - player_speed)


def move_right(event):
    player.setheading(360)
    player.setx(player.xcor() + player_speed)


def move_up(event):
    player.setheading(90)
    player.sety(player.ycor() + player_speed)


def move_down(event):
    player.setheading(270)
    player.sety(player.ycor() - player_speed)


def shoot(event):
    #I don't write the shoot function, because it's long
    print("shoot")


wn.bind('<Left>', move_left)
wn.bind('<Right>', move_right)
wn.bind('<Up>', move_up)
wn.bind('<Down>', move_down)
wn.bind('<space>', shoot)


#game loop
while running:

    #move the enemy
    for this_enemy in enemies:
        if this_enemy[0].xcor() < player.xcor():
            this_enemy[0].setx(this_enemy[0].xcor() + 3)
            time.sleep(0.1)

        if this_enemy[0].xcor() > player.xcor():
            this_enemy[0].setx(this_enemy[0].xcor() - 3)
            time.sleep(0.1)

        if this_enemy[0].ycor() < player.ycor():
            this_enemy[0].sety(this_enemy[0].ycor() + 3)
            time.sleep(0.1)

        if this_enemy[0].ycor() > player.ycor():
            this_enemy[0].sety(this_enemy[0].ycor() - 3)
            time.sleep(0.1)

wn.mainloop()

1 Ответ

0 голосов
/ 28 мая 2019

Базовый дизайн вашей программы неверен.Turtle (и tkinter) управляются событиями, но использование цикла while True: с time.sleep() работает против этого.Я переписал ваш код ниже, чтобы использовать события таймера вместе с другими изменениями.Враги должны продолжать двигаться, пока вы управляете игроком с клавиатуры.Я бросил код оболочки tkinter, так как он не делал ничего, что черепаха не могла сделать для себя:

from turtle import Screen, Turtle
from random import randint

def enemy_position_x():
    return randint(-325, 325)

def enemy_position_y():
    return randint(-300, 300)

# move the player
def move_left():
    player.setheading(180)
    player.setx(player.xcor() - player_speed)

def move_right():
    player.setheading(360)
    player.setx(player.xcor() + player_speed)

def move_up():
    player.setheading(90)
    player.sety(player.ycor() + player_speed)

def move_down():
    player.setheading(270)
    player.sety(player.ycor() - player_speed)

def move():

    # move the enemy
    for enemy in enemies:
        enemy.setheading(enemy.towards(player))

        if enemy.distance(player) > 10:
            enemy.forward(enemy_speed)

    screen.ontimer(move, 100)

# window

screen = Screen()
screen.setup(900, 700)

# player

player = Turtle()
player.speed('fastest')
player.color('green')
player.penup()

player_speed = 3

# enemies

enemies = []

for _ in range(5):
    enemy = Turtle()
    enemy.penup()
    enemy.speed('fastest')
    enemy.color('red')
    enemy.goto(enemy_position_x(), enemy_position_y())

    enemies.append(enemy)

enemy_speed = 3

screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
screen.onkey(move_up, 'Up')
screen.onkey(move_down, 'Down')
screen.listen()

move()

screen.mainloop()
...