PDA

View Full Version : [Python] Piccolo programma morra cinese (principiante)


draco97
02-01-2020, 22:08
Salve a tutti, mi sono avvicinato alla programmazione in Python da circa una settimana... e per ora sto studiando qualche base come i cicli while for e qualche nozione sulle variabili e i loro tipi. Siccome volevo iniziare a testarmi e provare a scrivere qualche piccolissimo programma con ciò che ho imparato, ho deciso di provare a scrivere una piccola morra cinese molto base, che da semplicemente un valore casuale alla mossa dell'avversario e decreta il giocatore che ha vinto:


print ('Benvenuto alla morra cinese di Alessandro.')
from random import randint
giocatore = input ('scegli carta, forbice o sasso ')
if giocatore != 'carta' and giocatore != 'sasso' and giocatore != 'forbice':
print ('errore') # in caso di errore, far ripartire il ciclo da capo
else:
print ('hai scelto', giocatore)
computer = randint (0,2)
if computer == 0: computer = 'sasso'
elif computer == 1: computer = 'forbice'
else:
computer = 'carta'
print('il tuo avversario ha scelto ', computer)
if giocatore == 'carta' and computer == 'forbice' or giocatore == 'forbice' and computer == 'carta' or giocatore == 'sasso' and computer == 'forbice':
print (' complimenti, hai vinto! ')
elif giocatore == 'carta' and computer == 'carta' or giocatore == 'forbice' and computer == 'forbice' or giocatore == 'sasso' and computer == 'sasso':
print (' è un pareggio!')
else:
print (' Mi spiace, hai perso!')

# fine della partita, chiedere se iniziare un'altra partita e quindi ricominciare il ciclo da capo


I problemi che non riesco a risolvere sono essenzialmente due:
- vorrei che, nel caso in cui l'immissione del valore della risposta del giocatore sia errato, il ciclo oltre a dare errore si debba interrompere e/o ripartire senza proseguire oltre.
- creare, una volta terminata la partita, un ulteriore pezzo di codice nel quale se la risposta equivalga a si, il ciclo ricominci da capo consentendo di effettuare un'altra partita.
Ho provato ad inserire un while a inizio programma. Tuttavia così facendo risolve soltanto un pezzo di codice (if, ed else iniziali) e non va oltre la scelta effettuata dal giocatore. Ho provato ad inserire più cicli per ogni if else impostando un valore true o false ad una variabile all'inizio del ciclo, ma anche in questo caso il risultato è stato insoddisfacente visto che il ciclo non ripartiva effettivamente se andavo a digitare un input si, ma invece il programma terminava.
Dove sbaglio? Sono effettivamente inesperto e alle prime armi, ma sono stato ore a provare quantomeno a far ripartire il ciclo una volta finita la partita. Mi serve sapere qualche nozione avanzata per poter fare ciò, oppure è sufficiente quello che ho imparato fin'ora?
Grazie a tutti quelli che mi risponderanno :)

DoctorT
03-01-2020, 09:36
l'idea di mettere un ciclo while è giusta, però il tuo codice sembra un pochino confuso mentre il python ha delle funzionalità ottime che ti permettono di scrivere un codice più elegante e comprensibile. Ad esempio per transformare in stringa la risposta random del computer è più semplice usare una lista.
Ti allego una mia implementazione che risolve il problema n.2, per gestire l'errore di input forse si potrebbe usare mettere la risposta dell'utente dentro un altro ciclo while ma la cosa si complica ... vediamo se arriva qualcuno con una rispost più elegante.


from random import randint

segno = ["carta","forbice","sasso"]
continua = "s";

print ('Benvenuto alla morra cinese di Alessandro.')
while continua =="s":
giocatore = input ('scegli carta, forbice o sasso ')
if giocatore != 'carta' and giocatore != 'sasso' and giocatore != 'forbice':
print('errore') # in caso di errore, far ripartire il ciclo da capo
else:
print ('hai scelto', giocatore)
computer = segno[randint(0,2)] # il computer scegli il segno da giocare
print("il tuo avversario ha scelto", computer)
if giocatore == 'carta' and computer == 'forbice' or giocatore == 'forbice' and computer == 'carta' or giocatore == 'sasso' and computer == 'forbice':
print (' complimenti, hai vinto! ')
elif giocatore == computer:
print (' è un pareggio!')
else:
print (' Mi spiace, hai perso!')
continua = input ("vuoi continuare ? (s/n) ") # chiedi se coninciare un altra partita

DoctorT
03-01-2020, 10:00
aggiunta la gestione dell'errore di input ... ho usato lo statement break e l'operatore in delle liste, forse non li hai ancora studiati ma rendono tutto un pò più chiaro


from random import randint

segno = ["carta","forbice","sasso"]
continua = "s";

print ('Benvenuto alla morra cinese di Alessandro.')
while continua =="s":
while True:
giocatore = input ('scegli carta, forbice o sasso ')
if giocatore in segno:
break
else:
print ("errore ripeti la scelta ")
print ('hai scelto ', giocatore)
computer = segno[randint(0,2)] # il computer scegli il segno da giocare
print("il tuo avversario ha scelto", computer)
if giocatore == 'carta' and computer == 'forbice' or giocatore == 'forbice' and computer == 'carta' or giocatore == 'sasso' and computer == 'forbice':
print (' complimenti, hai vinto! ')
elif giocatore == computer:
print (' è un pareggio!')
else:
print (' Mi spiace, hai perso!')
continua = input ("vuoi continuare ? (s/n) ") # chiedi se coninciare un altra partita

draco97
03-01-2020, 15:58
Aaah ecco. Sapevo che stavo sbagliando la forma e l'ordine in cui scrivevo il programma, sinceramente non penso che ci sarei mai arrivato da solo. Gli operatori (in, in particolare) non li ho ancora studiati, ma spero di arrivarci presto...
Quindi guardando il secondo programma che hai scritto: il ciclo while si interrompe se metto un valore corretto per poi far proseguire la seconda parte del programma, mentre fa ricominciare il primo ciclo da capo se sbaglio giusto?

DoctorT
04-01-2020, 12:51
Aaah ecco. Sapevo che stavo sbagliando la forma e l'ordine in cui scrivevo il programma, sinceramente non penso che ci sarei mai arrivato da solo. Gli operatori (in, in particolare) non li ho ancora studiati, ma spero di arrivarci presto...
Quindi guardando il secondo programma che hai scritto: il ciclo while si interrompe se metto un valore corretto per poi far proseguire la seconda parte del programma, mentre fa ricominciare il primo ciclo da capo se sbaglio giusto?

si esatto il ciclo si interrompe quando immetti un valore corretto.

draco97
05-01-2020, 13:39
si esatto il ciclo si interrompe quando immetti un valore corretto.

Perfetto, grazie mille gentilissimo :)