I am working on Jupyter Notebook and I am new to Python. I have created this BlackJack Game (This is my 2nd Project as I am Learning Python. See my 1st - [Tic Tac Toe](https://codereview.stackexchange.com/questions/165692/tic-tac-toe-in-python-jupyter) from IPython.display import clear_output import time import random colors = [] faces = [] values = {} deck = [] ip=[0] id=[0] def shufflecards(): global colors,faces,values,deck colors = ['spades', 'hearts', 'diamonds', 'clubs'] faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] values = dict(zip(faces, [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])) deck = [face + ' of ' + color for color in colors for face in faces] random.shuffle(deck) class Black_Jack_Bank(object): def __init__(self,bankroll=100): self.bankroll = bankroll def add_money(self,add=20): self.bankroll += add def sub_money(self,sub=10): trymoney = self.bankroll - sub if(trymoney<0): print"You Do Not Have Enough Money :(" while True : pass while True: try: self.bet = int(raw_input("\nPlease enter your Bet : ")) except: print "Oops ! Thats not a valid Bet ! \nTry Some Numbers" continue else: self.bankroll -= self.bet break def get_money(self): return self.bankroll def get_bet(self): return self.bet def blackjack_sub(self,sub): self.bet = sub self.bankroll -= self.bet class Black_Jack_Gameplay(object): def __init__(self): self.player_card = [] self.valuep = 0 self.dealer_card = [] self.valued = 0 def dealer_hand_initial(self): for i in range(2): a_card = deck.pop() self.dealer_card.append(a_card) self.valued += values[a_card.split()[0]] print '\nDealers Cards are : ' print"[' * ', '{a}']".format(a=self.dealer_card[1]) def player_hand_initial(self): for i in range(2): a_card = deck.pop() self.player_card.append(a_card) self.valuep += values[a_card.split()[0]] print '\nYour Initial Cards are : ' print self.player_card print self.valuep def player_hand_hit(self): if(ip[0] == 0): if( self.player_card[0] == 'A of spades' or self.player_card[0] == 'A of hearts' or self.player_card[0] == 'A of diamonds' or self.player_card[0] == 'A of clubs' or self.player_card[1] == 'A of spades' or self.player_card[1] == 'A of hearts' or self.player_card[1] == 'A of diamonds' or self.player_card[1] == 'A of clubs'): values['A']=1 ip[0] = 1 self.valuep = self.valuep - 10 a_card = deck.pop() self.player_card.append(a_card) self.valuep += values[a_card.split()[0]] clear_output() print '\nDealers Card are :' print"[' * ', '{a}']".format(a=self.dealer_card[1]) print '\nYour Cards are : ' print self.player_card print self.valuep def dealer_hand_hit(self): if(self.valued>=17): clear_output() print '\nYour Cards are : ' print self.player_card print '\nDealers Cards are :' print self.dealer_card print self.valued while self.valued < 17 : #Once Player Stands The Dealer will play till Soft Hand is Reached if(id[0] == 0): if( self.dealer_card[0] == 'A of spades' or self.dealer_card[0] == 'A of hearts' or self.dealer_card[0] == 'A of diamonds' or self.dealer_card[0] == 'A of clubs' or self.dealer_card[1] == 'A of spades' or self.dealer_card[1] == 'A of hearts' or self.dealer_card[1] == 'A of diamonds' or self.dealer_card[1] == 'A of clubs' ): values['A']=1 id[0] =1 self.valued = self.valued - 10 a_card = deck.pop() self.dealer_card.append(a_card) self.valued += values[a_card.split()[0]] clear_output() print '\nYour Cards are :' print self.player_card print '\nDealers Cards are : ' print self.dealer_card print self.valued def player_win(self): if (self.valuep == 21): clear_output() print '\nDealers Cards are :' print self.dealer_card print '\nYour Cards are : ' print self.player_card print self.valuep return 'Win' if(self.valuep > 21): print '\nDealers Cards are :' print self.dealer_card print '\nYour Cards are : ' print self.player_card print self.valuep return 'Burst' if(self.valuep < 21): return 'C' def dealer_win(self): if (self.valued == 21): return 'BJ' if(self.valued > 21): return 'B' if (self.valued > self.valuep): return 'W' if(self.valued < self.valuep): return 'L' if(self.valued == self.valuep): return 'D' player_name = raw_input("Please Enter Your Name : ") game_on = True input1 = 0 gamebet1=0 gamebet1 = input("Empty Your Pockets :) Add Money To Casion Bank ! : ") player_bank = Black_Jack_Bank(gamebet1) while game_on: clear_output() print 'Welcome To Black Jack' player_bank = Black_Jack_Bank(gamebet1) gamebet = player_bank.sub_money() gamebet1 = player_bank.get_money() gamebet2 = player_bank.get_bet() print'Shuffling Cards . . . & Counting Money' time.sleep(3) shufflecards() clear_output() print"Dealer's Card are as follows" player_name = Black_Jack_Gameplay() player_name.dealer_hand_initial() player_name.player_hand_initial() z = player_name.player_win() if(z == 'Win'): print "Yipee ! Its BlackJack" player_bank.add_money((gamebet2)*2.5) gamebet1 = player_bank.get_money() print "Your Balance is : %s "%(gamebet1) time.sleep(7) continue y = player_name.dealer_win() if(y == 'BJ'): print "Yipee ! Its BlackJack" player_bank.blackjack_sub((gamebet2)*0.5) gamebet1 = player_bank.get_money() print "Your Balance is : %s "%(gamebet1) time.sleep(7) continue while True: try: val = int(raw_input("Please enter \n1. Hit\n2. Stand\n3. Current Balanace\n4. Exit Game\nPlease Enter Your Choice : ")) except: print "Looks like you did not enter a Valid Choice!" continue else: if(val == 1): player_name.player_hand_hit() z = player_name.player_win() if(z == 'Win'): print "Yipee ! You Win !" player_bank.add_money((gamebet2)*2) gamebet1 = player_bank.get_money() print "Your Balance is : %s "%(gamebet1) time.sleep(7) break if(z == 'Burst'): print"Woopsie ! It's a burst" print "Your Balance is : %s "%(gamebet1) time.sleep(7) break if(z == 'C'): continue if(val == 2): player_name.dealer_hand_hit() y = player_name.dealer_win() if(y == 'B'): print'Dealer Bursts ! You Win' player_bank.add_money((gamebet2)*2) gamebet1 = player_bank.get_money() print "Your Balance is : %s "%(gamebet1) time.sleep(7) break if(y == 'BJ'): print"Hmmm ! Dealer Wins" player_bank.add_money(gamebet2) gamebet1 = player_bank.get_money() print "Your Balance is : %s "%(gamebet1) time.sleep(7) break if(y == 'W'): print'Hmmm ! Dealer Wins' print "Your Balance is : %s "%(gamebet1) time.sleep(7) break if(y == 'L'): print'Yipee ! You Win' player_bank.add_money((gamebet2)*2) gamebet1 = player_bank.get_money() print "Your Balance is : %s "%(gamebet1) time.sleep(7) break if(y == 'D'): print"Woah !It's a Draw" player_bank.add_money(gamebet2) gamebet1 = player_bank.get_money() print "Your Balance is : %s "%(gamebet1) time.sleep(7) break if(val == 3): print gamebet1 if(val == 4): print gamebet1 time.sleep(5) game_on = False I want help to make it better. **Any code optimization with explanation is welcome.** If you know any major rules that this code does not follow or some bugs in code, please mention. P.S. I have tried using Object Oriented Programming. Due to gettting frustrated at the end due to errors. At the end the name of variables might be confusing.