Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import sys
- import random
- import math
- import time
- class BadInputError(Exception):
- pass
- class Player():
- def __init__(self, name):
- self.id = None
- self.name = name
- self.type = 'Human'
- self.hand = Hand()
- self.legalCards = []
- self.wildCards = []
- self.valueChangeCards = []
- self.zeroCards = []
- self.canSkip = False
- self.canReverse = False
- self.canDrawTwo = False
- self.canDrawFour = False
- self.canValueChange = False
- self.drew = False
- self.scrollMax = 0
- self.points = 0
- self.forceDraw = 0
- def addCard(self, card):
- self.drew = True
- if self.forceDraw > 0:
- self.forceDraw -= 1
- self.drew = False
- self.hand.addCard(card)
- def beginTurn(self):
- self.drew = False
- def didDraw(self):
- return self.drew
- def getLegalCards(self, color, value, zeroChange=False):
- self.canSkip = False
- self.canReverse = False
- self.canDrawTwo = False
- self.canDrawFour = False
- self.canValueChange = False
- self.canZeroChange = False
- self.legalCards = []
- self.wildCards = []
- self.valueChangeCards = []
- self.zeroCards = []
- plusFours = []
- for card in self.hand:
- if card.isWild():
- if card.getValue() == '+4':
- plusFours.append(card)
- else:
- self.wildCards.append(card)
- elif zeroChange and card.isZero():
- self.canZero = True
- self.zeroCards.append(card)
- elif card.getColor() == color or card.getValue() == value:
- if card.getColor() != color:
- self.canValueChange = True
- self.valueChangeCards.append(card)
- if card.getValue() == "+2":
- self.canDrawTwo = True
- elif card.getValue() == 'R':
- self.canReverse = True
- elif card.getValue() == 'X':
- self.canSkip = True
- self.legalCards.append(card)
- if len(self.legalCards) == 0 and len(plusFours) > 0:
- self.canDrawFour = True
- self.wildCards += plusFours
- def getValidCards(self):
- return self.legalCards
- def getAllValidCards(self):
- return self.legalCards + self.wildCards + self.zeroCards
- def hasLegalCard(self):
- return len(self.legalCards) > 0
- def addPoints(self, amount):
- if (self.points + amount) <= 999999999999999999999:
- self.points += amount
- def removeCard(self, index):
- return self.hand.removeCard(index)
- def assignID(self, identity):
- self.id = identity
- def getName(self):
- return self.name
- def getID(self):
- return self.id
- def getPoints(self):
- return self.points
- def getType(self):
- return self.type
- def getCardNum(self):
- return len(self.hand)
- def getHand(self, scrollNum=0, hide=False):
- return self.hand.show(scrollNum, hide)
- def getForceDraws(self):
- return self.forceDraw
- def addForceDraw(self, num):
- self.forceDraw += num
- def decreaseForceDraw(self):
- self.forceDraw -= 1
- def removeForceDraw(self):
- self.forceDraw = 0
- def checkCard(self, index):
- return self.hand.getCard(int(index))
- def discardHand(self):
- self.hand.discard()
- def __str__(self):
- return self.name
- def __repr__(self):
- return '({},{})'.format(self.name, self.points)
- class Hand():
- ''''deck' (Deck) : Card's Color (rgby)
- 'numberOfCards' (int) : Card's Value (0-9, R, X, W, +2, +4)'''
- def __init__(self, deck=None,numberOfCards=0):
- self.hand = []
- if deck != None:
- self.draw(deck,numberOfCards)
- def __iter__(self):
- return iter(self.hand)
- def __len__(self):
- return len(self.hand)
- def __getitem__(self, item):
- try:
- return self.hand[item]
- except:
- return ''
- def addCard(self, card):
- self.hand.append(card)
- def removeCard(self, index):
- index = int(index)
- if (0 <= index < len(self)):
- return self.hand.pop(index)
- def discard(self):
- self.hand = []
- def show(self, scrollNum=0, hide=False):
- if scrollNum == -1:
- scrollNum = 0
- output = ''
- num = 0
- header, footer, upper, lower = '', '', '', ''
- header += ('\033[97m\u2666--\u2666\033[0m ')
- upper += ('\033[97m|<-|\033[0m ')
- lower += ('\033[97m|<-|\033[0m ')
- footer += ('\033[97m\u2666--\u2666\033[0m ')
- for i in range(10):
- indexNum = i+(10*scrollNum)
- if indexNum < len(self):
- header += (self[indexNum].getRow(0,hide)+' ')
- upper += (self[indexNum].getRow(1,hide)+' ')
- lower += (self[indexNum].getRow(2,hide)+' ')
- footer += (self[indexNum].getRow(3,hide)+' ')
- num += 1
- for j in range(10-num):
- j #unused
- header += (' ')
- footer += (' ')
- upper += (' ')
- lower += (' ')
- header += ('\033[97m\u2666--\u2666\033[0m ')
- upper += ('\033[97m|->|\033[0m ')
- lower += ('\033[97m|->|\033[0m ')
- footer += ('\033[97m\u2666--\u2666\033[0m ')
- output += (' '+header+'\n '+upper+'\n '+lower+'\n '+footer+'\n\033[97m|-(<)--')
- for k in range(num):
- output += '({})'.format(k)
- output += '--'
- for l in range(10-num):
- l #unused
- output += '-----'
- output += '(>)--|\033[0m\n'
- return output
- def getCard(self, index):
- return self.hand[index]
- def indexCard(self, card):
- return self.hand.index(card)
- class GameSettings():
- playerIdentities = ('play1','play2','play3','play4')
- computerNames = ('Watson','SkyNet','Hal','Metal Gear')
- def __init__(self):
- self.playerStaging = [] # Where Player Objs Are Stored Before Game Starts
- self.players = {} # ID : Player Obj
- self.numPlayers = 0
- self.useColor = True
- self.displayEffects = True
- self.hideComputerHands = True
- self.zeroChange = False
- self.computerSimulation = False
- self.mainMenuError = ''
- self.computerSpeed = 'normal'
- def canAddPlayer(self):
- return (self.numPlayers < 4)
- def canRemovePlayer(self):
- return (self.numPlayers > 0)
- def canBegin(self):
- return (self.numPlayers > 1)
- def addPlayer(self, player):
- self.playerStaging.append(player)
- self.numPlayers += 1
- def removePlayer(self, number):
- number -= 1
- del self.playerStaging[number]
- self.numPlayers -= 1
- def clearStaging(self):
- self.numPlayers = 0
- self.playerStaging = []
- def finalizePlayers(self):
- self.players.clear()
- identity = 0
- for player in self.playerStaging:
- playerID = self.playerIdentities[identity]
- player.assignID(playerID)
- self.players[playerID] = player
- identity += 1
- def getPlayerNum(self):
- return self.numPlayers
- def getComputerName(self):
- complete = False
- index = self.numPlayers
- while not complete:
- name = self.computerNames[index]
- complete = True
- for player in self.playerStaging:
- if player.getName() == name:
- index += 1
- if index >= len(self.computerNames):
- index = 0
- complete = False
- return self.computerNames[index]
- def getRandomIdentity(self):
- '''For Getting a Random Player for First Turn.'''
- return random.choice(self.players.keys())
- def compileMainMenuElements(self):
- def getBlankSpace(word, total):
- return " "*(total-len(word))
- def getPlayerBox(playerNum, rowNum):
- if rowNum == 1:
- name = self.playerStaging[playerNum-1].getName()
- return '{}{}'.format(name, getBlankSpace(name, 29))
- elif rowNum == 2:
- points = self.playerStaging[playerNum-1].getPoints()
- return 'Points: {}{}'.format(points, getBlankSpace(str(points), 21))
- self.mainMenuElements= {'play1row1':'No Player ','play1row2':' ',
- 'play2row1':'No Player ',
- 'play2row2':' ',
- 'play3row1':'No Player ','play3row2':' ',
- 'play4row1':'No Player ',
- 'play4row2':' ',
- 'play1box':'\033[90m','play2box':'\033[90m','play3box':'\033[90m','play4box':'\033[90m',
- 'beginBox':'\033[90m','addBox':'\033[97m','removeBox':'\033[90m'
- }
- playerBoxKey = 'play{}box'
- playerRowKey = 'play{}row{}'
- i = 1
- for j in self.playerStaging:
- j
- colorCode = ['\033[91m','\033[94m','\033[92m','\033[93m']
- key = playerBoxKey.format(i)
- self.mainMenuElements[key] = colorCode[i-1]
- self.mainMenuElements[playerRowKey.format(i,1)] = getPlayerBox(i, 1)
- self.mainMenuElements[playerRowKey.format(i,2)] = getPlayerBox(i, 2)
- i+=1
- if self.canBegin():
- self.mainMenuElements['beginBox'] = '\033[95m'
- if not self.canAddPlayer():
- self.mainMenuElements['addBox'] = '\033[90m'
- if self.canRemovePlayer():
- self.mainMenuElements['removeBox'] = '\033[97m'
- def changeComputerSpeed(self):
- if self.computerSpeed == 'slow':
- self.computerSpeed = 'normal'
- elif self.computerSpeed == 'normal':
- self.computerSpeed = 'fast'
- elif self.computerSpeed == 'fast':
- self.computerSpeed = 'slow'
- def getMainMenuElements(self):
- return self.mainMenuElements
- class Deck():
- ''''shuffle' (bool) : shuffle deck.'''
- colors = ('red','yellow','green','blue')
- values = ('0','1','2','3','4','5','6','7','8','9','X','R','+2')
- def __init__(self, populate):
- '''Initializes proper deck of 108 Uno Cards.'''
- self.deck = []
- if populate:
- self.populate(True)
- def __getitem__(self, index):
- return self.deck[index]
- def populate(self, shuffle=True):
- for color in self.colors:
- for value in self.values:
- self.deck.append(Card(color, value))
- if value != '0':
- self.deck.append(Card(color, value))
- for i in range(4):
- i #unused
- self.deck.append(Card('wild', '+4'))
- self.deck.append(Card('wild', 'W'))
- if shuffle:
- self.shuffle()
- def __iter__(self):
- return iter(self.deck)
- def __len__(self):
- return len(self.deck)
- def draw(self):
- return self.deck.pop()
- def place(self, card):
- return self.deck.append(card)
- def insert(self, card):
- self.deck.insert(0, card)
- def shuffle(self):
- random.shuffle(self.deck)
- class ComputerPlayer(Player):
- def __init__(self, name):
- super().__init__(name)
- self.type = 'Computer'
- self.begun = False
- self.colorsInHand = {'red':0, 'blue':0, 'green':0, 'yellow':0, 'wild':0}
- self.colorsOutHand = {}
- self.currentColor = ""
- def addCard(self, card):
- Player.addCard(self, card)
- color = card.getColor()
- self.colorsInHand[color] += 1
- def indexCard(self, cardColor, cardValue):
- for card in self.hand:
- if card.getValue() == cardValue:
- if cardValue in ('+4', 'W'):
- return self.hand.indexCard(card)
- else:
- if card.getColor() == cardColor:
- return self.hand.indexCard(card)
- raise ValueError("Card Cannot Be Found")
- def think(self, match):
- card = None
- self.currentColor = match.currentColor
- currentValue = match.currentValue
- zeroChangeRule = match.zeroChange
- twoPlayers = False
- previousTurnID = match.getNextTurn(True)
- nextTurnID = match.getNextTurn(False)
- previousPlayer = match.getPlayer(previousTurnID)
- #nextPlayer = match.getPlayer(nextTurnID)
- if previousTurnID == nextTurnID:
- twoPlayers = True
- if self.canSkip == False and self.canReverse == True:
- self.canSkip = True
- self.canReverse = False
- self.getLegalCards(self.currentColor, currentValue, zeroChangeRule)
- ### DRAW CASE ###
- if len(self.legalCards) == 0 and len(self.wildCards) == 0:
- return "d"
- else:
- ### NO LEGAL CARD, USE WILD CARD ###
- if len(self.legalCards) == 0:
- if zeroChangeRule and self.canZeroChange:
- bestZeroColor = self.getBestColor(self.zeroCards)
- card = self.getCardByColor(self.zeroCards, bestZeroColor)
- else:
- if self.canDrawFour:
- card = self.getCardByValue(self.wildCards, "+4")
- print(card)
- else:
- card = random.choice(self.wildCards)
- else:
- ### HAS LEGAL CARD ###
- if twoPlayers and self.canSkip: #Always play a skip card in a two player game
- #print("Shed Skip Strategy")
- card = self.getCardByValue(self.legalCards,"R", "X")
- if self.canReverse and previousPlayer.didDraw():
- #print("Reverse Strategy")
- reverseCards = self.getAllCardsByValue(self.legalCards, "R")
- for reverseCard in reverseCards:
- if reverseCard.getColor() == self.currentColor:
- card = reverseCard
- if self.canValueChange:
- # Computer Can Value Change, However, Should it?
- # Computer Checks to See if Value Change Color is Better Than Current
- currentColorNum = self.colorsInHand[self.currentColor]
- bestValueChangeColor = self.getBestColor(self.valueChangeCards)
- if self.colorsInHand[bestValueChangeColor] > currentColorNum or len(self.valueChangeCards) == len(self.legalCards):
- card = self.getCardByColor(self.valueChangeCards, bestValueChangeColor)
- if card == None:
- #print("Random Strategy")
- card = random.choice(list(set(self.legalCards) - set(self.valueChangeCards)))
- color = card.getColor()
- self.colorsInHand[color] -= 1
- return str(self.indexCard(card.getColor(), card.getValue()))
- def getWildColor(self):
- maxKey = max(self.colorsInHand, key=self.colorsInHand.get)
- if maxKey == 'wild':
- return random.choice(('r','g','b','y'))
- else:
- return maxKey
- def getCardByValue(self, cardList, *values):
- for card in cardList:
- if card.getValue() in values:
- return card
- def getAllCardsByValue(self, cardList, *values):
- cards = []
- for card in cardList:
- if card.getValue() in values:
- cards.append(card)
- return cards
- def getCardByColor(self, cardList, *colors):
- for card in cardList:
- if card.getColor() in colors:
- return card
- def getBestColor(self, cardList):
- bestColor = None
- bestColorNum = 0
- for card in cardList:
- color = card.getColor()
- if self.colorsInHand[color] > bestColorNum:
- bestColor = color
- bestColorNum = self.colorsInHand[color]
- return bestColor
- class Card():
- '''
- 'suit' (string) : Card's Color (rgby)
- 'rank' (string) : Card's Value (0-9, R, X, W, +2, +4)
- '''
- colors = {
- 'red' : '\033[91m',
- 'green' : '\033[92m',
- 'yellow' : '\033[93m',
- 'blue' : '\033[94m',
- 'purple' : '\033[95m',
- 'cyan' : '\033[96m',
- 'white' : '\033[97m',
- 'wild' : '',
- 'dwild' : '',
- 'dred' : '\033[31m',
- 'dgreen' : '\033[32m',
- 'dyellow' : '\033[33m',
- 'dblue' : '\033[34m',
- 'dpurple' : '\033[35m',
- 'dcyan' : '\033[36m',
- 'dwhite' : '\033[37m',
- }
- idMap = {
- 'red':'R','blue':'B','green':'G','yellow':'Y','wild':'W',
- '0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9',
- '+2':'+','R':'R','W':'W','+4':'$','X':'X'
- }
- bigNums = {
- "0" : [" .d888b. ","d88P Y88b","888 888","888 888","888 888","888 888","d88P Y88b"," \"Y888P\" "],
- "1" : [" d888 "," d8888 "," 888 "," 888 "," 888 "," 888 "," 888 "," 8888888 "],
- "2" : [".d8888b. ","d88P Y88","d8 888"," .d88P",".od888P\" ","d88P\" ","888\" ","888888888"],
- "3" : [" .d8888b.","d88P Y88"," .d88"," 8888\" "," \"Y8b","888 88","Y88b d88"," \"Y8888P\""],
- "4" : [" d88b "," d8P88 "," d8 88 "," d8 88 ","d8 88 ","888888888"," 88 "," 88 "],
- "5" : ["888888888","888 ","888 ","8888888b "," \"Y88b "," 888","Y88b d88P","\"Y8888P\" "],
- "6" : [" .d888b. ","d88P Y88b","888 ","888d888b ","888P \"Y8b","888 888","Y88b d88b"," \"Y888P\" "],
- "7" : ["888888888"," d8P"," d8P "," d8P "," 8888888 "," d8P "," d8P ","d8P "],
- "8" : [" .d888b. ","d8P Y8b","Y8b. d8P"," \"Y8888\" "," .dP\"Yb. ","888 888","Y88b d88P"," \"Y888P\" "],
- "9" : [" .d888b. ","d8P Y8b","88 88","Y8b. d88"," \"Y88P888"," 888","Y88b d88P"," \"Y888P\" "],
- "X" : ["Y8b d8P"," Y8b d8P "," Y8o8P "," Y8P "," d8b "," d888b "," d8P Y8b ","d8P Y8b"],
- "W" : ["88 88","88 88","88 o 88","88 d8b 88","88d888b88","88P Y88","8P Y8","P Y"],
- "+2" : [" db "," 88 ","C8888D "," 88 8888"," VP 8"," 8888"," 8 "," 8888"],
- "+4" : [" db "," 88 ","C8888D "," 88 d "," VP d8 "," d 8 "," d8888"," 8 "],
- "R9" : [" d88P "," d88P "," d88P "," d88P "," Y88b "," Y88b "," Y88b "," Y88b "],
- "R8" : [" d88P "," d88P "," d88P ","d88P ","Y88b "," Y88b "," Y88b "," Y88b "],
- "R7" : [" d88P Y"," d88P ","d88P ","88P ","88b ","Y88b "," Y88b "," Y88b d"],
- "R6" : [" d88P Y8","d88P Y","88P ","8P ","8b ","88b ","Y88b d"," Y88b d8"],
- "R5" : ["d88P Y88","88P Y8","8P Y","P ","b ","8b d","88b d8","Y88b d88"],
- "R4" : ["88P Y88b","8P Y88","P Y8"," Y"," d","b d8","8b d88","88b d88P"],
- "R3" : ["8P Y88b ","P Y88b"," Y88"," Y8"," d8"," d88","b d88P","8b d88P "],
- "R2" : ["P Y88b "," Y88b "," Y88b"," Y88"," d88"," d88P"," d88P ","b d88P "],
- "R1" : [" Y88b "," Y88b "," Y88b "," Y88b"," d88P"," d88P "," d88P "," d88P "],
- "R0" : [" Y88b "," Y88b "," Y88b "," Y88b "," d88P "," d88P "," d88P "," d88P "],
- }
- def __init__(self, color, value):
- '''Initializes Uno Card w/ Color and Value.'''
- self.wild = False #Is wild card?
- self.zero = False
- self.cardID = '{}{}'.format(self.idMap[color],self.idMap[value])
- self.setColor(color)
- self.setValue(value)
- self.setPoints(value)
- #############################################
- ### -\/- Retrieve Card Information -\/- ###
- def __repr__(self):
- return "{},{}".format(self.color, self.value)
- def getBigNum(self, reverse, reverseSeed=0):
- '''Returns list of strings to draw card's value on the pile.'''
- bigNums = []
- colorCode = self.colorCode
- colorCodeDark = self.colorCodeDark
- value = self.value
- if value == 'R':
- if not reverse:
- value += str(reverseSeed)
- else:
- value += str(9-reverseSeed)
- for mid in self.bigNums[value]:
- bigNums += ['{}| |{}'.format(colorCode,colorCodeDark)+mid+'{}| |\033[0m\t'.format(colorCode)]
- return bigNums
- def getColor(self):
- '''Returns card's color.'''
- return self.color
- def getColorCode(self):
- '''Returns card's color code.'''
- return self.colorCode
- def getValue(self):
- '''Returns card's value.'''
- return self.value
- def getPoints(self):
- '''Returns card's point value.'''
- return self.points
- def getRow(self,rowNum,hide=False):
- value = self.value
- displaySpace = self.displaySpace
- if hide:
- colorCode = '\033[97m'
- value = '?'
- displaySpace = ' '
- else:
- colorCode = self.colorCode
- if self.isWild():
- if rowNum == 0:
- colorCode = '\033[91m'
- elif rowNum == 1:
- colorCode = '\033[93m'
- elif rowNum == 2:
- colorCode = '\033[92m'
- elif rowNum == 3:
- colorCode = '\033[94m'
- if rowNum == 0:
- return '{}\u2666--\u2666\033[0m'.format(colorCode)
- elif rowNum == 1:
- return '{}|{}{}|\033[0m'.format(colorCode, displaySpace, value)
- elif rowNum == 2:
- if hide:
- return '{}|? |\033[0m'.format(colorCode)
- else:
- return '{}| |\033[0m'.format(colorCode)
- elif rowNum == 3:
- return '{}\u2666--\u2666\033[0m'.format(colorCode)
- #############################################
- ### -\/- Set Card Information -\/- ###
- def setColor(self, color):
- '''Sets Card's color and escape code.'''
- if color == 'blue':
- self.color = 'blue'
- self.colorCode = self.colors['blue']
- self.colorCodeDark = self.colors['dblue']
- elif color == 'red':
- self.color = 'red'
- self.colorCode = self.colors['red']
- self.colorCodeDark = self.colors['dred']
- elif color == 'yellow':
- self.color = 'yellow'
- self.colorCode = self.colors['yellow']
- self.colorCodeDark = self.colors['dyellow']
- elif color == 'green':
- self.color = 'green'
- self.colorCode = self.colors['green']
- self.colorCodeDark = self.colors['dgreen']
- elif color == 'wild': #No color modification
- self.wild = True
- self.color = 'wild'
- self.colorCodeDark = self.colors['dwild']
- self.colorCode = self.colors['wild']
- def setValue(self, value):
- if value in ('0','1','2','3','4','5','6','7','8','9','X','R','+2','+4','W'):
- self.value = value
- self.displaySpace = ' '
- if len(value) == 2:
- self.displaySpace = ''
- if value == '0':
- self.zero = True
- def setPoints(self, value):
- if value in ('0','1','2','3','4','5','6','7','8','9'):
- self.points = int(value)
- elif value in ("W", "+4"):
- self.points = 50
- else:
- self.points = 20
- #############################################
- ### -\/- Wild Card Methods -\/- ###
- def changeColor(self, color):
- '''Changes Card's Color, Intended for Wild Cards.'''
- self.setColor(color)
- def isWild(self):
- '''Returns if card is a wild card.'''
- return self.wild
- def isZero(self):
- return self.zero
- class Match():
- elementsInit = {
- ### Names (final) ###
- 'P1Name':' ', 'P2Name':' ', 'P3Name':' ', 'P4Name':' ',
- ### Card Values ###
- 'P1Cards':' ', 'P2Cards':' ', 'P3Cards':' ', 'P4Cards':' ',
- ### Turn Colors / Hand###
- 'P1Turn':'', 'P2Turn':'', 'P3Turn':'', 'P4Turn':'',
- 'HName':'\t\t', 'HVisual':'' ,'Hand':'',
- ### Deck ###
- 'DNum':'', 'Deck':['','','','','','','','',''],
- 'PostDNum':'',
- ### Pile ###
- 'uHeader':'\t\t\t\t', 'uMiddle':' ', 'uLower':' ',
- 'oHeader':'\t\t\t', 'oMiddle':['\t\t\t','\t\t\t','\t\t\t','\t\t\t','\t\t\t','\t\t\t','\t\t\t','\t\t\t'],
- ### Messages ###
- 'Console':'', 'Error':''
- }
- speeds = {'slow':2,'normal':1,'fast':0}
- def __init__(self, gs):
- ### Decks ###
- self.deck = Deck(True)
- self.pile = Deck(False)
- ### Player Information ###
- self.players = gs.players
- self.turnList = []
- self.handTitles = {'play1':'','play2':'','play3':'','play4':''}
- ### Carry Information ###
- self.displayEffects = gs.displayEffects
- self.hideComputerHands = gs.hideComputerHands
- self.zeroChange = gs.zeroChange
- self.computerSpeed = self.speeds[gs.computerSpeed]
- self.simulation = gs.computerSimulation
- ### Data ###
- self.handPosition = 0 # For hand displays
- self.drawAmount = 0 # Used for force draws
- self.passes = 0 # Keep track of consecutive passes for emergency color change
- self.passMax = 0 # Max passes before color change
- self.turn = '' # Current turn
- self.event = '' # Wild, Reverse, Skip, etc
- self.wildColorChange = '' # Specifies color to change wild card to
- self.currentColor = '' # Current color
- self.currentValue = '' # Current value
- self.winnerID = '' # ID of Player who Won
- self.reverse = False # Is turn order reversed
- self.turnComplete = False # Is turn complete
- self.matchComplete = False # Is the Game over?
- self.matchAbort = False # Did the match conclude without a winner?
- self.forcedWild = False # Force change wild
- ### Initialize Names / Cards / Deck (Assuming New Game) ###
- self.elements = dict(self.elementsInit)
- keyStringName = 'P{}Name'
- keyStringCards = 'P{}Cards'
- for i in self.players:
- self.elements[keyStringName.format(i[-1])] = self.players[i].getName()+(' '*(11-len(self.players[i].getName())))
- self.elements[keyStringCards.format(i[-1])] = ' '+(' '*(3-len(str(self.players[i].getCardNum()))))+str(self.players[i].getCardNum())+' Cards'
- self.elements['DNum'] = len(self.deck)
- if len(str(len(self.deck))) < 2:
- self.elements['PostDNum'] = '\t'
- j = 8
- for i in range(int(math.ceil(len(self.deck)/12))):
- self.elements['Deck'][j] = '='
- j -= 1
- for key in GameSettings.playerIdentities:
- try:
- self.buildHandString(key)
- self.turnList += [key]
- except KeyError:
- pass
- self.passMax = len(self.turnList)
- def clearShell(self):
- os.system('cls' if os.name == 'nt' else 'clear')
- def begin(self):
- self.elements['Console'] = 'Beginning Game, Press Enter.'
- print(self.drawScreen())
- self.enterBreak()
- self.eventDealCards()
- self.turn = random.choice(self.turnList)
- self.elements['Console'] = 'First turn will be {}. Press Enter.'.format(self.players[self.turn].getName())
- print(self.drawScreen(True))
- self.enterBreak()
- self.placeCard()
- self.elements['P{}Turn'.format(self.turn[-1])] = '\033[93m'
- if self.event == 'wild':
- self.eventWildCard()
- elif self.event == 'reverse':
- self.eventReverse()
- def end(self, gs):
- if not self.matchAbort:
- points = 0
- self.elements['P{}Turn'.format(self.turn[-1])] = ''
- self.elements['Console'] = '{} Wins! Press Enter to Begin Point Tally'.format(self.players[self.winnerID].getName())
- print(self.drawScreen())
- self.enterBreak()
- for identity in self.turnList:
- if identity != self.winnerID:
- self.turn = identity
- self.elements['HName'] = self.handTitles[self.turn]
- self.elements['P{}Turn'.format(self.turn[-1])] = '\033[93m'
- while self.players[identity].getCardNum() > 0:
- card = self.players[identity].removeCard(0)
- points += card.getPoints()
- self.elements['Console'] = '{} Won {} Points!'.format(self.players[self.winnerID].getName(),points)
- keyStringCards = 'P{}Cards'
- self.elements[keyStringCards.format(identity[-1])] = ' '+(' '*(3-len(str(self.players[identity].getCardNum()))))+str(self.players[identity].getCardNum())+' Cards'
- self.players[identity].maxScroll = math.ceil((self.players[identity].getCardNum() / 10)-1)
- if self.handPosition > self.players[identity].maxScroll:
- self.handPosition -= 1
- self.buildHandVisual(identity)
- if self.displayEffects and not self.simulation:
- print(self.drawScreen())
- time.sleep(.1)
- self.elements['P{}Turn'.format(self.turn[-1])] = ''
- self.players[self.winnerID].addPoints(points)
- self.elements['Console'] = '{} Won {} Points! Press Enter'.format(self.players[self.winnerID].getName(),points)
- print(self.drawScreen())
- self.enterBreak()
- gs.clearStaging()
- for identity in self.turnList:
- self.players[identity].discardHand()
- gs.addPlayer(self.players[identity])
- return gs
- def adjustCardAmount(self, playerID):
- keyStringCards = 'P{}Cards'
- self.elements[keyStringCards.format(playerID[-1])] = ' '+(' '*(3-len(str(self.players[playerID].getCardNum()))))+str(self.players[playerID].getCardNum())+' Cards'
- self.players[playerID].maxScroll = math.ceil((self.players[playerID].getCardNum() / 10)-1)
- if self.handPosition > self.players[playerID].maxScroll:
- self.handPosition -= 1
- self.buildHandVisual(playerID)
- def buildHandString(self, playerID):
- playerName = self.players[playerID].getName()
- if len(playerName) < 9:
- self.handTitles[playerID] = "{}'s Hand\t".format(self.players[playerID].getName())
- else:
- self.handTitles[playerID] = "{}'s Hand".format(self.players[playerID].getName())
- def buildHandVisual(self, playerID):
- string = '['
- for i in range(self.players[playerID].maxScroll+1):
- if i == self.handPosition:
- string += '|'
- else:
- string += '-'
- string += ']'
- self.elements['HVisual'] = string
- def checkInput(self, playerInput):
- if playerInput == '':
- return {'valid':False,'entry':playerInput}
- if playerInput.isnumeric():
- if int(playerInput)+(10*self.handPosition) < self.players[self.turn].getCardNum():
- return {'valid':True,'entry':str(int(playerInput)+(10*self.handPosition)),'type':'card'}
- else:
- self.elements['Error'] = '{} is not a card.'.format(playerInput)
- return {'valid':False,'entry':playerInput}
- else:
- playerInput = playerInput.lower()[0]
- if playerInput in ['<','>','u','d','p','q','s']:
- return {'valid':True,'entry':playerInput}
- else:
- self.elements['Error'] = '{} is not a valid selection.'.format(playerInput)
- return {'valid':False,'entry':playerInput}
- def checkColorInput(self, playerInput):
- if playerInput == '':
- return {'valid':False,'entry':playerInput}
- playerInput = str(playerInput).lower()[0]
- if playerInput[0] == 'b':
- return {'valid':True,'entry':'blue'}
- elif playerInput[0] == 'r':
- return {'valid':True,'entry':'red'}
- elif playerInput[0] == 'g':
- return {'valid':True,'entry':'green'}
- elif playerInput[0] == 'y':
- return {'valid':True,'entry':'yellow'}
- return {'valid':False,'entry':playerInput}
- def eventDealCards(self):
- if self.displayEffects and not self.simulation:
- self.elements['Console'] = 'Dealing Cards...'
- for i in ('play1','play2','play3','play4'):
- if i in self.players:
- for j in range(7):
- j #unused
- self.dealCard(i)
- if self.displayEffects and not self.simulation:
- print(self.drawScreen(True))
- time.sleep(.1)
- def eventReverse(self):
- if self.displayEffects and not self.simulation:
- hide = False
- if self.players[self.turn].getType() == "Computer":
- hide = self.hideComputerHands
- self.elements['Console'] = "Reverse Card Played! Reversing Turn Order.".format(self.players[self.turn].getName())
- print(self.drawScreen(hide))
- time.sleep(1)
- for i in range(10):
- cardBigNums = self.pile[0].getBigNum(self.reverse,i)
- self.elements['oMiddle'] = cardBigNums
- print(self.drawScreen(hide))
- if self.displayEffects and not self.simulation:
- time.sleep(.1)
- cardBigNums = self.pile[0].getBigNum(self.reverse,9)
- self.elements['oMiddle'] = cardBigNums
- self.reverse = not self.reverse
- self.event = ''
- def eventSkip(self):
- if self.displayEffects and not self.simulation:
- hide = False
- if self.players[self.turn].getType() == "Computer":
- hide = self.hideComputerHands
- self.elements['Console'] = "Skip Card Placed! Skipping {}'s Turn.".format(self.players[self.turn].getName())
- print(self.drawScreen(hide))
- time.sleep(1)
- for i in range(2):
- i #unused
- self.elements['P{}Turn'.format(self.turn[-1])] = '\033[91m'
- print(self.drawScreen(hide))
- time.sleep(.3)
- self.elements['P{}Turn'.format(self.turn[-1])] = ''
- print(self.drawScreen(hide))
- time.sleep(.3)
- self.turnComplete = True
- self.event = ''
- def eventWildCard(self):
- hide = False
- if not self.forcedWild:
- if self.players[self.turn].getType() == 'Human':
- self.elements['Console'] = 'Wild Card! Specifiy a Color: (B)lue, (R)ed, (G)reen, (Y)ellow'
- self.elements['Error'] = 'Specifiy A Color'
- print(self.drawScreen())
- playerInput = str(input("Color Change: "))
- checked = self.checkColorInput(playerInput)
- while not checked['valid']:
- if checked['entry'] == '<':
- self.handPosition -= 1
- if self.handPosition == -1:
- self.handPosition = self.players[self.turn].maxScroll
- self.buildHandVisual(self.turn)
- elif checked['entry'] == '>':
- self.handPosition += 1
- if self.handPosition > self.players[self.turn].maxScroll:
- self.handPosition = 0
- self.buildHandVisual(self.turn)
- print(self.drawScreen())
- playerInput = str(input("Color Change: "))
- checked = self.checkColorInput(playerInput)
- else:
- hide = self.hideComputerHands
- checked = self.checkColorInput(self.players[self.turn].getWildColor())
- self.wildColorChange = checked['entry']
- else:
- self.wildColorChange = self.checkColorInput(random.choice(('r','b','g','y')))['entry']
- self.forcedWild = False
- self.currentColor = self.wildColorChange
- self.elements['Error'] = ""
- if self.displayEffects and not self.simulation:
- self.elements['Console'] = 'Wild Card! Changing Color.'
- seed = 1
- for i in range(10):
- i #unused
- if seed > 4:
- seed = 1
- print(self.drawScreen(hide,wildSeed=seed))
- time.sleep(.1)
- seed += 1
- self.pile[0].changeColor(self.wildColorChange)
- self.wildColorChange = ''
- cardBigNums = self.pile[0].getBigNum(self.reverse)
- self.elements['oHeader'] = '{}\u2666\u2666\u2666=========\u2666\u2666\u2666\033[0m\t'.format(self.pile[0].getColorCode())
- self.elements['oMiddle'] = cardBigNums
- self.event = ''
- def eventDraw(self):
- self.players[self.turn].addForceDraw(self.drawAmount)
- self.drawAmount = 0
- self.event = ''
- def dealCard(self, playerID):
- card = self.deck.draw()
- self.players[playerID].addCard(card)
- ### Adjust Hand Visual ###
- self.players[playerID].maxScroll = math.ceil((self.players[playerID].getCardNum() / 10)-1)
- self.handPosition = self.players[playerID].maxScroll
- self.buildHandVisual(playerID)
- ### Adjust Player Tile ###
- keyStringCards = 'P{}Cards'
- self.elements[keyStringCards.format(playerID[-1])] = ' '+(' '*(3-len(str(self.players[playerID].getCardNum()))))+str(self.players[playerID].getCardNum())+' Cards'
- ### Adjust Deck ###
- self.elements['DNum'] = len(self.deck)
- if len(str(len(self.deck))) < 2:
- self.elements['PostDNum'] = '\t'
- j = 8
- self.elements['Deck'] = [' ',' ',' ',' ',' ',' ',' ',' ', ' ']
- for i in range(math.ceil(len(self.deck)/12)):
- i #unused
- self.elements['Deck'][j] = '='
- j -= 1
- def placeCard(self, card=None):
- if card == None:
- ### Used At Beginning For First Card ###
- card = self.deck.draw()
- self.elements['DNum'] = len(self.deck)
- cardColor = card.getColorCode()
- cardBigNums = card.getBigNum(self.reverse)
- self.currentColor = card.getColor()
- self.currentValue = card.getValue()
- self.pile.insert(card)
- self.elements['oHeader'] = '{}\u2666\u2666\u2666=========\u2666\u2666\u2666\033[0m\t'.format(cardColor)
- self.elements['oMiddle'] = cardBigNums
- if len(self.pile) > 1:
- previousCard = self.pile[1]
- previousCardColor = previousCard.getColorCode()
- self.elements['uHeader'] = '{} \u2666\u2666\u2666=========\u2666\u2666\u2666\033[0m\t\t'.format(previousCardColor)
- self.elements['uMiddle'] = '{}| |\033[0m'.format(previousCardColor)
- self.elements['uLower'] = '{}\u2666\u2666\u2666\033[0m'.format(previousCardColor)
- if self.currentColor == 'wild':
- self.event = 'wild'
- if self.currentValue == 'X':
- self.event = 'skip'
- elif self.currentValue == 'R':
- if len(self.players) > 2:
- self.event = 'reverse'
- else:
- self.event = 'skip'
- elif self.currentValue == '+4':
- self.drawAmount = 4
- elif self.currentValue == '+2':
- self.drawAmount = 2
- self.passes = 0
- def extractCard(self, playerID, index):
- card = self.players[playerID].removeCard(index)
- if self.players[playerID].getCardNum() == 0:
- self.matchComplete = True
- self.winnerID = self.turn
- self.adjustCardAmount(playerID)
- return card
- def enterBreak(self):
- if not self.simulation:
- str(input())
- return
- def nextTurn(self):
- self.turnComplete = False
- self.handPosition = 0
- turnType = self.players[self.turn].getType()
- self.players[self.turn].beginTurn()
- ### Prepare Hand Visuals ###
- self.elements['HName'] = self.handTitles[self.turn]
- self.buildHandVisual(self.turn)
- if self.event == 'skip':
- self.eventSkip()
- elif self.drawAmount > 0:
- self.eventDraw()
- while not self.turnComplete:
- if turnType == 'Human':
- self.players[self.turn].getLegalCards(self.currentColor, self.currentValue, self.zeroChange)
- if len(self.deck) > 0:
- self.elements['Console'] = 'Select a card, (D)raw, or (P)ause.'
- else:
- self.players[self.turn].removeForceDraw()
- self.elements['Console'] = 'Select a card, (D)raw, (P)ause, or Pas(s).'
- if self.players[self.turn].getForceDraws() > 0:
- self.elements['Error'] = 'Draw Card Played! Draw {} cards.'.format(self.players[self.turn].getForceDraws())
- print(self.drawScreen())
- playerInput = str(input("\033[97mSelection: \033[92m"))
- checked = self.checkInput(playerInput)
- while not checked['valid']:
- print(self.drawScreen())
- playerInput = str(input("\033[97mSelection: \033[92m"))
- checked = self.checkInput(playerInput)
- playerInput = checked['entry']
- if playerInput == '<':
- self.handPosition -= 1
- if self.handPosition == -1:
- self.handPosition = self.players[self.turn].maxScroll
- self.buildHandVisual(self.turn)
- elif playerInput == '>':
- self.handPosition += 1
- if self.handPosition > self.players[self.turn].maxScroll:
- self.handPosition = 0
- self.buildHandVisual(self.turn)
- elif playerInput == 'd':
- if len(self.deck) > 0:
- self.elements['Error'] = ''
- self.dealCard(self.turn)
- else:
- self.elements['Error'] = "Cannot Draw. Deck is Empty"
- elif playerInput == 'p':
- pauseOutput = self.pauseScreen()
- if pauseOutput == 'quit':
- self.matchComplete = True
- self.turnComplete = True
- self.winnerID = 'play1'
- self.matchAbort = True
- elif playerInput == 's':
- if len(self.deck) > 0:
- self.elements['Error'] = "Cannot pass until Deck is empty."
- elif len(self.players[self.turn].getAllValidCards()) > 0:
- self.elements['Error'] = "Cannot pass while having playable cards."
- else:
- self.turnComplete = True
- self.passes += 1
- if self.passes == self.passMax:
- self.forcedWild = True
- self.event = 'wild'
- self.passes = 0
- elif playerInput.isnumeric():
- if self.players[self.turn].getForceDraws() == 0:
- cardCheck = self.players[self.turn].checkCard(playerInput)
- if cardCheck in self.players[self.turn].getAllValidCards():
- card = self.extractCard(self.turn, playerInput)
- self.placeCard(card)
- self.elements['Error'] = ""
- self.turnComplete = True
- else:
- self.elements['Error'] = "Card Doesn't Match The Color {} or Value {}!".format(self.currentColor, self.currentValue)
- else:
- pass
- elif turnType == 'Computer':
- self.elements['Console'] = '{}\'s Turn'.format(self.players[self.turn].getName())
- print(self.drawScreen(self.hideComputerHands))
- if not self.simulation:
- time.sleep(self.computerSpeed)
- #str(input())
- while (True):
- if self.displayEffects and not self.simulation:
- time.sleep(.2)
- if self.players[self.turn].getForceDraws() > 0 and len(self.deck) > 0:
- cardIndex = 'd'
- else:
- cardIndex = self.players[self.turn].think(self)
- if cardIndex.isnumeric():
- card = self.extractCard(self.turn, int(cardIndex))
- if card.getColor() != self.currentColor:
- self.resetDrawBool()
- self.placeCard(card)
- self.turnComplete = True
- break
- else:
- if cardIndex == 'd':
- if len(self.deck) > 0:
- self.dealCard(self.turn)
- print(self.drawScreen(self.hideComputerHands))
- else:
- self.turnComplete = True
- self.players[self.turn].removeForceDraw()
- self.passes += 1
- if self.passes == self.passMax:
- self.forcedWild = True
- self.event = 'wild'
- self.passes = 0
- break
- ### DECODE INPUT ###
- if self.event == 'reverse':
- self.eventReverse()
- elif self.event == 'wild':
- self.eventWildCard()
- # Clear Current Turn
- self.elements['P{}Turn'.format(self.turn[-1])] = ''
- # Prepare Next Turn
- self.turn = self.getNextTurn()
- self.elements['P{}Turn'.format(self.turn[-1])] = '\033[93m'
- def drawScreen(self, hide=False, wildSeed=0):
- if self.simulation:
- return ''
- colorCombos = {
- 1 : ['\033[91m','\033[93m','\033[92m','\033[94m'],
- 2 : ['\033[94m','\033[91m','\033[93m','\033[92m'],
- 3 : ['\033[92m','\033[94m','\033[91m','\033[93m'],
- 4 : ['\033[93m','\033[92m','\033[94m','\033[91m'] }
- currentTurn = self.turn
- if currentTurn == '':
- currentTurn = self.turnList[-1]
- hide = True
- if wildSeed != 0:
- colorMod = colorCombos[wildSeed]
- else:
- colorMod = ['','','','']
- self.clearShell()
- screenout = ''
- screenout += '\t\t\033[94m || ||\033[92m ||\ || \033[91m// \\\\\n\033[0m'
- screenout += '\t\t\033[94m || ||\033[92m ||\\\|| \033[91m(( ))\n\033[0m'
- screenout += '\t\t\033[94m \\\ //\033[92m || \|| \033[91m \\\ //\n\033[0m'
- screenout += '\033[97m===============================================================\n'
- screenout += '\033[93m{}\033[0m\n'.format(self.elements['Console'])
- screenout += '\033[97m===============================================================\n'
- screenout += '\t\t\t\t\t\t' + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P1Turn'])
- screenout += '\033[97mDeck:\t\t' + '{}'.format(self.elements['uHeader']) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P1Turn'],self.elements['P1Name'])
- screenout += '\033[97m{} Cards'.format(self.elements['DNum']) + '{}'.format(self.elements['PostDNum'])+'\t' + '{}'.format(self.elements['uHeader']) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P1Turn'],self.elements['P1Cards'])
- screenout += '\t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[0],self.elements['oHeader']) + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P1Turn'])
- screenout += '\033[97m _+_ \t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[1],self.elements['oHeader']) + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P2Turn'])
- screenout += '\033[97m | ' + '\033[92m{}\033[0m'.format(self.elements['Deck'][0]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[2],self.elements['oMiddle'][0]) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P2Turn'],self.elements['P2Name'])
- screenout += '\033[97m | ' + '\033[92m{}\033[0m'.format(self.elements['Deck'][1]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[3],self.elements['oMiddle'][1]) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P2Turn'],self.elements['P2Cards'])
- screenout += '\033[97m | ' + '\033[92m{}\033[0m'.format(self.elements['Deck'][2]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[0],self.elements['oMiddle'][2]) + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P2Turn'])
- screenout += '\033[97m | ' + '\033[93m{}\033[0m'.format(self.elements['Deck'][3]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[1],self.elements['oMiddle'][3]) + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P3Turn'])
- screenout += '\033[97m | ' + '\033[93m{}\033[0m'.format(self.elements['Deck'][4]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[2],self.elements['oMiddle'][4]) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P3Turn'],self.elements['P3Name'])
- screenout += '\033[97m | ' + '\033[93m{}\033[0m'.format(self.elements['Deck'][5]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uMiddle']) + '\033[97m{}{}'.format(colorMod[3],self.elements['oMiddle'][5]) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P3Turn'],self.elements['P3Cards'])
- screenout += '\033[97m | ' + '\033[91m{}\033[0m'.format(self.elements['Deck'][6]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uLower']) + '\033[97m{}{}'.format(colorMod[0],self.elements['oMiddle'][6]) + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P3Turn'])
- screenout += '\033[97m | ' + '\033[91m{}\033[0m'.format(self.elements['Deck'][7]) + '\033[97m |\t\t ' + '{}'.format(self.elements['uLower']) + '\033[97m{}{}'.format(colorMod[1],self.elements['oMiddle'][7]) + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P4Turn'])
- screenout += '\033[97m |_' + '\033[91m{}\033[0m'.format(self.elements['Deck'][8]) + '\033[97m_|\t\t ' + '\033[97m{}{}'.format(colorMod[2],self.elements['oHeader']) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P4Turn'],self.elements['P4Name'])
- screenout += '\033[97m\t\t ' + '\033[97m{}{}'.format(colorMod[3],self.elements['oHeader']) + ' \033[97m{}|{}|\033[0m\n'.format(self.elements['P4Turn'],self.elements['P4Cards'])
- screenout += '\t\t\t\t\t\t' + ' \033[97m{}\u2666-----------\u2666\033[0m\n'.format(self.elements['P4Turn'])
- screenout += "\033[97m{}".format(self.elements['HName']) + "\t\t\t\t {}\n".format(self.elements['HVisual'])
- screenout += '\033[97m===============================================================\n'
- screenout += self.players[currentTurn].getHand(self.handPosition,hide)
- screenout += '\033[91m{}\033[0m'.format(self.elements['Error'])
- return screenout
- def pauseScreen(self):
- while True:
- self.clearShell()
- print('\n\t\t\tPause')
- print('\n\t\t1. Resume')
- print('\t\t2. Quit')
- selection = str(input('\nSelection: ')).upper()
- while selection not in ['1', '2']:
- print('\nSelection Invalid')
- selection = str(input('\nSelection: ')).upper()
- if selection == '1' or "":
- return ""
- elif selection == '2':
- return "quit"
- def isComplete(self):
- return self.matchComplete
- def next(self):
- self.turn = self.getNextTurn()
- def getNextTurn(self, forceReverse=False):
- if forceReverse:
- reverse = not self.reverse
- else:
- reverse = self.reverse
- currentIndex = self.turnList.index(self.turn)
- if not reverse:
- if (currentIndex + 1) == len(self.turnList):
- return self.turnList[0]
- else:
- return self.turnList[currentIndex+1]
- else:
- if currentIndex == 0:
- return self.turnList[len(self.turnList) - 1]
- else:
- return self.turnList[currentIndex-1]
- def getPlayer(self, playerID):
- return self.players[playerID]
- def resetDrawBool(self):
- for identity in self.players:
- self.players[identity].drew = False
- def Uno(debugging=False):
- ###MENUS###
- def clearShell():
- os.system('cls' if os.name == 'nt' else 'clear')
- def mainMenu():
- sys.stdout.write("\x1b[8;32;63t")
- sys.stdout.flush()
- gs = GameSettings()
- while True:
- print(drawMainMenu(gs))
- selection = str(input('\033[97mSelection: \033[92m'))
- while selection not in ['1', '2', '3', '4', '5']:
- gs.mainMenuError = "Invalid Selection"
- print(drawMainMenu(gs))
- selection = str(input('\033[97mSelection: \033[92m'))
- if selection == '1':
- if gs.canBegin():
- gs.mainMenuError = ""
- gs.finalizePlayers()
- gs = playMatch(gs)
- else:
- gs.mainMenuError = "Two Players Required to Begin"
- elif selection == '2':
- if gs.canAddPlayer():
- gs.mainMenuError = ""
- gs = addPlayer(gs)
- else:
- gs.mainMenuError = "Max Number of Players Reached"
- elif selection == '3':
- if gs.canAddPlayer():
- gs.mainMenuError = ""
- gs = addComputer(gs)
- else:
- gs.mainMenuError = "Max Number of Players Reached"
- elif selection == '4':
- if gs.canRemovePlayer():
- gs.mainMenuError = ""
- gs = removePlayer(gs)
- else:
- gs.mainMenuError = "No Players to Remove"
- elif selection == '5':
- gs.mainMenuError = ""
- gs = settingsMenu(gs)
- else:
- raise BadInputError('Data Provided Has No Function')
- def playMatch(gs):
- for i in range(1):
- i
- m = Match(gs)
- m.begin()
- while (not m.isComplete()):
- m.nextTurn()
- gs = m.end(gs)
- return gs
- def addPlayer(gs):
- colors = ['\033[91m','\033[94m', '\033[92m', '\033[93m']
- nameOkay = False
- playerNum = gs.getPlayerNum() + 1
- colorIndex = playerNum - 1
- message = "\033[97mPlease Enter Player {}'s Name: {}".format(playerNum, colors[colorIndex])
- while not nameOkay:
- print(drawMainMenu(gs))
- name = str(input(message)).title()
- if len(name) > 11:
- gs.mainMenuError = "Name Must Be 11 Characters or Less!"
- elif len(name) == 0:
- gs.mainMenuError = ""
- return gs
- else:
- nameOkay = True
- for player in gs.playerStaging:
- if player.getName() == name:
- nameOkay = False
- if nameOkay == False or name in GameSettings.computerNames:
- gs.mainMenuError = "Name Cannot Match Another Player's Name!"
- p = Player(name)
- gs.addPlayer(p)
- gs.mainMenuError = ""
- return gs
- def addComputer(gs):
- name = gs.getComputerName()
- c = ComputerPlayer(name)
- gs.addPlayer(c)
- return gs
- def removePlayer(gs):
- sys.stdout.write("\x1b[8;{rows};{cols}t".format(rows=32, cols=63))
- sys.stdout.flush()
- clearShell()
- complete = False
- playerNum = gs.getPlayerNum()
- message = "\033[97mPlease Enter Player Number to Remove: \033[91m".format(playerNum)
- while (not complete):
- print(drawMainMenu(gs))
- number = str(input(message))
- if len(number) == 0:
- gs.mainMenuError = ""
- return gs
- try:
- number = int(number)
- if 0 < number <= playerNum:
- complete = True
- else:
- gs.mainMenuError = "Invalid Player Number!"
- except:
- gs.mainMenuError = "Please Enter the Player Number, not Name!"
- gs.mainMenuError = ""
- gs.removePlayer(number)
- return gs
- def settingsMenu(gs):
- while True:
- sys.stdout.write("\x1b[8;32;63t")
- sys.stdout.flush()
- clearShell()
- print('\n\t\tSettings')
- print('\n\t1. Draw Effects\t\t\t{}'.format(gs.displayEffects))
- print('\t2. Hide Computer Hands\t\t{}'.format(gs.hideComputerHands))
- print('\t3. Computer Speed\t\t{}'.format(gs.computerSpeed.title()))
- #print('\t4. Zero Card Changes Color\t{}'.format(gs.zeroChange))
- #print('\t5. Run Simulations\t\t{}'.format(gs.computerSimulation))
- print('\n\tA. Exit')
- selection = str(input('\nSelection: ')).upper()
- while selection not in ('1', '2', '3', '4', '5', 'A', ''):
- print('\nSelection Invalid')
- selection = str(input('\nSelection: ')).upper()
- if selection == '1':
- gs.displayEffects = not gs.displayEffects
- elif selection == '2':
- gs.hideComputerHands = not gs.hideComputerHands
- elif selection == '3':
- gs.changeComputerSpeed()
- '''
- elif selection == '4':
- gs.zeroChange = not gs.zeroChange
- elif selection == '5':
- gs.computerSimulation = not gs.computerSimulation
- '''
- elif selection == 'A' or selection == '' or selection in ('4','5'):
- return gs
- def drawMainMenu(gs):
- clearShell()
- gs.compileMainMenuElements()
- menuElements = gs.getMainMenuElements()
- screenout = ''
- screenout += '\t\t\033[94m || ||\033[92m ||\ || \033[91m// \\\\\n\033[0m'
- screenout += '\t\t\033[94m || ||\033[92m ||\\\|| \033[91m(( ))\n\033[0m'
- screenout += '\t\t\033[94m \\\ //\033[92m || \|| \033[91m \\\ //\n\033[0m'
- screenout += '\033[97m===============================================================\033[0m\n'
- screenout += "{}1-----------------------------1\033[0m {}2-----------------------------2\033[0m\n".format(menuElements['play1box'],menuElements['play2box'])
- screenout += "{}|{}|\033[0m {}|{}|\033[0m\n".format(menuElements['play1box'],menuElements['play1row1'],menuElements['play2box'],menuElements['play2row1'])
- screenout += "{}|{}|\033[0m {}|{}|\033[0m\n".format(menuElements['play1box'],menuElements['play1row2'],menuElements['play2box'],menuElements['play2row2'])
- screenout += "{}1-----------------------------1\033[0m {}2-----------------------------2\033[0m\n".format(menuElements['play1box'],menuElements['play2box'])
- screenout += "{}3-----------------------------3\033[0m {}4-----------------------------4\033[0m\n".format(menuElements['play3box'],menuElements['play4box'])
- screenout += "{}|{}|\033[0m {}|{}|\033[0m\n".format(menuElements['play3box'],menuElements['play3row1'],menuElements['play4box'],menuElements['play4row1'])
- screenout += "{}|{}|\033[0m {}|{}|\033[0m\n".format(menuElements['play3box'],menuElements['play3row2'],menuElements['play4box'],menuElements['play4row2'])
- screenout += "{}3-----------------------------3\033[0m {}4-----------------------------4\033[0m\n".format(menuElements['play3box'],menuElements['play4box'])
- screenout += "\033[97m===============================================================\033[0m\n"
- screenout += " {}\u2666---------------------------\u2666\033[0m \u2666===========================\u2666\n".format(menuElements['beginBox'])
- screenout += " {}|1. Begin Match |\033[0m | High Scores |\n".format(menuElements['beginBox'])
- screenout += " {}\u2666---------------------------\u2666\033[0m \u2666---------------------------\u2666\n".format(menuElements['beginBox'])
- screenout += " {}\u2666---------------------------\u2666\033[0m | |\n".format(menuElements['addBox'])
- screenout += " {}|2. Add Player |\033[0m | |\n".format(menuElements['addBox'])
- screenout += " {}\u2666---------------------------\u2666\033[0m | |\n".format(menuElements['addBox'])
- screenout += " {}\u2666---------------------------\u2666\033[0m | |\n".format(menuElements['addBox'])
- screenout += " {}|3. Add Computer |\033[0m | |\n".format(menuElements['addBox'])
- screenout += " {}\u2666---------------------------\u2666\033[0m | |\n".format(menuElements['addBox'])
- screenout += " {}\u2666---------------------------\u2666\033[0m | |\n".format(menuElements['removeBox'])
- screenout += " {}|4. Remove Player |\033[0m | |\n".format(menuElements['removeBox'])
- screenout += " {}\u2666---------------------------\u2666\033[0m | |\n".format(menuElements['removeBox'])
- screenout += " \033[97m\u2666---------------------------\u2666\033[0m | |\n"
- screenout += " \033[97m|5. Settings |\033[0m | |\n"
- screenout += " \033[97m\u2666---------------------------\u2666\033[0m \u2666===========================\u2666\n"
- screenout += "\033[97m===============================================================\033[0m\n"
- screenout += '\033[91m{}\033[0m'.format(gs.mainMenuError)
- return screenout
- mainMenu()
- if __name__ == "__main__":
- Uno()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement