Esempi master mind

Sommario

Primissima versione

import random

#-------------------------------------------------------------------
# Cancella console e scrive messaggio iniziale
#-------------------------------------------------------------------
for z in range(24):
  print
print"PYTHON MASTER MIND"
print"------------------"
print

#-------------------------------------------------------------------
# Prepara lista a con il codice da indovinare
#-------------------------------------------------------------------
a=[0,0,0,0]
i=0
while i<4:
    a[i]=random.randint(1,6)
    i=i+1

#-------------------------------------------------------------------
# Ciclo principale
#-------------------------------------------------------------------
t=0
while 1:

    #-------------------------------------------------------------------
    # Copia la lista a nella lista b
    #-------------------------------------------------------------------
    b=[0,0,0,0]
    i=0
    while i<4:
        b[i]=a[i]
        i=i+1

    #-------------------------------------------------------------------
    # Legge sequenza da tastiera e la splitta nella lista c
    #-------------------------------------------------------------------
    d=raw_input("Codice? ")
    c=[0,0,0,0]
    i=0
    while i<4:
        c[i]=eval(d[i])
        i=i+1

    #-------------------------------------------------------------------
    # Calcola quanti giusti nella posizione giusta
    #-------------------------------------------------------------------
    neri=0
    i=0
    while i<4:
        if c[i]==b[i]:
            neri=neri+1
            c[i]=999
            b[i]=0
        i=i+1

    #-------------------------------------------------------------------
    # Calcola quanti rimanenti giusti ma nella posizione sbagliata
    #-------------------------------------------------------------------
    bianchi=0
    i=0
    while i<4:
        j=0
        while j<4:
            if c[i]==b[j]:
                bianchi=bianchi+1
                c[i]=999
                b[j]=0
            j=j+1
        i=i+1

    #-------------------------------------------------------------------
    # Scrive risultato
    #-------------------------------------------------------------------
    t=t+1
    print "Tentativo",t,"  Codice",d," NERI =",neri,"  BIANCHI =",bianchi
    if neri==4:
        break

print "ESATTOOOOO!!!!!!"



Seconda versione
Le iterazioni while sono state sostituite con for.

import random

a=[0,0,0,0]
b=[0,0,0,0]
c=[0,0,0,0]

for i in range(4):
    a[i]=random.randint(1,6)

while 1:

    neri=0
    bianchi=0

    for i in range(4):
        b[i]=a[i]

    d=raw_input("Tenta: ")
    for i in range(4):
        c[i]=eval(d[i])

    for i in range(4):
        if c[i]==b[i]:
            neri=neri+1
            c[i]=999
            b[i]=0

    for i in range(4):
        for j in range(4):
            if c[i]==b[j]:
                bianchi=bianchi+1
                b[j]=0

    print " "*15,"Codice",d,"  NERI =", \
          neri,"  BIANCHI =",bianchi

    if neri==4:
        print "ESATTOOOOO!!!!!! "
        break



Terza versione
Le iterazioni sulle liste sono state sostituite con la list comprehension. La copia degli elementi della lista a nella lista b è stata ridotta ad un semplice "affettamento" dell'intera lista a. I due cicli per il controllo bianchi/neri sono stati accorpati.

import random

a=[0]*4
b=[0]*4
c=[0]*4

a=[random.randint(1,6) for i in range(4)]

while True:

    neri=bianchi=0

    b=a[:]

    d=raw_input("Tenta: ")
    c=[int(d[i]) for i in range(4)]

    for i in range(4):
        if c[i]==b[i]:
            neri+=1
            b[i]=0
        else:
            for j in range(4):
                if c[i]==b[j] and b[j]!=c[j]:
                    bianchi+=1
                    b[j]=0

    print " "*15,"Codice",d,"  NERI =",neri," \
                           BIANCHI =",bianchi
    if neri==4:
        print "ESATTOOOOO!!!!!! "
        break



Quarta versione
Il controllo bianchi/neri è stato spostato in una funzione a parte (generalizzata per accettare codici di qualsiasi lunghezza) e non non è più necessaria una lista di copia. La lista passata al parametro t viene modificata, ma trattandosi del codice inserito da tastiera questo viene rinnovato ad ogni ciclo. Il risultato viene scritto usando i formattatori di stringa % a cui vengono sostituiti rispettivamente i valori presenti nella tupla finale.

import random

#--------------------------------------------- 

def confronta(c,t):
    neri=bianchi=0
    for i in range(len(c)):
        if c[i]==t[i]:
            neri+=1
            t[i]=0
        else:
            for j in range(len(c)):
                if c[i]==t[j] and t[j]!=c[j]:
                    bianchi+=1
                    t[j]=0
    return neri,bianchi

#--------------------------------------------- 

codice=[0]*4
tentativo=[0]*4
codice=[random.randint(1,6) for i in range(4)]
while True:
    neri=bianchi=0
    d=raw_input("Tenta: ")
    tentativo=[int(d[i]) for i in range(4)]
    neri,bianchi=confronta(codice,tentativo)
    print "%15s Codice=%4s NERI=%1s BIANCHI=%1s" % (" ",d,neri,bianchi)
    if neri==4:
        print "ESATTOOOOO!!!!!! "
        break

#---------------------------------------------