Как мне запустить 2 функции в Pyglet? - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь создать игру Python, Paper, Scissors на Python, используя Pyglet.Во время работы функции «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. Rock - A, Paper - S, Scissors - D и ждет ввода, 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, перечисленные выше

1 Ответ

0 голосов
/ 02 апреля 2019

Есть пара проблем с вашим кодом, с которыми нам нужно разобраться.
Во-первых, 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()

Это покажет быстрое сообщение «помощь», и как только игра начнется, будут показаны результаты и варианты выбора.

Более точным способом будет использование объекта.ориентированное программирование для решения множества вопросов рендеринга, хранения.По прошествии времени мне придется вернуться и отредактировать этот ответ с помощью этого решения, мне нужно пойти поработать, хе.

...