Python Tkinter Game Arcade (Complete - 4 Games)
# [Link]
# Python 3.x - Tkinter Game Arcade for Grade 12 CS
# Contains: Main Menu + Tic-Tac-Toe + Snake + Memory Match + Brick Breaker
# Save as [Link] and run: python [Link]
import tkinter as tk
from tkinter import messagebox
import random
import time
import os
import json
# Utility: persistent high scores
SCORES_FILE = "high_scores.json"
def load_scores():
try:
with open(SCORES_FILE, "r") as f:
return [Link](f)
except Exception:
return {}
def save_score(game_name, score):
scores = load_scores()
best = [Link](game_name, 0)
# For Memory 'best' is least moves, so check separately if needed.
if game_name == "Memory":
# lower is better; save if best==0 or score < best
if best == 0 or score < best:
scores[game_name] = score
else:
if score > best:
scores[game_name] = score
with open(SCORES_FILE, "w") as f:
[Link](scores, f)
def get_best(game_name):
return load_scores().get(game_name, 0)
# MAIN MENU
class MainMenu:
def __init__(self, root):
[Link] = root
[Link]("Python Game Arcade")
[Link]("520x520")
[Link](bg="#F0F8FF")
[Link](False, False)
[Link](root, text="Python Game Arcade", font=("Segoe UI", 26, "bold"),
bg="#F0F8FF").pack(pady=20)
btn_frame = [Link](root, bg="#F0F8FF")
btn_frame.pack(pady=8)
[Link](btn_frame, text="Tic-Tac-Toe", font=("Segoe UI", 14),
width=20, command=self.open_tictactoe).grid(row=0, column=0, pady=8)
[Link](btn_frame, text="Snake Game", font=("Segoe UI", 14),
width=20, command=self.open_snake).grid(row=1, column=0, pady=8)
[Link](btn_frame, text="Memory Match", font=("Segoe UI", 14),
width=20, command=self.open_memory).grid(row=2, column=0, pady=8)
[Link](btn_frame, text="Brick Breaker", font=("Segoe UI", 14),
width=20, command=self.open_brick_breaker).grid(row=3, column=0,
pady=8)
[Link](root, text="Exit", font=("Segoe UI", 12), bg="#d9534f", fg="white",
width=12, command=[Link]).pack(pady=30)
scores = load_scores()
info = "High Scores:\\n"
info += "TicTacToe: {} ".format([Link]('TicTacToe', 'N/A'))
info += "Snake: {} ".format([Link]('Snake', 'N/A'))
info += "Memory: {} ".format([Link]('Memory', 'N/A'))
info += "Brick: {}".format([Link]('Brick', 'N/A'))
[Link](root, text=info, bg="#F0F8FF", font=("Segoe UI",
10)).pack(side="bottom", pady=12)
def open_tictactoe(self):
TicTacToe([Link])
def open_snake(self):
SnakeGame([Link])
def open_memory(self):
MemoryMatch([Link])
def open_brick_breaker(self):
BrickBreaker([Link])
# TIC-TAC-TOE (2-player)
class TicTacToe:
def __init__(self, parent):
[Link] = [Link](parent)
[Link]("Tic-Tac-Toe")
[Link]("360x420")
[Link](False, False)
self.current_player = "X"
[Link] = [["" for _ in range(3)] for _ in range(3)]
[Link] = [[None]*3 for _ in range(3)]
[Link]([Link], text="Tic-Tac-Toe", font=("Segoe UI", 18,
"bold")).pack(pady=8)
[Link] = [Link]([Link])
[Link]()
for r in range(3):
for c in range(3):
b = [Link]([Link], text="", width=6, height=3,
font=("Segoe UI", 20),
command=lambda rr=r, cc=c: self.on_click(rr, cc))
[Link](row=r, column=c, padx=5, pady=5)
[Link][r][c] = b
self.status_label = [Link]([Link], text="Player X's turn", font=("Segoe UI",
11))
self.status_label.pack(pady=8)
ctrl = [Link]([Link])
[Link](pady=6)
[Link](ctrl, text="Restart", width=10, command=[Link]).grid(row=0,
column=0, padx=6)
[Link](ctrl, text="Close", width=10, command=[Link]).grid(row=0,
column=1, padx=6)
def on_click(self, r, c):
if [Link][r][c] != "":
return
[Link][r][c] = self.current_player
[Link][r][c].config(text=self.current_player, state="disabled")
winner = self.check_winner()
if winner:
self.end_game(winner)
save_score("TicTacToe", 1) # store a dummy score for completion
return
if all([Link][i][j] != "" for i in range(3) for j in range(3)):
self.end_game("Draw")
return
self.current_player = "O" if self.current_player == "X" else "X"
self.status_label.config(text=f"Player {self.current_player}'s turn")
def check_winner(self):
b = [Link]
for i in range(3):
if b[i][0] == b[i][1] == b[i][2] != "":
return b[i][0]
if b[0][i] == b[1][i] == b[2][i] != "":
return b[0][i]
if b[0][0] == b[1][1] == b[2][2] != "":
return b[0][0]
if b[0][2] == b[1][1] == b[2][0] != "":
return b[0][2]
return None
def end_game(self, winner):
if winner == "Draw":
msg = "It's a draw!"
else:
msg = "Player {} wins!".format(winner)
[Link]("Game Over", msg)
for r in range(3):
for c in range(3):
[Link][r][c].config(state="disabled")
self.status_label.config(text=msg)
def restart(self):
self.current_player = "X"
[Link] = [["" for _ in range(3)] for _ in range(3)]
for r in range(3):
for c in range(3):
[Link][r][c].config(text="", state="normal")
self.status_label.config(text="Player X's turn")
# SNAKE GAME
class SnakeGame:
def __init__(self, parent):
[Link] = [Link](parent)
[Link]("Snake")
[Link]("520x540")
[Link](False, False)
self.W = 480
self.H = 420
self.cell_size = 20
[Link] = 120 # ms per step, smaller -> faster
[Link] = "Right"
[Link] = True
[Link] = 0
[Link]([Link], text="Snake Game", font=("Segoe UI", 16,
"bold")).pack(pady=6)
top_frame = [Link]([Link])
top_frame.pack()
self.score_label = [Link](top_frame, text="Score: 0", font=("Segoe UI", 12))
self.score_label.pack(side="left", padx=8)
best = get_best("Snake")
self.best_label = [Link](top_frame, text=f"Best: {best}", font=("Segoe UI",
12))
self.best_label.pack(side="left", padx=8)
[Link] = [Link]([Link], width=self.W, height=self.H, bg="black")
[Link](pady=8)
ctrl = [Link]([Link])
[Link]()
[Link](ctrl, text="Restart", width=10, command=[Link]).grid(row=0,
column=0, padx=6)
[Link](ctrl, text="Quit", width=10, command=[Link]).grid(row=0,
column=1, padx=6)
mid_x = (self.W // self.cell_size) // 2
mid_y = (self.H // self.cell_size) // 2
[Link] = [(mid_x, mid_y), (mid_x-1, mid_y), (mid_x-2, mid_y)]
self.spawn_food()
[Link]()
[Link]("<Key>", self.on_key)
self.after_id = None
[Link]()
def spawn_food(self):
max_x = (self.W // self.cell_size) - 1
max_y = (self.H // self.cell_size) - 1
while True:
fx = [Link](0, max_x)
fy = [Link](0, max_y)
if (fx, fy) not in [Link]:
[Link] = (fx, fy)
break
# Truncated for PDF brevity... (full code continues)