Как включить эту переменную в строку font.render? - PullRequest
1 голос
/ 09 февраля 2020

Я пытаюсь сделать так, чтобы результат броска костей был включен в строку текста blit на экране, "You rolled a" + roll

Я считаю, что проблема связана с тем, как l oop «во время работы:» или порядок, в котором я написал код, но я не знаю, как это исправить. Любая помощь будет оценена. Я новичок в StackOverflow, поэтому заранее прошу прощения, если название / объяснение недостаточно ясны.

from random import *
import pygame
import sys

from pygame import rect

"""SETTINGS"""
global roll
clock = pygame.time.Clock()
fps = 60

WHITE = (255, 255, 255)
GREY = (200, 200, 200)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

WIDTH = 520
HEIGHT = 500

bg = (255, 255, 255)

"""functions"""


def dice():
    roll = randint(1, 6)
    print("You rolled a ", roll)


"""init"""

pygame.init()
pygame.font.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Dice")

"""dice image"""

image = pygame.image.load("diceImage.gif").convert()
image2 = image.get_rect()
imageUsed = pygame.transform.scale(image, (WIDTH, HEIGHT))

"""text object"""
surf = pygame.Surface((WIDTH, 60))
font = pygame.font.SysFont("comicsansms", 37)
text = font.render("Click the dice to roll a number", True, (30, 128, 190))

surf2 = pygame.Surface((400, 60))
text2 = font.render(("You rolled a", roll), True, (30, 128, 190))

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            dice()
            mouse_pos = event.pos
            if image2.collidepoint(mouse_pos):
                print('button was pressed at {0}'.format(mouse_pos))

    screen.fill(bg)
    screen.blit(imageUsed, (0, 0))
    screen.blit(surf, (0, 0))
    screen.blit(surf2, (50, 450))
    screen.blit(text, (0, 0))
    screen.blit(text2, (50, 450))
    pygame.display.update()
    clock.tick(fps)

Сообщение об ошибке:

Traceback (most recent call last):
  File "C:/Users/lee/Documents/PYTHON/Dice/Dice.py", line 50, in <module>
    text2 = font.render(("You rolled a", roll), True, (30, 128, 190))
NameError: name 'roll' is not defined

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Вы поместили оператор global в неправильном месте. Оператор global означает, что перечисленные идентификаторы должны интерпретироваться как глобальные в текущей области.
Объявить и инициализировать roll в глобальном пространстве имен, но использовать оператор global в функции dice, чтобы установить переменная roll в глобальном пространстве имен:

roll = 1
def dice():
    global roll
    roll = randint(1, 6)
    print("You rolled a ", roll)

Вы должны преобразовать числовое значение roll в строку как str(), прежде чем использовать ее в render() и визуализировать текст Surface:

text2 = font.render(("You rolled a " + str(roll)), True, (30, 128, 190))
0 голосов
/ 09 февраля 2020

В функции dice(), roll = на самом деле не будет ссылаться или изменять переменную roll верхнего уровня, вот где вам нужен глобальный оператор. Я не уверен, какую IDE вы используете, но при вставке соответствующего кода мой немедленно уведомляет меня о том, что roll = randint(1, 6) имя тени «катится» из внешней области видимости .

Я думаю функция dice() должна быть переименована во что-то более наглядное и потерять печать. Я не обладаю достаточными знаниями о PyGame, чтобы сказать, можно ли полностью избавиться от глобальной переменной.

Кроме того, import *, как правило, плохая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...