2016-09-03 4 views
1

Я, наконец, заканчиваю игру с Саймоном, но у меня есть некоторые сомнения относительно того, как закончить последовательность.Python Simon Игра: Я застрял, завершая последовательность

Редактировать: Как вы просили, я редактировал свое сообщение. Здесь я выложу свой код так, как это было до этого сообщения. Итак, вот мои актуальные проблемы.

1) Я не знаю, как добавить одно число в последовательность после каждого поворота.

2) Первый ход работает нормально, но я не знаю, как начать следующий поворот. Я попытался снова вызвать функцию после проверки последовательности, но она не сработала.

Необходимый код для двух вещей:

from Tkinter import * 
import Tkinter 
import random 

base = Tkinter.Tk() 

fr = Tkinter.Frame(base, bg='black', width='238', height='250') 

score = Tkinter.Label(base, bg='black', fg='white', text='Score:') 
score.place(x = 30, y = 15) 

s = 0 

scoreNum = Tkinter.Label(base, bg='black', fg='white', text = s) 
scoreNum.place(x = 70, y = 15) 

clicks = [] 
color = 0 

def yellowClick(): 

    yellow.configure(activebackground='yellow3') 
    yellow.after(500, lambda: yellow.configure(activebackground='yellow')) 

    global clicks 
    global color 

    color = 1 
    clicks.append(color) 

yellow = Tkinter.Button(base, bd='0', highlightthickness='0', 
         width='7', height='5', activebackground='yellow', 
         bg='yellow3', command = yellowClick) 

yellow.place(x = 30, y = 50) 

def blueClick(): 

    blue.configure(activebackground='medium blue') 
    blue.after(500, lambda: blue.configure(activebackground='blue')) 

    global clicks 
    global color 

    color = 2 
    clicks.append(color) 

blue = Tkinter.Button(base, bd='0', highlightthickness='0', 
        width='7', height='5', activebackground='blue', 
        bg='medium blue', command = blueClick) 

blue.place(x = 125, y = 50) 

def redClick(): 

    red.configure(activebackground='red3') 
    red.after(500, lambda: red.configure(activebackground='red')) 

    global clicks 
    global color 

    color = 3 
    clicks.append(color) 

red = Tkinter.Button(base, bd='0', highlightthickness='0', 
        width='7', height='5', activebackground='red', 
        bg = 'red3', command = redClick)  

red.place(x = 30, y = 145) 

def greenClick(): 

    green.configure(activebackground='dark green') 
    green.after(500, lambda: green.configure(activebackground='green4')) 

    global clicks 
    global color 

    color = 4 
    clicks.append(color) 

green = Tkinter.Button(base, bd='0', highlightthickness='0', 
         width='7', height='5', activebackground='green4', 
         bg='dark green', command = greenClick) 

green.place(x = 125, y = 145) 

def scoreUp(): 

    global s 

    s = s + 1 

    scoreNum.configure(text = s) 


sequence = [] 

def checkSequence(): 

    global clicks 
    global sequence 

    if clicks == sequence: 

     scoreUp() 

def showSequence(): 

    global sequence 
    global clicks 
    global check 

    r = random.randint(1, 4) 

    if r == 1: 

     yellow.configure(bg='yellow') 
     yellow.after(1000, lambda: yellow.configure(bg='yellow3')) 

     sequence.append(r) 

     base.after(5000, checkSequence) 

    elif r == 2: 

     blue.configure(bg='blue') 
     blue.after(1000, lambda: blue.configure(bg='medium blue')) 

     sequence.append(r) 

     base.after(5000, checkSequence) 

    elif r == 3: 

     red.configure(bg='red') 
     red.after(1000, lambda: red.configure(bg='red3')) 

     sequence.append(r) 

     base.after(5000, checkSequence) 

    elif r == 4: 

     green.configure(bg='green4') 
     green.after(1000, lambda: green.configure(bg='dark green')) 

     sequence.append(r)  

     base.after(5000, checkSequence) 


base.after(2000, showSequence) 

fr.pack() 

base.resizable(False, False) 
base.mainloop() 

Функция checkSequence активируется по времени, потому что я не мог найти другой способ сделать это.

+0

Что вы имеете в виду остановки? Как остановить и ждать события? –

+0

Да, вот что я имею в виду: – Andrea

+1

'sequence == sequence + 1' равно' 0 == 1', и он всегда False. – furas

ответ

1

Я уже ответил на этот вопрос, но у вас все еще были проблемы, вот полный и полный код. Я сделал это более эффективным и исправил проблемы :)

Это работает, я протестировал его. Просто комментарий, если есть что-то, что нужно знать

