244 lines
8.4 KiB
Python
244 lines
8.4 KiB
Python
''' Python 3.6.5 code using Tkinter graphical user interface.
|
|
Starting player chosen randomly. '''
|
|
from tkinter import *
|
|
from tkinter import messagebox
|
|
import random
|
|
|
|
# ************************************************
|
|
|
|
class Game:
|
|
def __init__(self, gw):
|
|
self.window = gw
|
|
self.won = 0
|
|
self.lost = 0
|
|
self.score = 0
|
|
self.puter_turn = None
|
|
self.var123 = IntVar()
|
|
self.varsub = IntVar()
|
|
|
|
# top frame:
|
|
self.top_fr = Frame(gw,
|
|
width=600,
|
|
height=100,
|
|
bg='dodger blue')
|
|
self.top_fr.pack(fill=X)
|
|
|
|
self.hdg = Label(self.top_fr,
|
|
text=' 21 Game ',
|
|
font='arial 22 bold',
|
|
fg='navy',
|
|
bg='lemon chiffon')
|
|
self.hdg.place(relx=0.5, rely=0.5,
|
|
anchor=CENTER)
|
|
|
|
self.play_btn = Button(self.top_fr,
|
|
text='Play\nGame',
|
|
bd=5,
|
|
bg='navy',
|
|
fg='lemon chiffon',
|
|
font='arial 12 bold',
|
|
command=self.play_game)
|
|
self.play_btn.place(relx=0.92, rely=0.5,
|
|
anchor=E)
|
|
|
|
self.quit_btn = Button(self.top_fr,
|
|
text='Quit\nGame',
|
|
bd=5,
|
|
bg='navy',
|
|
fg='lemon chiffon',
|
|
font='arial 12 bold',
|
|
command=self.quit_game)
|
|
self.quit_btn.place(relx=0.07, rely=0.5,
|
|
anchor=W)
|
|
|
|
# bottom frame:
|
|
self.btm_fr = Frame(gw,
|
|
width=600,
|
|
height=500,
|
|
bg='lemon chiffon')
|
|
self.btm_fr.pack(fill=X)
|
|
|
|
self.msg = Label(self.btm_fr,
|
|
text="(Click 'Play' or 'Quit')",
|
|
font='arial 16 bold',
|
|
fg='navy',
|
|
bg='lemon chiffon')
|
|
self.msg.place(relx=0.5, rely=0.1,
|
|
anchor=CENTER)
|
|
|
|
self.hdg = Label(self.btm_fr,
|
|
text="Scoreboard",
|
|
font='arial 16 bold',
|
|
fg='navy',
|
|
bg='lemon chiffon')
|
|
self.hdg.place(relx=0.5, rely=0.2,
|
|
anchor=CENTER)
|
|
|
|
self.score_msg = Label(self.btm_fr,
|
|
text="0",
|
|
font='arial 16 bold',
|
|
fg='navy',
|
|
bg='dodger blue',
|
|
width=8)
|
|
|
|
self.score_msg.place(relx=0.5, rely=0.27,
|
|
anchor=CENTER)
|
|
|
|
self.ch_fr = LabelFrame(self.btm_fr,
|
|
text='Choose a number',
|
|
bg='dodger blue',
|
|
fg='navy',
|
|
bd=8,
|
|
relief=RIDGE,
|
|
font='arial 16 bold')
|
|
self.ch_fr.place(relx=0.5, rely=0.5,
|
|
anchor=CENTER)
|
|
|
|
self.radio1 = Radiobutton(self.ch_fr,
|
|
text='1',
|
|
state='disabled',
|
|
font='arial 16 bold',
|
|
fg='navy',
|
|
bg='dodger blue',
|
|
variable=self.var123,
|
|
value=1)
|
|
self.radio1.pack()
|
|
|
|
self.radio2 = Radiobutton(self.ch_fr,
|
|
text='2',
|
|
state='disabled',
|
|
font='arial 16 bold',
|
|
fg='navy',
|
|
bg='dodger blue',
|
|
variable=self.var123,
|
|
value=2)
|
|
self.radio2.pack()
|
|
|
|
self.radio3 = Radiobutton(self.ch_fr,
|
|
text='3',
|
|
state='disabled',
|
|
font='arial 16 bold ',
|
|
fg='navy',
|
|
bg='dodger blue',
|
|
variable=self.var123,
|
|
value=3)
|
|
self.radio3.pack()
|
|
|
|
self.submit_btn = Button(self.btm_fr,
|
|
text='SUBMIT',
|
|
state='disabled',
|
|
bd=5,
|
|
bg='navy',
|
|
fg='lemon chiffon',
|
|
font='arial 12 bold',
|
|
command=self.submit)
|
|
self.submit_btn.place(relx=0.5, rely=0.75,
|
|
anchor=CENTER)
|
|
|
|
self.won_lbl = Label(self.btm_fr,
|
|
text="Won: 0",
|
|
font='arial 16 bold',
|
|
fg='navy',
|
|
bg='lemon chiffon')
|
|
self.won_lbl.place(relx=0.85, rely=0.88,
|
|
anchor=W)
|
|
|
|
self.lost_lbl = Label(self.btm_fr,
|
|
text="Lost: 0",
|
|
font='arial 16 bold',
|
|
fg='navy',
|
|
bg='lemon chiffon')
|
|
self.lost_lbl.place(relx=0.85, rely=0.93,
|
|
anchor=W)
|
|
|
|
# play one game:
|
|
def play_game(self):
|
|
self.play_btn.config(state='disabled')
|
|
# pick who goes first randomly:
|
|
self.puter_turn = random.choice([True, False])
|
|
self.score = 0
|
|
self.score_msg.config(text=self.score)
|
|
if not self.puter_turn:
|
|
m = 'your turn'
|
|
self.msg.config(text=m)
|
|
# alternate turns until 21 is reached:
|
|
while self.score != 21:
|
|
if self.puter_turn:
|
|
self.puter_plays()
|
|
else:
|
|
self.user_plays()
|
|
self.puter_turn = not self.puter_turn
|
|
self.play_btn.config(state='normal')
|
|
return
|
|
|
|
# computer picks a number:
|
|
def puter_plays(self):
|
|
if self.score == 20:
|
|
x = 1
|
|
elif self.score == 19:
|
|
x = random.choice([1, 2])
|
|
else:
|
|
x = random.choice([1, 2, 3])
|
|
self.score += x
|
|
self.score_msg.config(text=self.score)
|
|
if self.score == 21:
|
|
m = 'Computer won!'
|
|
self.lost += 1
|
|
self.lost_lbl.config(text='Lost: ' + str(self.lost))
|
|
else:
|
|
m = 'Computer chose ' + str(x) + ', your turn'
|
|
self.msg.config(text=m)
|
|
return
|
|
|
|
# user picks a number:
|
|
def user_plays(self):
|
|
self.set_user_state('normal')
|
|
while True:
|
|
# wait for submit button to be pressed:
|
|
self.submit_btn.wait_variable(self.varsub)
|
|
x = self.var123.get()
|
|
if x + self.score > 21:
|
|
m = 'Score cannot exceed 21, try again'
|
|
messagebox.showerror('Error', m)
|
|
elif x not in (1,2,3):
|
|
m = 'No selection made'
|
|
messagebox.showerror('Error', m)
|
|
else:
|
|
break
|
|
self.score += x
|
|
if self.score == 21:
|
|
m = 'You won!'
|
|
self.msg.config(text=m)
|
|
self.score_msg.config(text=self.score)
|
|
self.won += 1
|
|
self.won_lbl.config(text='Won: ' + str(self.won))
|
|
# reset and disable radio buttons:
|
|
self.var123.set(0)
|
|
self.set_user_state('disabled')
|
|
return
|
|
|
|
# set radio buttons to 'disabled' or 'normal':
|
|
def set_user_state(self, state):
|
|
self.radio1.config(state=state)
|
|
self.radio2.config(state=state)
|
|
self.radio3.config(state=state)
|
|
self.submit_btn.config(state=state)
|
|
return
|
|
|
|
|
|
def quit_game(self):
|
|
self.window.destroy()
|
|
|
|
# indicate that submit button was pressed:
|
|
def submit(self):
|
|
self.varsub.set(0)
|
|
|
|
# ************************************************
|
|
|
|
root = Tk()
|
|
root.title('21 Game')
|
|
root.geometry('600x600+100+50')
|
|
root.resizable(False, False)
|
|
g = Game(root)
|
|
root.mainloop()
|