Как консолидировать операторы if / elif в Python - PullRequest
0 голосов
/ 15 марта 2012

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

import random
trial = 0
def geuss():
    geuss = raw_input("What is your geuss? ")
    global g1
    global g2
    global g3
    global g4
    a = geuss[:-3]
    b = geuss[1:-2]
    c = geuss[2:-1]
    d = geuss[3:]
    if a == peg1:
        g1 = 'R'
    elif a == peg2:
        g1 = 'W'
    elif a == peg3:
        g1 = 'W'
    elif a == peg4:
        g1 = 'W'
    else:
        g1 = 'X'

    if b == peg2:
        g2 = 'R'
    elif b == peg1:
        g2 = 'W'
    elif b == peg3:
        g2 = 'W'
    elif b == peg4:
        g2 = 'W'
    else:
        g2 = 'X'

    if c == peg3:
        g3 = 'R'
    elif c == peg1:
        g3 = 'W'
    elif c == peg2:
        g3 = 'W'
    elif c == peg4:
        g3 = 'W'
    else:
        g3 = 'X'

    if d == peg4:
        g4 = 'R'
    elif d == peg1:
        g4 = 'W'
    elif d == peg2:
        g4 = 'W'
    elif d == peg3:
        g4 = 'W'
    else:
        g4 = 'X'

    print g1, g2, g3, g4
    global trial
    trial = trial + 1
    return trial



colour = ['B', 'G', 'Y', 'P', 'R']

peg1 = random.choice(colour)
peg2 = random.choice(colour)
peg3 = random.choice(colour)
peg4 = random.choice(colour)
g1 = 0
g2 = 0
g3 = 0
g4 = 0

print ""
while g1 != 'R' or g2 != 'R' or g3 != 'R' or g4 != 'R':
    geuss()
print "Congratulations! It took you %d tries to crack the code!" % trial

print ""
print "The code was %s%s%s%s." % (peg1, peg2, peg3, peg4)

Как вы можете видеть, операторы if и elif в функции 'geuss ()' неоправданно ошибочны, но когда я пытался собрать их вместе, скрипт всегда помещал бы W.

    if a == peg1:
        g1 = 'R'
    elif a == peg2 or peg 3 or peg4:
        g1 = 'W'
    else:
        g1 = 'X'

Даже если я добавлю «QWER» в качестве ввода, я получу X. Есть ли способ объединить их, все еще получая правильный ответ?

Кроме того, не по теме, если есть какие-либо другие предложения, которые вы можете дать мне по сценарию, поскольку я новичок, это будет очень цениться! Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Когда вы используете or или and, вам необходимо указать, какую операцию вы используете.Вот что вы написали ...

if a == peg1:
  g1 = 'R'
elif a == peg2 or peg 3 or peg4:
  g1 = 'W'
else:
  g1 = 'X'

elif, в котором спрашивается, равен ли a peg2, а затем, если существует peg3 или peg4Вы должны изменить это так a == peg3/4 также.Вот так ...

elif a == peg2 or a == peg3 or a == peg4:
1 голос
/ 15 марта 2012

Что касается вашего вопроса if / elif, типичной идиомы Python для использования словаря для оператора switch.

// http://stackoverflow.com/questions/374239/why-doesnt-python-have-a-switch-statement
{'option1': function1,
 'option2': function2,
 'option3': function3,
 'option4': function4,
}.get(value, defaultfunction)()

Однако в этом случае я считаю, что вы используете неправильный подход.«Мышление» в Python немного отличается от других языков и требует некоторого времени, чтобы привыкнуть к действиям «по пути Python».Вы, кажется, понимаете списки и кусочки строк, что хорошо.Вы можете использовать это немного больше, чтобы упростить вашу программу Mastermind, как показано ниже.

import random

trial = 0
colour = ['B', 'G', 'Y', 'P', 'R']

pegs = [random.choice(colour), random.choice(colour), random.choice(colour), random.choice(colour)]
guess_pegs = ['?', '?', '?', '?']

def main():
    print "Generating a code"
    print pegs

    guess()    
    print "Congratulations! It took you %d tries to crack the code!\n" % trial
    print "The code was: " + ', '.join(pegs) 

def guess():
    global trial
    global pegs
    global guess_pegs

    entry_list = ['?', '?', '?', '?']

    while pegs != guess_pegs :
        entry_list = raw_input("What is your guess? ").split(' ')

        trial = trial + 1

        if len(pegs) == len(entry_list) :
            for i in range(0,4) :
                if(entry_list[i] == pegs[i]) :
                    guess_pegs[i] = entry_list[i]
        print guess_pegs                    
        guess()

# Kick things off
main()
0 голосов
/ 29 декабря 2013

Опытный программист на Python написал бы: -

elif a == peg2 or a == peg3 or a == peg4:

как: -

elif a in (peg2, peg3, peg4):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...