当前位置:  首页>> 技术小册>> Python编程轻松进阶(五)

14.2.3 四子棋编写代码

在Python编程的旅途中,通过实现有趣的游戏项目,我们不仅能巩固基础知识,还能提升编程思维和问题解决能力。本章节,我们将一起动手编写一个简单的四子棋(Connect Four)游戏。四子棋是一款经典的两人对战游戏,玩家轮流在7x6的棋盘上放置棋子(通常是红蓝两色),目标是让自己的棋子在水平、垂直、对角线上连成一线(四个棋子连续)。接下来,我们将分步骤实现这个游戏。

1. 游戏设计概述

首先,我们需要明确游戏的基本结构和流程:

  • 初始化棋盘:创建一个7x6的二维数组,初始化为空(可以使用None或空格' '表示)。
  • 玩家交替下棋:通过控制台输入棋子的位置(列号),系统自动计算行号(从上至下第一个空位)。
  • 检查胜负:每次下棋后,检查当前棋盘是否有玩家连成四子。
  • 游戏结束处理:如果某玩家获胜,显示胜利信息;如果棋盘填满而无人获胜,则宣布平局。
  • 用户交互:提供清晰的指令和反馈,增强用户体验。

2. 初始化棋盘

我们可以使用Python的列表(list)来创建和表示棋盘。

  1. def initialize_board():
  2. return [[' ' for _ in range(7)] for _ in range(6)]
  3. def print_board(board):
  4. for row in board:
  5. print(" ".join(row))

3. 玩家下棋

玩家通过输入列号来选择下棋位置,系统需要验证该列是否已满,并自动找到该列最底部的空位。

  1. def place_piece(board, column, player):
  2. for i in range(5, -1, -1): # 从下往上遍历
  3. if board[i][column] == ' ':
  4. board[i][column] = player
  5. return True
  6. return False # 列已满
  7. def get_player_move(player):
  8. while True:
  9. try:
  10. column = int(input(f"{player}的回合,请输入列号(1-7): "))
  11. if 1 <= column <= 7:
  12. return column
  13. else:
  14. print("列号输入错误,请重新输入!")
  15. except ValueError:
  16. print("请输入有效的数字!")

4. 检查胜负

检查胜负是游戏的核心逻辑之一,需要分别检查水平、垂直、两个对角线方向是否连续出现四个相同的棋子。

  1. def check_win(board, player):
  2. directions = [
  3. # 水平方向
  4. [(0, 1), (0, 2), (0, 3)],
  5. # 垂直方向
  6. [(1, 0), (2, 0), (3, 0)],
  7. # 主对角线
  8. [(1, 1), (2, 2), (3, 3)],
  9. # 副对角线
  10. [(1, -1), (2, -2), (3, -3)]
  11. ]
  12. for row in range(6):
  13. for col in range(7):
  14. if board[row][col] == player:
  15. for dx, dy in directions:
  16. try:
  17. if all(board[row + i*dy][col + i*dx] == player for i in range(1, 4)):
  18. return True
  19. except IndexError:
  20. continue
  21. return False

注意:这里的directions仅示例了四个方向,实际实现时需要完整覆盖所有可能的连线情况,包括所有水平、垂直及两个对角线方向。

5. 游戏主循环

将上述功能整合到游戏的主循环中,处理玩家交替下棋、胜负检查和游戏结束逻辑。

  1. def play_game():
  2. board = initialize_board()
  3. players = ['X', 'O']
  4. current_player = players[0]
  5. while True:
  6. print_board(board)
  7. column = get_player_move(current_player)
  8. if place_piece(board, column - 1, current_player): # 注意列号减1,因为用户习惯从1开始计数
  9. if check_win(board, current_player):
  10. print_board(board)
  11. print(f"{current_player} 获胜!")
  12. break
  13. current_player = players[1 - players.index(current_player)] # 切换玩家
  14. else:
  15. print("该列已满,请重新输入!")
  16. if all(all(cell != ' ' for cell in row) for row in board):
  17. print_board(board)
  18. print("平局!")
  19. break
  20. play_game()

6. 总结与扩展

以上代码实现了四子棋游戏的基本功能,但仍有许多可以改进和扩展的地方,比如:

  • 增加更复杂的胜负检查逻辑,确保所有可能的连线都被检查到。
  • 实现AI对手,让玩家可以与计算机对战。
  • 增加图形用户界面(GUI),使游戏更加直观和吸引人。
  • 支持保存和加载游戏状态,允许玩家中断游戏后继续。

通过实现这个项目,我们不仅学会了如何在Python中处理二维数组、控制流和函数定义,还锻炼了问题分解和代码组织的能力。希望这个四子棋项目能成为你Python编程进阶之路上的一块坚实基石。