Gra kamień, papier i nożyce z komputerem

0

Hej, od około tygodnia uczę się pythona, napisałem prostą gierkę w papier, kamień i nożyce. Polega na tym, że komputer losuje liczbę, a my staramy się z nim wygrać. Gra jest do 3 punktów. Co myślicie o takim kodzie? Pewnie dałoby się to jeszcze bardziej uprościć.

from random import randint
from time import sleep


# listy
lista = {1: 'papier', 2:'kamien', 3:'nozyce'}
choices = ['papier', 'kamien', 'nozyce']

# nagłówek
print('Papier, kamien czy nozyce?')

# zmienne punktów użyt. i komputera
points_user = 0
points_computer = 0


# funkcja zliczania punktów
def punkty(points_user, points_computer):
    print('Twoje punkty: ', points_user)
    print('Punkty komputera: ', points_computer)


# GRA
while points_user != 3 and points_computer != 3:
        x = randint(1, 3)
        user_choice = True
        while user_choice:
            user = input('Podaj swój wybór: ')
            if user in choices:
                user_choice = False
            #
            #  PAPIER
            #
            if user == 'papier':
                if x == 1:
                    sleep(1)
                    punkty(points_user, points_computer)
                    print('\n')
                    print('Remis! Wybraliśmy to samo')
                    print('\n')
                if x == 2:
                    sleep(1)
                    points_user = points_user + 1
                    punkty(points_user, points_computer)
                    print('\n')
                    print(f'O nie! Przegrałem, mój wybór to {lista[x]}')
                    print('\n')
                if x == 3:
                    sleep(1)
                    points_computer = points_computer + 1
                    punkty(points_user, points_computer)
                    print('\n')
                    print(f'Haa! Wygrałem! Mój wybór to {lista[x]}')
                    print('\n')
            #
            #  KAMIEN
            #
            if user == 'kamien':
                if x == 2:
                    sleep(1)
                    punkty(points_user, points_computer)
                    print('\n')
                    print('Remis! Wybraliśmy to samo')
                    print('\n')
                if x == 3:
                    sleep(1)
                    points_user = points_user + 1
                    punkty(points_user, points_computer)
                    print('\n')
                    print(f'O nie! Przegrałem, mój wybór to {lista[x]}')
                    print('\n')
                if x == 1:
                    sleep(1)
                    points_computer = points_computer + 1
                    punkty(points_user, points_computer)
                    print('\n')
                    print(f'Haa! Wygrałem! Mój wybór to {lista[x]}')
                    print('\n')
            #
            #  NOZYCE
            #
            if user == 'nozyce':
                if x == 3:
                    sleep(1)
                    punkty(points_user, points_computer)
                    print('\n')
                    print('Remis! Wybraliśmy to samo')
                    print('\n')
                if x == 1:
                    sleep(1)
                    points_user = points_user + 1
                    punkty(points_user, points_computer)
                    print('\n')
                    print(f'O nie! Przegrałem, mój wybór to {lista[x]}')
                    print('\n')
                if x == 2:
                    sleep(1)
                    points_computer = points_computer + 1
                    punkty(points_user, points_computer)
                    print('\n')
                    print(f'Haa! Wygrałem! Mój wybór to {lista[x]}')
                    print('\n')


# WYŚWIETLENIE WYNIKU
if points_user == 3:
    print('BRAWO WYGRAŁEŚ!')
    print('')
else:
    print('Niestety komputer wygrał')
    print('')```
2

Myśle że masz fajną bazę do nauki na tej gierce. Pomyśl jak możesz uprościć ten kawałek kodu:

                    print('\n')
                    print(f'Haa! Wygrałem! Mój wybór to {lista[x]}')
                    print('\n')

Już prostą funkcje do wyświetlania punktów zrobiłeś to może do tego kto wygrał też się da?

3

Strasznie przekombinowany kod. Niepotrzebne zagnieżdżenia pętli. Ogólnie można zrobić to bez użycia ani jednego ifa. Wystarczy użyć słowników, co znacząco przyspieszy i skróci kod.
Mała podpowiedź: Zrób sobie słownik z logiką przypisywania pukntów np:

rules = {
    "kamien":{
        "kamien": 0,
        "papier": 0,
        "nozyce": 1
    },
    "papier":{
        "kamien": 1,
        "papier": 0,
        "nozyce": 0
    },
    "nozyce":{
        "kamien": 0,
        "papier": 1,
        "nozyce": 0
    }
}

Następnie wystarczy podpiąć pod to input użytkownika oraz pc :)

To samo tyczy się samych graczy. Można wsadzić ich w słownik i jedynie inkrementować wartości. Znowu bez użycia ifa.

players = {
    "pc": 0,
    "user": 0
}

Resztę programu można zawrzeć 5-6 linijkach.

1

Też spróbowałem i takie coś mi się wykluło:

from random import choice
choices = ["kamien", "nozyce", "papier"]

while True:
	cpu_choice = choice(choices)
	user_choice = input(f"ja wybrałem {cpu_choice}, a ty? ")
	if not user_choice in choices:
		print('zle')
		continue;		
	cpu_idx = choices.index(cpu_choice)
	cpu_win_choice = choices[(cpu_idx + 1) % len(choices)]
	user_win_choice = choices[(cpu_idx - 1) % len(choices)]  
	if cpu_choice == user_choice:
		print("remis")
	elif user_choice == cpu_win_choice:
		print(f"haha, wygrałem")
	elif user_choice == user_win_choice:
		print(f"ojejku, przegrałem")		

ogólnie chodzi o to, że w tej liście

choices = ["kamien", "nozyce", "papier"]

każdy następny element to element przegrany.
zakładając cykliczność (osiągniętą przez dzielenie modulo: % len(choices))

kamien -> nozyce
nożyce -> papier
papier -> (koniec listy, więc idziemy do pierwszego elementu) kamień

1

Podbijam :P

import random


rules = {
    "kamien":{
        "kamien": 0,
        "papier": 0,
        "nozyce": 1
    },
    "papier":{
        "kamien": 1,
        "papier": 0,
        "nozyce": 0
    },
    "nozyce":{
        "kamien": 0,
        "papier": 1,
        "nozyce": 0
    }
}
players = {
    "pc": 0,
    "user": 0
}

while not any(item[1] == 3 for item in players.items()):
    player_choice = input("your choice: ")
    pc_choice = random.choice(("kamien", "papier", "nozyce"))
    players["user"] += rules[player_choice][pc_choice]
    players["pc"] += rules[pc_choice][player_choice]

print(f"wygral: {max(players.items(), key=lambda x: x[1])[0]}")

0

Nie rozumiem po co Wam ten random jak można za każdym razem wygrać

from time import sleep
from sys import exit

answers = {
        "papier": "nozyce",
        "kamien": "papier",
        "nozyce": "kamien",
}

for i in range(3):
        user = input("\nPodaj swój wybór: ")
        ans = answers.get(user, "Python")
        sleep(1)
        print(f"\nHaa! Wygrałem! Mój wybór to {ans}.")

print("\nTwoje punkty: 0\nPunkty komputera: 3")

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