Python实现五子棋游戏

这个程序使用命令行界面进行交互,玩家可以通过输入坐标来下棋。

# 五子棋游戏

# 初始化棋盘
def init_board(size=15):
    return [['.' for _ in range(size)] for _ in range(size)]

# 打印棋盘
def print_board(board):
    size = len(board)
    print('  ' + ' '.join(str(i) for i in range(size)))
    for i in range(size):
        print(f'{i} ' + ' '.join(board[i]))

# 检查是否有五子连珠
def check_winner(board, x, y, player):
    directions = [
        (1, 0),  # 水平
        (0, 1),  # 垂直
        (1, 1),  # 对角线
        (1, -1)  # 反对角线
    ]
    
    for dx, dy in directions:
        count = 1
        # 向一个方向搜索
        nx, ny = x + dx, y + dy
        while 0 <= nx < len(board) and 0 <= ny < len(board) and board[nx][ny] == player:
            count += 1
            nx += dx
            ny += dy
        # 向相反方向搜索
        nx, ny = x - dx, y - dy
        while 0 <= nx < len(board) and 0 <= ny < len(board) and board[nx][ny] == player:
            count += 1
            nx -= dx
            ny -= dy
        # 如果五子连珠
        if count >= 5:
            return True
    return False

# 主函数
def main():
    size = 15
    board = init_board(size)
    players = ['X', 'O']
    turn = 0
    
    while True:
        print_board(board)
        player = players[turn % 2]
        print(f"玩家 {player} 的回合")
        
        try:
            x, y = map(int, input("请输入坐标 (x y): ").split())
            if board[x][y] != '.':
                print("该位置已有棋子,请重新输入!")
                continue
            board[x][y] = player
        except (ValueError, IndexError):
            print("输入无效,请重新输入!")
            continue
        
        if check_winner(board, x, y, player):
            print_board(board)
            print(f"玩家 {player} 获胜!")
            break
        
        turn += 1

if __name__ == "__main__":
    main()

运行说明:

  1. 运行程序后,棋盘会显示在命令行中。
  2. 玩家轮流输入坐标(例如 7 7 表示在第7行第7列下棋)。
  3. 程序会自动检测是否有五子连珠,如果有玩家获胜,游戏结束。

注意事项:

  • 棋盘大小为15x15,玩家可以通过修改 size 变量来调整棋盘大小。
  • 该程序是一个简单的命令行版本,适合初学者学习和理解五子棋的基本逻辑。

希望这个程序对你有帮助!如果有任何问题,欢迎随时提问。

我们可以从以下几个方面对五子棋程序进行优化:

  1. 代码结构优化:将功能模块化,提高代码的可读性和可维护性。
  2. 输入校验优化:增强用户输入的健壮性,避免程序崩溃。
  3. 性能优化:减少不必要的计算,提高程序运行效率。
  4. 用户体验优化:增加更多的提示信息,让用户更容易理解游戏规则和操作。
  5. AI对战功能:增加一个简单的AI对手,让玩家可以单人游戏。

以下是优化后的代码:

# 五子棋游戏(优化版)

# 初始化棋盘
def init_board(size=15):
    return [['.' for _ in range(size)] for _ in range(size)]

# 打印棋盘
def print_board(board):
    size = len(board)
    print('  ' + ' '.join(f'{i:2}' for i in range(size)))  # 列号
    for i in range(size):
        print(f'{i:2} ' + ' '.join(board[i]))  # 行号 + 棋盘内容

# 检查是否有五子连珠
def check_winner(board, x, y, player):
    directions = [
        (1, 0),  # 水平
        (0, 1),  # 垂直
        (1, 1),  # 对角线
        (1, -1)  # 反对角线
    ]
    
    for dx, dy in directions:
        count = 1
        # 向一个方向搜索
        nx, ny = x + dx, y + dy
        while 0 <= nx < len(board) and 0 <= ny < len(board) and board[nx][ny] == player:
            count += 1
            nx += dx
            ny += dy
        # 向相反方向搜索
        nx, ny = x - dx, y - dy
        while 0 <= nx < len(board) and 0 <= ny < len(board) and board[nx][ny] == player:
            count += 1
            nx -= dx
            ny -= dy
        # 如果五子连珠
        if count >= 5:
            return True
    return False

# 检查棋盘是否已满
def is_board_full(board):
    for row in board:
        if '.' in row:
            return False
    return True

