Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Donald Quick
- #Cptr 215 - Lab13
- from unoCard import UnoCard
- #from unoPlayer import UnoPlayer
- import random
- from tkinter import ttk
- import tkinter as tk
- import tkinter.messagebox as messagebox
- class UnoPlayer:
- def __init__(self):
- self.hand = []
- def __str__(self):
- #return cards in hand
- return f'{self.hand}'
- def __repr__(self):
- return 'UnoPlayer()'
- def __add__(self, card):
- self.hand.append(card)
- def remove(self, card):
- self.hand.remove(card)
- class gameWindow(tk.Frame):
- def __init__(self, parent, players):
- tk.Frame.__init__(self, parent)
- self.parent = parent
- self.buttons = []
- self.column = 0
- self.turnLabel = ttk.Label(self, text=f"Player 1 turn")
- self.turnLabel.grid(row=1, column=1)
- self.currentCardLabel = ttk.Label(self, text='Current card')
- self.currentCardFrame = ttk.Frame(self)
- self.currentCardLabel.grid(row=2, column=1)
- self.currentCardFrame.grid(row=3, column=1)
- cardLabel = ttk.Label(self, text="Cards in your hand")
- cardLabel.grid(row=4, column=1)
- self.buttonFrame = ttk.Frame(self)
- self.buttonFrame.grid(row=5, column=1)
- self.players = players
- self.deck = create_deck()
- self.currentCard = self.drawCard(self.deck)
- self.currentPlayer = self.players[0]
- self.passButton = tk.Button(self, text='Skip your turn', command=lambda: self.nextTurn())
- self.passButton.grid(row=6, column=1)
- self.changeCurrentCard(self.currentCard)
- for i in range(len(self.players)):
- self.initHands(players[i])
- self.generateCardButtons(self.currentPlayer.hand)
- def initHands(self, player): #init multi hands - pass in players
- for i in range(7):
- player + (self.drawCard(self.deck))
- def generateCardButtons(self, range):
- if self.buttons != []:
- self.clearButtons(range)
- else:
- for card in range:
- cardButton = tk.Button(self.buttonFrame, text=str(card), fg=card.color, bg='White', width=10,
- command=lambda currentCard=card: self.buttonAction(currentCard))
- self.buttons.append(cardButton)
- cardButton.grid(row=0, column=self.column, sticky='ew')
- self.column += 1
- def clearButtons(self, passthrough):
- for i in self.buttons:
- i.destroy()
- self.buttons.remove(i)
- self.generateCardButtons(passthrough)
- def buttonAction(self, card):
- #Check for wild
- if card.playedOn(self.currentCard):
- self.currentPlayer.remove(card)
- self.changeCurrentCard(card)
- button = self.getButton(card)
- button.destroy()
- self.buttons.remove(button)
- self.nextTurn()
- else:
- messagebox.showinfo("Incorrect match", "Incorrect card match! Please match by card type or color. "
- + "If you can't, skip your turn")
- def changeCurrentCard(self, card):
- #Mabye add the changed button to a list for reshuffling (discardPile)
- cardButton = tk.Button(self.currentCardFrame, text=str(card), fg=card.color)
- cardButton.grid(row=0, column=0, sticky='ew')
- self.currentCard = card
- def addCard(self):
- self.currentPlayer + self.drawCard(self.deck)
- self.generateCardButtons(self.currentPlayer.hand)
- def getButton(self, card):
- for button in self.buttons:
- if button['text'] == str(card) and button['fg'].startswith(card.color):
- return button
- def nextTurn(self):
- self.addCard
- if self.players.index(self.currentPlayer) + 1 == len(self.players):
- self.currentPlayer = self.players[0]
- self.turnLabel.config(text = f"Player 1 turn")
- else:
- self.currentPlayer = self.players[self.players.index(self.currentPlayer) + 1]
- self.turnLabel.config(text = f"Player {self.players.index(self.currentPlayer) + 1} turn")
- self.generateCardButtons(self.currentPlayer.hand)
- def drawCard(self, deck):
- card = deck[0]
- deck.pop(0)
- return card
- def create_deck():
- deck = []
- for c in ['Red', 'Green', 'Blue', 'Gold']:
- for r in ['0','1','2','3','4','5','6','7','8','9', 'Skip', 'Reverse', 'Draw']:
- if r == '0':
- deck.append(UnoCard(c, r))
- else:
- for i in range(2):
- deck.append(UnoCard(c, r))
- deck.append(UnoCard('Black', 'Wild'))
- deck.append(UnoCard('Black', 'Draw4'))
- random.shuffle(deck)
- return deck
- player1 = UnoPlayer()
- player2 = UnoPlayer()
- player3 = UnoPlayer()
- player4 = UnoPlayer()
- players = [player1, player2, player3, player4]
- if __name__ == "__main__":
- #https://stackoverflow.com/questions/17466561/best-way-to-structure-a-tkinter-application
- root = tk.Tk()
- # Ask how many players
- gameWindow(root, players).pack(side="top", fill="both", expand=True)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement