Playing computer games is a great way to unwind or challenge yourself. Some people even do it professionally. It’s also fun and educational to build your own computer games. In this tutorial, you’ll build a classic tic-tac-toe game using Python and Tkinter.
With this project, you’ll go through the thought processes required for creating your own game. You’ll also learn how to integrate your diverse programming skills and knowledge to develop a functional and fun computer game.
In this tutorial, you’ll learn how to:
- Program the classic tic-tac-toe game’s logic using Python
- Create the game’s graphical user interface (GUI) using the Tkinter tool kit
- Integrate the game’s logic and GUI into a fully functional computer game
As mentioned, you’ll be using the Tkinter GUI framework from the Python standard library to create your game’s interface. You’ll also use the model-view-controller pattern and an object-oriented approach to organize your code. For more on these concepts, check out the links in the prerequisites.
To download the entire source code for this project, click the link in the box below:
Get Source Code: Click here to get access to the source code that you’ll use to build your tic-tac-toe game.
Rules of Game
- Traditionally the first player plays with “X”. So you can decide who wants to go with “X” and who wants to go with “O”.
- Only one player can play at a time.
- If any of the players have filled a square, then the other player and the same player cannot override that square.
- There are only two conditions that may match will be a draw or may win.
- The player who succeeds in placing three respective marks (X or O) in a horizontal, vertical, or diagonal row wins the game.
Requirements
The requirement for building the tic tac toe python are listed below:
- Good knowledge of Python Basics and refreshing the topics as mentioned under the subheading Pre-requisites.
- Command line Interface or any local Terminal to build the tic tac toe python.
- Text editor: We can use either VSCode Python 3 installed on your machine or we can implement the source code with any Python online compiler as well.
Demo: A Tic-Tac-Toe Game in Python
In this step-by-step project, you’ll build a tic-tac-toe game in Python. You’ll use the Tkinter tool kit from the Python standard library to create the game’s GUI. In the following demo video, you’ll get a sense of how your game will work once you’ve completed this tutorial:
Your tic-tac-toe game will have an interface that reproduces the classic three-by-three game board. The players will take turns making their moves on a shared device. The game display at the top of the window will show the name of the player who gets to go next.
If a player wins, then the game display will show a winning message with the player’s name or mark (X or O). At the same time, the winning combination of cells will be highlighted on the board.
Finally, the game’s File menu will have options to reset the game if you want to play again or to exit the game when you’re done playing.
If this sounds like a fun project to you, then read on to get started!
Prerequisites
To complete this tic-tac-toe game project, you should be comfortable or at least familiar with the concepts and topics covered in the following resources:
- Python GUI Programming With Tkinter
- Object-Oriented Programming (OOP) in Python 3
- Python “for” Loops (Definite Iteration)
- When to Use a List Comprehension in Python
- Model-View-Controller (MVC) Explained – With Legos
- Dictionaries in Python
- How to Iterate Through a Dictionary in Python
- Main Functions in Python
- Write Pythonic and Clean Code With namedtuple
If you don’t have all of the suggested knowledge before starting this tutorial, that’s okay. You’ll learn by doing, so go ahead and give it a whirl! You can always stop and review the resources linked here if you get stuck.
Step 1: Set Up the Tic-Tac-Toe Game Board With Tkinter
To kick things off, you’ll start by creating the game board. Before doing this, you need to decide how to organize the code for your tic-tac-toe game. Because this project will be fairly small, you can initially keep all the code in a single
.py
file. This way, running the code and executing your game will be more straighforward.
Go ahead and fire up your favorite code editor or IDE. Then create a
tic_tac_toe.py
file in your current working directory:
# tic_tac_toe.py """A tic-tac-toe game built with Python and Tkinter."""
Throughout this tutorial, you’ll be incrementally adding code to this file, so keep it open and near. If you want to get the entire code for this tic-tac-toe game project, then you can click the following collapsible section and copy the code from it:
"""A tic-tac-toe game built with Python and Tkinter.""" import tkinter as tk from itertools import cycle from tkinter import font from typing import NamedTuple class Player(NamedTuple): label: str color: str class Move(NamedTuple): row: int col: int label: str = "" BOARD_SIZE = 3 DEFAULT_PLAYERS = ( Player(label="X", color="blue"), Player(label="O", color="green"), ) class TicTacToeGame: def __init__(self, players=DEFAULT_PLAYERS, board_size=BOARD_SIZE): self._players = cycle(players) self.board_size = board_size self.current_player = next(self._players) self.winner_combo = [] self._current_moves = [] self._has_winner = False self._winning_combos = [] self._setup_board() def _setup_board(self): self._current_moves = [ [Move(row, col) for col in range(self.board_size)] for row in range(self.board_size) ] self._winning_combos = self._get_winning_combos() def _get_winning_combos(self): rows = [ [(move.row, move.col) for move in row] for row in self._current_moves ] columns = [list(col) for col in zip(*rows)] first_diagonal = [row[i] for i, row in enumerate(rows)] second_diagonal = [col[j] for j, col in enumerate(reversed(columns))] return rows + columns + [first_diagonal, second_diagonal] def toggle_player(self): """Return a toggled player.""" self.current_player = next(self._players) def is_valid_move(self, move): """Return True if move is valid, and False otherwise.""" row, col = move.row, move.col move_was_not_played = self._current_moves[row][col].label == "" no_winner = not self._has_winner return no_winner and move_was_not_played def process_move(self, move): """Process the current move and check if it's a win.""" row, col = move.row, move.col self._current_moves[row][col] = move for combo in self._winning_combos: results = set(self._current_moves[n][m].label for n, m in combo) is_win = (len(results) == 1) and ("" not in results) if is_win: self._has_winner = True self.winner_combo = combo break def has_winner(self): """Return True if the game has a winner, and False otherwise.""" return self._has_winner def is_tied(self): """Return True if the game is tied, and False otherwise.""" no_winner = not self._has_winner played_moves = ( move.label for row in self._current_moves for move in row ) return no_winner and all(played_moves) def reset_game(self): """Reset the game state to play again.""" for row, row_content in enumerate(self._current_moves): for col, _ in enumerate(row_content): row_content[col] = Move(row, col) self._has_winner = False self.winner_combo = [] class TicTacToeBoard(tk.Tk): def __init__(self, game): super().__init__() self.title("Tic-Tac-Toe Game") self._cells = {} self._game = game self._create_menu() self._create_board_display() self._create_board_grid() def _create_menu(self): menu_bar = tk.Menu(master=self) self.config(menu=menu_bar) file_menu = tk.Menu(master=menu_bar) file_menu.add_command(label="Play Again", command=self.reset_board) file_menu.add_separator() file_menu.add_command(label="Exit", command=quit) menu_bar.add_cascade(label="File", menu=file_menu) def _create_board_display(self): display_frame = tk.Frame(master=self) display_frame.pack(fill=tk.X) self.display = tk.Label( master=display_frame, text="Ready?", font=font.Font(size=28, weight="bold"), ) self.display.pack() def _create_board_grid(self): grid_frame = tk.Frame(master=self) grid_frame.pack() for row in range(self._game.board_size): self.rowconfigure(row, weight=1, minsize=50) self.columnconfigure(row, weight=1, minsize=75) for col in range(self._game.board_size): button = tk.Button( master=grid_frame, text="", font=font.Font(size=36, weight="bold"), fg="black", width=3, height=2, highlightbackground="lightblue", ) self._cells[button] = (row, col) button.bind("
", self.play) button.grid(row=row, column=col, padx=5, pady=5, sticky="nsew") def play(self, event): """Handle a player's move.""" clicked_btn = event.widget row, col = self._cells[clicked_btn] move = Move(row, col, self._game.current_player.label) if self._game.is_valid_move(move): self._update_button(clicked_btn) self._game.process_move(move) if self._game.is_tied(): self._update_display(msg="Tied game!", color="red") elif self._game.has_winner(): self._highlight_cells() msg = f'Player "{self._game.current_player.label}" won!' color = self._game.current_player.color self._update_display(msg, color) else: self._game.toggle_player() msg = f"{self._game.current_player.label}'s turn" self._update_display(msg) def _update_button(self, clicked_btn): clicked_btn.config(text=self._game.current_player.label) clicked_btn.config(fg=self._game.current_player.color) def _update_display(self, msg, color="black"): self.display["text"] = msg self.display["fg"] = color def _highlight_cells(self): for button, coordinates in self._cells.items(): if coordinates in self._game.winner_combo: button.config(highlightbackground="red") def reset_board(self): """Reset the game's board to play again.""" self._game.reset_game() self._update_display(msg="Ready?") for button in self._cells.keys(): button.config(highlightbackground="lightblue") button.config(text="") button.config(fg="black") def main(): """Create the game's board and run its main loop.""" game = TicTacToeGame() board = TicTacToeBoard(game) board.mainloop() if __name__ == "__main__": main()
Having the entire source code beforehand will allow you to check your progress while going through the tutorial.
Alternatively, you can also download the game source code from GitHub by clicking the link in the box below:
Get Source Code: Click here to get access to the source code that you’ll use to build your tic-tac-toe game.
Now that you know what the game’s final code will look like, it’s time to make sure you have the right Tkinter version for this project. Then, you’ll go ahead and create your game board.
Ensure the Right Tkinter Version
To complete this project, you’ll use a standard Python installation. There’s no need to create a virtual environment because no external dependency is required. The only package that you’ll need is Tkinter, which comes with the Python standard library.
However, you need to make sure that you have the right Tkinter version installed. You should have Tkinter greater than or equal to 8.6. Otherwise, your game won’t work.
You can check your current Tkinter version by starting a Python interactive session and running the following code:
>>> import tkinter >>> tkinter.TkVersion 8.6
If this code doesn’t show a version greater than or equal to 8.6 for your Tkinter installation, then you’ll need to fix that.
On Ubuntu Linux, you may need to install the
python3-tk
package using the system’s package manager,
apt
. That’s because typically Ubuntu doesn’t include Tkinter in its default Python installation.
Once you have Tkinter properly installed, then you need to check its current version. If the Tkinter version is lower than 8.6, then you’ll have to install a more recent version of Python either by downloading it from the official download page or by using a tool like pyenv or Docker.
On macOS and Windows, a straightforward option is to install a Python version greater than or equal to 3.9.8 from the download page.
Once you’re sure you have the right Tkinter version, you can get back to your code editor and start writing code. You’ll begin with the Python class that’ll represent the tic-tac-toe game board.
Create a Class to Represent the Game Board
To build the board of your tic-tac-toe game, you’ll use the
Tk
class, which allows you to create the main window of your Tkinter app. Then you’ll add a display on a top frame and a grid of cells covering the rest of the main window.
Go ahead and import the required objects and define the board class:
# tic_tac_toe.py import tkinter as tk from tkinter import font class TicTacToeBoard(tk.Tk): def __init__(self): super().__init__() self.title("Tic-Tac-Toe Game") self._cells = {}
In this code snippet, you first import
tkinter
as
tk
to bring the module’s name to your current namespace. Using the
tk
abbreviation is a common practice when it comes to using Tkinter in your code.
Then you import the
font
module directly from
tkinter
. You’ll use this module later in this tutorial to tweak the font of your game display.
The
TicTacToeBoard
class inherits from
Tk
, which makes it a full-fledged GUI window. This window will represent the game board. Inside
.__init__()
, you first call the superclass’s
.__init__()
method to properly initialize the parent class. To do this, you use the built-in super() function.
The
.title
attribute of
Tk
defines the text to show on the window’s title bar. In this example, you set the title to the
"Tic-Tac-Toe Game"
string.
The
._cells
non-public attribute holds an initially empty dictionary. This dictionary will map the buttons or cells on the game board to their corresponding coordinates—row and column—on the grid. These coordinates will be integer numbers reflecting the row and column where a given button will appear.
To continue with the game board, you now need to create a display where you can provide information about the game’s state and result. For this display, you’ll use a
Frame
widget as the display panel and a
Label
widget to show the required information.
Note: The line numbers in the code samples in this tutorial are intended to facilitate the explanation. Most of the time, they won’t match the line numbers in your final script.
Now go ahead and add the following method to your
TicTacToeBoard
class:
1# tic_tac_toe.py 2# ... 3 4class TicTacToeBoard(tk.Tk): 5 # ... 6 7 def _create_board_display(self): 8 display_frame = tk.Frame(master=self) 9 display_frame.pack(fill=tk.X) 10 self.display = tk.Label( 11 master=display_frame, 12 text="Ready?", 13 font=font.Font(size=28, weight="bold"), 14 ) 15 self.display.pack()
Here’s a breakdown of what this method does line by line:
-
Line 8 creates a
Frame
object to hold the game display. Note that the
master
argument is set to
self
, which means that the game’s main window will be the frame’s parent. -
Line 9 uses the
.pack()
geometry manager to place the frame object on the main window’s top border. By setting the
fill
argument to
tk.X
, you ensure that when the user resizes the window, the frame will fill its entire width. -
Lines 10 to 14 create a
Label
object. This label needs to live inside the frame object, so you set its
master
argument to the actual frame. The label will initially show the text
"Ready?"
, which indicates that the game is ready to go, and the players can start a new match. Finally, you change the label’s font size to
28
pixels and make it bold. -
Line 15 packs the display label inside the frame using the
.pack()
geometry manager.
Cool! You already have the game display. Now you can create the grid of cells. A classic tic-tac-toe game has a three-by-three grid of cells.
Here’s a method that creates the grid of cells using
Button
objects:
1# tic_tac_toe.py 2# ... 3 4class TicTacToeBoard(tk.Tk): 5 # ... 6 7 def _create_board_grid(self): 8 grid_frame = tk.Frame(master=self) 9 grid_frame.pack() 10 for row in range(3): 11 self.rowconfigure(row, weight=1, minsize=50) 12 self.columnconfigure(row, weight=1, minsize=75) 13 for col in range(3): 14 button = tk.Button( 15 master=grid_frame, 16 text="", 17 font=font.Font(size=36, weight="bold"), 18 fg="black", 19 width=3, 20 height=2, 21 highlightbackground="lightblue", 22 ) 23 self._cells[button] = (row, col) 24 button.grid( 25 row=row, 26 column=col, 27 padx=5, 28 pady=5, 29 sticky="nsew" 30 )
Wow! This method does a lot! Here’s an explanation of what each line does:
-
Line 8 creates a
Frame
object to hold the game’s grid of cells. You set the
master
argument to
self
, which again means that the game’s main window will be the parent of this frame object. -
Line 9 uses the
.pack()
geometry manager to place the frame object on the main window. This frame will occupy the area under the game display, all the way to the bottom of the window. -
Line 10 starts a loop that iterates from
to. These numbers represent the row coordinates of each cell in the grid. For now, you’ll haverows on the grid. However, you’ll change this magic number later and provide the option of using a different grid size, such as four by four.
-
Line 11 and 12 configure the width and minimum size of every cell on the grid.
-
Line 13 loops over the three column coordinates. Again you use three columns, but you’ll change this number later to provide more flexibility and get rid of magic numbers.
-
Lines 14 to 22 create a
Button
object for every cell on the grid. Note that you set several attributes, including
master
,
text
,
font
, and so on. -
Line 23 adds every new button to the
._cells
dictionary. The buttons work as keys, and their coordinates—expressed as
(row, col)
—work as values. -
Lines 24 to 30 finally add every button to the main window using the
.grid()
geometry manager.
Now that you’ve implemented
._create_board_display()
and
._create_board_grid()
, you can call them from the class initializer. Go ahead and add the following two lines to
.__init__()
in your
TicTacToeBoard
class:
# tic_tac_toe.py # ... class TicTacToeBoard(tk.Tk): def __init__(self): super().__init__() self.title("Tic-Tac-Toe Game") self._cells = {} self._create_board_display() self._create_board_grid()
These two lines put together the game board by adding the display and grid of cells. Isn’t that cool?
With these updates, you can almost run your app and see how your tic-tac-toe game will look. You just need to write a few more lines of boilerplate code. You need to instantiate
TicTacToeBoard
and call its
.mainloop()
method to launch your Tkinter app.
Go ahead and add the following piece of code to the end of your
tic_tac_toe.py
file:
# tic_tac_toe.py # ... def main(): """Create the game's board and run its main loop.""" board = TicTacToeBoard() board.mainloop() if __name__ == "__main__": main()
This code snippet defines a
main()
function for your game. Inside this function, you first instantiate
TicTacToeBoard
and then run its main loop by calling
.mainloop()
.
The
if __name__ == "__main__":
construct is a common pattern in Python applications. It allows you to control the execution of your code. In this case, the call to
main()
will only happen if you run the
.py
file as an executable program, as opposed to an importable module.
That’s it! You’re now ready to run your game for the first time. Of course, the game isn’t playable yet, but the board is ready. To run the game, go ahead and execute the following command on your command line:
$ python tic_tac_toe.py
Once you’ve run this command, then you’ll get the following window on your screen:
Cool! Your tic-tac-toe game is starting to look like the real thing. Now you need to make this window respond to the players’ actions on the board.
Project Overview
Your goal with this project is to create a tic-tac-toe game in Python. For the game interface, you’ll use the Tkinter GUI tool kit, which comes in the standard Python installation as an included battery.
The tic-tac-toe game is for two players. One player plays X and the other plays O. The players take turns placing their marks on a grid of three-by-three cells. If a given player gets three marks in a row horizontally, vertically, or diagonally, then that player wins the game. The game will be tied if no one gets three in a row by the time all the cells are marked.
With these rules in mind, you’ll need to put together the following game components:
-
The game’s board, which you’ll build with a class called
TicTacToeBoard
-
The game’s logic, which you’ll manage using a class called
TicTacToeGame
The game board will work as a mix between view and controller in a model-view-controller design. To build the board, you’ll use a Tkinter window, which you can create by instantiating the
tkinter.Tk
class. This window will have two main components:
- Top display: Shows information about the game’s status
- Grid of cells: Represents previous moves and available spaces or cells
You’ll create the game display using a
tkinter.Label
widget, which allows you to display text and images.
For the grid of cells, you’ll use a series of
tkinter.Button
widgets arranged in a grid. When a player clicks one of these buttons, the game logic will run to process the player’s move and determine whether there’s a winner. In this case, the game logic will work as the model, which will manage the data, logic, and rules of your game.
Now that you have a general idea of how to build your tic-tac-toe game, you should check out a few knowledge prerequisites that’ll allow you to get the most out of this tutorial.
Step 5: Provide Options to Play Again and Exit the Game
In this section, you’ll provide your tic-tac-toe game with a main menu. This menu will have an option to restart the game so that the players can start another match. It’ll also have an option to exit the game once the players have finished playing.
Main menus are often an essential component of many GUI applications. So, learning how to create them in Tkinter is a good exercise to improve your GUI-related skills beyond the game development itself.
This is an example of how building your own games is a powerful learning experience because it allows you to integrate knowledge and skills that you can later use in other non-game projects.
The complete source code for this step is available for download. Just click the link below and navigate to the
source_code_step_5/
folder:
Get Source Code: Click here to get access to the source code that you’ll use to build your tic-tac-toe game.
Build the Game’s Main Menu
To add a main menu to a Tkinter application, you can use the
tkinter.Menu
class. This class allows you to create a menu bar on top of your Tkinter window. It also allows you to add dropdown menus to the menu bar.
Here’s the code that creates and adds a main menu to your tic-tac-toe game:
1# tic_tac_toe.py 2# ... 3 4class TicTacToeBoard(tk.Tk): 5 def __init__(self, game): 6 # ... 7 8 def _create_menu(self): 9 menu_bar = tk.Menu(master=self) 10 self.config(menu=menu_bar) 11 file_menu = tk.Menu(master=menu_bar) 12 file_menu.add_command( 13 label="Play Again", 14 command=self.reset_board 15 ) 16 file_menu.add_separator() 17 file_menu.add_command(label="Exit", command=quit) 18 menu_bar.add_cascade(label="File", menu=file_menu)
Here’s what this code does line by line:
-
Line 8 defines a helper method called
._create_menu()
to handle the menu creation in a single place. -
Line 9 creates an instance of
Menu
, which will work as the menu bar. -
Line 10 sets the menu bar object as the main menu of your current Tkinter window.
-
Line 11 creates another instance of
Menu
to provide a File menu. Note that the
master
argument in the class constructor is set to your menu bar object. -
Lines 12 to 15 add a new menu option to the File menu using the
.add_command()
method. This new option will have the label
"Play Again"
. When a user clicks this option, the application will run the
.reset_board()
method, which you provided through the
command
argument. You’ll write this method in the following section. -
Line 16 adds a menu separator using the
.add_separator()
method. Separators are useful when you need to separate groups of related commands in a given dropdown menu. -
Line 17 adds an Exit command to the File menu. This command will make the game exit by calling the
quit()
function. -
Line 18 finally adds the File menu to the menu bar by calling
.add_cascade()
with appropriate arguments.
To actually add the main menu to your game’s main window, you need to call
._create_menu()
from the initializer of
TicTacToeBoard
. So, go ahead and add the following line to the class’s
.__init__()
method:
# tic_tac_toe.py # ... class TicTacToeBoard(tk.Tk): def __init__(self, game): super().__init__() self.title("Tic-Tac-Toe Game") self._cells = {} self._game = game self._create_menu() self._create_board_display() self._create_board_grid() # ...
With this final update, your game’s main menu is almost ready for use. However, before using it, you must implement the
.reset_board()
method. That’s what you’ll do in the following section in order to allow the players to play again.
Implement the Play Again Option
To reset the game board and allow the players to play again, you need to add code to both classes,
TicTacToeGame
and
TicTacToeBoard
.
In the game logic class, you need to reset the
._current_moves
attribute to hold a list of initially empty
Move
objects. You also need to reset the
._has_winner
and
.winner_combo
to their initial state. On the other hand, in the game board class, you need to reset the board display and cells to their initial state.
Get back to
TicTacToeGame
in your code editor and add the following method right at the end of the class:
# tic_tac_toe.py # ... class TicTacToeGame(tk.Tk): # ... def reset_game(self): """Reset the game state to play again.""" for row, row_content in enumerate(self._current_moves): for col, _ in enumerate(row_content): row_content[col] = Move(row, col) self._has_winner = False self.winner_combo = []
The
for
loop in
.reset_game()
sets all the current moves to an empty
Move
object. An empty move’s main characteristic is that its
.label
attribute holds the empty string,
""
.
After updating the current moves, the methods sets
._has_winner
to
False
and
.winner_combo
to an empty list. These three resets ensure that the game’s abstract representation is ready to start a new match.
Note that
reset_game()
doesn’t reset the player back to X when preparing the game for a new match. Typically, the winner of the previous match gets to go first in the next one. So, there’s no need to reset the player here.
Once you’ve provided the required new functionality in the game logic, then you’re ready to update the game board functionality. Go ahead and add the following method to the end of
TicTacToeBoard
:
1# tic_tac_toe.py 2# ... 3 4class TicTacToeBoard(tk.Tk): 5 # ... 6 7 def reset_board(self): 8 """Reset the game's board to play again.""" 9 self._game.reset_game() 10 self._update_display(msg="Ready?") 11 for button in self._cells.keys(): 12 button.config(highlightbackground="lightblue") 13 button.config(text="") 14 button.config(fg="black")
This
.reset_board()
method works as follows:
-
Line 9 calls
.reset_game()
to reset the board’s abstract representation. -
Line 10 updates the board display to hold the initial text,
"Ready?"
. -
Line 11 starts a loop over the buttons on the board grid.
-
Lines 12 to 14 restore every button’s
highlightbackground
,
text
, and
fg
properties to their initial state.
That’s it! With this last feature, your tic-tac-toe game project is complete. Go ahead and give it a try!
Next Steps
The tic-tac-toe game that you implemented in this tutorial is fairly bare-bones. However, you can expand it in several different and fun ways. Some ideas to take this game project to the next level include allowing your users to:
- Use a different game board size
- Play against the computer
What other ideas can you come up with to extend this project? Be creative and have fun!
Now that you’ve completed this project, here are some additional great projects to continue building your own games with Python:
-
Make Your First Python Game: Rock, Paper, Scissors!: In this tutorial, you’ll learn to program rock paper scissors in Python from scratch. You’ll learn how to take in user input, make the computer choose a random action, determine a winner, and split your code into functions.
-
PyGame: A Primer on Game Programming in Python: In this step-by-step tutorial, you’ll learn how to use PyGame. This library allows you to create games and rich multimedia programs in Python. You’ll learn how to draw items on your screen, implement collision detection, handle user input, and much more!
-
Build an Asteroids Game With Python and Pygame: This article will show you how to create a game in PyGame!
-
Arcade: A Primer on the Python Game Framework: This article is a excellent follow-up because it shows you another Python game framework that allows you to create more complex games.
-
Build a Platform Game in Python With Arcade: In this step-by-step tutorial, you’ll build a platform game in Python using the arcade library. You’ll cover techniques for designing levels, sourcing assets, and implementing advanced features.
-
Build a Tic-Tac-Toe Game Engine With an AI Player in Python: In this step-by-step tutorial, you’ll build a universal game engine in Python with tic-tac-toe rules and two computer players, including an unbeatable AI player using the minimax algorithm.
Step 3: Process the Players’ Moves on the Game’s Logic
In this tic-tac-toe game, you’ll mostly handle one type of event: players’ moves. Translated to Tkinter terms, a player’s move is just a click on the selected cell, which is represented by a button widget.
Every player’s move will trigger a bunch of operations on the
TicTacToeGame
class. These operations include:
- Validating the move
- Checking for a winner
- Checking for a tied game
- Toggling the player for the next move
In the following sections, you’ll write the code to handle all these operations in your
TicTacToeGame
class.
To download the source code for this step from GitHub, click the link below and navigate to the
source_code_step_3/
folder:
Get Source Code: Click here to get access to the source code that you’ll use to build your tic-tac-toe game.
Validate Players’ Moves
You need to validate the move every time a player clicks a given cell on the tic-tac-toe board. The question is: What defines a valid move? Well, at least two conditions make a move valid. Players can only play if:
- The game doesn’t have a winner.
- The selected move hasn’t already been played.
Go ahead and add the following method to the end of
TicTacToeGame
:
1# tic_tac_toe.py 2# ... 3 4class TicTacToeGame: 5 # ... 6 7 def is_valid_move(self, move): 8 """Return True if move is valid, and False otherwise.""" 9 row, col = move.row, move.col 10 move_was_not_played = self._current_moves[row][col].label == "" 11 no_winner = not self._has_winner 12 return no_winner and move_was_not_played
The
.is_valid_move()
method takes a
Move
object as an argument. Here’s what the rest of the method does:
-
Line 9 gets the
.row
and
.col
coordinates from the input
move
. -
Line 10 checks if the move at the current coordinates,
[row][col]
, still holds an empty string as its label. This condition will be
True
if no player has made the input
move
before. -
Line 11 checks if the game doesn’t have a winner yet.
This method returns a Boolean value that results from checking if the game has no winner and the current move hasn’t been played yet.
Process Players’ Moves to Find a Winner
Now it’s time for you to determine if a player has won the game after their last move. This may be your chief concern as the game designer. Of course, you’ll have many different ways to find out if a given player has won the game.
In this project, you’ll use the following ideas to determine the winner:
-
Every cell on the game board has an associated
Move
object. -
Each
Move
object has a
.label
attribute that identifies the player who has made the move.
To find out if the last player has won the game, you’ll check if the player’s label is present in all the possible moves contained in a given winning combination.
Go ahead and add the following method to your
TicTacToeGame
class:
1# tic_tac_toe.py 2# ... 3 4class TicTacToeGame: 5 # ... 6 7 def process_move(self, move): 8 """Process the current move and check if it's a win.""" 9 row, col = move.row, move.col 10 self._current_moves[row][col] = move 11 for combo in self._winning_combos: 12 results = set( 13 self._current_moves[n][m].label 14 for n, m in combo 15 ) 16 is_win = (len(results) == 1) and ("" not in results) 17 if is_win: 18 self._has_winner = True 19 self.winner_combo = combo 20 break
Here’s a breakdown of what this new method does line by line:
-
Line 7 defines
process_move()
, which takes a
Move
object as an argument. -
Line 9 gets the
.row
and
.col
coordinates from the input
move
. -
Line 10 assigns the input
move
to the item at
[row][col]
in the list of current moves. -
Line 11 starts a loop over the winning combinations.
-
Lines 12 to 15 run a generator expression that retrieves all the labels from the moves in the current winning combination. The result is then converted into a
set
object. -
Line 16 defines a Boolean expression that checks if the current move determined a win or not. The result is stored in
is_win
. -
Line 17 checks the content of
is_win
. If the variable holds
True
, then
._has_winner
is set to
True
and
.winner_combo
is set to the current combination. Then the loop breaks and the function terminates.
On lines 12 to 16, a few points and ideas need clarification. To better understand lines 12 to 15, say that all the labels in the moves associated with the cells of the current winning combination hold an X. In that case, the generator expression will yield three X labels.
When you feed the built-in
set()
function with several instances of X, you get a set with a single instance of X. Sets don’t allow repeated values.
So, if the set in
results
contains a single value different from the empty string, then you have a winner. In this example, that winner would be the player with the X label. Line 16 checks both of these conditions.
To wrap up the topic of finding the winner of your tic-tac-toe game, go ahead and add the following method at the end of your
TicTacToeGame
class:
# tic_tac_toe.py # ... class TicTacToeGame: # ... def has_winner(self): """Return True if the game has a winner, and False otherwise.""" return self._has_winner
This method returns the Boolean value stored in
._has_winner
whenever you need to check if the current match has a winner or not. You’ll use this method later in this tutorial.
Check for Tied Games
In the tic-tac-toe game, if the players play on all the cells and there’s no winner, then the game is tied. So, you have two conditions to check before declaring the game as tied:
- All possible moves have been played.
- The game has no winner.
Go ahead and add the following method at the end of
TicTacToeGame
to check these conditions:
# tic_tac_toe.py # ... class TicTacToeGame: # ... def is_tied(self): """Return True if the game is tied, and False otherwise.""" no_winner = not self._has_winner played_moves = ( move.label for row in self._current_moves for move in row ) return no_winner and all(played_moves)
Inside
.is_tied()
, you first check if the game has no winner yet. Then you use the built-in
all()
function to check if all the moves in
._current_moves
have a label different from the empty string. If this is the case, then all the possible cells have already been played. If both conditions are true, then the game is tied.
Toggle Players Between Turns
Every time a player makes a valid move, you need to toggle the current player so that the other player can make the next move. To provide this functionality, go ahead and add the following method to your
TicTacToeGame
class:
# tic_tac_toe.py # ... class TicTacToeGame: # ... def toggle_player(self): """Return a toggled player.""" self.current_player = next(self._players)
Because
._players
holds an iterator that cyclically loops over the two default players, you can call
next()
on this iterator to get the next player whenever you need it. This toggling mechanism will allow the next player to take their turn and continue the game.
What We are building?
We will be implementing our Python knowledge learned so far from the scaler module link to Python module, to build, the project called the tic tac toe Python. Here we will be dividing the tic tac toe Python project into various steps to ease the understanding while parallelly building the game.
Tic tac toe Python, also known as Noughts and Crosses or Xs and Os, is a very simple two-player game where both the player get to choose any of the symbols between X and O. This game is played on a 3X3 grid board and one by one each player gets a chance to mark its respective symbol on the empty spaces of the grid. Once a player is successful in marking a strike of the same symbol either in the horizontal, vertical or diagonal way as shown in the picture below is created that player wins the game else the game goes on a draw if all the spots are filled.
Learn to Play tic tac toe Python
In the tic tac toe Python game that we shall be building, we require two players. These two players will be selecting their respective two signs which are generally used in the game that is, X and O. The two players draw the X and O on an alternative basis on the 3×3 grid having 9 empty boxes as shown below.
The game is played by drawing X and O in each box one by one for each player. The player who chose X starts the game. Once any player is successful in marking a strike of the same symbol either in the row-wise or column-wise or diagonally way as shown in the picture below is created that player wins the game else the game goes on a draw if all the spots are filled.
The players play the game as follows:
In total there are 8 ways to place the same sign to win the game. In the diagram below we can see all 8 arrangements.
When the 9 boxes get filled up without any winning arrangement then the game is said to be DRAW.
We can increase the complexity of the game by increasing the number of grids as well. We can create an automatic version of the game program as well which won’t require any input from the user. This would not take away the fun involved with the game and building the game from scratch would be a lot of fun too.
While implementing the interesting tic tac tow Python project we can use NumPy, pygame, or random Python libraries. With the below module, we shall be dividing the tic tac toe Python project into multiple steps to keep a parallel track of our game implementation alongside learning the concepts behind what we are doing and how we are implementing the project. We are not going to build those heavy games but we are building the tic tac toe Python project on the CLI or the command line interface.
Pre-requisites
The major topics that must be refreshed before creating and building the tic tac toe Python project are as follows:
- Basic concepts of Python
- User define functions in Python
- Loops in Python (for loop, if else, if elif else)
- try-exception block in Python
- while loop of Python
How are we Going to Build the Tic Tac Toe Python Project?
The algorithm that we shall be following to build the tic tac toe Python project is as below:
- We shall start by designing the tic tac toe Python grid for which we shall be using the command line interface as implementing tic tac toe in Python using CLI comes in handy. We shall be using the user-defined function and print statements in Python.
- Then we shall be using the Data Structure to Store Data using the user-defined function in Python as it’s very important to understand the dynamics of the game. For this, we shall be knowing about two parts that are, The Status of the Grid and The move of each player.
- After this we need to understand the game loop where we shall understand if the player has played their move without any exceptions.
- Then we all implement the information about the game from time to time to record what is the status of the game.
- It’s very important to mark out the win or lose situations for which we should be creating a user-defined function in Python and will be implementing if statements in Python to check if after every move the game has been won or tied by any player.
- As this game is between two players our program needs to understand the same for we shall be using loops in Python to make this tic tac toe Python game give the player its chance alternatively.
- In this step we shall be capturing the names of the player as we want our tic tac toe Python project to showcase a proper scorecard at the end of the game to display the name of the winner alongside.
- After every move by the player we need to record the available chances the player holds to avoid any mismanagement by our tic tac toe Python project.
- As we want to showcase the Winner of the game at the end, we will be recording the points earned by each player and creating a scoreboard around it we need to create that in this step.
- We need our tic tac tor Python project to be flexible enough to allow the player to play as many matches as they want hence we shall be creating an outer loop of the game in this step.
- After each alternative chance as we want our code to handle and store the selection of the current player we shall be using the try-exception block in Python to handle any exception if encountered for the selection of the player inputs.
- The final step is to execute our entire program to help both the player play the game and record their victories too.
Final Output
The final project shall look like this where we can see the tic tac toe Python project after execution.
Output :
Tic Tac Toe
The tutorial is divided into three different sections. In the first section, you will get to know how to play the tic-tac-toe game. After that, we will see an algorithm that helps us to come up with the game logic. Finally, we will see the structured code and its explanation.
You may skip the first section if you already know how to play Tic Tac Toe.
So, without further ado, let’s dive into our first section.
Playing Tic Tac Toe
There will be two players in a game. Two signs represent each player. The general signs used in the game are X and O. Finally, there will be a board with 9 boxes.
See the tic-tac-toe board visually.
The gameplay will be as follows.
- First, one user will place their sign in one of the available empty boxes.
- Next, the second user will place their sign in one of the available empty boxes.
- The goal of the players is to place their respective signs completely row-wise or column-wise, or diagonally.
- The game goes on until a player wins the game or it ended up in a draw by filling all boxes without a winning match.
Let’s see some gameplays visually.
The player X wins the game in the above gameplay. All boxes diagonally fill with X signs. So, the respective player wins the game.
There are a total of 8 ways to arrange the same sign and win the game. Let’s see all the 8 arrangements that can win the game.
And finally, a draw fills the board without any winning arrangement. I hope you understand how to Tic Tac Toe now.
Now, it’s playtime for you. You may go here and play it to understand the gameplay completely. Leave it if you have already got it.
Now, it’s time to move the algorithm section.
Algorithm
We will now discuss the algorithm to write the code. This algorithm will help you to write code in any programming language of your choice. Let’s see how it’s done.
-
Create a board using a 2-dimensional array and initialize each element as empty.
-
You can represent empty using any symbol you like. Here, we are going to use a hyphen.
'-'
.
-
You can represent empty using any symbol you like. Here, we are going to use a hyphen.
- You can represent empty using any symbol you like. Here, we are going to use a hyphen.
-
Write a function to check whether the board is filled or not.
-
Iterate over the board and return
false
if the board contains an empty sign or else return
true
.
-
Iterate over the board and return
- Iterate over the board and return
-
Write a function to check whether a player has won or not.
- We have to check all the possibilities that we discussed in the previous section.
- Check for all the rows, columns, and two diagonals.
- Write a function to show the board as we will show the board multiple times to the users while they are playing.
-
Write a function to start the game.
- Select the first turn of the player randomly.
-
Write an infinite loop that breaks when the game is over (either win or draw).
- Show the board to the user to select the spot for the next move.
- Ask the user to enter the row and column number.
- Update the spot with the respective player sign.
- Check whether the current player won the game or not.
- If the current player won the game, then print a winning message and break the infinite loop.
- Next, check whether the board is filled or not.
- If the board is filled, then print the draw message and break the infinite loop.
- Finally, show the user the final view of the board.
You may be able to visualize what’s happening. Don’t worry, even if you didn’t understand it completely. You will get more clarity once you see the code.
So, let’s jump into the code section. I assume you have Python installed on your PC to try the code.
Code
Go through the below code.
import random class TicTacToe: def __init__(self): self.board = [] def create_board(self): for i in range(3): row = [] for j in range(3): row.append('-') self.board.append(row) def get_random_first_player(self): return random.randint(0, 1) def fix_spot(self, row, col, player): self.board[row][col] = player def is_player_win(self, player): win = None n = len(self.board) # checking rows for i in range(n): win = True for j in range(n): if self.board[i][j] != player: win = False break if win: return win # checking columns for i in range(n): win = True for j in range(n): if self.board[j][i] != player: win = False break if win: return win # checking diagonals win = True for i in range(n): if self.board[i][i] != player: win = False break if win: return win win = True for i in range(n): if self.board[i][n - 1 - i] != player: win = False break if win: return win return False for row in self.board: for item in row: if item == '-': return False return True def is_board_filled(self): for row in self.board: for item in row: if item == '-': return False return True def swap_player_turn(self, player): return 'X' if player == 'O' else 'O' def show_board(self): for row in self.board: for item in row: print(item, end=" ") print() def start(self): self.create_board() player = 'X' if self.get_random_first_player() == 1 else 'O' while True: print(f"Player {player} turn") self.show_board() # taking user input row, col = list( map(int, input("Enter row and column numbers to fix spot: ").split())) print() # fixing the spot self.fix_spot(row - 1, col - 1, player) # checking whether current player is won or not if self.is_player_win(player): print(f"Player {player} wins the game!") break # checking whether the game is draw or not if self.is_board_filled(): print("Match Draw!") break # swapping the turn player = self.swap_player_turn(player) # showing the final view of board print() self.show_board() # starting the game tic_tac_toe = TicTacToe() tic_tac_toe.start()
Check out the sample output of the code.
$ python tic_tac_toe.py Player X turn - - - - - - - - - Enter row and column numbers to fix spot: 1 1 Player O turn X - - - - - - - - Enter row and column numbers to fix spot: 2 1 Player X turn X - - O - - - - - Enter row and column numbers to fix spot: 1 2 Player O turn X X - O - - - - - Enter row and column numbers to fix spot: 1 3 Player X turn X X O O - - - - - Enter row and column numbers to fix spot: 2 2 Player O turn X X O O X - - - - Enter row and column numbers to fix spot: 3 3 Player X turn X X O O X - - - O Enter row and column numbers to fix spot: 3 2 Player X wins the game! X X O O X - - X O
Some major points that help you understand the structure of the code.
- We have used a class to have all the methods in one place. It can easily be a reusable bundle in some other code as well.
- Next, we have defined different functions for each responsibility, even if it is a small task. It helps to maintain the code with ease.
- The above two approaches help us update the app effortlessly if we want to update the game.
Feel free to adapt the structure and improve it based on your project. Structuring the code is not limited.
Final Words
Hurray! 😎 You have created a game completely from scratch. It is not one of the visual games that we play daily. But it helps you to write logic and maintain clean structure in code. Follow similar guidelines to create some interesting games like this. You can find similar games if you go back some years to your childhood.
Happy Coding! 👩💻
Next, explore how to create number guessing game and Unit Testing with Python unittest Module.
Star
You must be signed in to star a gist
A traditional Tic Tac Toe game written in Python
# Pam Qian 2016 Fall CS 112 Python Midterm Project II |
# Tic Tack Toe |
def main(): |
# The main function |
introduction = intro() |
board = create_grid() |
pretty = printPretty(board) |
symbol_1, symbol_2 = sym() |
full = isFull(board, symbol_1, symbol_2) # The function that starts the game is also in here. |
def intro(): |
# This function introduces the rules of the game Tic Tac Toe |
print(“Hello! Welcome to Pam’s Tic Tac Toe game!”) |
print(“\n”) |
print(“Rules: Player 1 and player 2, represented by X and O, take turns ” |
“marking the spaces in a 3*3 grid. The player who succeeds in placing ” |
“three of their marks in a horizontal, vertical, or diagonal row wins.”) |
print(“\n”) |
input(“Press enter to continue.”) |
print(“\n”) |
def create_grid(): |
# This function creates a blank playboard |
print(“Here is the playboard: “) |
board = [[” “, ” “, ” “], |
[” “, ” “, ” “], |
[” “, ” “, ” “]] |
return board |
def sym(): |
# This function decides the players’ symbols |
symbol_1 = input(“Player 1, do you want to be X or O? “) |
if symbol_1 == “X”: |
symbol_2 = “O” |
print(“Player 2, you are O. “) |
else: |
symbol_2 = “X” |
print(“Player 2, you are X. “) |
input(“Press enter to continue.”) |
print(“\n”) |
return (symbol_1, symbol_2) |
def startGamming(board, symbol_1, symbol_2, count): |
# This function starts the game. |
# Decides the turn |
if count % 2 == 0: |
player = symbol_1 |
elif count % 2 == 1: |
player = symbol_2 |
print(“Player “+ player + “, it is your turn. “) |
row = int(input(“Pick a row:” |
“[upper row: enter 0, middle row: enter 1, bottom row: enter 2]:”)) |
column = int(input(“Pick a column:” |
“[left column: enter 0, middle column: enter 1, right column enter 2]”)) |
# Check if players’ selection is out of range |
while (row > 2 or row < 0) or (column > 2 or column < 0): |
outOfBoard(row, column) |
row = int(input(“Pick a row[upper row:” |
“[enter 0, middle row: enter 1, bottom row: enter 2]:”)) |
column = int(input(“Pick a column:” |
“[left column: enter 0, middle column: enter 1, right column enter 2]”)) |
# Check if the square is already filled |
while (board[row][column] == symbol_1)or (board[row][column] == symbol_2): |
filled = illegal(board, symbol_1, symbol_2, row, column) |
row = int(input(“Pick a row[upper row:” |
“[enter 0, middle row: enter 1, bottom row: enter 2]:”)) |
column = int(input(“Pick a column:” |
“[left column: enter 0, middle column: enter 1, right column enter 2]”)) |
# Locates player’s symbol on the board |
if player == symbol_1: |
board[row][column] = symbol_1 |
else: |
board[row][column] = symbol_2 |
return (board) |
def isFull(board, symbol_1, symbol_2): |
count = 1 |
winner = True |
# This function check if the board is full |
while count < 10 and winner == True: |
gaming = startGamming(board, symbol_1, symbol_2, count) |
pretty = printPretty(board) |
if count == 9: |
print(“The board is full. Game over.”) |
if winner == True: |
print(“There is a tie. “) |
# Check if here is a winner |
winner = isWinner(board, symbol_1, symbol_2, count) |
count += 1 |
if winner == False: |
print(“Game over.”) |
# This is function gives a report |
report(count, winner, symbol_1, symbol_2) |
def outOfBoard(row, column): |
# This function tells the players that their selection is out of range |
print(“Out of boarder. Pick another one. “) |
def printPretty(board): |
# This function prints the board nice! |
rows = len(board) |
cols = len(board) |
print(“—+—+—“) |
for r in range(rows): |
print(board[r][0], ” |”, board[r][1], “|”, board[r][2]) |
print(“—+—+—“) |
return board |
def isWinner(board, symbol_1, symbol_2, count): |
# This function checks if any winner is winning |
winner = True |
# Check the rows |
for row in range (0, 3): |
if (board[row][0] == board[row][1] == board[row][2] == symbol_1): |
winner = False |
print(“Player ” + symbol_1 + “, you won!”) |
elif (board[row][0] == board[row][1] == board[row][2] == symbol_2): |
winner = False |
print(“Player ” + symbol_2 + “, you won!”) |
# Check the columns |
for col in range (0, 3): |
if (board[0][col] == board[1][col] == board[2][col] == symbol_1): |
winner = False |
print(“Player ” + symbol_1 + “, you won!”) |
elif (board[0][col] == board[1][col] == board[2][col] == symbol_2): |
winner = False |
print(“Player ” + symbol_2 + “, you won!”) |
# Check the diagnoals |
if board[0][0] == board[1][1] == board[2][2] == symbol_1: |
winner = False |
print(“Player ” + symbol_1 + “, you won!”) |
elif board[0][0] == board[1][1] == board[2][2] == symbol_2: |
winner = False |
print(“Player ” + symbol_2 + “, you won!”) |
elif board[0][2] == board[1][1] == board[2][0] == symbol_1: |
winner = False |
print(“Player ” + symbol_1 + “, you won!”) |
elif board[0][2] == board[1][1] == board[2][0] == symbol_2: |
winner = False |
print(“Player ” + symbol_2 + “, you won!”) |
return winner |
def illegal(board, symbol_1, symbol_2, row, column): |
print(“The square you picked is already filled. Pick another one.”) |
def report(count, winner, symbol_1, symbol_2): |
print(“\n”) |
input(“Press enter to see the game summary. “) |
if (winner == False) and (count % 2 == 1 ): |
print(“Winner : Player ” + symbol_1 + “.”) |
elif (winner == False) and (count % 2 == 0 ): |
print(“Winner : Player ” + symbol_2 + “.”) |
else: |
print(“There is a tie. “) |
# Call Main |
main() |
adityapandey141
commented
Feb 3, 2023
creating this simple 2-player tic-tac-toe game using pythonhttps://ohastech.com/tic-tac-toe-game-with-python-tkinter-gui/
jarvissilva937
commented
Nov 1, 2023
Great code, here is is tutorial to make fruit ninja game in python
Incerivers
commented
Jan 13, 2024
•
@basket random Thank you for providing the useful code.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
import
numpy as np
import
random
from
time
import
sleep
def
create_board():
return
(np.array([[
],
],
]]))
def
possibilities(board):
[]
for
in
range
len
(board)):
for
in
range
len
(board)):
if
board[i][j]
l.append((i, j))
return
(l)
def
random_place(board, player):
selection
possibilities(board)
current_loc
random.choice(selection)
board[current_loc]
player
return
(board)
def
row_win(board, player):
for
in
range
len
(board)):
win
True
for
in
range
len
(board)):
if
board[x, y] !
player:
win
False
continue
if
win
True
return
(win)
return
(win)
def
col_win(board, player):
for
in
range
len
(board)):
win
True
for
in
range
len
(board)):
if
board[y][x] !
player:
win
False
continue
if
win
True
return
(win)
return
(win)
def
diag_win(board, player):
win
True
for
in
range
len
(board)):
if
board[x, x] !
player:
win
False
if
win:
return
win
win
True
if
win:
for
in
range
len
(board)):
len
(board)
if
board[x, y] !
player:
win
False
return
win
def
evaluate(board):
winner
for
player
in
]:
if
(row_win(board, player)
or
col_win(board, player)
or
diag_win(board, player)):
winner
player
if
np.
all
(board !
and
winner
winner
return
winner
def
play_game():
board, winner, counter
create_board(),
print
(board)
sleep(
while
winner
for
player
in
]:
board
random_place(board, player)
print
"Board after "
str
(counter)
" move"
print
(board)
sleep(
counter
winner
evaluate(board)
if
winner !
break
return
(winner)
print
"Winner is: "
str
(play_game()))
Tic Tac Toe Python
Step 2: Set Up the Tic-Tac-Toe Game Logic in Python
Up to this point, you’ve put together a suitable tic-tac-toe game board using Tkinter. Now you need to think of how to deal with the game’s logic. This logic will consist of code that processes a player’s move and determines if this player has won the game or not.
Several ideas are key when it comes to implementing the logic of a tic-tac-toe game. First, you need a valid representation of the players and their moves. You also need a higher-level class to represent the game itself. In this section, you’ll define classes for these three logic concepts.
You can download the source code for this step by clicking the link below and navigating to the
source_code_step_2/
folder:
Get Source Code: Click here to get access to the source code that you’ll use to build your tic-tac-toe game.
Define Classes for the Players and Their Moves
In the first round, you’ll define classes to represent players and their moves on the game board. These classes will be pretty bare-bones. All they need is a few attributes each. They don’t even need to have any methods.
You can use a few tools to build classes that fulfill these requirements. For example, you can use either a data class or a named tuple. In this tutorial, you’ll use a named tuple for both classes because this kind of class provides all you need.
Instead of using the classic
namedtuple
from the
collections
module, you’ll use the
NamedTuple
class from
typing
as a way to provide initial type hint information in your classes.
Go back to your code editor and add the following code at the beginning of your
tic_tac_toe.py
file:
1# tic_tac_toe.py 2 3import tkinter as tk 4from tkinter import font 5from typing import NamedTuple 6 7class Player(NamedTuple): 8 label: str 9 color: str 10 11class Move(NamedTuple): 12 row: int 13 col: int 14 label: str = "" 15 16# ...
Here’s a breakdown of this code snippet:
-
Line 5 imports
NamedTuple
from
typing
. -
Lines 7 to 9 define the
Player
class. The
.label
attribute will store the classic player signs, X and O. The
.color
attribute will hold a string with a Tkinter color. You’ll use this color to identify the target player on the game board. -
Lines 11 to 14 define the
Move
class. The
.row
and
.col
attributes will hold the coordinates that identify the move’s target cell. The
.label
attribute will hold the sign that identifies the player, X or O. Note that
.label
defaults to the empty string,
""
, which means that this specific move hasn’t been played yet.
With these two classes in place, now you can define the class that you’ll use to represent the game logic.
Create a Class to Represent the Game Logic
In this section, you’ll define a class to manage the game’s logic. This class will take care of processing the moves, finding a winner, toggling players, and performing a few other tasks. Get back to your
tic_tac_toe.py
file and add the following class right before your
TicTacToeBoard
class:
# tic_tac_toe.py import tkinter as tk from itertools import cycle from tkinter import font # ... class TicTacToeGame: def __init__(self, players=DEFAULT_PLAYERS, board_size=BOARD_SIZE): self._players = cycle(players) self.board_size = board_size self.current_player = next(self._players) self.winner_combo = [] self._current_moves = [] self._has_winner = False self._winning_combos = [] self._setup_board() class TicTacToeBoard(tk.Tk): # ...
Here, you first import
cycle()
from the
itertools
module. Then you define
TicTacToeGame
, whose initializer takes two arguments,
players
and
board_size
. The
players
argument will hold a tuple of two
Player
objects, representing players X and O. This argument defaults to
DEFAULT_PLAYERS
, a constant that you’ll define in a moment.
The
board_size
argument will hold a number representing the size of the game board. In a classic tic-tac-toe game, this size would be . In your class, the argument defaults to
BOARD_SIZE
, another constant that you’ll define soon.
Inside
.__init__()
, you define the following instance attributes:
Attribute | Description |
A cyclical iterator over the input tuple of | |
The board size | |
The current player | |
The combination of cells that defines a winner | |
The list of players’ moves in a given game | |
A Boolean variable to determine if the game has a winner or not | |
A list containing the cell combinations that define a win |
The
._players
attribute calls
cycle()
from the
itertools
module. This function takes an iterable as an argument and returns an iterator that cyclically yields items from the input iterable. In this case, the argument to
cycle()
is the tuple of default players passed in through the
players
argument. As you go through this tutorial, you’ll learn more about all the attributes in the above table.
Regarding the last line in
.__init__()
, it calls
._setup_board()
, which is a method that you’ll also define in a moment.
Now go ahead and define the following constants right below the
Move
class:
# tic_tac_toe.py # ... class Move(NamedTuple): # ... BOARD_SIZE = 3 DEFAULT_PLAYERS = ( Player(label="X", color="blue"), Player(label="O", color="green"), ) class TicTacToeGame: # ...
As you already learned,
BOARD_SIZE
holds the size of the tic-tac-toe board. Typically, this size is . So, you’ll have a three-by-three grid of cells on the board.
On the other hand,
DEFAULT_PLAYERS
defines a two-item tuple. Each item represents a player in the game. The
.label
and
.color
attributes of each player are set to suitable values. Player X will be blue, and player O will be green.
Set Up the Abstract Game Board
Managing the game’s state in every moment is a fundamental step in the game’s logic. You need to keep track of every move on the board. To do this, you’ll use the
._current_moves
attribute, which you’ll update whenever a player makes a move.
You also need to determine which cell combinations on the board determine a win. You’ll store these combinations in the
._winning_combos
attribute.
Here’s the
._setup_board()
method, which computes initial values for
._current_moves
and
._winning_combos
:
# tic_tac_toe.py # ... class TicTacToeGame: # ... def _setup_board(self): self._current_moves = [ [Move(row, col) for col in range(self.board_size)] for row in range(self.board_size) ] self._winning_combos = self._get_winning_combos()
In
._setup_board()
, you use a list comprehension to provide an initial list of values for
._current_moves
. The comprehension creates a list of lists. Each inner list will contain empty
Move
objects. An empty move stores the coordinates of its containing cell and an empty string as the initial player’s label.
The last line of this method calls
._get_winning_combos()
and assigns its return value to
._winning_combos
. You’ll implement this new method in the following section.
Figure Out the Winning Combinations
On a classic tic-tac-toe board, you’ll have eight possible winning combinations. They’re essentially the rows, columns, and diagonals of the board. The following illustration shows these winning combinations:
How would you get the coordinates of all these combinations using Python code? There are several ways to do it. In the code below, you’ll use four list comprehensions to get all the possible winning combinations:
# tic_tac_toe.py # ... class TicTacToeGame: # ... def _get_winning_combos(self): rows = [ [(move.row, move.col) for move in row] for row in self._current_moves ] columns = [list(col) for col in zip(*rows)] first_diagonal = [row[i] for i, row in enumerate(rows)] second_diagonal = [col[j] for j, col in enumerate(reversed(columns))] return rows + columns + [first_diagonal, second_diagonal]
The main input for this method is the
._current_moves
attribute. By default, this attribute will hold a list containing three sublists. Each sublist will represent a row on the grid and have three
Move
objects in it.
The first comprehension iterates over the rows on the grid, getting the coordinates of every cell and building a sublist of coordinates. Each sublist of coordinates represents a winning combination. The second comprehension creates sublists containing the coordinates of each cell in the grid columns.
The third and fourth comprehensions use a similar approach to get the coordinates of every cell in the board diagonals. Finally, the method returns a list of lists containing all possible winning combinations on the tic-tac-toe board.
With this initial setup for your game board, you’re ready to start thinking about processing the players’ moves.
Step 4: Process Players’ Moves on the Game Board
At this point, you’re able to handle the players’ moves on the game logic. Now you have to connect this logic to the game board itself. You also need to write the code to make the board respond to players’ moves.
First, go ahead and inject the game logic into the game board. To do this, update the
TicTacToeBoard
class as in the code below:
# tic_tac_toe.py # ... class TicTacToeGame: # ... class TicTacToeBoard(tk.Tk): def __init__(self, game): super().__init__() self.title("Tic-Tac-Toe Game") self._cells = {} self._game = game self._create_board_display() self._create_board_grid() # ... def _create_board_grid(self): grid_frame = tk.Frame(master=self) grid_frame.pack() for row in range(self._game.board_size): self.rowconfigure(row, weight=1, minsize=50) self.columnconfigure(row, weight=1, minsize=75) for col in range(self._game.board_size): # ...
In this code snippet, you first add a
game
argument to the
TicTacToeBoard
initializer. Then you assign this argument to an instance attribute,
._game
, which will give you full access to the game logic from the game board.
The second update is to use
._game.board_size
to set the board size instead of using a magic number. This update also enables you to use different board sizes. For example, you can create a four-by-four board grid, which can be an exciting experience.
With these updates, you’re ready to dive into handling the players’ moves on the
TicTacToeBoard
class.
As usual, you can download the source code for this step by clicking the link below and navigating to the
source_code_step_4/
folder:
Get Source Code: Click here to get access to the source code that you’ll use to build your tic-tac-toe game.
Handle a Player’s Move Event
The
.mainloop()
method on the
Tk
class runs what’s known as the application’s main loop or event loop. This is an infinite loop in which all the GUI events happen. Inside this loop, you can handle the events on the application’s user interface. An event is a user action on the GUI, such as a keypress, mouse move, or mouse click.
When a player in your tic-tac-toe game clicks a cell, a click event occurs inside the game’s event loop. You can process this event by providing an appropriate handler method on your
TicTacToeBoard
class. To do this, get back to your code editor and add the following
.play()
method at the end of the class:
1# tic_tac_toe.py 2# ... 3 4class TicTacToeBoard(tk.Tk): 5 # ... 6 7 def play(self, event): 8 """Handle a player's move.""" 9 clicked_btn = event.widget 10 row, col = self._cells[clicked_btn] 11 move = Move(row, col, self._game.current_player.label) 12 if self._game.is_valid_move(move): 13 self._update_button(clicked_btn) 14 self._game.process_move(move) 15 if self._game.is_tied(): 16 self._update_display(msg="Tied game!", color="red") 17 elif self._game.has_winner(): 18 self._highlight_cells() 19 msg = f'Player "{self._game.current_player.label}" won!' 20 color = self._game.current_player.color 21 self._update_display(msg, color) 22 else: 23 self._game.toggle_player() 24 msg = f"{self._game.current_player.label}'s turn" 25 self._update_display(msg)
This method is fundamental in your tic-tac-toe game because it puts together almost all the game logic and GUI behavior. Here’s a summary of what this method does:
-
Line 7 defines
play()
, which takes a Tkinter event object as an argument. -
Line 9 retrieves the widget that triggered the current event. This widget will be one of the buttons on the board grid.
-
Line 10 unpacks the button’s coordinates into two local variables,
row
and
col
. -
Line 11 creates a new
Move
object using
row
,
col
, and the current player’s
.label
attribute as arguments. -
Line 12 starts a conditional statement that checks if the player’s move is valid or not. If the move is valid, then the
if
code block runs. Otherwise, no further action takes place. -
Line 13 updates the clicked button by calling the
._update_button()
method. You’ll write this method in the next section. In short, the method updates the button’s text to reflect the current player’s label and color. -
Line 14 calls
.process_move()
on the
._game
object using the current move as an argument. -
Line 15 checks if the game is tied. If that’s the case, then the game display gets updated accordingly.
-
Line 17 checks if the current player has won the game. Then line 18 highlights the winning cells, and lines 19 to 21 update the game display to acknowledge the winner.
-
Line 22 runs if the game isn’t tied and there’s no winner. In this case, lines 23 to 25 toggle the player for the next move and update the display to point out the player who will play next.
You’re almost there! With a few more updates and additions, your tic-tac-toe game will be ready for its first-ever match.
The next step is to connect every button on the game board to the
.play()
method. To do this, get back to the
._create_board_grid()
method and update it as in the code below:
# tic_tac_toe.py # ... class TicTacToeBoard(tk.Tk): # ... def _create_board_grid(self): grid_frame = tk.Frame(master=self) grid_frame.pack() for row in range(self._game.board_size): self.rowconfigure(row, weight=1, minsize=50) self.columnconfigure(row, weight=1, minsize=75) for col in range(self._game.board_size): # ... self._cells[button] = (row, col) button.bind("
", self.play) # ...
The highlighted line binds the click event of every button on the game board with the
.play()
method. This way, whenever a player clicks a given button, the method will run to process the move and update the game state.
Update the Game Board to Reflect the Game State
To complete the code for processing the players’ moves on the game board, you need to write three helper methods. These methods will complete the following actions:
- Update the clicked button
- Update the game display
- Highlight the winning cells
To kick things off, go ahead and add
._update_button()
to
TicTacToeBoard
:
# tic_tac_toe.py # ... class TicTacToeBoard(tk.Tk): # ... def _update_button(self, clicked_btn): clicked_btn.config(text=self._game.current_player.label) clicked_btn.config(fg=self._game.current_player.color)
In this code snippet,
._update_button()
calls
.config()
on the clicked button to set its
.text
attribute to the current player’s label. The method also sets the text foreground color,
fg
, to the current player’s color.
The next helper method to add is
._update_display()
:
# tic_tac_toe.py # ... class TicTacToeBoard(tk.Tk): # ... def _update_display(self, msg, color="black"): self.display["text"] = msg self.display["fg"] = color
In this method, instead of using
.config()
to tweak the text and color of the game display, you use a dictionary-style subscript notation. Using this type of notation is another option that Tkinter provides for accessing a widget’s attributes.
Finally, you need a helper method to highlight the winning cells once a given player makes a winning move:
# tic_tac_toe.py # ... class TicTacToeBoard(tk.Tk): # ... def _highlight_cells(self): for button, coordinates in self._cells.items(): if coordinates in self._game.winner_combo: button.config(highlightbackground="red")
The loop inside
._highlight_cells()
iterates over the items in the
._cells
dictionary. This dictionary maps buttons to their row and column coordinates on the board grid. If the current coordinates are in a winning cell combination, then the button’s background color is set to
"red"
, highlighting the cell combination on the board.
With this last helper method in place, your tic-tac-toe game is ready for the first match!
Run Your Tic-Tac-Toe Game for the First Time
To finish putting together the logic and the user interface of your tic-tac-toe game, you need to update the game’s
main()
function. Up to this point, you have a
TicTacToeBoard
object only. You need to create a
TicTacToeGame
object and pass it over to the
TicTacToeBoard
updated constructor.
Get back to
main()
and update it like in the code below:
# tic_tac_toe.py # ... def main(): """Create the game's board and run its main loop.""" game = TicTacToeGame() board = TicTacToeBoard(game) board.mainloop()
In this code, the first highlighted line creates an instance of
TicTacToeGame
, which you’ll use to handle the game logic. The second highlighted line passes the new instance to the
TicTacToeBoard
class constructor, which injects the game logic into the game board.
With these updates in place, you can now run your game. To do this, fire up a terminal window and navigate to the directory containing your
tic_tac_toe.py
file. Then run the following command:
$ python tic_tac_toe.py
Once this command has run, then your game’s main window will appear on your screen. Go ahead and give it a try! It’ll behave something like this:
Wow! Your game project looks amazing so far! It allows two players to share their mouse and play a classic tic-tac-toe match. The game GUI looks nice and, in general, the game works as expected.
In the following section, you’ll write code to allow the players to restart the game and play again. You’ll also provide the option of exiting the game.
Introduction
In this article, I am showing you how to create a very simple game of Tic-Tac-Toe in Python.
Tic-Tac-Toe is a very simple two-player game. So only two players can play at a time. This game is also known as Noughts and Crosses or Xs and Os game. One player plays with X, and the other player plays with O. In this game, we have a board consisting of a 3X3 grid. The number of grids may be increased.
The Tic-Tac-Toe board looks like the following
Condition for wiining
Whoever places three respective marks (X or O) horizontally, vertically, or diagonally will be the winner.
The code for the game is as follows.
import os
import time
board = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
player = 1
# Win Flags
Win = 1
Draw = -1
Running = 0
Stop = 1
Game = Running
Mark = 'X'
def DrawBoard():
print(" %c | %c | %c " % (board[1], board[2], board[3]))
print("___|___|___")
print(" %c | %c | %c " % (board[4], board[5], board[6]))
print("___|___|___")
print(" %c | %c | %c " % (board[7], board[8], board[9]))
print(" | | ")
def CheckPosition(x):
if board[x] == ' ':
return True
else:
return False
def CheckWin():
global Game
if board[1] == board[2] and board[2] == board[3] and board[1] != ' ':
Game = Win
elif board[4] == board[5] and board[5] == board[6] and board[4] != ' ':
Game = Win
elif board[7] == board[8] and board[8] == board[9] and board[7] != ' ':
Game = Win
elif board[1] == board[4] and board[4] == board[7] and board[1] != ' ':
Game = Win
elif board[2] == board[5] and board[5] == board[8] and board[2] != ' ':
Game = Win
elif board[3] == board[6] and board[6] == board[9] and board[3] != ' ':
Game = Win
elif board[1] == board[5] and board[5] == board[9] and board[5] != ' ':
Game = Win
elif board[3] == board[5] and board[5] == board[7] and board[5] != ' ':
Game = Win
elif board[1] != ' ' and board[2] != ' ' and board[3] != ' ' and \
board[4] != ' ' and board[5] != ' ' and board[6] != ' ' and \
board[7] != ' ' and board[8] != ' ' and board[9] != ' ':
Game = Draw
else:
Game = Running
print("Tic-Tac-Toe Game Designed By Sourabh Somani")
print("Player 1 [X] --- Player 2 [O]\n")
print()
print()
print("Please Wait...")
time.sleep(3)
while Game == Running:
os.system('cls')
DrawBoard()
if player % 2 != 0:
print("Player 1's chance")
Mark = 'X'
else:
print("Player 2's chance")
Mark = 'O'
choice = int(input("Enter the position between [1-9] where you want to mark: "))
if CheckPosition(choice):
board[choice] = Mark
player += 1
CheckWin()
os.system('cls')
DrawBoard()
if Game == Draw:
print("Game Draw")
elif Game == Win:
player -= 1
if player % 2 != 0:
print("Player 1 Won")
else:
print("Player 2 Won")
Output
How to Create a Tic-Tac-Toe Game in Python?
Let us create a simple Tic Tac Toe game in Python. It will help you to build up game logic and understand how to structure code.
Gaming is one of the entertainment that humans have. We can find different types of games on the web, mobile, desktop, etc. We are not here to make one of those heavy games now. We are going to create a CLI tic-tac-toe game using Python.
If you are not familiar with Tic Tac Toe, play it visually here to understand. Don’t worry, even if you don’t understand it, we are going to see it.
Building Tic Tac Toe using Python
Now after understanding the logical flow of the project and refreshing our Python knowledge based on the pre-requisite, let us start to create our tic tac toe Python project step by step.
Step 1: Designing the Tic Tac Toe Python Project:
As discussed in the algorithm before we can start playing the game as we are building our tic tac tor Python game from scratch that too using the command line interface. We need to start by designing a tic tac toe Python program 3X3 gameboard. For doing so, we shall be using the print statements from Python and designing the 9 empty boxes of the game board.
Our prime objective in creating the design of the tic tac toe Python grid function would be that whenever a player needs to mark the box of their choice, then he/she will be inputting the respective digit that is displayed on the grid. For example, if we want to select the first box of the grid on the leftmost corner then we will input 1 in the command line interface.
Code :
Output :
Explanation :
As seen above, we created a function called tictactoe_grid where we implemented the user-defined function knowledge from Python. This function takes values from the user as its parameter. We have used the print function along with the format function to act as the placeholder for the user’s input value. Here the value parameter, signifies the status of each cell of the grid as a list.
Step 2: Using the Data Structure to Store Data
Now to understand the key principles of any game we need to dive deep into the dynamics of that game.
As we are building a relatively simple game, we need to know two important pieces of information that need to be stored so that they can be referred to at any point in time during the game which is as follow:
The Status of Grid: For this we will create a data structure that stores the status for each cell which can be either filled or empty.
The Move of each player: it is always good to store the past and present moves of each player which are the positions occupied by ‘X’ and ‘O’.
Quick Note: We can access the above data from the Status of Grid which requires us to pass over the information every time we need to know the positions of each player. This is generally done by conserving time via the Time versus Space Complexity Trade-off.
Code :
Output :
Explanation :
As seen above, we created a user-defined function game_single for the tic-tac-toe Python game. This function is created for a single game of tic tac toe Python where the value signifies the parameter of the previous function. The variable position_player is used for storing the position of the box that is either filled by the cross (X) or the naught (O). We store three values that help to manage the Grid Status as a list of characters:
‘X’ – This signifies when a cell is occupied by the X Player. ‘O’ – This signifies when a cell is occupied by the O Player. ‘ ‘ – This signifies when a cell is empty or vacant.
To check the player move, we have created the variable position_player where the moves of the players are stored as a dictionary (consisting of a list of integers) where the keys are defined by ‘X’ and ‘O’ for each player.
Quick Note: The player_current variable is used to store the move of the current player as ‘X’ or ‘O’.
Step 3: To Understand the Game-Loop
Understanding the game loop for the tic tac toe Python game allows the player to understand how to play the game until that player wins or a draw happens between the two players. Also, in the tic tac toe Python game, every single move of the player is denoted by the loop iteration.
Code :
Explanation :
To print the values for the function tictactoe_grid(), we have made use of the while loop from Python that helps us to generate the single tic tac toe Python game loop.
To handle the input from the player, we are using the Try-Exception block for ‘CHANCE’ input that can handle the unintended value if provided by the payer as his move during each iteration of the game. We also handled the ValueError exception to resolve if the same error gets encountered and also to maintain the continuity of the game. Finally, we also performed a few sanity checks, to verify if the value given by the player is a valid input or not or if the valid position given is already occupied or not.
Step 4: Updating the Game Information
Now that we have understood the game loop and gathered the inputs from the player, we need to update the information too. We can make our tic tac toe Python game work smoothly by updating the information by concatenating the below-given piece of code into our main game program.
Code :
Output :
Explanation :
Once we call our tictactoe_grid() function, the grid will be as shown above as we now have the value list updated. We updated the status of the grid in addition to the position of the player by updating our game information where we update the boxes that got occupied as per the players which are reflected by the value list. Also, by adding the position just filed by the move of the current player we reflect the position of the player.
Step 5: To Validate the Win or Tie Situation
Now we move towards analyzing the win or tie situation. For that, we need to validate if any player after every move it takes has won the tic tac toe Python game or if the game ended as a tie.
We will be creating two user-defined functions in Python to validate the Win or Tie situation. We name these functions win_validate() and tie_validate().
win_validate(): This function validates if the player has satisfied any of the winning combinations that are stored. If it does, then it shall return TRUE; otherwise, it shall give output as FALSE.
tie_validate(): This is a function that validates if all ‘Nine’ boxes on the grid are filled and the game is ending with a tie.
Code :
Explanation :
As seen above, we created user-defined function (UDF) in Python to define the win_validate() and tie_validate(). We made use of the for loops in Python and if statements to validate if the winning combination to win the game is met or not. Consecutively, while calling both the functions we shall get the respective output if the game is won by any player or it has resulted in a tie. The game_single() function shall return if the current player has won the game or not. Else, the game will return ‘D’ signifying a tie.
Step 6: Switching Between the Player Once the Chance of One Player is Executed
As the tic tac toe Python game is based on an alternate chance being given to each player after one player has played its chance therefore we shall be using the if-else loop in Python now to enable this switching between the players after its chance has been executed.
Code :
Explanation :
We implemented the if-else statement in Python to switch between the player once the chance of one player is executed in a way that when the current player makes its move and takes one position from the grid, then the program must switch the position to the next payer.
Step 7: Recording the Player’s Names to Observe on the Scoreboard
As we are maintaining the scoreboard to see what is the score against each player’s name after they have played multiple matches of the tic tac toe Python game, we will be using the main function in Python to capture and record the Player’s names to observe on the scoreboard at the end of the game.
Code :
Explanation :
Above shows the special variable__name__ that has the value of “main”. We use the input function in Python to provide the names of the two players. This will be captured as soon as the game starts when the entire program for the tic tac toe Python game gets executed.
Step 8: To Capture the Game Information
In the tic tac toe Python game, it’s always important to store the game information so that we are capturing the data related to the current player, the selection between the X or O that the players choose, the available options in the game which is either X or O and the scoreboard information.
Code :
Explanation :
As per the above code, we selected the current player as the first player along with storing the information on the selections made by both players as a dictionary, the available options in the game as a list, and the scoreboard information as a dictionary.
Step 9: To Design the Scoreboard
We shall be designing the Scoreboard as a dictionary data structure to keep a track of multiple games that the players play. here, the players’ names will act as the keys of the dictionary, and their respective wins shall be captured as the values.
Code :
Output :
Explanation :
We used the user-defined function my_scoreboard(score_board) which is taking score_board as the parameter where we define the variable that captures the names of the players in a list using the .keys() function in Python after which we index that as part of our score_board and show the respective scores which here is 0 as this is what shall be visible while the game starts.
As we are our game flexible enough to let the players play multiple games of tic tac toe Python, we shall require another loop for the same where we shall allow the current player to select the mark for each match. The selection menu will also be shown in each iteration of the game.
Code :
Output :
Explanation :
As seen above we implemented the while loop from Python to show the menu and give the current payer which is John here to make the choice for the series of the Tic tac toe Python game. John can now make use of action between the three options Cross ‘X’ or Naught ‘O’ or exit the game by pressing the respective key.
It’s very important to maintain the flow of the game to Handle Exceptions and Allot the selection of the symbol for the current player for each iteration of the game, for which we shall be using the try-exception block in Python as shown in the below code. The selection made by the current player will be captured and evaluated to let them know which player has won the game.
Code :
Explanation :
In the above snippet of code, we have used the try-exception block to handle any exception for the the_choice input. We have then used the if-else statement to create the choice menu for the current player to select from.
As per the selection made by the player, the data will be stored. This is significant as it will tell us which player won after every match.
Step 12: Execution of the Tic Tac Toe Python Game and Updating the Scoreboard Simultaneously
Now we are approaching the final part of our tic tac toe Python game, where we shall be executing an independent game between the two players and capture the win for the player. And as we have our scoreboard ready we shall also be updating it when the first game end as well.
Code :
Explanation :
As seen above, we captured the details of the winner of the tic tac toe Python game for a single match. we also used the if statement in Python to validate if the match is getting a tie or if one of the players is winning the game. If the game is a tie, then again the new match will start else when the game ends in a win the score of the player gets updated and the scoreboard gets updated too.
Step 13: Swapping the Chance Given to Choose the Symbol Between the Selecting Player
It is important to swap the chance given to choose the symbol between the players after each game has ended. While playing a game, it becomes mandatory to switch the chance of choosing the mark. For doing so, we shall be using the if-else statements in Python for letting the players switch the chance of selecting the mark (X or O) once one game has ended so that both the players get an equal chance to choose between the symbol.
Code :
Explanation :
Using the if-else statement in Python we created the possibility of giving each player an equal chance to choose between the Cross or Naught after each game has ended.
Step 14: It’s Gameplay Time
Now as we have understood each step in detail and the logic behind each let us compile all the above-created functions and execute our tic tac toe Python game to see it working and also to enjoy our very own created game!!
Code :
Output :
Please refer to the subsection – Final Output under the heading What we are building?
Elevate your coding skills with our Machine Coding Tic Tac Toe – LLD Case Study Course. Enroll now and master the art of low-level design!
Conclusion
Throughout this step-by-step project, you’ve created a classic tic-tac-toe computer game using Python and Tkinter. This GUI framework is available in the Python standard library. It runs on Windows, Linux, and macOS, so your game will work great on all three platforms. That’s pretty cool!
In this tutorial, you learned how to:
- Implement the logic of the classic tic-tac-toe game using Python
- Build the game’s board or GUI using Tkinter from the Python standard library
- Connect the game’s logic and GUI to make the game work correctly
This knowledge provides you with the foundation for creating new and more complex games and GUI projects, which will help you take your Python skills to the next level.
Conclusion
- Tic tac toe Python, also known as Noughts and Crosses or Xs and Os, is a very simple two-player game where both the player choose between the symbol ‘X’ and ‘O’ to mark the position on a 3X3 grid. Once a player is successful in marking a strike of the same symbol either in the horizontal, vertical, or diagonal way that player wins the game else the game goes on a draw if all the spots are filled.
- We can access the above data from the Status of Grid which requires us to pass over the information every time we need to know the positions of each player. This is generally done by conserving time via the Time versus Space Complexity Trade-off.
- The player_current variable that we used was to store the move of the current player as ‘X’ or ‘O’ in the tic tac toe in Python.
Overview
Have you ever tried implementing the most popular game – tic tac toe in Python programming language? We shall be creating an end-to-end tic tac-toe Python project and implementing the knowledge of Python that we have gained throughout the Python tutorial. Tic tac toe Python is a two-player game played on the 3X3 grid between two players. Each player chooses between X and O and the first player starts to draw the X on the space on the grid followed alternatively by the other until a player successfully marks a streak on the grid else if all spaces are filled the game is set to draw.
Keywords searched by users: xo game in python
Categories: Sưu tầm 20 Xo Game In Python
See more here: kientrucannam.vn
See more: https://kientrucannam.vn/vn/