首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配色时返回字符串索引错误。

配色时返回字符串索引错误。
EN

Stack Overflow用户
提问于 2022-05-07 23:52:59
回答 3查看 55关注 0票数 0

我正试图在游戏中创建一个蠕虫克隆。我用于确定字母颜色(determine_colour)的功能目前造成以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/tmp/sessions/e9773df3e08e9b22/main.py", line 77, in <module>
    colour = determine_colour(GUESSES[i], j)
  File "/tmp/sessions/e9773df3e08e9b22/main.py", line 34, in determine_colour
    if letter == ANSWER[j]:
IndexError: string index out of range

我的代码如下:

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

word_options = ("NANCY")
ANSWER  = 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 = []
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
UNGUESSED = ALPHABET
GAME_OVER = False

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

def determine_colour(guess, j):
  letter = guess[j]

  if letter == ANSWER[j]:
    return GREEN

    #yellow
  if letter in ANSWER:
    return YELLOW
    
    #grey
  return GREY_FILLED
    
  
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)
def determine_unguessed_letters(guesses):
  guessed_letters = "".join(guesses)
  unguessed_letters = ""
  for letter in ALPHABET:
    if letter not in guessed_letters:
      unguessed_letters = unguessed_letters+letter
  return unguessed_letters
#screen
screen = pygame.display.set_mode((WIDTH, HEIGHT))
white = (255, 255, 255)
#animation loop
animating = True
while animating:

  screen.fill(white)
  determine_unguessed_letters(GUESSES)
  
  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(0,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):
        colour = determine_colour(GUESSES[i], j)
        pygame.draw.rect(screen, colour, 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)
        
      # user text input (next guess)
      if i == len(GUESSES) and j < len(INPUT):
        letter = FONT.render(INPUT[j], False, (0, 0, 0))
        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_BACKSPACE:
        if len(INPUT) > 0:
          INPUT = INPUT[:len(INPUT) - 1]
      if event.key == pygame.K_RETURN:
        if len(INPUT) == 5:
          GUESSES.append(INPUT)
          UNGUESSED = determine_unguessed_letters(GUESSES)
          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

我尝试了几次for循环类型的迭代,更改了“确定颜色”函数的代码,检查了我的输入代码,并查看了用于选择单词的代码,但都没有结果。我希望"AZNCY“这个词被输入为黄色、灰色、绿色。

EN

回答 3

Stack Overflow用户

发布于 2022-05-08 00:07:15

你的可变答案是由一个字母组成的。random.choice('xyz')->returning是一个字母,所以当您尝试访问ANSWERnumber>0时,您将自动得到索引测距的错误。接下来,时间试着去阅读错误,我希望它能有所帮助。

编辑:对不起,OP,我以为我的答案足以解决这个问题。试着把你的单词南希分开来回答,就像那个答案= 'N','A','N','C','Y‘。希望这是你的解决方案。

票数 0
EN

Stack Overflow用户

发布于 2022-05-10 10:05:38

导致索引问题的原因是因为在开始时有以下两条语句:

代码语言:javascript
复制
word_options = ("NANCY")
ANSWER = random.choice(word_options).upper()

这第一行将word_options设置为单个字符串("NANCY"),第二行将ANSWER设置为该字符串的单个字母

可以通过添加一个后缀逗号来使字符串的tuple成为字符串的word_options来解决这个问题--这可能是您的意图,也是通过在括号中插入字符串来实现的:

代码语言:javascript
复制
word_options = ("NANCY",)  # Note added comma.
ANSWER = random.choice(word_options).upper()

然后random.choice()ANSWER设置为整个字符串 "NANCY",而不仅仅是其中的一个字母。

还为测试目的设置GUESSES = ["AZNCY"]之后,IndexError不再发生,以下内容显示在屏幕上:

票数 0
EN

Stack Overflow用户

发布于 2022-05-08 13:05:25

我目前是一个初学者,但希望这个洞察力可以提供一个解决方案:

由于j在猜测时超出了范围,所以如果要从0中索引,请检查所有重要的实例,因为当您有来自0的list索引时。

示例:

  • A、B、C等
  • 0 1 2等

或者这就是问题所在,如果是==呢?

代码语言:javascript
复制
if i < len(GUESSES) <----------- THIS
  colour = determine_colour(GUESSES[i], j)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72157143

复制
相关文章

相似问题

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