kamień papier nożyce

0

Witam, jestem raczkującym programista, przerabiam sobie aktualnie temat funkcji i po zdobyciu już jakiejś wiedzy chciałem sobie poćwiczyć pisząc jakiś prosty program, do głowy wpadł pomysł z grą kamień papier nożyce, zamieszczę tutaj kod jaki udało mi się wyskrobać i byłbym wdzięczny jak ktoś o większej wiedzy podpowie co by można było zmienić żeby kod był bardziej czytelny (dla mnie osobiście jest, aczkolwiek myślę że dużo można by tutaj jeszcze zmienić), bądź jak go można zmienić/skrócić

import random
import sys

kpn = ['kamień','papier','nożyce']

def play_again():
    answer = None
    while answer != 'y' or answer != 'n':
        if answer == 'n':
            print("Dziękuje za gre, zamykam program!")
            sys.exit()
        elif answer == 'y':
            wynik()
        answer = input("Czy chcesz zagrać jeszcze raz? y/n: ")


def comp_choice():
    cc = random.choice(kpn)
    return cc

def player_choice():
    pc = input("wybierz kamień[k], papier[p] lub nożycze[n] : ")
    while True:
        if pc == 'k':
            pc = 'kamień'
            break
        elif pc == 'p':
            pc = 'papier'
            break
        elif pc == 'n':
            pc = 'nożyce'
            break
        pc = input("wybierz jeszcze raz: kamień[k], papier[p] lub nożycze[n] : ")
    return pc

def wynik():
    cc = comp_choice()
    pc = player_choice()
    print('gracz : ', pc)
    print("komputer : ",cc)
    if cc == pc:
        print("remis")
    elif cc == 'kamień' and pc == 'nożyce':
        print('Wygrywa komputer')
    elif cc == 'kamień' and pc == 'papier':
        print("Wygrywa gracz")
    elif cc == 'papier' and pc == 'kamień':
        print("Wygrywa komputer")
    elif cc == 'papier' and pc == 'nożyce':
        print("Wygrywa gracz")
    elif cc == 'nożyce' and pc == 'papier':
        print("Wygrywa komputer")
    else:
        print("wygrywa gracz")

wynik()
play_again()
2

Pierwsza rzecz, którą możesz zrobić to wytłumacz po co zamieniasz p na papier itd? Przecież w funkcji wynik możesz posługiwać się jednoliterowymi nazwami.

6

Pierwsza i wielokrotnie wałkowana sprawa - nazwy zmiennych. Wiem, że może się to wydawać mało istotne przy takim małym programiku, ale lepiej od początku wyrabiać dobre nawyki. Zmienne cc czy pc za wiele nie mówią. Ja zamiast tego bym je nazwał opisowo, coś w stylu computerChoice = getComputerChoice(). Poza tym jesteś niekonsekwentny - raz nazywasz funkcje po angielsku, a potem walisz wynik() :P

Po drugie - drabinki if'ów są czymś, czego lepiej unikać.

Ja bym wydzielił całe sprawdzanie odpowiedzi do osobnej funkcji, ale najpierw w ogóle bym sprawdził coś, o czym chyba zapomniałeś - czyli remis. Jeśli obaj gracze wybiorą taką samą odpowiedź, to trzeba poinformować o tym, że mamy remis i nie ma sensu prowadzić dalszych sprawdzeń. Jeśli natomiast odpowiedzi są różne, to wywołujemy funkcję sprawdzającą, w której zamiast wielu IF dałbym konstrukcję typu SWITCH/CASE. Poniżej pseudokod (sam sobie to zapiszesz w Pythonie)

winner=komputer
switch computerChoice
case kamien:
  if (playerChoice==papier): winner=player 
case nozyce:
  if (playerChoice==kamien): winner=player
case papier:
  if (playerchoice==nozyce): winner=player

EDIT
zauważyłem, że na samym początku sprawdzenia wyniku masz uwzględniony remis, przepraszam i zwracam honor ;)

1

@warjatt11: Tak na szybko

  • dlaczego mieszasz polskie nazwy z angielskimi (pisz kod po angielsku)
  • nazywaj zmienne w zrozumiały sposób a nie cc czy pc
  • zastanów sie jak inaczej sprawdzić kto wygrał, gdybyś miał rozbudowaną wersję (paper rock scissors lizard spock) to miałbyś już całkiem pokaźną drabinkę if'ów
1

dzięki za uwagi, co to nazw zmiennych tutaj oczywiście widzę swój problem, aczkolwiek nie wiem czemu nad nimi nie popracowałem bardziej(dziękuje za uwagę) a co się tyczy if'ów to racja że średnio to wygląda lecz nie wpadłem na żaden pomysł jak inaczej zaimplementować wynik, próbowałem zrobić to z słownikiem ale nie wychodziło mi to w ogóle

0

