import random
import time
color = ('CZERWONY','ZIELONY','NIEBIESKI','ŻÓŁTY')
rank = ('0','1','2','3','4','5','6','7','8','9','Pominięcie','Odwrócenie','Dobierz +2','Dobierz +4','Dzika')
ctype = {'0':'number','1':'number','2':'number','3':'number','4':'number','5':'number','6':'number',
'7':'number','8':'number','9':'number','Pominięcie':'action','Odwrócenie':'action','Dobierz +2':'action',
'Dobierz +4':'action_nocolor','Dzika':'action_nocolor'}
class Card:
#inicjacja kart na podstawie wartości ze słowników
def __init__(self, color, rank):
self.rank = rank
if ctype[rank] == 'number':
self.color = color
self.cardtype = 'number'
elif ctype[rank] == 'action':
self.color = color
self.cardtype = 'action'
else:
self.color = None
self.cardtype = 'action_nocolor'
` #zwrócenie opisu karty w formie tekstu
def __str__(self):
if self.color == None:
return self.rank
else:
return self.color + " " + self.rank
class Deck:
#inicjowanie nowej talii kart
def __init__(self):
self.deck = []
for clr in color:
for ran in rank:
if ctype[ran] != 'action_nocolor':
self.deck.append(Card(clr, ran))
self.deck.append(Card(clr, ran))
else:
self.deck.append(Card(clr, ran))
#zwrócenie talii kart na stół
def __str__(self):
deck_comp = ''
for card in self.deck:
deck_comp += '\n' + card.__str__()
return 'Na stole są ' + deck_comp
#tasowanie kart
def shuffle(self):
random.shuffle(self.deck)
#rozdanie kart
def deal(self):
return self.deck.pop()
class Hand:
#inicjacja nowej ręki gracza przechowującą karty
def __init__(self):
self.cards = []
self.cardsstr = []
self.number_cards = 0
self.action_cards = 0
#dodawanie karti do ręki gracza
def add_card(self, card):
self.cards.append(card)
self.cardsstr.append(str(card))
if card.cardtype == 'number':
self.number_cards += 1
else:
self.action_cards += 1
#usowanie karty z ręki graca
def remove_card(self, place):
self.cardsstr.pop(place - 1)
return self.cards.pop(place - 1)
#wyświetlenie wszystkich kart w ręce
def cards_in_hand(self):
for i in range(len(self.cardsstr)):
print(f' {i + 1}.{self.cardsstr[i]}')
#zwraca określoną kartę z ręki gracza
def single_card(self, place):
return self.cards[place - 1]
#zwracanie liczby kart w ręce gracza
def no_of_cards(self):
return len(self.cards)
#wybór gracza który zaczyna
def choose_first():
if random.randint(0,1)==0:
return player_nick
else:
return 'Pc'
#sprawdzenie karty gracza z kartą na stole
def single_card_check(top_card,card):
if card.color==top_card.color or top_card.rank==card.rank or card.cardtype=='action_nocolor':
return True
else:
return False
#PC
#sprawdzene czy karta pc jest wlasciwa
def full_hand_check(hand,top_card):
for c in hand.cards:
if c.color==top_card.color or c.rank == top_card.rank or c.cardtype=='action_nocolor':
return hand.remove_card(hand.cardsstr.index(str(c))+1)
else:
return 'no card'
#sprawdzenie kto wygral
def win_check(hand):
if len(hand.cards)==0:
return True
else:
return False
#sprafdzenie ostatnie jkarty
def last_card_check(hand):
for c in hand.cards:
if c.cardtype!='number':
return True
else:
return False
#Pętla gry
while True:
player_nick = input("Podaj swój nick: ")
print(player_nick, 'Witaj w UNO! Pozbądź się wszystkich kart aby wygrać')
deck = Deck()
deck.shuffle()
player_hand = Hand()
for i in range(7):
player_hand.add_card(deck.deal())
pc_hand = Hand()
for i in range(7):
pc_hand.add_card(deck.deal())
top_card = deck.deal()
if top_card.cardtype != 'number':
while top_card.cardtype != 'number':
top_card = deck.deal()
print('\nZaczynająca karta to {}'.format(top_card))
time.sleep(1)
playing = True
turn = choose_first()
print(turn + ' zaczyna')
while playing:
if turn == player_nick:
print('\nKarta na górze to: ' + str(top_card))
print('Twoje karty: ')
player_hand.cards_in_hand()
if player_hand.no_of_cards() == 1:
if last_card_check(player_hand):
print('Ostatnia karta nie może być kartą akcji \nDostajesz jedną karte ze stołu')
player_hand.add_card(deck.deal())
print('Twoje karty: ')
player_hand.cards_in_hand()
choice = input("\nRzuć lub dobierz kartę? (r/d): ")
if choice == 'r':
pos = int(input('Podaj numer karty: '))
temp_card = player_hand.single_card(pos)
if single_card_check(top_card, temp_card):
if temp_card.cardtype == 'number':
top_card = player_hand.remove_card(pos)
turn = 'Pc'
else:
if temp_card.rank == 'Pominięcie':
turn = player_nick
top_card = player_hand.remove_card(pos)
elif temp_card.rank == 'Odwrócenie':
turn = player_nick
top_card = player_hand.remove_card(pos)
elif temp_card.rank == 'Dobierz +2':
pc_hand.add_card(deck.deal())
pc_hand.add_card(deck.deal())
top_card = player_hand.remove_card(pos)
turn = player_nick
elif temp_card.rank == 'Dobierz +4':
for i in range(4):
pc_hand.add_card(deck.deal())
top_card = player_hand.remove_card(pos)
draw4color = input('Zmień kolor na (dużymi literami): ')
if draw4color != draw4color.upper():
draw4color = draw4color.upper()
top_card.color = draw4color
turn = player_nick
elif temp_card.rank == 'Dzika':
top_card = player_hand.remove_card(pos)
wildcolor = input('Zmień kolor na (dużymi literami): ')
if wildcolor != wildcolor.upper():
wildcolor = wildcolor.upper()
top_card.color = wildcolor
turn = 'Pc'
else:
print('Ta karta nie może być użyta')
elif choice == 'd':
temp_card = deck.deal()
print('Masz: ' + str(temp_card))
time.sleep(1)
if single_card_check(top_card, temp_card):
player_hand.add_card(temp_card)
else:
print('Nie możesz użyć tej karty')
player_hand.add_card(temp_card)
turn = 'Pc'
if win_check(player_hand):
print('\n',player_nick,'Wygrał/a!!')
playing = False
break
if turn == 'Pc':
if pc_hand.no_of_cards() == 1:
if last_card_check(pc_hand):
time.sleep(1)
print('Dobieranie karty dla PC')
pc_hand.add_card(deck.deal())
temp_card = full_hand_check(pc_hand, top_card)
time.sleep(1)
if temp_card != 'no card':
print(f'\nPC zrzuca się z: {temp_card}')
time.sleep(1)
if temp_card.cardtype == 'number':
top_card = temp_card
turn = player_nick
else:
if temp_card.rank == 'Pominięcie':
turn = 'Pc'
top_card = temp_card
elif temp_card.rank == 'Odwrócnie':
turn = 'Pc'
top_card = temp_card
elif temp_card.rank == 'Dobierz +2':
player_hand.add_card(deck.deal())
player_hand.add_card(deck.deal())
top_card = temp_card
turn = 'Pc'
elif temp_card.rank == 'Dobierz +4':
for i in range(4):
player_hand.add_card(deck.deal())
top_card = temp_card
draw4color = pc_hand.cards[0].color
print('Kolor zmieniony na', draw4color)
top_card.color = draw4color
turn = 'Pc'
elif temp_card.rank == 'Dzika':
top_card = temp_card
wildcolor = pc_hand.cards[0].color
print("Kolor zmieniony na", wildcolor)
top_card.color = wildcolor
turn = player_nick
else:
print('\nPC dobiera karte ze stołu')
time.sleep(1)
temp_card = deck.deal()
if single_card_check(top_card, temp_card):
print(f'PC zrzuca się z: {temp_card}')
time.sleep(1)
if temp_card.cardtype == 'number':
top_card = temp_card
turn = player_nick
else:
if temp_card.rank == 'Pominięcie':
turn = 'Pc'
top_card = temp_card
elif temp_card.rank == 'Odwrócenie':
turn = 'Pc'
top_card = temp_card
elif temp_card.rank == 'Dobierz +2':
player_hand.add_card(deck.deal())
player_hand.add_card(deck.deal())
top_card = temp_card
turn = 'Pc'
elif temp_card.rank == 'Dobierz +4':
for i in range(4):
player_hand.add_card(deck.deal())
top_card = temp_card
draw4color = pc_hand.cards[0].color
print('Kolor zmienia się na', draw4color)
top_card.color = draw4color
turn = 'Pc'
elif temp_card.rank == 'Dzika':
top_card = temp_card
wildcolor = pc_hand.cards[0].color
print('Kolor zmienia się na', wildcolor)
top_card.color = wildcolor
turn = player_nick
else:
print('PC nie ma pasującej karty')
time.sleep(1)
pc_hand.add_card(temp_card)
turn = player_nick
print('\nPC zostało {} kart'.format(pc_hand.no_of_cards()))
time.sleep(1)
if win_check(pc_hand):
print('\nPC WYGRAŁ!!')
playing = False
new_game = input('Chesz zagrać jeszcze raz? (t/n)')
if new_game == 't':
continue
else:
print('\nThanks for playing!!')
break