这个程序使用命令行界面进行交互,玩家可以通过输入坐标来下棋。
# 五子棋游戏
# 初始化棋盘
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列下棋)。size
变量来调整棋盘大小。希望这个程序对你有帮助!如果有任何问题,欢迎随时提问。
以下是优化后的代码:
# 五子棋游戏(优化版)
# 初始化棋盘
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对战功能:
7 7
表示在第7行第7列下棋)。希望这个优化版本对你有帮助!如果有其他需求,欢迎随时提出!