python井字棋游戏pygame
时间: 2024-01-04 09:04:02 浏览: 26
以下是使用Pygame库构建的Python井字棋游戏的示例代码:
```python
import pygame as pg
import sys
from pygame.locals import *
import time
# 初始化全局变量
XO = 'x'
winner = None
draw = False
width = 400
height = 400
white = (255, 255, 255)
line_color = (10, 10, 10)
# TicTacToe 3x3 棋盘
TTT = [[None]*3, [None]*3, [None]*3]
# 初始化Pygame
pg.init()
fps = 30
CLOCK = pg.time.Clock()
screen = pg.display.set_mode((width, height + 100), 0, 32)
pg.display.set_caption("Tic Tac Toe")
# 加载图像
opening = pg.image.load('tic tac opening.png')
x_img = pg.image.load('x.png')
o_img = pg.image.load('o.png')
# 调整图像大小
x_img = pg.transform.scale(x_img, (80, 80))
o_img = pg.transform.scale(o_img, (80, 80))
opening = pg.transform.scale(opening, (width, height + 100))
# 绘制开场画面
def game_opening():
screen.blit(opening, (0, 0))
pg.display.update()
time.sleep(1)
screen.fill(white)
# 绘制竖线
pg.draw.line(screen, line_color, (width / 3, 0), (width / 3, height), 7)
pg.draw.line(screen, line_color, (width / 3 * 2, 0), (width / 3 * 2, height), 7)
# 绘制横线
pg.draw.line(screen, line_color, (0, height / 3), (width, height / 3), 7)
pg.draw.line(screen, line_color, (0, height / 3 * 2), (width, height / 3 * 2), 7)
draw_status()
# 绘制游戏状态
def draw_status():
global draw
if winner is None:
message = XO.upper() + "'s Turn"
else:
message = winner.upper() + " won!"
if draw:
message = "Game Draw!"
font = pg.font.Font(None, 30)
text = font.render(message, 1, (255, 255, 255))
# 绘制状态栏
screen.fill((0, 0, 0), (0, 400, 500, 100))
text_rect = text.get_rect(center=(width / 2, 500 - 50))
screen.blit(text, text_rect)
pg.display.update()
# 绘制棋盘
def draw_board():
for row in range(3):
for col in range(3):
if TTT[row][col] == 'x':
screen.blit(x_img, (col * 133, row * 133))
elif TTT[row][col] == 'o':
screen.blit(o_img, (col * 133, row * 133))
# 检查游戏是否结束
def check_win():
global TTT, winner, draw
# 检查行
for row in range(3):
if (TTT[row][0] == TTT[row][1] == TTT[row][2]) and (TTT[row][0] is not None):
winner = TTT[row][0]
pg.draw.line(screen, (250, 0, 0), (0, (row + 1) * height / 3 - height / 6),
(width, (row + 1) * height / 3 - height / 6), 4)
break
# 检查列
for col in range(3):
if (TTT[0][col] == TTT[1][col] == TTT[2][col]) and (TTT[0][col] is not None):
winner = TTT[0][col]
pg.draw.line(screen, (250, 0, 0), ((col + 1) * width / 3 - width / 6, 0),
((col + 1) * width / 3 - width / 6, height), 4)
break
# 检查对角线
if (TTT[0][0] == TTT[1][1] == TTT[2][2]) and (TTT[0][0] is not None):
winner = TTT[0][0]
pg.draw.line(screen, (250, 70, 70), (50, 50), (350, 350), 4)
if (TTT[0][2] == TTT[1][1] == TTT[2][0]) and (TTT[0][2] is not None):
winner = TTT[0][2]
pg.draw.line(screen, (250, 70, 70), (350, 50), (50, 350), 4)
if all([all(row) for row in TTT]) and winner is None:
draw = True
draw_status()
# 重置游戏
def reset_game():
global TTT, winner, XO, draw
time.sleep(3)
XO = 'x'
draw = False
game_opening()
winner = None
TTT = [[None] * 3, [None] * 3, [None] * 3]
# 主循环
game_opening()
while True:
for event in pg.event.get():
if event.type == QUIT:
pg.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
if winner is None and not draw:
mouseX = event.pos[0] # 鼠标点击的x坐标
mouseY = event.pos[1] # 鼠标点击的y坐标
clicked_row = int(mouseY // (height / 3))
clicked_col = int(mouseX // (width / 3))
if TTT[clicked_row][clicked_col] is None:
TTT[clicked_row][clicked_col] = XO
if XO == 'x':
XO = 'o'
else:
XO = 'x'
draw_board()
check_win()
if winner or draw:
reset_game()
pg.display.update()
CLOCK.tick(fps)
```