Python打造井字游戏:分步代码教程
Python井字游戏是有趣项目,助掌握基础概念。可用PyCharm或命令行开发。
井字游戏规则
- 空白方格网格开始
- 双方选符号(通常X/O)
- 轮流标记格子,直至某方凑成整行/列/对角线同符号获胜
- 棋盘填满无赢家则平局
前置要求
- Python初级水平(理解for循环、if语句)
- 已安装Python与文本编辑器
- 无需第三方库
- 具备基本调试能力
算法流程
- 创建棋盘
- 用户输入维度N(≥3)
- 随机决定先手
- 游戏开始
- 玩家选空位落子
- 更新棋盘
- 判定胜负/平局
- 每步后刷新显示
- 输出结果
- 询问再来一局
完整Python代码
# Guru99井字游戏
def getInput(prompt, cast=None, condition=None, errorMessage=None):
while True:
try:
val = cast(input(prompt))
assert condition is None or condition(val)
return val
except:
print(errorMessage or "Invalid input.")
def printBoard(board):
print()
for row in board:
print(*row)
print()
def checkWin(board):
# 检查行
for row in range(len(board)):
for col in range(len(board)-1):
if board[row][col] == "_" or board[row][col+1] == "_" or board[row][col] != board[row][col+1]:
break
else:
return True
# 检查列
for col in range(len(board)):
for row in range(len(board)-1):
if board[row][col] == "_" or board[row+1][col] == "_" or board[row][col] != board[row+1][col]:
break
else:
return True
# 检查主对角线
for cell in range(len(board)-1):
if board[cell][cell] == "_" or board[cell+1][cell+1] == "_" or board[cell][cell] != board[cell+1][cell+1]:
break
else:
return True
# 检查副对角线
for cell in range(len(board)-1):
emptyCell = board[cell][len(board)-cell-1] == "_" or board[cell+1][len(board)-cell-2] == "_"
different = board[cell][len(board)-cell-1] != board[cell+1][len(board)-cell-2]
if emptyCell or different:
break
else:
return True
return False
def play():
print("------------\nN-DIMENSIONAL TIC TAC TOE game by guru99.com\n------------")
N = getInput(prompt="Enter N (board dimension, >=3): ", cast=int, condition=lambda x: x >= 3, errorMessage="Invalid input. Enter integer >=3.")
board = [['_'] * N for _ in range(N)]
used = 0
turn = 0
while True:
printBoard(board)
pick = getInput(prompt=f"Player {turn+1} - Pick location (row col): ", cast=lambda line: tuple(map(int, line.split())), condition=lambda pair: 0 <= pair[0] < N and 0 <= pair[1] < N and board[pair[0]][pair[1]] == "_", errorMessage="Invalid input. Enter valid empty cell as 'row col'.")
board[pick[0]][pick[1]] = "X" if turn == 0 else "O"
used += 1
if checkWin(board):
printBoard(board)
print(f"Game over, Player {turn+1} wins.")
break
elif used == N*N:
printBoard(board)
print("Game over. Tie.")
break
turn = (turn + 1) % 2
playAgain = getInput(prompt="Play again? (y/n): ", cast=str, condition=lambda ans: ans.strip().lower() in {"y","n"}, errorMessage="Enter 'y' or 'n'.")
if playAgain == 'n':
print("\nGame ended.")
return
else:
play()
if __name__ == '__main__':
play()
运行示例(3x3棋盘)
------------ N-DIMENSIONAL TIC TAC TOE game by guru99.com ------------ Enter N (board dimension, >=3): 3 _ _ _ _ _ _ _ _ _ Player 1 - Pick location (row col): 1 1 _ _ _ _ X _ _ _ _ Player 2 - Pick location (row col): 0 1 _ O _ _ X _ _ _ _ ... (后续步骤省略) Game over, Player 1 wins. Play again? (y/n):
代码核心解析
棋盘打印
printBoard遍历二维列表逐行打印,*row解包列表元素以空格分隔。
胜负判定
checkWin分四向检查:行、列、主对角线、副对角线。采用for-else结构:若循环未break(即全满足同符号非空),else返回True。任意方向满足即胜利。
游戏主循环
N存棋盘维度,board初始化为下划线填充的二维列表used记录已落子数,turn标识当前玩家(0/1)- 循环内:显示棋盘 → 获取合法输入 → 落子 → 判胜/平 → 切换玩家
- 局末询问重玩,
y递归调用play(),n退出
结语
- 井字游戏是练习循环、条件、二维列表的绝佳入门项目
- 算法清晰:绘板 → 判胜 → 交互 → 循环
- 可直接运行测试,体验完整游戏流程
Python
- 精通 Python range() 函数:从基础到高级用法
- 加入 Real Python 专属 Slack 社区,与全球 Python 开发者同行
- Python timeit():精准测量代码执行时间与实战示例
- Python calendar 模块专家指南:代码示例详解
- 精通 Python 异常处理:try、except、else 与 finally 详解
- Python 函数详解:构建可复用代码模块的最佳实践
- 精通Python函数参数:位置、关键字与默认参数
- Python 文件 I/O:掌握输入输出操作
- Python 计算平均值:从循环到 NumPy 的四种实战方法
- Python 字典基础:键值对操作、访问与核心方法大全
- 精通 Python 装饰器:专家技巧增强函数
- 精通 Python strptime():准确解析日期字符串