Gra kamień, papier i nożyce z komputerem

Gra kamień, papier i nożyce z komputerem
PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 2
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ć.

Kopiuj
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('')```
CM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
2

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

Kopiuj
                    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?

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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:

Kopiuj
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.

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

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

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8487
1

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

Kopiuj
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

Kopiuj
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ń

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

Podbijam :P

Kopiuj
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]}")

Alley Cat
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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")
RS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
Pinokio napisał(a):

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ć. Oczywiście możesz uprościć tę grę w kodzie. Wszystko przychodzi z doświadczeniem. Na początku też miałem kody na 1000 linii, choć dało się pisać na 200 linii. Sam pracuję nad różnymi grami hazardowymi. Lubię też grać na pieniadze, znalazłem do tego https://nowe.polskiekasynos.com/. Poszukaj wskazówek, jak to zrobić tutaj, w formularzu. W ten sposób szybciej dowiesz się, co jest czym.

Kopiuj
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('')```

Zamiast testować wybory użytkownika i komputera za pomocą wielu bloków if, można zastosować prostsze, bardziej zwięzłe podejście.
Podziel kod na funkcje, aby uniknąć powtórzeń kodu i ułatwić testowanie i konserwację!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.