前言
本文介绍如何使用 Python 编写简单的小游戏,并提供多个经典案例的完整代码示例。
1. 小恐龙
玩法:上下控制起跳躲避
import cfg
import sys
import random
import pygame
from modules import *
def main(highest_score):
# 游戏初始化
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Dinosaur')
# 导入所有声音文件
sounds = {}
for key, value in cfg.AUDIO_PATHS.items():
sounds[key] = pygame.mixer.Sound(value)
# 游戏开始界面
GameStartInterface(screen, sounds, cfg)
# 定义一些游戏中必要的元素和变量
score = 0
score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)
highest_score = highest_score
highest_score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)
dino = Dinosaur(cfg.IMAGE_PATHS['dino'])
ground = Ground(cfg.IMAGE_PATHS['ground'], position=(0, cfg.SCREENSIZE[1]))
cloud_sprites_group = pygame.sprite.Group()
cactus_sprites_group = pygame.sprite.Group()
ptera_sprites_group = pygame.sprite.Group()
add_obstacle_timer = 0
score_timer = 0
# 游戏主循环
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
dino.jump(sounds)
elif event.key == pygame.K_DOWN:
dino.duck()
elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
dino.unduck()
screen.fill(cfg.BACKGROUND_COLOR)
# --随机添加云
if len(cloud_sprites_group) < 5 and random.randrange(0, 300) == 10:
cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS['cloud'], position=(cfg.SCREENSIZE[0], random.randrange(30, 75))))
# --随机添加仙人掌/飞龙
add_obstacle_timer += 1
if add_obstacle_timer > random.randrange(50, 150):
add_obstacle_timer = 0
random_value = random.randrange(0, 10)
if random_value >= 5 and random_value <= 7:
cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS['cacti']))
else:
position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20]
ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS['ptera'], position=(600, random.choice(position_ys))))
# --更新游戏元素
dino.update()
ground.update()
cloud_sprites_group.update()
cactus_sprites_group.update()
ptera_sprites_group.update()
score_timer += 1
if score_timer > (cfg.FPS//12):
score_timer = 0
score += 1
score = min(score, 99999)
if score > highest_score:
highest_score = score
if score % 100 == 0:
sounds['point'].play()
if score % 1000 == 0:
ground.speed -= 1
for item in cloud_sprites_group:
item.speed -= 1
for item in cactus_sprites_group:
item.speed -= 1
for item in ptera_sprites_group:
item.speed -= 1
# --碰撞检测
for item in cactus_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
for item in ptera_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
# --将游戏元素画到屏幕上
dino.draw(screen)
ground.draw(screen)
cloud_sprites_group.draw(screen)
cactus_sprites_group.draw(screen)
ptera_sprites_group.draw(screen)
score_board.set(score)
highest_score_board.set(highest_score)
score_board.draw(screen)
highest_score_board.draw(screen)
# --更新屏幕
pygame.display.update()
clock.tick(cfg.FPS)
# --游戏是否结束
if dino.is_dead:
break
# 游戏结束界面
return GameEndInterface(screen, cfg), highest_score
if __name__ == '__main__':
highest_score = 0
while True:
flag, highest_score = main(highest_score)
if not flag: break
2. 消消乐
玩法:三个相连就能消除
import os
import sys
import cfg
import pygame
from modules import *
def main():
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Gemgem')
# 加载背景音乐
pygame.mixer.init()
pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))
pygame.mixer.music.set_volume(0.6)
pygame.mixer.music.play(-1)
# 加载音效
sounds = {}
sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
sounds['match'] = []
for i in range(6):
sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))
# 加载字体
font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)
# 图片加载
gem_imgs = []
for i in range(1, 8):
gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))
# 主循环
game = gemGame(screen, sounds, font, gem_imgs, cfg)
while True:
score = game.start()
flag = False
# 一轮游戏结束后玩家选择重玩或者退出
while True:
for event in pygame.event.get():
event. == pygame.QUIT (event. == pygame.KEYUP event.key == pygame.K_ESCAPE):
pygame.quit()
sys.exit()
event. == pygame.KEYUP event.key == pygame.K_r:
flag =
flag:
screen.fill((, , ))
text0 = % score
text1 =
text2 =
y =
idx, text ([text0, text1, text2]):
text_render = font.render(text, , (, , ))
rect = text_render.get_rect()
idx == :
rect.left, rect.top = (, y)
idx == :
rect.left, rect.top = (, y)
:
rect.left, rect.top = (, y)
y +=
screen.blit(text_render, rect)
pygame.display.update()
game.reset()
__name__ == :
main()
3. 俄罗斯方块
玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。
import os
import sys
import random
from modules import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class TetrisGame(QMainWindow):
def __init__(self, parent=None):
super(TetrisGame, self).__init__(parent)
self.is_paused = False
self.is_started = False
self.initUI()
def initUI(self):
self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
self.grid_size = 22
self.fps = 200
self.timer = QBasicTimer()
self.setFocusPolicy(Qt.StrongFocus)
layout_horizontal = QHBoxLayout()
self.inner_board = InnerBoard()
self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.external_board)
self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.side_panel)
.status_bar = .statusBar()
.external_board.score_signal[].connect(.status_bar.showMessage)
.start()
.center()
.setWindowTitle()
.show()
.setFixedSize(.external_board.width() + .side_panel.width(), .side_panel.height() + .status_bar.height())
():
screen = QDesktopWidget().screenGeometry()
size = .geometry()
.move((screen.width() - size.width()) // , (screen.height() - size.height()) // )
():
.external_board.updateData()
.side_panel.updateData()
.update()
():
.is_started:
.is_started =
.inner_board.createNewTetris()
.timer.start(.fps, )
():
.is_started:
.is_paused = .is_paused
.is_paused:
.timer.stop()
.external_board.score_signal.emit()
:
.timer.start(.fps, )
.updateWindow()
():
event.timerId() == .timer.timerId():
removed_lines = .inner_board.moveDown()
.external_board.score += removed_lines
.updateWindow()
:
(TetrisGame, ).timerEvent(event)
():
.is_started .inner_board.current_tetris == tetrisShape().shape_empty:
(TetrisGame, ).keyPressEvent(event)
key = event.key()
key == Qt.Key_P:
.pause()
.is_paused:
key == Qt.Key_Left:
.inner_board.moveLeft()
key == Qt.Key_Right:
.inner_board.moveRight()
key == Qt.Key_Up:
.inner_board.rotateAnticlockwise()
key == Qt.Key_Space:
.external_board.score += .inner_board.dropDown()
:
(TetrisGame, ).keyPressEvent(event)
.updateWindow()
__name__ == :
app = QApplication([])
tetris = TetrisGame()
sys.exit(app.exec_())
4. 贪吃蛇
玩法:童年经典,普通模式没啥意思,小时候玩的也是加速的。
import cfg
import sys
import pygame
from modules import *
def main(cfg):
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Greedy Snake')
clock = pygame.time.Clock()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1)
snake = Snake(cfg)
apple = Apple(cfg, snake.coords)
score = 0
while True:
screen.fill(cfg.BLACK)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
if snake.update(apple):
apple = Apple(cfg, snake.coords)
score += 1
if snake.isgameover: break
drawGameGrid(cfg, screen)
snake.draw(screen)
apple.draw(screen)
showScore(cfg, score, screen)
pygame.display.update()
clock.tick(cfg.FPS)
return endInterface(screen, cfg)
if __name__ == '__main__':
while True:
if not main(cfg):
break
5. 平衡木(24 点)
玩法:也是小时候的经典
import os
import sys
import pygame
from cfg import *
from modules import *
from fractions import Fraction
def checkClicked(group, mouse_pos, group_type='NUMBER'):
selected = []
if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]:
max_selected = 2 if group_type == GROUPTYPES[0] else 1
num_selected = 0
for each in group:
num_selected += int(each.is_selected)
for each in group:
if each.rect.collidepoint(mouse_pos):
if each.is_selected:
each.is_selected = not each.is_selected
num_selected -= 1
each.select_order = None
else:
if num_selected < max_selected:
each.is_selected = not each.is_selected
num_selected += 1
each.select_order = str(num_selected)
if each.is_selected:
selected.append(each.attribute)
elif group_type == GROUPTYPES[2]:
for each in group:
if each.rect.collidepoint(mouse_pos):
each.is_selected =
selected.append(each.attribute)
:
ValueError( % (group_type, *GROUPTYPES))
selected
():
number_sprites_group = pygame.sprite.Group()
idx, number (numbers):
args = (*NUMBERCARD_POSITIONS[idx], (number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, (number))
number_sprites_group.add(Card(*args))
number_sprites_group
():
operator_sprites_group = pygame.sprite.Group()
idx, operator (operators):
args = (*OPERATORCARD_POSITIONS[idx], (operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, (operator))
operator_sprites_group.add(Card(*args))
operator_sprites_group
():
button_sprites_group = pygame.sprite.Group()
idx, button (buttons):
args = (*BUTTONCARD_POSITIONS[idx], (button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, (button))
button_sprites_group.add(Button(*args))
button_sprites_group
():
operator_map = {: , : , : , : }
:
result = ((number1+operator_map[operator]+number2))
result result (Fraction(number1+operator_map[operator]+number2))
:
():
rect = pygame.Rect(, , , )
pygame.draw.rect(screen, PAPAYAWHIP, rect)
font = pygame.font.Font(FONTPATH, )
text_render = font.render(text, , BLACK)
font_size = font.size(text)
screen.blit(text_render, (rect.x+(rect.width-font_size[])/, rect.y+(rect.height-font_size[])/))
():
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(SCREENSIZE)
pygame.display.set_caption()
win_sound = pygame.mixer.Sound(AUDIOWINPATH)
lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
pygame.mixer.music.load(BGMPATH)
pygame.mixer.music.play(-, )
game24_gen = game24Generator()
game24_gen.generate()
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
button_sprites_group = getButtonSpritesGroup(BUTTONS)
clock = pygame.time.Clock()
selected_numbers = []
selected_operators = []
selected_buttons = []
is_win =
:
event pygame.event.get():
event. == pygame.QUIT:
pygame.quit()
sys.exit(-)
event. == pygame.MOUSEBUTTONUP:
mouse_pos = pygame.mouse.get_pos()
selected_numbers = checkClicked(number_sprites_group, mouse_pos, )
selected_operators = checkClicked(operator_sprites_group, mouse_pos, )
selected_buttons = checkClicked(button_sprites_group, mouse_pos, )
screen.fill(AZURE)
(selected_numbers) == (selected_operators) == :
noselected_numbers = []
each number_sprites_group:
each.is_selected:
each.select_order == :
selected_number1 = each.attribute
each.select_order == :
selected_number2 = each.attribute
:
ValueError( % each.select_order)
:
noselected_numbers.append(each.attribute)
each.is_selected =
each operator_sprites_group:
each.is_selected =
result = calculate(selected_number1, selected_number2, *selected_operators)
result :
game24_gen.numbers_now = noselected_numbers + [result]
is_win = game24_gen.check()
is_win:
win_sound.play()
is_win (game24_gen.numbers_now) == :
lose_sound.play()
:
warn_sound.play()
selected_numbers = []
selected_operators = []
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
each number_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
each operator_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
each button_sprites_group:
selected_buttons selected_buttons[] [, ]:
is_win =
selected_buttons each.attribute == selected_buttons[]:
each.is_selected =
number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
selected_buttons = []
each.draw(screen, pygame.mouse.get_pos())
is_win:
showInfo(, screen)
is_win (game24_gen.numbers_now) == :
showInfo(, screen)
pygame.display.flip()
clock.tick()
__name__ == :
main()
6. 外星人入侵
玩法:这让我想起了魂斗罗那第几关的 boss,有点类似,不过魂斗罗那个难度肯定高点。
import os
import sys
import cfg
import random
import pygame
from modules import *
def startGame(screen):
clock = pygame.time.Clock()
font = pygame.font.SysFont('arial', 18)
if not os.path.isfile('score'):
f = open('score', 'w')
f.write('0')
f.close()
with open('score', 'r') as f:
highest_score = int(f.read().strip())
enemies_group = pygame.sprite.Group()
for i in range(55):
if i < 11:
enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)
elif i < 33:
enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)
else:
enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)
enemy.rect.x = 85 + (i % 11) * 50
enemy.rect.y = 120 + (i // 11) * 45
enemies_group.add(enemy)
boomed_enemies_group = pygame.sprite.Group()
en_bullets_group = pygame.sprite.Group()
ufo = ufoSprite(color=cfg.RED)
myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)
my_bullets_group = pygame.sprite.Group()
enemy_move_count = 24
enemy_move_interval =
enemy_move_flag =
enemy_change_direction_count =
enemy_change_direction_interval =
enemy_need_down =
enemy_move_right =
enemy_need_move_row =
enemy_max_row =
enemy_shot_interval =
enemy_shot_count =
enemy_shot_flag =
running =
is_win =
running:
screen.fill(cfg.BLACK)
event pygame.event.get():
event. == pygame.QUIT:
pygame.quit()
sys.exit()
event. == pygame.KEYDOWN:
event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
event. == pygame.MOUSEBUTTONDOWN:
my_bullet = myaircraft.shot()
my_bullet:
my_bullets_group.add(my_bullet)
enemy enemies_group:
pygame.sprite.spritecollide(enemy, my_bullets_group, , ):
boomed_enemies_group.add(enemy)
enemies_group.remove(enemy)
myaircraft.score += enemy.reward
pygame.sprite.spritecollide(ufo, my_bullets_group, , ):
ufo.is_dead =
myaircraft.score += ufo.reward
enemy_shot_count +=
enemy_shot_count > enemy_shot_interval:
enemy_shot_flag =
enemies_survive_list = [enemy.number enemy enemies_group]
shot_number = random.choice(enemies_survive_list)
enemy_shot_count =
enemy_move_count +=
enemy_move_count > enemy_move_interval:
enemy_move_count =
enemy_move_flag =
enemy_need_move_row -=
enemy_need_move_row == :
enemy_need_move_row = enemy_max_row
enemy_change_direction_count +=
enemy_change_direction_count > enemy_change_direction_interval:
enemy_change_direction_count =
enemy_move_right = enemy_move_right
enemy_need_down =
enemy_move_interval = (, enemy_move_interval-)
enemy_shot_interval = (, enemy_move_interval-)
enemy enemies_group:
enemy_shot_flag:
enemy.number == shot_number:
en_bullet = enemy.shot()
en_bullets_group.add(en_bullet)
enemy_move_flag:
enemy.number ((enemy_need_move_row-)*, enemy_need_move_row*):
enemy_move_right:
enemy.update(, cfg.SCREENSIZE[])
:
enemy.update(, cfg.SCREENSIZE[])
:
enemy.update(, cfg.SCREENSIZE[])
enemy_need_down:
enemy.update(, cfg.SCREENSIZE[]):
running =
is_win =
enemy.change_count -=
enemy.draw(screen)
enemy_move_flag =
enemy_need_down =
enemy_shot_flag =
boomed_enemy boomed_enemies_group:
boomed_enemy.boom(screen):
boomed_enemies_group.remove(boomed_enemy)
boomed_enemy
myaircraft.one_dead:
pygame.sprite.spritecollide(myaircraft, en_bullets_group, , ):
myaircraft.one_dead =
myaircraft.one_dead:
myaircraft.boom(screen):
myaircraft.resetBoom()
myaircraft.num_life -=
myaircraft.num_life < :
running =
is_win =
:
myaircraft.update(cfg.SCREENSIZE[])
myaircraft.draw(screen)
( ufo.has_boomed) (ufo.is_dead):
ufo.boom(screen):
ufo.has_boomed =
:
ufo.update(cfg.SCREENSIZE[])
ufo.draw(screen)
bullet my_bullets_group:
bullet.update():
my_bullets_group.remove(bullet)
bullet
:
bullet.draw(screen)
bullet en_bullets_group:
bullet.update(cfg.SCREENSIZE[]):
en_bullets_group.remove(bullet)
bullet
:
bullet.draw(screen)
myaircraft.score > highest_score:
highest_score = myaircraft.score
(myaircraft.score % == ) (myaircraft.score > ) (myaircraft.score != myaircraft.old_score):
myaircraft.old_score = myaircraft.score
myaircraft.num_life = (myaircraft.num_life + , myaircraft.max_num_life)
(enemies_group) < :
is_win =
running =
showText(screen, , cfg.WHITE, font, , )
showText(screen, (myaircraft.score), cfg.WHITE, font, , )
showText(screen, , cfg.WHITE, font, , )
showText(screen, ((enemies_group)), cfg.WHITE, font, , )
showText(screen, , cfg.WHITE, font, , )
showText(screen, (highest_score), cfg.WHITE, font, , )
showText(screen, + ((clock.get_fps())), cfg.RED, font, , )
showLife(screen, myaircraft.num_life, cfg.GREEN)
pygame.display.update()
clock.tick(cfg.FPS)
(, ) f:
f.write((highest_score))
is_win
():
pygame.init()
pygame.display.set_caption()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume()
pygame.mixer.music.play(-)
:
is_win = startGame(screen)
endInterface(screen, cfg.BLACK, is_win)
__name__ == :
main()
7. 井字棋
玩法:我打赌大家在课堂上肯定玩过这个,想想当年和同桌玩这个废了好几本本子。
from tkinter import *
import tkinter.messagebox as msg
root = Tk()
root.title('TIC-TAC-TOE---Project Gurukul')
Label(root, text="player1 : X", font="times 15").grid(row=0, column=1)
Label(root, text="player2 : O", font="times 15").grid(row=0, column=2)
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9]
mark = ''
count = 0
panels = ["panel"] * 10
def win(panels, sign):
return ((panels[1] == panels[2] == panels[3] == sign)
or (panels[1] == panels[4] == panels[7] == sign)
or (panels[1] == panels[5] == panels[9] == sign)
or (panels[2] == panels[5] == panels[8] == sign)
or (panels[3] == panels[6] == panels[9] == sign)
or (panels[3] == panels[5] == panels[] == sign)
(panels[] == panels[] == panels[] == sign)
(panels[] == panels[] == panels[] == sign))
():
count, mark, digits
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button1.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button2.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button3.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button4.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button5.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button6.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button7.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button8.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
digit == digit digits:
digits.remove(digit)
count % == :
mark =
panels[digit] = mark
count % != :
mark =
panels[digit] = mark
button9.config(text=mark)
count = count +
sign = mark
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(win(panels, sign) sign == ):
msg.showinfo(, )
root.destroy()
(count > win(panels, ) == win(panels, ) == ):
msg.showinfo(, )
root.destroy()
button1 = Button(root, width=, font=(), height=, command=: checker())
button1.grid(row=, column=)
button2 = Button(root, width=, height=, font=(), command=: checker())
button2.grid(row=, column=)
button3 = Button(root, width=, height=, font=(), command=: checker())
button3.grid(row=, column=)
button4 = Button(root, width=, height=, font=(), command=: checker())
button4.grid(row=, column=)
button5 = Button(root, width=, height=, font=(), command=: checker())
button5.grid(row=, column=)
button6 = Button(root, width=, height=, font=(), command=: checker())
button6.grid(row=, column=)
button7 = Button(root, width=, height=, font=(), command=: checker())
button7.grid(row=, column=)
button8 = Button(root, width=, height=, font=(), command=: checker())
button8.grid(row=, column=)
button9 = Button(root, width=, height=, font=(), command=: checker())
button9.grid(row=, column=)
root.mainloop()


