Wątek przeniesiony 2022-09-17 15:30 z Python przez Riddle.

Gra "Kamień, Papier, Nożyce"

0

Witam, od dwóch tygodniu bawię się z programowaniem i chciałbym załączyć kod do oceny. Zdaje sobie sprawę, że jest dużo do poprawy, ale program działa. Pytanie jak można go zapisać prościej, lub zastąpić te drabinki if'ów.

import random

sps = ['Kamień', 'Papier', 'Nożyce']
computerChoice = random.choice(sps)

computerPoints = 0
playerPoints = 0

print("****** KAMIEŃ PAPIER NOŻYCE ****** \n         DO 5 ZWYCIĘSTW")

playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')

while True:

    computerChoice = random.choice(sps)

    if playerChoice == 'k':
        playerChoice = 'Kamień'
        print(computerChoice + ' VS ' + playerChoice)
        if computerChoice == 'Kamień': 
            print("Remis")
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')
        elif computerChoice == 'Papier':
            computerPoints += 1
            if playerPoints == 5 or computerPoints == 5:
                print(computerPoints, ":", playerPoints)
                print('Dzięki za grę! Koniec')
                break
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')
        elif computerChoice == 'Nożyce':
            playerPoints += 1
            if playerPoints == 5 or computerPoints == 5:
                print(computerPoints, ":", playerPoints)
                print('Dzięki za grę! Koniec')
                break
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')

        
        

    elif playerChoice == 'p':
        playerChoice = 'Papier'
        print(computerChoice + ' VS ' + playerChoice)
        if computerChoice == 'Papier':
            print('Remis')
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')
        elif computerChoice == 'Kamień':
            playerPoints += 1
            if playerPoints == 5 or computerPoints == 5:
                print(computerPoints, ":", playerPoints)
                print('Dzięki za grę! Koniec')
                break
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')
        elif computerChoice == 'Nożyce':
            computerPoints += 1
            if playerPoints == 5 or computerPoints == 5:
                print(computerPoints, ":", playerPoints)
                print('Dzięki za grę! Koniec')
                break
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')

            
             
    elif playerChoice == 'n':
        playerChoice = 'Nożyce'
        print(computerChoice + ' VS ' + playerChoice)
        if computerChoice == 'Nożyce':
            print('Remis')
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')
        elif computerChoice == "Kamień":
            computerPoints += 1
            if playerPoints == 5 or computerPoints == 5:
                print(computerPoints, ":", playerPoints)
                print('Dzięki za grę! Koniec')
                break
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')
        elif computerChoice == 'Papier':
            playerPoints += 1
            if playerPoints == 5 or computerPoints == 5:
                print(computerPoints, ":", playerPoints)
                print('Dzięki za grę! Koniec')
                break
            print(computerPoints, ":", playerPoints)
            playerChoice = input('Wybierz: k = Kamień, p = Papier, n = Nożyce : ')
                   
    else:
        playerChoice = input('Niepoawidłowa wartość!(k/p/n): ')
        continue

Z góry dzięki za pomoc! :D

60

Zacznij rozbijać logikę na pojedyncze funkcje, bo powyższego tworu nawet nie chce się czytać.

4

Jak wyżej, a potem dopisz jakieś testy, bo na razie nie wiadomo czy ten kod działa.:P Zapoznaj się też z:
https://peps.python.org/pep-0008/

1

Może sam oceń:

import random

data={
     'k':{'value':0,'name':'Kameń'},  #1
     'n':{'value':1,'name':'Nożyce'}, #2
     'p':{'value':2,'name':'Paper'},  #0
}

playTill=5
computerPoints=playerPoints=0

while True:
    prompt='Wybierz: '
    for key in data:
        prompt=prompt+key+'='+data[key]['name']+' '
    playerChoice=input(prompt+' : ')
    if playerChoice in data:
        computerChoice=random.choice(list(data.keys()))
        print('gracz:'+data[playerChoice]['name']+' VS komputer:'+data[computerChoice]['name'])
        playerValue=data[playerChoice]['value']
        computerValue=data[computerChoice]['value']
        if ((playerValue+1)%3)==computerValue:
            playerPoints+=1
        elif ((computerValue+1)%3)==playerValue:
            computerPoints+=1
        print('Wynik: gracz:'+str(playerPoints)+' VS komputer:'+str(computerPoints))
        if playerPoints>=playTill:
                print('Wygraleś')
                break
        elif computerPoints>=playTill:
                print('Przegraleś')
                break
    else:
        print('Nie możesz wybrać: '+playerChoice)
3

Polecam również Pythona 3.10, zamiast tej ifologii masz ładne match - case (odpowiednik switcha z C).

0

Poniżej kod w chomiku (mój eksperymentalny język), tylko jedna gra (bez iteracji):

#!/usr/local/bin/chomik

type opcja = {kamien, papier, nozyce}, osoba = {nikt, komputer, czlowiek};
expand(1);

execute <create new input random enum stream "opcja">;
let variable my opcja generator index = <the created stream index>;

execute <print "wybierz: k-kamien p-papier n-nozyce">;

variable (X:osoba) punkty: integer;
let variable (X:osoba) punkty = value integer 0;

variable (X:osoba) wybor:opcja;

variable mapowanie litera na opcje (X:string):opcja;

let variable mapowanie litera na opcje "k"=value opcja kamien;
let variable mapowanie litera na opcje "p"=value opcja papier;
let variable mapowanie litera na opcje "n"=value opcja nozyce;

variable kto wygral (RUCH_KOMPUTERA:opcja) (RUCH_CZLOWIEKA:opcja):osoba;
let variable kto wygral (RUCH:opcja) (RUCH:opcja)=value osoba nikt;
let variable kto wygral kamien papier=value osoba czlowiek;
let variable kto wygral papier kamien=value osoba komputer;
let variable kto wygral kamien nozyce=value osoba komputer;
let variable kto wygral nozyce kamien=value osoba czlowiek;
let variable kto wygral papier nozyce=value osoba czlowiek;
let variable kto wygral nozyce papier=value osoba komputer;

let variable the read from stream source stream index = <my opcja generator index>;
execute <read from stream "opcja">;
let variable komputer wybor= <the read from stream result "opcja">;    


let variable the read from stream source stream index = value integer 2;    # standardowe wejscie
execute <read from stream "string">;
let variable czlowiek wybor= <mapowanie litera na opcje <the read from stream result "string">>;
execute <print "wybrales" <the read from stream result "string"> ", czyli " <czlowiek wybor>>;


execute <print "wybor komputera" <komputer wybor>>;

let variable <kto wygral <komputer wybor> <czlowiek wybor>> punkty=value integer 1;

execute <print "wygral" <kto wygral <komputer wybor> <czlowiek wybor>>>;

Chomik jest dostępny tu link, do kompilacji potrzeba flexa, bisona i np. g++. Ja go kompiluję g++ 11.2.0.

1 użytkowników online, w tym zalogowanych: 0, gości: 1