Игровой проект Simon в Python PyGame — цикл по шаблону?

Я работаю над проектом, в котором мне нужно создать программу, отвечающую нескольким требованиям. Я выбрал игру Саймон.

Я думаю, что я, по большей части, завершил его, однако есть одна часть, которую я не смог сделать правильно, и это делает так, чтобы он каждый раз повторял весь шаблон. Прямо сейчас пользователю просто нужно щелкнуть самый последний цвет, и он будет считать его правильным. Скажем, узор красный, желтый, синий, зеленый, затем снова появляется желтый цвет. Все, что нужно сделать пользователю, это нажать на желтый, и он считает, что это правильно. Я хочу, чтобы пользователь нажимал красный, желтый, синий, зеленый, затем желтый, чтобы он был правильным.

Как я могу изменить свой код, чтобы сделать это? Вот мой код:

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

Если кому нужна дополнительная информация, или может помочь, пожалуйста, дайте мне знать! Заранее спасибо!

Это много кода. Как вы думаете, вы могли бы сузить его, чтобы было легче понять, в чем именно проблема?

go2nirvana 22.12.2020 13:49

Да, я попробую. Спасибо.

Fox GAMING_NTF 22.12.2020 13:50

Хорошо, я удалил некоторый закомментированный код. Часть, которую я пытаюсь заставить работать, находится прямо над частью кода, которая прокомментирована с помощью «Render Out Text». Я пытаюсь понять, как правильно перебрать весь шаблон и попытаться проверить его с помощью пользовательского шаблона или чего-то в этом роде. Я в настоящее время только пытаюсь сделать это с зеленым.

Fox GAMING_NTF 22.12.2020 13:53

@ go2nirvana Я также пытался добавить раздел, который представляет собой просто код, который пытается пройти весь шаблон внизу. Надеюсь, это поможет. Пожалуйста, дайте мне знать, если вам нужны дополнительные разъяснения. Спасибо!

Fox GAMING_NTF 22.12.2020 13:58

@go2nirvana Есть идеи? Я не знаю, почему я не могу понять это.

Fox GAMING_NTF 22.12.2020 14:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
450
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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()

Это почти работает, за исключением того, что кажется, что это неправильно, только когда пользователь вводит шаблон той же длины, что и фактический шаблон. В остальном все отлично работает, большое спасибо!

Fox GAMING_NTF 22.12.2020 14:29

@FoxGAMING_NTF Понятно. Я изменил ответ: if len(userpattern) == len(pattern) or userpattern != pattern[:len(userpattern)]:

Rabbid76 22.12.2020 14:33

Хорошо спасибо. Извините, еще одна последняя вещь, которую я хотел узнать, не могли бы вы мне помочь: иногда кажется, что когда пользователь щелкает цвет, квадрат не загорается. Есть ли у вас какие-либо идеи, что может быть причиной этого, или как это исправить?

Fox GAMING_NTF 22.12.2020 14:43

@FoxGAMING_NTF См. Как подождать некоторое время в pygame?.

Rabbid76 22.12.2020 15:38

Другие вопросы по теме