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