1. 概述
井字棋是一种经典的两人游戏,游戏规则简单但富有趣味性。我们将使用Python语言来实现一款井字棋小游戏,玩家可以选择人机对战或者双人对战。
在游戏过程中,我们需要完成如下任务:
绘制游戏界面
实现人机对战
实现双人对战
判断游戏结束
2. 界面绘制
2.1 安装pygame
在绘制游戏界面之前,我们需要先安装pygame模块。
!pip install pygame
2.2 绘制棋盘
我们使用pygame来绘制游戏界面,首先需要导入pygame模块。
import pygame
然后,我们创建一个窗口并设置窗口大小,使用pygame.draw.line()函数绘制棋盘线条。
# 创建窗口
win = pygame.display.set_mode((500, 500))
# 绘制棋盘线条
pygame.draw.line(win, (255, 255, 255), (100, 200), (400, 200), 5)
pygame.draw.line(win, (255, 255, 255), (100, 300), (400, 300), 5)
pygame.draw.line(win, (255, 255, 255), (200, 100), (200, 400), 5)
pygame.draw.line(win, (255, 255, 255), (300, 100), (300, 400), 5)
运行代码,可以看到绘制的棋盘界面。
2.3 绘制棋子
接着,在每个格子中间绘制棋子,用1表示玩家1的棋子,2表示玩家2的棋子。
# 绘制棋子
def draw_piece(row, col, player):
x = col * 100 + 50
y = row * 100 + 50
if player == 1:
pygame.draw.circle(win, (255, 0, 0), (x, y), 40, 5)
else:
pygame.draw.line(win, (0, 0, 255), (x-30, y-30), (x+30, y+30), 5)
pygame.draw.line(win, (0, 0, 255), (x+30, y-30), (x-30, y+30), 5)
我们接下来需要记录当前棋盘的状态,用一个二维数组表示棋盘状态。
board = [[0 for i in range(3)] for j in range(3)]
每当有一个玩家下棋时,将对应位置的数组元素改为1或2,并调用draw_piece()函数在棋盘上绘制出棋子。
# 人机对战
def human_vs_computer():
board = [[0 for i in range(3)] for j in range(3)]
player = 1
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
break
if event.type == pygame.MOUSEBUTTONDOWN and player == 1:
# 玩家下棋
x, y = event.pos
row, col = y // 100, x // 100
if board[row][col] == 0:
board[row][col] = player
draw_piece(row, col, player)
player = 2
# 策略1:随机选择一个空格子
if player == 2:
empty_list = []
for i in range(3):
for j in range(3):
if board[i][j] == 0:
empty_list.append((i, j))
if len(empty_list) > 0:
row, col = empty_list[random.randint(0, len(empty_list)-1)]
board[row][col] = player
draw_piece(row, col, player)
player = 1
# 判断游戏是否结束
result = check_board(board)
if result != 0:
running = False
pygame.display.update()
运行代码,可以看到实现的人机对战界面。
3. 游戏结束判断
当有一方玩家获胜或者棋盘已满时,游戏结束。我们需要在每次有棋子下出时,判断当前状态下是否有一方玩家获胜,如果出现获胜的情况,则游戏结束。
我们需要实现一个检查获胜情况的函数check_board(),函数返回值为0表示游戏继续进行,返回值为1表示玩家1获胜,返回值为2表示玩家2获胜,返回值为3表示平局。
# 检查获胜情况
def check_board(board):
# 检查行
for i in range(3):
if board[i][0] == board[i][1] == board[i][2] and board[i][0] != 0:
return board[i][0]
# 检查列
for j in range(3):
if board[0][j] == board[1][j] == board[2][j] and board[0][j] != 0:
return board[0][j]
# 检查对角线
if board[0][0] == board[1][1] == board[2][2] and board[0][0] != 0:
return board[0][0]
if board[2][0] == board[1][1] == board[0][2] and board[2][0] != 0:
return board[2][0]
# 检查平局
is_full = True
for i in range(3):
for j in range(3):
if board[i][j] == 0:
is_full = False
if is_full:
return 3
return 0
4. 实现双人对战
完成了上面的步骤以后,我们就可以实现一个双人对战了。双人对战中,两个玩家轮流下棋,如果出现获胜情况或者棋盘已满就结束游戏。
# 双人对战
def two_players():
board = [[0 for i in range(3)] for j in range(3)]
player = 1
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
break
if event.type == pygame.MOUSEBUTTONDOWN:
# 玩家下棋
x, y = event.pos
row, col = y // 100, x // 100
if board[row][col] == 0:
board[row][col] = player
draw_piece(row, col, player)
result = check_board(board)
if result != 0:
running = False
break
player = 2 if player == 1 else 1
pygame.display.update()
运行代码,可以看到实现的双人对战界面。
5. 总结
通过上面的代码实现,我们学会了使用Python语言来实现一个井字棋小游戏。
我们使用了pygame模块来绘制游戏界面,绘制了棋盘和棋子。
我们实现了人机对战和双人对战两种游戏模式。
我们通过实现check_board()函数来进行获胜情况的判断。
这样的小游戏能够带给我们很多的快乐,同时也能锻炼我们的编程思维和编程能力。我们在实现过程中也可以加入更多的功能和优化,例如加入音效、更加智能的电脑策略等等。希望大家能够在这样的练习中不断提升自己的编程能力和创造力。