Проблема с движением и стрельбой в игре на питоне. ⇐ Python
-
Гость
Проблема с движением и стрельбой в игре на питоне.
Написал простенькую игру на питоне, ошибок в коде нет, но почему-то не могу двигаться и стрелять, перепробовал все варианты, даже в gpt чат обращался и не помогло(< /п> Я перепробовал все варианты, подошло только управление стрелкой, но выстрелить все равно не удалось. Мне нужно управлять клавишами W A S D, а стрельбой левой кнопкой мыши
код здесь:
импортировать tkinter как tk импортировать случайный импорт математики время импорта # Инициализация Tkinter корень = тк.Тк() root.title("Нажмите, чтобы убить") # Параметры экрана ШИРИНА, ВЫСОТА = 800, 600 холст = tk.Canvas(корень, ширина=ШИРИНА, высота=ВЫСОТА, bg="черный") холст.пакет() # Цвета БЕЛЫЙ = «белый» КРАСНЫЙ = «красный» ОРАНЖЕВЫЙ = «оранжевый» # Игровые параметры player_radius = 20 враг_радиус = 15 босс_радиус = 30 пуля_радиус = 5 player_speed = 5 пуля_скорость = 10 враг_скорость = 3 max_enemies = 6 Boss_spawn_rate = 10 оценка = 0 player_lives = 10 отбрасывание_дистанция = 40 shots_to_kill_enemy = 3 shots_to_kill_boss = 5 враги_киллед = 0 #Игровые объекты player = Canvas.create_oval(WIDTH // 2 - player_radius, HEIGHT // 2 - player_radius, ШИРИНА // 2 + player_radius, HEIGHT // 2 + player_radius, fill=WHITE) пули = [] враги = [] боссы = [] #Таймер start_time = время.время() бессмертный_таймер = 0 бессмертный_длительность = 500 # Окно игры game_window = (0, 0, ШИРИНА, ВЫСОТА) window_shrink_speed = 0,05 # Флаги для распознавания сигналов и отпускания клавиш move_left = Ложь move_right = Ложь move_up = Ложь move_down = Ложь mouse_button_pressed = Ложь can_shoot = Истина # Флаг для обозначения состояния игры game_over = Ложь защита mouse_click (событие): глобальное mouse_button_pressed, can_shoot mouse_button_pressed = Истина can_shoot = Истина защита mouse_release (событие): глобальный mouse_button_pressed mouse_button_pressed = Ложь защита restart_game(событие): глобальные player_lives, счет, враги_убитые, бессмертный_таймер, время начала, игрок, пули, враги, боссы, game_over player_lives = 10 оценка = 0 враги_киллед = 0 бессмертный_таймер = 0 start_time = время.время() Canvas.coords(player, WIDTH // 2 - player_radius, HEIGHT // 2 - player_radius, ШИРИНА // 2 + радиус игрока, ВЫСОТА // 2 + радиус игрока) пули = [] враги = [] боссы = [] game_over = Ложь root.bind("", mouse_click) root.bind("", mouse_release) root.bind("", restart_game) защита key_press (событие): глобальное перемещение_влево, перемещение_вправо, перемещение_вверх, перемещение_вниз если event.keysym == "a": move_left = Истина elif event.keysym == "d": move_right = Истина elif event.keysym == "w": перемещение_вверх = Истина elif event.keysym == "s": перемещение_вниз = Истина защита key_release (событие): глобальное перемещение_влево, перемещение_вправо, перемещение_вверх, перемещение_вниз если event.keysym == "a": move_left = Ложь elif event.keysym == "d": move_right = Ложь elif event.keysym == "w": move_up = Ложь elif event.keysym == "s": move_down = Ложь root.bind("", key_press) root.bind("", key_release) защита update_game(): глобальные player_lives, счет, враги_убитые, бессмертный_таймер, время начала, игрок, пули, враги, боссы, game_over, can_shoot если не game_over: player_movement = [move_left, move_right, move_up, move_down] #Движение игрока new_player_x = Canvas.coords(player)[0] + (player_movement[1] - player_movement[0]) * player_speed new_player_y = Canvas.coords(player)[1] + (player_movement[3] - player_movement[2]) * player_speed # Проверка на выход за границу экрана new_player_x = max(min(new_player_x, WIDTH - player_radius * 2), 0) new_player_y = max(min(new_player_y, ВЫСОТА - player_radius * 2), 0) # Проверка обнаружения с врагами player_rect = (new_player_x, new_player_y, new_player_x + player_radius * 2, new_player_y + player_radius * 2) для врага во врагах: if Canvas.coords(enemy)[0] < player_rect[2] и Canvas.coords(enemy)[2] > player_rect[0] и \ Canvas.coords(enemy)[1] < player_rect[3] и Canvas.coords(enemy)[3] > player_rect[1] and immortal_timer == 0: direction = math.atan2(new_player_y + player_radius - (canvas.coords(enemy)[1] + enemy_radius), new_player_x + player_radius - (canvas.coords(enemy)[0] + enemy_radius)) # Отбрасывание игрока new_player_x += math.cos(direction) * knockback_distance new_player_y += math.sin(direction) * knockback_distance immortal_timer = time.time() player_lives -= 1 if player_lives == 0: game_over = True # Проверка времени бессмертия if immortal_timer != 0 and time.time() - immortal_timer >= immortal_duration: immortal_timer = 0 # Обновление координат игрока canvas.coords(player, new_player_x, new_player_y, new_player_x + player_radius * 2, new_player_y + player_radius * 2) # Стрельба if mouse_button_pressed and can_shoot: angle = math.atan2(root.winfo_pointery() - (new_player_y + player_radius), root.winfo_pointerx() - (new_player_x + player_radius)) bullets.append((new_player_x + player_radius, new_player_y + player_radius, angle)) can_shoot = False # Движение пуль active_bullets = [] for bullet in bullets: bullet_x = bullet[0] + math.cos(bullet[2]) * bullet_speed bullet_y = bullet[1] + math.sin(bullet[2]) * bullet_speed # Проверка на выход за границы экрана if 0 player_rect[0] and boss_rect[1] < player_rect[3] and boss_rect[3] > player_rect[1]): canvas.move(boss, math.cos(direction) * enemy_speed, math.sin(direction) * enemy_speed) # Проверка столкновения пуль с врагами и боссами bullets_to_remove = [] for bullet in bullets: should_remove_bullet = False for enemy in enemies: enemy_rect = canvas.coords(enemy) if enemy_rect[0] < bullet[0] < enemy_rect[2] and enemy_rect[1] < bullet[1] < enemy_rect[3]: should_remove_bullet = True # Попадание врага enemies_killed += 1 score += 1 canvas.delete(enemy) # Проверка столкновения пуль с боссами for boss in bosses: boss_rect = canvas.coords(boss) if boss_rect[0] < bullet[0] < boss_rect[2] and boss_rect[1] < bullet[1] < boss_rect[3]: should_remove_bullet = True # Попадание босса score += 5 canvas.delete(boss) if not should_remove_bullet: bullets_to_remove.append(bullet) # Удаление пуль bullets = bullets_to_remove # Проверка столкновения игрока с окном if not (game_window[0] < player_rect[2] < game_window[2] and game_window[1] < player_rect[3] < game_window[3]): game_over = True # Отображение счета и жизней score_text = tk.Label(root, text=f"Очки: {score}", font=("Arial", 14), fg=WHITE, bg="black") score_text.place(x=10, y=10) lives_text = tk.Label(root, text=f"Жизни: {player_lives}/10", font=("Arial", 14), fg=WHITE, bg="black") lives_text.place(x=WIDTH - 170, y=10) # Отображение времени игры current_time = time.time() elapsed_time = (current_time - start_time) minutes = int(elapsed_time // 60) seconds = int(elapsed_time % 60) milliseconds = int((elapsed_time * 100) % 100) timer_text = tk.Label(root, text=f"Время: {minutes:02}:{seconds:02}.{milliseconds:02}", font=("Arial", 14), fg=WHITE, bg="black") timer_text.place(x=WIDTH - 195, y=50) else: # Отображение сообщения о проигрыше и результатов game_over_text = tk.Label(root, text="Ты проиграл, лох!", font=("Arial", 28), fg=WHITE, bg="black") game_over_text.place(x=WIDTH // 2 - game_over_text.winfo_reqwidth() // 2, y=HEIGHT // 4) result_text = tk.Label(root, text=f"Очки: {score} | Время: {minutes:02}:{seconds:02}.{milliseconds:02}", font=("Arial", 14), fg=WHITE, bg="black") result_text.place(x=WIDTH // 2 - result_text.winfo_reqwidth() // 2, y=HEIGHT // 2) restart_text = tk.Label(root, text="Нажмите Enter, чтобы начать заново", font=("Arial", 14), fg=WHITE, bg="black") restart_text.place(x=WIDTH // 2 - restart_text.winfo_reqwidth() // 2, y=HEIGHT * 3 // 4) root.after(30, update_game) # Запуск игрового цикла update_game() root.mainloop()
Написал простенькую игру на питоне, ошибок в коде нет, но почему-то не могу двигаться и стрелять, перепробовал все варианты, даже в gpt чат обращался и не помогло(< /п> Я перепробовал все варианты, подошло только управление стрелкой, но выстрелить все равно не удалось. Мне нужно управлять клавишами W A S D, а стрельбой левой кнопкой мыши
код здесь:
импортировать tkinter как tk импортировать случайный импорт математики время импорта # Инициализация Tkinter корень = тк.Тк() root.title("Нажмите, чтобы убить") # Параметры экрана ШИРИНА, ВЫСОТА = 800, 600 холст = tk.Canvas(корень, ширина=ШИРИНА, высота=ВЫСОТА, bg="черный") холст.пакет() # Цвета БЕЛЫЙ = «белый» КРАСНЫЙ = «красный» ОРАНЖЕВЫЙ = «оранжевый» # Игровые параметры player_radius = 20 враг_радиус = 15 босс_радиус = 30 пуля_радиус = 5 player_speed = 5 пуля_скорость = 10 враг_скорость = 3 max_enemies = 6 Boss_spawn_rate = 10 оценка = 0 player_lives = 10 отбрасывание_дистанция = 40 shots_to_kill_enemy = 3 shots_to_kill_boss = 5 враги_киллед = 0 #Игровые объекты player = Canvas.create_oval(WIDTH // 2 - player_radius, HEIGHT // 2 - player_radius, ШИРИНА // 2 + player_radius, HEIGHT // 2 + player_radius, fill=WHITE) пули = [] враги = [] боссы = [] #Таймер start_time = время.время() бессмертный_таймер = 0 бессмертный_длительность = 500 # Окно игры game_window = (0, 0, ШИРИНА, ВЫСОТА) window_shrink_speed = 0,05 # Флаги для распознавания сигналов и отпускания клавиш move_left = Ложь move_right = Ложь move_up = Ложь move_down = Ложь mouse_button_pressed = Ложь can_shoot = Истина # Флаг для обозначения состояния игры game_over = Ложь защита mouse_click (событие): глобальное mouse_button_pressed, can_shoot mouse_button_pressed = Истина can_shoot = Истина защита mouse_release (событие): глобальный mouse_button_pressed mouse_button_pressed = Ложь защита restart_game(событие): глобальные player_lives, счет, враги_убитые, бессмертный_таймер, время начала, игрок, пули, враги, боссы, game_over player_lives = 10 оценка = 0 враги_киллед = 0 бессмертный_таймер = 0 start_time = время.время() Canvas.coords(player, WIDTH // 2 - player_radius, HEIGHT // 2 - player_radius, ШИРИНА // 2 + радиус игрока, ВЫСОТА // 2 + радиус игрока) пули = [] враги = [] боссы = [] game_over = Ложь root.bind("", mouse_click) root.bind("", mouse_release) root.bind("", restart_game) защита key_press (событие): глобальное перемещение_влево, перемещение_вправо, перемещение_вверх, перемещение_вниз если event.keysym == "a": move_left = Истина elif event.keysym == "d": move_right = Истина elif event.keysym == "w": перемещение_вверх = Истина elif event.keysym == "s": перемещение_вниз = Истина защита key_release (событие): глобальное перемещение_влево, перемещение_вправо, перемещение_вверх, перемещение_вниз если event.keysym == "a": move_left = Ложь elif event.keysym == "d": move_right = Ложь elif event.keysym == "w": move_up = Ложь elif event.keysym == "s": move_down = Ложь root.bind("", key_press) root.bind("", key_release) защита update_game(): глобальные player_lives, счет, враги_убитые, бессмертный_таймер, время начала, игрок, пули, враги, боссы, game_over, can_shoot если не game_over: player_movement = [move_left, move_right, move_up, move_down] #Движение игрока new_player_x = Canvas.coords(player)[0] + (player_movement[1] - player_movement[0]) * player_speed new_player_y = Canvas.coords(player)[1] + (player_movement[3] - player_movement[2]) * player_speed # Проверка на выход за границу экрана new_player_x = max(min(new_player_x, WIDTH - player_radius * 2), 0) new_player_y = max(min(new_player_y, ВЫСОТА - player_radius * 2), 0) # Проверка обнаружения с врагами player_rect = (new_player_x, new_player_y, new_player_x + player_radius * 2, new_player_y + player_radius * 2) для врага во врагах: if Canvas.coords(enemy)[0] < player_rect[2] и Canvas.coords(enemy)[2] > player_rect[0] и \ Canvas.coords(enemy)[1] < player_rect[3] и Canvas.coords(enemy)[3] > player_rect[1] and immortal_timer == 0: direction = math.atan2(new_player_y + player_radius - (canvas.coords(enemy)[1] + enemy_radius), new_player_x + player_radius - (canvas.coords(enemy)[0] + enemy_radius)) # Отбрасывание игрока new_player_x += math.cos(direction) * knockback_distance new_player_y += math.sin(direction) * knockback_distance immortal_timer = time.time() player_lives -= 1 if player_lives == 0: game_over = True # Проверка времени бессмертия if immortal_timer != 0 and time.time() - immortal_timer >= immortal_duration: immortal_timer = 0 # Обновление координат игрока canvas.coords(player, new_player_x, new_player_y, new_player_x + player_radius * 2, new_player_y + player_radius * 2) # Стрельба if mouse_button_pressed and can_shoot: angle = math.atan2(root.winfo_pointery() - (new_player_y + player_radius), root.winfo_pointerx() - (new_player_x + player_radius)) bullets.append((new_player_x + player_radius, new_player_y + player_radius, angle)) can_shoot = False # Движение пуль active_bullets = [] for bullet in bullets: bullet_x = bullet[0] + math.cos(bullet[2]) * bullet_speed bullet_y = bullet[1] + math.sin(bullet[2]) * bullet_speed # Проверка на выход за границы экрана if 0 player_rect[0] and boss_rect[1] < player_rect[3] and boss_rect[3] > player_rect[1]): canvas.move(boss, math.cos(direction) * enemy_speed, math.sin(direction) * enemy_speed) # Проверка столкновения пуль с врагами и боссами bullets_to_remove = [] for bullet in bullets: should_remove_bullet = False for enemy in enemies: enemy_rect = canvas.coords(enemy) if enemy_rect[0] < bullet[0] < enemy_rect[2] and enemy_rect[1] < bullet[1] < enemy_rect[3]: should_remove_bullet = True # Попадание врага enemies_killed += 1 score += 1 canvas.delete(enemy) # Проверка столкновения пуль с боссами for boss in bosses: boss_rect = canvas.coords(boss) if boss_rect[0] < bullet[0] < boss_rect[2] and boss_rect[1] < bullet[1] < boss_rect[3]: should_remove_bullet = True # Попадание босса score += 5 canvas.delete(boss) if not should_remove_bullet: bullets_to_remove.append(bullet) # Удаление пуль bullets = bullets_to_remove # Проверка столкновения игрока с окном if not (game_window[0] < player_rect[2] < game_window[2] and game_window[1] < player_rect[3] < game_window[3]): game_over = True # Отображение счета и жизней score_text = tk.Label(root, text=f"Очки: {score}", font=("Arial", 14), fg=WHITE, bg="black") score_text.place(x=10, y=10) lives_text = tk.Label(root, text=f"Жизни: {player_lives}/10", font=("Arial", 14), fg=WHITE, bg="black") lives_text.place(x=WIDTH - 170, y=10) # Отображение времени игры current_time = time.time() elapsed_time = (current_time - start_time) minutes = int(elapsed_time // 60) seconds = int(elapsed_time % 60) milliseconds = int((elapsed_time * 100) % 100) timer_text = tk.Label(root, text=f"Время: {minutes:02}:{seconds:02}.{milliseconds:02}", font=("Arial", 14), fg=WHITE, bg="black") timer_text.place(x=WIDTH - 195, y=50) else: # Отображение сообщения о проигрыше и результатов game_over_text = tk.Label(root, text="Ты проиграл, лох!", font=("Arial", 28), fg=WHITE, bg="black") game_over_text.place(x=WIDTH // 2 - game_over_text.winfo_reqwidth() // 2, y=HEIGHT // 4) result_text = tk.Label(root, text=f"Очки: {score} | Время: {minutes:02}:{seconds:02}.{milliseconds:02}", font=("Arial", 14), fg=WHITE, bg="black") result_text.place(x=WIDTH // 2 - result_text.winfo_reqwidth() // 2, y=HEIGHT // 2) restart_text = tk.Label(root, text="Нажмите Enter, чтобы начать заново", font=("Arial", 14), fg=WHITE, bg="black") restart_text.place(x=WIDTH // 2 - restart_text.winfo_reqwidth() // 2, y=HEIGHT * 3 // 4) root.after(30, update_game) # Запуск игрового цикла update_game() root.mainloop()