import Tkinter # you don't need to import Tkinter again, from ... import * moves all the functions from ... into your program 
import random 

base = Tkinter.Tk() 

fr = Tkinter.Frame(base, bg='black', width='238', height='250') 
fr.pack() 

score = Tkinter.Label(base, bg='black', fg='white', text='Score:') 
score.place(x = 30, y = 15) 

scoreNum = Tkinter.Label(base, bg='black', fg='white', text = 0) 
scoreNum.place(x = 70, y = 15) 

global sequence 
global clicks 
global s 
sequence = [] 
clicks = [] 
s = 0 

yellow = Tkinter.Button(base, bd='0', highlightthickness='0', 
         width='7', height='5', activebackground='yellow', 
         bg='yellow3', command = lambda *args: Click(yellow, "yellow", "yellow3", 1)) 


blue = Tkinter.Button(base, bd='0', highlightthickness='0', 
        width='7', height='5', activebackground='blue', 
        bg='medium blue', command = lambda *args: Click(blue, "blue", "medium blue", 2)) 

red = Tkinter.Button(base, bd='0', highlightthickness='0', 
        width='7', height='5', activebackground='red', 
        bg = 'red3', command = lambda *args: Click(red, "red", "red3", 3))  

green = Tkinter.Button(base, bd='0', highlightthickness='0', 
         width='7', height='5', activebackground='green4', 
         bg='dark green', command = lambda *args: Click(green, "green", "dark green", 4)) 

yellow.place(x = 30, y = 50) 
blue.place(x = 125, y = 50) 
red.place(x = 30, y = 145) 
green.place(x = 125, y = 145) 


def Click(button, colour1, colour2, number): # these arguments change so that you don't have to copy the function 10 times 
    global clicks 

    yellow.configure(activebackground=colour2) 
    yellow.after(500, lambda: yellow.configure(activebackground=colour1)) 

    clicks.append(number) 
    checkSequence() # why not do this straight away? 

def checkSequence(): 
    global clicks 
    global sequence 
    global s 

    print("clicks: "+str(clicks)) # debug 
    print("sequence: "+str(sequence)) 

    if clicks != sequence[:len(clicks)]: # if all their clicks so far e.g. [1, 2, 4, 3] DONT fit with the sequence e.g. [3, 2, 4, 3, 2, 1] 
     print("   ...Incorrect!") 
     s = 0 
     scoreNum.configure(text = 0) 
     sequence = [] 
     clicks = [] 
     base.after(1000, showSequence) # now move to the next value in the sequence 

    elif clicks == sequence: # they have completed a sequence 
     print("   ...Match!") 
     s = s + 1 
     scoreNum.configure(text = s) 
     clicks = [] 
     base.after(1000, showSequence) # now move to the next value in the sequence 

def showSequence(): 
    global sequence 
    global clicks 

    r = random.randint(1, 4) 

    if r == 1: 
     yellow.configure(bg='yellow') 
     yellow.after(1000, lambda: yellow.configure(bg='yellow3')) 

    elif r == 2: 
     blue.configure(bg='blue') 
     blue.after(1000, lambda: blue.configure(bg='medium blue')) 

    elif r == 3: 
     red.configure(bg='red') 
     red.after(1000, lambda: red.configure(bg='red3')) 

    elif r == 4: 
     green.configure(bg='green') 
     green.after(1000, lambda: green.configure(bg='dark green')) 

    sequence.append(r) # you don't need this in all the if statements, it always happens 

base.after(100, showSequence) 
base.resizable(False, False) 
base.mainloop() 

ПРИМЕЧАНИЕ: Я использую Python 3.4.1, так что я изменил все tkinters к Tkinter

+0

Благодарим вас за помощь. – Andrea

+0

Без проблем, не прочь милый зеленый тик :) –

+0

Андреа это работает? Если это действительно мой ответ, верьте! –

0

Вот код, основанный на решении furas' в комментариях

def showSequence(): 

    global sequence  

    number_added = True 
    r = random.randint(1, 4) 

    if r == 1: 
    elif r == 2: 
    elif r == 3: 
    elif r == 4: 
    else: 
     number_added = False 

    return number_added # this will be True if a number was added, False if not 

И вызвать функцию:

number_added = showSequence() 
if number_added: 
    # stop sequence here 

Вы также сказал, что вы не знаете, как остановить его, попробуйте это:

import sys 
sys.exit() 

Это немедленно остановить функцию вы находитесь в данный момент в

+0

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

+0

Нет проблем :) Если вам что-то еще нужно добавить комментарий –

+0

помните, если бы это помогло вам, я бы не прочь красивого, большого зеленого цвета XD –