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.
Codice:
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