我正在尝试使用Pyglet在Python中创建一个Rock,Paper,Scissors游戏。在运行'on_draw'功能时,我希望它允许用户输入“A”代表摇滚,“P”代表纸张,“S”代表剪刀,但我找不到解决方案。我有一个想法是,当你启动“窗口”时,它会设置一个包含文本的背景,但无法找到任何相关信息。如果您有任何想法并且有一些闲暇时间,我将非常感谢您的帮助。
我一直试图弄清楚这一点,但我对Pyglet很新。
这是我到目前为止的代码......
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)
# all images are defined correctly and sprites(tested it and all works)
#default choice of the computer player and user
num1 = 0
num2 = 0 #num2 is the user
@window.event
#Here is where I want it to say "Rock - A, Paper - S, Scissors - D"
def on_key_press(symbol, modifiers):
global num2
if symbol == key.A:
print ("Player: Rock")
num2 = 0
on_draw2()
elif symbol == key.S:
print ("Player: Paper")
num2 = 1
on_draw2()
elif symbol == key.D:
print ("Player: Scissors")
num2 = 2
on_draw2()
def on_draw():
window.clear()
sprite_bg.draw()
num1 = random.randint(0, 2)
if num1 == 0:
sprite_r_right.draw()
elif num1 == 1:
sprite_p_right.draw()
elif num1 == 2:
sprite_s_right.draw()
if num2 == 0:
sprite_r_left.draw()
elif num2 == 1:
sprite_p_left.draw()
elif num2 == 2:
sprite_s_left.draw()
if num1 == num2:
both_win.draw()
elif num2 == 0:
if num1 == 1:
right_win.draw()
else:
left_win.draw()
elif num2 == 1:
if num1 == 2:
right_win.draw()
else:
left_win.draw()
elif num2 == 2:
if num1 == 0:
right_win.draw()
else:
left_win.draw()
if __name__ == '__main__':
pyglet.app.run()
我希望程序运行如下:1。摇滚 - A,纸 - S,剪刀 - D等待输入a,s或d 2.然后将'num2'(用户)设置为0,1或2 (0 - 摇滚,1 - 纸,2 - 剪刀)3。随机'num1'(计算机播放器),0,1或2 4.显示两侧的岩石,纸张或剪刀的图像,并说谁赢了5.显示得分(尚未实施)6。重复(尚未实施)
程序运行如下:1。空白屏幕(等待输入a,s或d)2。执行上面列出的步骤2,3,4
我们需要解决您的代码存在的一些问题。
第一个是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
。我猜这是一个代表摇滚或类似东西的精灵。这一切都很好,但是出于时间目的,我在下面的代码中用Label替换它。
另一个问题是你在每个渲染循环中都做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()
这将显示快速“帮助”消息,并且一旦游戏开始,将显示结果和选择。
更简洁的方法是使用面向对象的编程来解决很多渲染,保留的问题。由于时间关系,我将不得不回来用这个解决方案编辑这个答案,得做一些工作嘿。