# 玩家输入坐标
def get_player_move(board, player):
    while True:
        try:
            x, y = map(int, input(f"玩家 {player},请输入坐标 (x y): ").split())
            if 0 <= x < len(board) and 0 <= y < len(board):
                if board[x][y] == '.':
                    return x, y
                else:
                    print("该位置已有棋子,请重新输入!")
            else:
                print("坐标超出范围,请重新输入!")
        except ValueError:
            print("输入无效,请输入两个整数坐标!")

# 简单AI下棋
def ai_move(board, player):
    import random
    size = len(board)
    empty_cells = [(x, y) for x in range(size) for y in range(size) if board[x][y] == '.']
    return random.choice(empty_cells) if empty_cells else None

# 主函数
def main():
    size = 15
    board = init_board(size)
    players = ['X', 'O']
    turn = 0
    ai_mode = input("是否启用AI对手?(y/n): ").lower() == 'y'
    
    while True:
        print_board(board)
        player = players[turn % 2]
        
        if ai_mode and player == 'O':
            print("AI正在思考...")
            x, y = ai_move(board, player)
            if x is None:
                print("棋盘已满,游戏结束!")
                break
            print(f"AI选择了坐标 ({x}, {y})")
        else:
            x, y = get_player_move(board, player)
        
        board[x][y] = player
        
        if check_winner(board, x, y, player):
            print_board(board)
            print(f"玩家 {player} 获胜!")
            break
        
        if is_board_full(board):
            print_board(board)
            print("棋盘已满,游戏结束!")
            break
        
        turn += 1

if __name__ == "__main__":
    main()

优化点说明:

  1. 代码结构优化

    • 将棋盘初始化、打印、胜负判断等功能封装成函数,代码更清晰。
    • 使用 is_board_full 函数检查棋盘是否已满,避免无意义的循环。
  2. 输入校验优化

    • 增加了坐标范围检查和重复落子检查。
    • 使用异常处理避免非法输入导致程序崩溃。
  3. 性能优化

    • check_winner 函数中,只检查当前落子位置的四个方向,减少不必要的计算。
  4. 用户体验优化

    • 打印棋盘时增加了行列号,方便玩家定位。
    • 增加了提示信息,如“该位置已有棋子”和“坐标超出范围”。
  5. AI对战功能

    • 增加了一个简单的AI对手,随机选择一个空位落子。
    • 玩家可以选择是否启用AI对战。

运行说明:

  1. 运行程序后,玩家可以选择是否启用AI对手。
  2. 玩家轮流输入坐标(例如 7 7 表示在第7行第7列下棋)。
  3. 如果启用AI,AI会自动选择一个空位落子。
  4. 程序会自动检测是否有五子连珠或棋盘已满,游戏结束后会显示获胜者或平局。

进一步优化方向:

  1. 增强AI:实现一个更智能的AI,使用 Minimax 算法或 Alpha-Beta 剪枝。
  2. 图形界面:使用 Pygame 或 Tkinter 实现图形化界面。
  3. 网络对战:支持两个玩家通过网络对战。

希望这个优化版本对你有帮助!如果有其他需求,欢迎随时提出!

下面是一份简单的 Python 五子棋游戏代码,供您参考: ``` import numpy as np def create_board(): board = np.zeros((15,15)) return board def is_valid_move(board, row, col): if board[row][col] == 0: return True else: return False def make_move(board, row, col, player): board[row][col] = player def is_game_over(board, player): # check rows for i in range(15): for j in range(11): if board[i][j] == player and board[i][j+1] == player and board[i][j+2] == player and board[i][j+3] == player and board[i][j+4] == player: return True # check columns for i in range(11): for j in range(15): if board[i][j] == player and board[i+1][j] == player and board[i+2][j] == player and board[i+3][j] == player and board[i+4][j] == player: return True # check diagonals for i in range(11): for j in range(11): if board[i][j] == player and board[i+1][j+1] == player and board[i+2][j+2] == player and board[i+3][j+3] == player and board[i+4][j+4] == player: return True if board[i][j+4] == player and board[i+1][j+3] == player and board[i+2][j+2] == player and board[i+3][j+1] == player and board[i+4][j] == player: return True return False def print_board(board): print(board) def main(): board = create_board() print_board(board) player = 1 while True: row = int(input("Enter row: ")) col = int(input("Enter column: ")) if is_valid_move(board, row, col): make_move(board, row, col, player) if is_game_over(board, player): print("Player", player, "wins!") break player = 2 if player == 1 else 1 print_board(board) else: print("Invalid move. Try again.") if __name__ == &#39;__main__&#39;: main() ``` 这份代码实现了一个简单的五子棋游戏,使用了 numpy 库来创建棋盘。您可以在控制台中运行该代码,并按照提示输入行和列来落子。当有一方获胜时,游戏结束并显示胜者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值