【问题标题】:How to introduce a box entry to this code [duplicate]如何在此代码中引入一个框条目[重复]
【发布时间】:2021-10-20 10:31:21
【问题描述】:

我需要将 2 个代码合并为 1 个,但如果不冻结就无法做到。其中一个在屏幕上显示 2 个随机数和它们之间的符号“+”并生成一个灰色矩形(参见这篇文章:How to STOP generating numbers)。这是第一个的最终代码:

import pygame
import random

pygame.init()

clock = pygame.time.Clock()
surface = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Projecte MatZanfe")
font = pygame.font.SysFont('comicsans', 50)
base_font = pygame.font.Font(None, 32)
user_text = ''
color_active = pygame.Color('lightskyblue3')
running = True
def start_the_game():
    x = random.randint(0, 10)
    y = random.randint(0, 10)
    is_correct = False
    return x, y

def display_the_game(x, y):
    # Variables
    points = 0

    z = x + y
    surface.fill((255, 70, 90))
    text = font.render(str(x) + "+" + str(y), True, (255, 255, 255))
    input_rect = pygame.Rect(200, 200, 180, 50)

    pygame.draw.rect(surface, color_active, input_rect)
    text_surface = base_font.render(user_text, True, (255, 255, 255))
    surface.blit(text_surface, input_rect)
    surface.blit(text, (260, 120))
    input_rect.w = max(100, text_surface.get_width() + 10)

x, y = start_the_game()
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    display_the_game(x, y)
    pygame.display.update()
pygame.quit()

另一个生成一个输入框,因此用户可以输入他想要的任何内容(这将用于输入第一个代码中数字总和的结果)。代码如下:

import pygame


pygame.init()
screen = pygame.display.set_mode((600, 400))
COLOR_INACTIVE = pygame.Color('lightskyblue3')
COLOR_ACTIVE = pygame.Color('dodgerblue2')
FONT = pygame.font.SysFont('comicsans', 32)
base_font = pygame.font.Font(None, 32)
color_active = pygame.Color('lightskyblue3')
user_text = ''


class InputBox:

    def __init__(self, x, y, w, h, text=''):
        self.rect = pygame.Rect(x, y, w, h)
        self.color = COLOR_INACTIVE
        self.text = text
        self.txt_surface = FONT.render(text, True, self.color)
        self.active = False

    def handle_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            # If the user clicked on the input_box rect.
            if self.rect.collidepoint(event.pos):
                # Toggle the active variable.
                self.active = not self.active
            else:
                self.active = False
            # Change the current color of the input box.
            self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE
        if event.type == pygame.KEYDOWN:
            if self.active:
                if event.key == pygame.K_RETURN:
                    print(self.text)
                    self.text = ''
                elif event.key == pygame.K_BACKSPACE:
                    self.text = self.text[:-1]
                else:
                    self.text += event.unicode
                # Re-render the text.
                self.txt_surface = FONT.render(self.text, True, self.color)

    def update(self):
        # Resize the box if the text is too long.
        width = max(200, self.txt_surface.get_width()+10)
        self.rect.w = width

    def draw(self, screen):
        # Blit the text.
        screen.blit(self.txt_surface, (self.rect.x+5, self.rect.y+5))
        # Blit the rect.
        pygame.draw.rect(screen, self.color, self.rect, 2)



def main():
    clock = pygame.time.Clock()
    input_box2 = InputBox(190, 250, 200, 32)
    input_boxes = [input_box2]
    done = False

    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            for box in input_boxes:
                box.handle_event(event)

        for box in input_boxes:
            box.update()

        screen.fill((255, 70, 90))
        for box in input_boxes:
            box.draw(screen)

        pygame.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    main()
    pygame.quit()

我需要将它们合并为 1 个代码,以便用户可以给出随机数的答案。

【问题讨论】:

    标签: python python-3.x merge pygame


    【解决方案1】:

    假设你有一个名为 InputBox 的文件: InputBox.py。使用 2 个随机数转到 其他文件 并将其更改为:

    import pygame
    import random
    from InputBox import InputBox
    
    pygame.init()
    
    clock = pygame.time.Clock()
    surface = pygame.display.set_mode((600, 400))
    pygame.display.set_caption("Projecte MatZanfe")
    font = pygame.font.SysFont('comicsans', 50)
    base_font = pygame.font.Font(None, 32)
    user_text = ''
    color_active = pygame.Color('lightskyblue3')
    running = True
    
    
    def start_the_game():
        x = random.randint(0, 10)
        y = random.randint(0, 10)
        is_correct = False
        return x, y
    
    def display_the_game(x, y):
        # Variables
        points = 0
    
        z = x + y
        surface.fill((255, 70, 90))
        text = font.render(str(x) + "+" + str(y), True, (255, 255, 255))
    
        text_surface = base_font.render(user_text, True, (255, 255, 255))
        surface.blit(text, (260, 120))
        input_box.draw(surface)
    
    x, y = start_the_game()
    input_box = InputBox(190, 250, 200, 32)
    
    while running:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            else:
                result = input_box.handle_event(event)
                if result != None:
                    if int(result) == x + y:
                        # TODO: add what you want to do when he is right
                        pass
                    else:
                        # TODO: add what you want to do when the use is wrong
                        pass
    
        display_the_game(x, y)        # By the way you can take all of the code in this function and move to the main loop, looks cleaner to me
        pygame.display.update()
    
    pygame.quit()
    

    现在记下 3 件事:

    1. 用户对的时候你要加代码,你想做什么,他错的时候你想做什么,我没加。
    2. 我没有检查用户输入是否有效。我在他的输入上调用了int()函数,所以如果他输入一个字符串,就会抛出一个异常。
    3. 我对@9​​87654326@ 文件中的handle_event 函数进行了一些更改,所以它会返回结果,并且不会打印它。现在看起来像这样:
        def handle_event(self, event):
            if event.type == pygame.MOUSEBUTTONDOWN:
                # If the user clicked on the input_box rect.
                if self.rect.collidepoint(event.pos):
                    # Toggle the active variable.
                    self.active = not self.active
                else:
                    self.active = False
                # Change the current color of the input box.
                self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE
            if event.type == pygame.KEYDOWN:
                if self.active:
                    if event.key == pygame.K_RETURN:
                        user_input = self.text
                        self.text = ''
                        self.txt_surface = FONT.render(self.text, True, self.color)
                        return user_input
                    elif event.key == pygame.K_BACKSPACE:
                        self.text = self.text[:-1]
                    else:
                        self.text += event.unicode
                    # Re-render the text.
                    self.txt_surface = FONT.render(self.text, True, self.color)
    
    

    【讨论】:

    • 好的,我试试看。谢谢,我会努力完成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多