No to teraz masz temat do zabawy - wprowadź nasze sugestie w życie i pokaż, co stworzyłeś :)

1

Wyskrobałem coś takiego, zamiast porównywać if'ami to zastąpiłem to słownikiem, nie będę oszukiwał że sam do tego doszedłem tylko znalazłem takie rozwiązanie w internecie, ale zrozumiałem jak ono działa(więc chyba dobre posunięcie?:)) więc nie jest to bezmyślne kopiuj/wklej

import random
import sys

rock_stone_scissors = ['kamień','papier','nożyce']

def play_again():
    answer = input("Czy chcesz zagrać jeszcze raz? y/n: ")
    while answer != 'y' or answer != 'n':
        if answer == 'n':
            print("Dziękuje za gre, zamykam program!")
            sys.exit()
        elif answer == 'y':
            victory()
        else:
            print("Nie ma takiej odpowiedzi")
        answer = input("Czy chcesz zagrać jeszcze raz? y/n: ")

def cpu_choice():
    getComputer_Choice = random.choice(rock_stone_scissors)
    return getComputer_Choice

def player_choice():
    getPlayer_Choice = input("wybierz kamień[k], papier[p] lub nożycze[n] : ")
    while True:
        if getPlayer_Choice == 'k':
            getPlayer_Choice = 'kamień'
            break
        elif getPlayer_Choice == 'p':
            getPlayer_Choice = 'papier'
            break
        elif getPlayer_Choice == 'n':
            getPlayer_Choice = 'nożyce'
            break
        getPlayer_Choice = input("wybierz jeszcze raz: kamień[k], papier[p] lub nożycze[n] : ")
    return getPlayer_Choice

def victory():
    computer_Choice = cpu_choice()
    player_Choice = player_choice()
    print('gracz : ', player_Choice)
    print("komputer : ",computer_Choice)
    if player_Choice == computer_Choice:
        print("remis")
    elif compare(player_Choice,computer_Choice):
        print("Wygrał gracz")
    else:
        print("Wygrał komputer")

def compare(playerChoice,cpuChoice):
    results = {('kamień','nożyce') : True,
               ('kamień','papier') : False,
               ('papier','kamień') : True,
               ('papier','nożyce') : False,
               ('nożyce','papier') : True,
               ('nożyce','kamień') : False}
    return playerChoice,cpuChoice

victory()
play_again()
0

znalazłem takie rozwiązanie w internecie, ale zrozumiałem jak ono działa(więc chyba dobre posunięcie?

Bardzo dobre. Obecnie jest tyle technologii, języków, frameworkow, że nieraz bardzo duża część pracy polega na szukaniu w necie i kopiowaniu. Jest nawet na to określenie SODD czyli Stack Overflow Driven Development ;) Nie chodzi o to, żeby wszystko wykuć na pałę, zresztą jest to nierealne, tylko żeby być zaradnym i umieć skutecznie znaleźć potrzebne informacje.

Twoim plusem jest to, że nie zrobiłeś bezmyślnego kopiuj-wklej, tylko załapałeś zasadę, czyli mamy tutaj podwójny sukces - uzyskałeś działająca apkę oraz się czegoś przy okazji nauczyłeś :)

1
def compare(playerChoice,cpuChoice):
    results = {('kamień','nożyce') : True,
               ('kamień','papier') : False,
               ('papier','kamień') : True,
               ('papier','nożyce') : False,
               ('nożyce','papier') : True,
               ('nożyce','kamień') : False}
    return playerChoice,cpuChoice

Yyyhhh, a nie tak?

def compare(playerChoice,cpuChoice):
    results = {('kamień','nożyce') : True,
               ('kamień','papier') : False,
               ('papier','kamień') : True,
               ('papier','nożyce') : False,
               ('nożyce','papier') : True,
               ('nożyce','kamień') : False}
    return results[(playerChoice,cpuChoice)]
0

a no prawda, przeanalizowałem kod i zgadza się, tak powinno być, dzięki za uwage

1

No to chyba nie do konca zrozumiales za pierwszym razem :D

1

I cyk

import random

class Item:
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def __str__(self):
        return self.name

    def __lt__(self, other):
        if (self.value, other.value) in ((0, 2), (2, 0)):
            return self.value > other.value
        return self.value < other.value

    def __eq__(self, other):
        return self.value == other.value

items = {
    'k': Item('kamień', 0),
    'p': Item('papier', 1),
    'n': Item('nożyce', 2)
}

while True:
    player_choice = input('Papier/kamień/nożyce: ').lower()
    player_item = items[player_choice[0]]
    computer_item = items[random.choice(list(items))]

    if player_item == computer_item:
        result_msg = 'Remis'
    elif player_item < computer_item:
        result_msg = 'Przegrałeś'
    else:
        result_msg = 'Wygrałeś'

    print('{}, komputer wybrał {}'.format(result_msg, computer_item))

    if input('Jeszcze raz [t/n]? ') not in ('t', 'T'):
        break

