【问题标题】:Simon Game Project in Python PyGame- Looping through the pattern? [duplicate]Python PyGame 中的 Simon 游戏项目 - 循环模式? [复制]
【发布时间】:2023-04-11 02:13:01
【问题描述】:

我正在做一个项目,我必须制作一个满足多个要求的程序。我选择了西蒙游戏。

我想我已经完成了大部分工作,但是,有一个部分我无法正常工作,这使得它每次都在整个模式中循环。现在,用户只需点击最近的颜色,它就会认为它是正确的。假设图案是红、黄、蓝、绿,那么黄色又出现了。用户所要做的就是按下黄色,它认为它是正确的。我希望用户必须按红色、黄色、蓝色、绿色、然后黄色才能正确。

如何修改我的代码来做到这一点?这是我的代码:

pattern = []
userpattern = []
score = 1
global run_once
run_once = 0

def randomcolor():
  
  print(score)
  for i in range(10):

      padchoice = random.randint(0, 3)

      if(padchoice == 0):
        pattern.append("green")
        break
      elif(padchoice == 1):
        pattern.append("red")
        break
        ...

  print("Pattern: " + str(pattern))
  print(userpattern)


fps = pg.time.Clock()

while(end == False):
  fps.tick(60)

  if run_once == 0:
      randomcolor()
      run_once = 1

  for event in pg.event.get():
      #If Quit Button Pressed
      if event.type == pg.QUIT:
          end = True

      elif event.type == pg.MOUSEBUTTONDOWN:
        pos_x = pg.mouse.get_pos()[0]
        pos_y = pg.mouse.get_pos()[1]

        #Mouse Position
        print(str(pos_x) + ", " + str(pos_y))
        
        if(pos_x > 5 and pos_x < 150):
          if(pos_y > 5 and pos_y < 150):
            green("on")
            userpattern.append("green")
            print(userpattern)
        
        ...
      
  if(userpattern != pattern[:len(userpattern)] and len(userpattern) != 0):
    print("Wrong!")
    userpattern.clear()
    pattern.clear()
    score = 0
    run_once = 0
  
  for i in range(len(pattern)):
    if(pattern[i] == "green"):
      if(pos_x > 5 and pos_x < 150):
          if(pos_y > 5 and pos_y < 150):
            green("on")
            userpattern.append("green")
            print(userpattern)    

  
  if(userpattern == pattern):
    print("Correct")
    score += 1
    print(score)
    run_once = 0

if(score == 11):
  wintext = font.render("Win!"), 0, (255, 255, 255)
  screen.blit(wintext, (screen.get_width()/2, screen.get_height()/2))
  pg.display.flip()

P.S.- 我知道代码不是最好的,我敢肯定,但我真的只是想让它工作。

编辑:我认为问题出在这些代码行的某个地方,我正试图让它工作:

      if(userpattern != pattern[:len(userpattern)] and len(userpattern) != 0):
    print("Wrong!")
    userpattern.clear()
    pattern.clear()
    score = 0
    run_once = 0
  
  for i in range(len(pattern)):
    if(pattern[i] == "green"):
      if(pos_x > 5 and pos_x < 150):
          if(pos_y > 5 and pos_y < 150):
            green("on")
            userpattern.append("green")
            print(userpattern)

if(userpattern == pattern): #and new == False
   print("Correct")
   score += 1
   print(score)
   run_once = 0

如果有人需要更多信息或可以提供帮助,请告诉我! 提前致谢!

【问题讨论】:

  • 那是很多代码。你认为你可以缩小范围,以便更容易理解问题的确切位置吗?
  • 是的,我会试试的。谢谢。
  • 好的,我已经删除了一些注释代码。我试图开始工作的部分就在用“渲染文本”注释的代码部分的正上方。我试图弄清楚如何正确循环整个模式,并尝试使用 userpattern 或类似的东西来检查它。我目前只尝试用绿色来做到这一点。
  • @go2nirvana 我还尝试在底部添加一个部分,该部分只是尝试循环遍历所有模式的代码。我希望这有帮助。如果您需要更多说明,请告诉我。谢谢!
  • @go2nirvana 有什么想法吗?我不知道为什么我想不通。

标签: python loops pygame user-input


【解决方案1】:

您可以轻松地修复您的代码。允许用户进行多个条目。仅当列表的长度相同或已输入的模式部分不同时,才将输入 (userpattern) 与 pattern 进行比较:

while(end == False):
    # [...]

    for event in pg.event.get():
         if event.type == pg.MOUSEBUTTONDOWN:
         
           # add input to `userpattern`
           # [...]

    if len(userpattern) == len(pattern) or userpattern != pattern[:len(userpattern)]:

        win = userpattern == pattern

        if not win:
            # [...]
        else:
            # [...]

代码相关改动:

while(end == False):
  fpsmax.tick(60)

  # [...]

  #USER INPUT
  for event in pg.event.get():
      # [...]

  #Render Out Text
  patterntext = font.render(str(pattern), 0, (255, 255, 255))
  userpatterntext = font.render(str(userpattern), 0, (255, 255, 255))
  screen.blit(patterntext, (screen.get_width()/2, screen.get_height()/2))
  screen.blit(userpatterntext, (screen.get_width()/2, (screen.get_height()/2) - 50 ))
  pg.display.flip()

  if len(userpattern) == len(pattern) or userpattern != pattern[:len(userpattern)]:
    
    win = userpattern == pattern

    if not win:
      print("Wrong!")
      userpattern.clear()
      pattern.clear()
      score = 0
      run_once = 0
    else:
      print("Correct")
      userpattern.clear()
      new = True
      score += 1
      print(score)
      run_once = 0

      #OUTPUT
      if(score == 10):
        wintext = font.render("You Win!"), 0, (255, 255, 255)
        screen.blit(wintext, (screen.get_width()/2, screen.get_height()/2))
        pg.display.flip()

【讨论】:

  • 这几乎可以工作,只是一旦用户输入与实际模式相同长度的模式,它似乎只会计算错误。除此之外,这非常有效,非常感谢!
  • @FoxGAMING_NTF 我明白了。我改变了答案:if len(userpattern) == len(pattern) or userpattern != pattern[:len(userpattern)]:
  • 好的,谢谢。抱歉,我想知道您能否帮我解决最后一件事:有时,当用户单击一种颜色时,方块似乎不会亮起。您知道是什么原因造成的,或者如何解决?
  • @FoxGAMING_NTF 见How to wait some time in pygame?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多