首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏用户输入在按回车后不会呈现

游戏用户输入在按回车后不会呈现
EN

Stack Overflow用户
提问于 2022-05-06 03:06:35
回答 1查看 48关注 0票数 1

我正试图在python中创建一个蠕虫克隆。我不是很有经验的游戏,并试图设置用户输入在屏幕上的小灰色框。但是,我使用的代码要么不正确地接受用户输入,要么不正确地呈现它。(我怀疑是后者。)我已经看过我多次引用的代码教程,检查了堆栈溢出帖子,但似乎没有一个有效。我希望在输入并按回键之后,单词会显示出来,因为为了代码简单起见,在键入时呈现的单词已经被移除。任何帮助都将不胜感激。

代码语言:javascript
复制
import random
import pygame

word_options = ("birth", "happy", "nancy")
word = random.choice(word_options).upper

WIDTH = 600
HEIGHT = 700
MARGIN = 10
T_MARGIN = 100
B_MARGIN = 100
LR_MARGIN = 100

GREY = (225, 227, 229)
GREY_FILLED = (120, 124, 126)
GREEN = (6,214,160)
YELLOW = (255, 209, 102)

INPUT = ""
GUESSES = ["berry"]
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
UNGUESSED = ALPHABET
GAME_OVER = False

pygame.init()
pygame.font.init()
pygame.display.set_caption("Nancdle")

SQ_SIZE = (WIDTH-4*MARGIN-2*LR_MARGIN) // 5
FONT = pygame.font.SysFont("free sans bold", SQ_SIZE)
FONT_SMALL = pygame.font.SysFont("free sans bold", SQ_SIZE//2)

#screen
screen = pygame.display.set_mode((WIDTH, HEIGHT))
white = (255, 255, 255)
#animation loop
animating = True
while animating:

  screen.fill(white)
  letters =FONT_SMALL.render(UNGUESSED, False, GREY_FILLED)
  surface = letters.get_rect(center = (WIDTH//2, T_MARGIN//2))
  screen.blit(letters, surface)
  
  y = T_MARGIN
  for i in range(6):
    x = LR_MARGIN
    for j in range(5):
      square = pygame.Rect(x, y, SQ_SIZE, SQ_SIZE)
      pygame.draw.rect(screen, GREY, square, 2)
      #to add past letters/words
      if i < len(GUESSES):
        color = GREY_FILLED
        pygame.draw.rect(screen, color, square)
        letter = FONT.render(GUESSES[i][j], False, (255,255,255))
        surface = letter.get_rect(center = (x+SQ_SIZE//2, y+SQ_SIZE//2))
        screen.blit(letter, surface)
      x += SQ_SIZE + MARGIN
    y += SQ_SIZE + MARGIN
  
    
  #to update screen
  pygame.display.flip()
  for event in pygame.event.get():
    #so you can close window
    if event.type == pygame.QUIT:
      animating = False
    
    elif event.type == pygame.KEYDOWN:
      if event.key == pygame.K_RETURN:
        if len(INPUT) == 5:
          GUESSES.append(INPUT)
          GAME_OVER = True if INPUT == ANSWER else false
          INPUT = ""
      
    
        elif len(INPUT) < 5 and not GAME_OVER:
          INPUT = INPUT + event.unicode.upper()

如果这个问题措辞不当或者问错了,我很乐意删除这篇文章。

EN

回答 1

Stack Overflow用户

发布于 2022-05-06 06:12:45

您的代码只处理K_Return的事件,而不是任何其他键。这是由于将elif len(INPUT) < 5 and not GAME_OVER:缩进过远造成的。

如果按以下方式更改事件处理程序代码,则应该可以工作:

代码语言:javascript
复制
elif event.type == pygame.KEYDOWN:
  if event.key == pygame.K_RETURN:
    if len(INPUT) == 5:
      GUESSES.append(INPUT)
      GAME_OVER = True if INPUT == word else False
      INPUT = ""

  elif len(INPUT) < 5 and not GAME_OVER:
    INPUT = INPUT + event.unicode.upper()

注:我还必须用ANSWER取代word,并将false资本化。

您使用两个空格进行缩进,如果使用了四个,则可能更容易识别范围不匹配。

使用event.unicode相当健壮,但用户仍然可以添加数字和空格。如果你想遍历所有的字母键,但不想要像if event.key in [pygame.K_a, pygame.K_b, ...这样可怕的东西,你可以使用range

代码语言:javascript
复制
elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RETURN:
        if len(INPUT) == 5:
            GUESSES.append(INPUT)
            GAME_OVER = True if INPUT == ANSWER else False
            INPUT = ""
    elif event.key in range(pygame.K_a, pygame.K_z + 1):
        # any other letter keys pressed
        if len(INPUT) < 5 and not GAME_OVER:
            INPUT = INPUT + event.unicode.upper()
    elif event.key in [pygame.K_BACKSPACE, pygame.K_DELETE]:
        INPUT = INPUT[:-1]  # don't need to check length
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72135730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档