You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python井字棋界面行显示异常求助:需实现指定格式输出

解决Python井字棋界面行显示问题

当前程序界面仅以空格分隔棋盘格子,无行列分隔线,无法清晰区分每个格子;期望实现的界面是每个格子用竖线分隔,每行之间用横线分隔,行列编号与棋盘格子一一对应。

修改方案

核心是重写show_board方法调整棋盘输出格式,同时修正顶部的行列提示:

修改后的完整代码

import random 

class TicTacToe:

    def __init__(self):
        self.board = []

    def create_board(self):
        for i in range(3):
            row = []
            for j in range(3):
                row.append('-')
            self.board.append(row)
            
    def get_random_first_player(self):
        return random.randint(0, 1)

    def fix_spot(self, row, col, player):
        self.board[row][col] = player

    def is_player_win(self, player):
        win = None
        n = len(self.board)

        # 检查行
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[i][j] != player:
                    win = False
                    break
            if win:
                return win

        # 检查列
        for i in range(n):
            win = True
            for j in range(n):
                if self.board[j][i] != player:
                    win = False
                    break
            if win:
                return win

        # 检查对角线
        win = True
        for i in range(n):
            if self.board[i][i] != player:
                win = False
                break
        if win:
            return win

        win = True
        for i in range(n):
            if self.board[i][n - 1 - i] != player:
                win = False
                break
        if win:
            return win
        return False

    def is_board_filled(self):
        for row in self.board:
            for item in row:
                if item == '-':
                    return False
        return True

    def swap_player_turn(self, player):
        return 'X' if player == 'O' else 'O'

    def show_board(self):
        # 打印每行,用竖线分隔格子
        for idx, row in enumerate(self.board):
            print(' | '.join(row))
            # 最后一行不打印分隔线
            if idx != len(self.board) - 1:
                print('---|---|---')

    def start(self):
        self.create_board()

        player = 'X' if self.get_random_first_player() == 1 else 'O'
        while True:
            print(f"玩家 {player} 回合")
            # 调整行列提示格式,和棋盘匹配
            print("1 | 2 | 3")
            print("---|---|---")
            
            self.show_board()

            # 获取用户输入
            row, col = list(
                map(int, input("输入行号和列号(用空格分隔): ").split()))
            print()
            
            # 落子
            self.fix_spot(row - 1, col - 1, player)

            # 检查当前玩家是否获胜
            if self.is_player_win(player):
                print(f"玩家 {player} 获胜!")
                break

            # 检查是否平局
            if self.is_board_filled():
                print("平局!")
                break

            # 切换玩家
            player = self.swap_player_turn(player)

        # 显示最终棋盘
        print()
        self.show_board()

# 启动游戏
tic_tac_toe = TicTacToe()
tic_tac_toe.start()

修改说明

  1. show_board方法:使用' | '.join(row)将每行的格子用竖线连接,同时在除最后一行外的每行下方打印---|---|---作为行分隔线,实现清晰的棋盘格子区分。
  2. start方法:将顶部的行列提示从1 2 3和-----修改为1 | 2 | 3和---|---|---,与棋盘格式保持一致,让用户更直观地对应行列号。

内容的提问来源于stack exchange,提问作者Vurgun Abbasov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:21:35