Я работаю над проектом, в котором мне нужно создать программу, отвечающую нескольким требованиям. Я выбрал игру Саймон.
Я думаю, что я, по большей части, завершил его, однако есть одна часть, которую я не смог сделать правильно, и это делает так, чтобы он каждый раз повторял весь шаблон. Прямо сейчас пользователю просто нужно щелкнуть самый последний цвет, и он будет считать его правильным. Скажем, узор красный, желтый, синий, зеленый, затем снова появляется желтый цвет. Все, что нужно сделать пользователю, это нажать на желтый, и он считает, что это правильно. Я хочу, чтобы пользователь нажимал красный, желтый, синий, зеленый, затем желтый, чтобы он был правильным.
Как я могу изменить свой код, чтобы сделать это? Вот мой код:
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
Если кому нужна дополнительная информация, или может помочь, пожалуйста, дайте мне знать! Заранее спасибо!
Да, я попробую. Спасибо.
Хорошо, я удалил некоторый закомментированный код. Часть, которую я пытаюсь заставить работать, находится прямо над частью кода, которая прокомментирована с помощью «Render Out Text». Я пытаюсь понять, как правильно перебрать весь шаблон и попытаться проверить его с помощью пользовательского шаблона или чего-то в этом роде. Я в настоящее время только пытаюсь сделать это с зеленым.
@ go2nirvana Я также пытался добавить раздел, который представляет собой просто код, который пытается пройти весь шаблон внизу. Надеюсь, это поможет. Пожалуйста, дайте мне знать, если вам нужны дополнительные разъяснения. Спасибо!
@go2nirvana Есть идеи? Я не знаю, почему я не могу понять это.
Вы можете легко исправить свой код. Разрешить пользователю делать несколько записей. Сравните ввод (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 См. Как подождать некоторое время в pygame?.
Это много кода. Как вы думаете, вы могли бы сузить его, чтобы было легче понять, в чем именно проблема?