print('Dziękuję za grę!')    
1

Więc dobrze zmodyfikowałem kod i wygląda on następująco

import random
import sys

rock_stone_scissors = ['k','p','n']

def play_again():
    answer = input("Czy chcesz zagrać jeszcze raz? y/n : ")
    while answer != "y":
        if answer == 'n':
            print("Dziękuje za gre! Zamykam program")
            sys.exit()
        else:
            print("Nie można udzielić takiej odpowiedzi!")
            answer = input("Czy chcesz zagrać jeszcze raz? y/n : ")
    play()

def nameIT(ItemSymbol):
    if (ItemSymbol == 'k'): return 'kamień'
    if (ItemSymbol == 'p'): return 'papier'
    if (ItemSymbol == 'n'): return 'nożyce'

def play():
    player_choice = input("Wybierz kamień[k], papier[p] lub nożycze[n] : ")
    while player_choice != 'k' or 'p' or 'n':
        if player_choice == 'k' or 'p' or 'n':
            break
        player_choice = input("Wybierz jeszcze raz: kamień[k], papier[p] lub nożycze[n] : ")
    cpu_choice = random.choice(rock_stone_scissors)
    print('Gracz : ',nameIT(player_choice))
    print("Komputer : ",nameIT(cpu_choice))
    if nameIT(player_choice) == nameIT(cpu_choice):
        print("Remis")
    elif compare(player_choice,cpu_choice):
        print("Wygrał gracz")
    else:
        print("Wygrał komputer")
    play_again()

def compare(playerChoice,cpuChoice):
    results = {('k','n') : True,
               ('k','p') : False,
               ('p','k') : True,
               ('p','n') : False,
               ('n','p') : True,
               ('n','k') : False}
    return results [(playerChoice,cpuChoice)]

play()

Niestety poległem na pętli while, nie rozumiem dlaczego podczas wpisywania innej literki niż k,p,n nie spełnia warunku while tylko Od razu wywalą błąd porównania do słownika
rozchodzi się o linie od 23 do 27, jakieś sugestie?

2

while player_choice != 'k' or 'p' or 'n':

IMHO znaczy while (player_choice != 'k') or 'p' or 'n': - ergo zawsze true. W jezyku logiki masz tutaj p v q v r gdzie dla kazdego wartosciowania sigma, sigma(q) == true

Sprobuj player_choice not in ['k', 'p', 'n']
Update: player_choice not in rock_stone_scissors

I nie wiem po co ten if w whilu...

0

Program skończony, dodałem do niego jeszcze punktacje. Jestem usatysfakcjonowany jego działaniem.

import random
import sys

player_score = 0
cpu_score = 0
rock_stone_scissors = ['k','p','n']

def play_again():
    answer = input("Czy chcesz zagrać jeszcze raz? y/n : ")
    while answer != "y":
        if answer == 'n':
            print("Dziękuje za gre! Zamykam program")
            print("Liczba punktów gracza: ",player_score)
            print("Liczba punktów komputera: ",cpu_score)
            if player_score > cpu_score:
                print("Wygrywa gracz")
            else:
                print('Wygrywa komputer')
            sys.exit()
        else:
            print("Nie można udzielić takiej odpowiedzi!")
            answer = input("Czy chcesz zagrać jeszcze raz? y/n : ")
    play()

def nameIT(ItemSymbol):
    if (ItemSymbol == 'k'): return 'kamień'
    if (ItemSymbol == 'p'): return 'papier'
    if (ItemSymbol == 'n'): return 'nożyce'

def play():
    global player_score, cpu_score
    player_choice = input("Wybierz kamień[k], papier[p] lub nożycze[n] : ")
    while player_choice not in ['k', 'p', 'n']:
        player_choice = input("Wybierz jeszcze raz: kamień[k], papier[p] lub nożycze[n] : ")
    cpu_choice = random.choice(rock_stone_scissors)
    print('Gracz : ',nameIT(player_choice))
    print("Komputer : ",nameIT(cpu_choice))
    if nameIT(player_choice) == nameIT(cpu_choice):
        print("Remis")
    elif compare(player_choice,cpu_choice):
        print("Wygrał gracz")
        player_score +=1
    else:
        print("Wygrał komputer")
        cpu_score +=1
    play_again()

def compare(playerChoice,cpuChoice):
    results = {('k','n') : True,
               ('k','p') : False,
               ('p','k') : True,
               ('p','n') : False,
               ('n','p') : True,
               ('n','k') : False}
    return results [(playerChoice,cpuChoice)]

play()
0

Zrobił by ktoś w windows form ? taką gre ?

0
DawciOO napisał(a):

Zrobił by ktoś w windows form ? taką gre ?

Mogę zrobić za 199zł

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