这个程序使用命令行界面进行交互,玩家可以通过输入坐标来下棋。
# 五子棋游戏
# 初始化棋盘
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()
运行说明:
- 运行程序后,棋盘会显示在命令行中。
- 玩家轮流输入坐标(例如
7 7
表示在第7行第7列下棋)。 - 程序会自动检测是否有五子连珠,如果有玩家获胜,游戏结束。
注意事项:
- 棋盘大小为15x15,玩家可以通过修改
size
变量来调整棋盘大小。 - 该程序是一个简单的命令行版本,适合初学者学习和理解五子棋的基本逻辑。
希望这个程序对你有帮助!如果有任何问题,欢迎随时提问。
我们可以从以下几个方面对五子棋程序进行优化:
- 代码结构优化:将功能模块化,提高代码的可读性和可维护性。
- 输入校验优化:增强用户输入的健壮性,避免程序崩溃。
- 性能优化:减少不必要的计算,提高程序运行效率。
- 用户体验优化:增加更多的提示信息,让用户更容易理解游戏规则和操作。
- 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()
优化点说明:
-
代码结构优化:
- 将棋盘初始化、打印、胜负判断等功能封装成函数,代码更清晰。
- 使用
is_board_full
函数检查棋盘是否已满,避免无意义的循环。
-
输入校验优化:
- 增加了坐标范围检查和重复落子检查。
- 使用异常处理避免非法输入导致程序崩溃。
-
性能优化:
- 在
check_winner
函数中,只检查当前落子位置的四个方向,减少不必要的计算。
- 在
-
用户体验优化:
- 打印棋盘时增加了行列号,方便玩家定位。
- 增加了提示信息,如“该位置已有棋子”和“坐标超出范围”。
-
AI对战功能:
- 增加了一个简单的AI对手,随机选择一个空位落子。
- 玩家可以选择是否启用AI对战。
运行说明:
- 运行程序后,玩家可以选择是否启用AI对手。
- 玩家轮流输入坐标(例如
7 7
表示在第7行第7列下棋)。 - 如果启用AI,AI会自动选择一个空位落子。
- 程序会自动检测是否有五子连珠或棋盘已满,游戏结束后会显示获胜者或平局。
进一步优化方向:
- 增强AI:实现一个更智能的AI,使用 Minimax 算法或 Alpha-Beta 剪枝。
- 图形界面:使用 Pygame 或 Tkinter 实现图形化界面。
- 网络对战:支持两个玩家通过网络对战。
希望这个优化版本对你有帮助!如果有其他需求,欢迎随时提出!