Есть пара проблем с вашим кодом, с которыми нам нужно разобраться.
Во-первых, on_draw
не будет вызван, если пользователь не нажмет кнопку, в идеале. Эта функция вызывается через определенные промежутки времени./ прерывает в рамках.
Мы делаем это следующим образом:
@window.event # <-- This is key, if you forget this - the screen won't update
def on_draw():
window.clear()
sprite_bg.draw()
Позже ваш код использует набор переменных, которых не существует, например, sprite_r_right
никогда не бываетопределены.Я предполагаю, что это спрайт, представляющий камень или что-то подобное.Это все нормально, но для временных целей я заменяю это меткой в моем коде ниже.
Другая проблема заключается в том, что вы делаете num1 = random.randint(0, 2)
в каждом цикле рендеринга.Без проверки, предоставил ли пользователь выбор или нет.В идеале вы должны сделать что-то вроде:
if num2 != 0:
num1 = random.randint(0, 2)
* (Еще одно быстрое замечание: эти имена переменных сбивают с толку как f ***, и любому трудно реально отследить, для чего они используются.Поэтому в приведенном ниже коде я изменил их, чтобы они представляли что-то более логичное с точки зрения того, что они делают или используют) *
Вот предлагаемый пример того, как можно настроить логику:
import pyglet
from pyglet.window import key
import random
import time
window = pyglet.window.Window(width = 1000, height = 700, resizable = False, caption = "Rock, Paper, Scissors!")
#images saved in root of the .py file
bg = pyglet.image.load('bg.png')
sprite_bg = pyglet.sprite.Sprite(img=bg)
sprite_player = pyglet.text.Label("", x=(window.width/3), y=window.height/2)
sprite_computer = pyglet.text.Label("", x=window.width-(window.width/3), y=window.height/2)
sprite_result = pyglet.text.Label("", x=window.width/2, y=window.height/3, anchor_x="center")
@window.event
def on_key_press(symbol, modifiers):
if symbol == key.A:
sprite_player.text = 'Rock'
elif symbol == key.S:
sprite_player.text = 'Paper'
elif symbol == key.D:
sprite_player.text = 'Scissors'
# Once the user presses a key, randomize the computers choice
rng = random.randint(0, 2)
if rng == 0:
sprite_computer.text = 'Rock'
elif rng == 1:
sprite_computer.text = 'Paper'
elif rng == 2:
sprite_computer.text = 'Scissors'
@window.event # <-- This is key, if you forget this - the screen won't update
def on_draw():
window.clear()
sprite_bg.draw()
if sprite_player.text != "" and sprite_computer.text != "":
if sprite_player.text == sprite_computer.text:
sprite_result.text = "Draw!"
elif sprite_computer.text == "Rock":
if sprite_player.text == "Paper":
sprite_result.text = "Player wins"
else:
sprite_result.text = "Computer wins"
elif sprite_computer.text == "Paper":
if sprite_player.text == "Scissors":
sprite_result.text = "Player wins"
else:
sprite_result.text = "Computer wins"
elif sprite_computer.text == "Scissors":
if sprite_player.text == "Rock":
sprite_result.text = "Player wins"
else:
sprite_result.text = "Computer wins"
else:
sprite_result.text = "Press A for Rock, S for Paper and D for Scissors"
sprite_player.draw()
sprite_computer.draw()
sprite_result.draw()
if __name__ == '__main__':
pyglet.app.run()
Это покажет быстрое сообщение «помощь», и как только игра начнется, будут показаны результаты и варианты выбора.
Более точным способом будет использование объекта.ориентированное программирование для решения множества вопросов рендеринга, хранения.По прошествии времени мне придется вернуться и отредактировать этот ответ с помощью этого решения, мне нужно пойти поработать, хе.