In this video we’ll continue with our Tic Tac Toe game and create a scoreboard that keeps track of how many times X and O have won!
In the last video we looked at logic, in this video we’ll keep track of how often people won or lost the game.
This is pretty simple, we’ll just create a couple of variables, X_win and O_win, and increment them every time someone wins.
Then we’ll just output those variables to the screen in a label.
#kivy #codemy
Python Code: toe.py
GitHub Code: toe.py
from kivy.lang import Builder
from kivymd.app import MDApp
class MainApp(MDApp):
title = "Tic Tac Toe!"
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "BlueGray"
return Builder.load_file('toe.kv')
# Define Who's turn it is
turn = "X"
# Keep Track of win or lose
winner = False
# Keep track of winners and losers
X_win = 0
O_win = 0
# No Winner
def no_winner(self):
if self.winner == False and \
self.root.ids.btn1.disabled == True and \
self.root.ids.btn2.disabled == True and \
self.root.ids.btn3.disabled == True and \
self.root.ids.btn4.disabled == True and \
self.root.ids.btn5.disabled == True and \
self.root.ids.btn6.disabled == True and \
self.root.ids.btn7.disabled == True and \
self.root.ids.btn8.disabled == True and \
self.root.ids.btn9.disabled == True:
self.root.ids.score.text = "IT'S A TIE!!"
# End The Game
def end_game(self, a,b,c):
self.winner = True
a.color = "red"
b.color = "red"
c.color = "red"
# Disable the buttons
self.disable_all_buttons()
# Set Label for winner
self.root.ids.score.text = f"{a.text} Wins!"
# Keep track of winners and loser
if a.text == "X":
self.X_win = self.X_win + 1
else:
self.O_win = self.O_win + 1
self.root.ids.game.text = f"X Wins: {self.X_win} | O Wins: {self.O_win}"
def disable_all_buttons(self):
# Disable The Buttons
self.root.ids.btn1.disabled = True
self.root.ids.btn2.disabled = True
self.root.ids.btn3.disabled = True
self.root.ids.btn4.disabled = True
self.root.ids.btn5.disabled = True
self.root.ids.btn6.disabled = True
self.root.ids.btn7.disabled = True
self.root.ids.btn8.disabled = True
self.root.ids.btn9.disabled = True
def win(self):
# Across
if self.root.ids.btn1.text != "" and self.root.ids.btn1.text == self.root.ids.btn2.text and self.root.ids.btn2.text == self.root.ids.btn3.text:
self.end_game(self.root.ids.btn1, self.root.ids.btn2, self.root.ids.btn3)
if self.root.ids.btn4.text != "" and self.root.ids.btn4.text == self.root.ids.btn5.text and self.root.ids.btn5.text == self.root.ids.btn6.text:
self.end_game(self.root.ids.btn4, self.root.ids.btn5, self.root.ids.btn6)
if self.root.ids.btn7.text != "" and self.root.ids.btn7.text == self.root.ids.btn8.text and self.root.ids.btn8.text == self.root.ids.btn9.text:
self.end_game(self.root.ids.btn7, self.root.ids.btn8, self.root.ids.btn9)
# Down
if self.root.ids.btn1.text != "" and self.root.ids.btn1.text == self.root.ids.btn4.text and self.root.ids.btn4.text == self.root.ids.btn7.text:
self.end_game(self.root.ids.btn1, self.root.ids.btn4, self.root.ids.btn7)
if self.root.ids.btn2.text != "" and self.root.ids.btn2.text == self.root.ids.btn5.text and self.root.ids.btn5.text == self.root.ids.btn8.text:
self.end_game(self.root.ids.btn2, self.root.ids.btn5, self.root.ids.btn8)
if self.root.ids.btn3.text != "" and self.root.ids.btn3.text == self.root.ids.btn6.text and self.root.ids.btn6.text == self.root.ids.btn9.text:
self.end_game(self.root.ids.btn3, self.root.ids.btn6, self.root.ids.btn9)
# Diagonal
if self.root.ids.btn1.text != "" and self.root.ids.btn1.text == self.root.ids.btn5.text and self.root.ids.btn5.text == self.root.ids.btn9.text:
self.end_game(self.root.ids.btn1, self.root.ids.btn5, self.root.ids.btn9)
if self.root.ids.btn3.text != "" and self.root.ids.btn3.text == self.root.ids.btn5.text and self.root.ids.btn5.text == self.root.ids.btn7.text:
self.end_game(self.root.ids.btn3, self.root.ids.btn5, self.root.ids.btn7)
self.no_winner()
def presser(self, btn):
if self.turn == 'X':
btn.text = "X"
btn.disabled = True
self.root.ids.score.text = "O's Turn!"
self.turn = "O"
else:
btn.text = "O"
btn.disabled = True
self.root.ids.score.text = "X's Turn!"
self.turn = "X"
# Check To See if won
self.win()
def restart(self):
# Reset Who's Turn It Is
self.turn = "X"
# Enable The Buttons
self.root.ids.btn1.disabled = False
self.root.ids.btn2.disabled = False
self.root.ids.btn3.disabled = False
self.root.ids.btn4.disabled = False
self.root.ids.btn5.disabled = False
self.root.ids.btn6.disabled = False
self.root.ids.btn7.disabled = False
self.root.ids.btn8.disabled = False
self.root.ids.btn9.disabled = False
# Clear The Buttons
self.root.ids.btn1.text = ""
self.root.ids.btn2.text = ""
self.root.ids.btn3.text = ""
self.root.ids.btn4.text = ""
self.root.ids.btn5.text = ""
self.root.ids.btn6.text = ""
self.root.ids.btn7.text = ""
self.root.ids.btn8.text = ""
self.root.ids.btn9.text = ""
# Reset The Button Colors
self.root.ids.btn1.color = "green"
self.root.ids.btn2.color = "green"
self.root.ids.btn3.color = "green"
self.root.ids.btn4.color = "green"
self.root.ids.btn5.color = "green"
self.root.ids.btn6.color = "green"
self.root.ids.btn7.color = "green"
self.root.ids.btn8.color = "green"
self.root.ids.btn9.color = "green"
# Reset The Score Label
self.root.ids.score.text = "X GOES FIRST!"
# Reset The Winner Variable
self.winner = False
MainApp().run()
Kivy Design Code: toe.kv
GitHub Code: toe.kv
MDFloatLayout:
MDGridLayout:
size_hint: .5, .5
pos_hint: {'center_x': .5, 'center_y': .7}
cols: 3
rows: 3
Button:
id: btn1
text: ""
font_size: "45sp"
on_release: app.presser(btn1)
Button:
id: btn2
text: ""
font_size: "45sp"
on_release: app.presser(btn2)
Button:
id: btn3
text: ""
font_size: "45sp"
on_release: app.presser(btn3)
Button:
id: btn4
text: ""
font_size: "45sp"
on_release: app.presser(btn4)
Button:
id: btn5
text: ""
font_size: "45sp"
on_release: app.presser(btn5)
Button:
id: btn6
text: ""
font_size: "45sp"
on_release: app.presser(btn6)
Button:
id: btn7
text: ""
font_size: "45sp"
on_release: app.presser(btn7)
Button:
id: btn8
text: ""
font_size: "45sp"
on_release: app.presser(btn8)
Button:
id: btn9
text: ""
font_size: "45sp"
on_release: app.presser(btn9)
MDLabel:
id: score
font_size: "32sp"
text: "X GOES FIRST!"
halign: "center"
pos_hint: {"center_y": .3}
MDRaisedButton:
id: restart
text: "Restart The Game"
pos_hint: {'center_x': .5, 'center_y': .15}
on_release: app.restart()
MDLabel:
id: game
font_size: "14sp"
text: "X Wins: 0 | O Wins: 0"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .05}

Add comment