idle python五子棋人机算法源码
时间: 2023-06-18 07:03:32 浏览: 61
以下是一个简单的五子棋人机算法的 Python 代码示例:
```python
import random
SIZE = 15 # 棋盘大小
CHESS_EMPTY = 0
CHESS_PLAYER = 1
CHESS_COMPUTER = 2
WIN = 1
LOSE = -1
DRAW = 0
# 初始化棋盘
def init_board():
board = []
for i in range(SIZE):
row = [CHESS_EMPTY] * SIZE
board.append(row)
return board
# 人机对弈
def play():
board = init_board()
print_board(board)
while True:
player_move(board)
winner = check_winner(board)
if winner != CHESS_EMPTY:
break
computer_move(board)
winner = check_winner(board)
if winner != CHESS_EMPTY:
break
print_board(board)
if winner == CHESS_PLAYER:
print("你赢了!")
elif winner == CHESS_COMPUTER:
print("电脑赢了!")
else:
print("平局!")
# 人类下棋
def player_move(board):
while True:
x, y = map(int, input("请输入你的坐标(x,y): ").split(','))
if board[x][y] == CHESS_EMPTY:
board[x][y] = CHESS_PLAYER
break
else:
print("该位置已经有棋子了,请重新输入!")
# 电脑下棋
def computer_move(board):
x, y = find_best_move(board)
board[x][y] = CHESS_COMPUTER
print("电脑落子坐标为:({},{})".format(x, y))
# 查找最佳落子位置
def find_best_move(board):
best_score = -1000
best_move = (0, 0)
for i in range(SIZE):
for j in range(SIZE):
if board[i][j] == CHESS_EMPTY:
score = evaluate_move(board, i, j)
if score > best_score:
best_score = score
best_move = (i, j)
return best_move
# 评估落子位置得分
def evaluate_move(board, x, y):
score = 0
score += evaluate_line(board, x, y, 0, 1) # 水平方向得分
score += evaluate_line(board, x, y, 1, 0) # 垂直方向得分
score += evaluate_line(board, x, y, 1, 1) # 正斜方向得分
score += evaluate_line(board, x, y, -1, 1) # 反斜方向得分
return score
# 评估一条线上的得分
def evaluate_line(board, x, y, dx, dy):
player_count = 0 # 玩家棋子数量
computer_count = 0 # 电脑棋子数量
empty_count = 0 # 空位数量
line_score = 0 # 该线得分
for i in range(5):
xi = x + i * dx
yi = y + i * dy
if xi < 0 or xi >= SIZE or yi < 0 or yi >= SIZE:
break
if board[xi][yi] == CHESS_PLAYER:
player_count += 1
elif board[xi][yi] == CHESS_COMPUTER:
computer_count += 1
else:
empty_count += 1
if player_count == 4: # 玩家连四
line_score = LOSE
elif computer_count == 4: # 电脑连四
line_score = WIN
elif computer_count == 3 and empty_count == 1: # 活三
line_score = 100
elif player_count == 3 and empty_count == 1: # 防守活三
line_score = 90
elif computer_count == 2 and empty_count == 2: # 活二
line_score = 50
elif player_count == 2 and empty_count == 2: # 防守活二
line_score = 40
return line_score
# 检查是否有胜者
def check_winner(board):
# 检查行
for i in range(SIZE):
for j in range(SIZE - 4):
if board[i][j] == board[i][j+1] == board[i][j+2] == board[i][j+3] == board[i][j+4] and board[i][j] != CHESS_EMPTY:
return board[i][j]
# 检查列
for i in range(SIZE - 4):
for j in range(SIZE):
if board[i][j] == board[i+1][j] == board[i+2][j] == board[i+3][j] == board[i+4][j] and board[i][j] != CHESS_EMPTY:
return board[i][j]
# 检查正斜线
for i in range(SIZE - 4):
for j in range(SIZE - 4):
if board[i][j] == board[i+1][j+1] == board[i+2][j+2] == board[i+3][j+3] == board[i+4][j+4] and board[i][j] != CHESS_EMPTY:
return board[i][j]
# 检查反斜线
for i in range(SIZE - 4):
for j in range(4, SIZE):
if board[i][j] == board[i+1][j-1] == board[i+2][j-2] == board[i+3][j-3] == board[i+4][j-4] and board[i][j] != CHESS_EMPTY:
return board[i][j]
# 没有胜者
if CHESS_EMPTY in (x for row in board for x in row):
return CHESS_EMPTY
else:
return DRAW
# 打印棋盘
def print_board(board):
print(" ", end="")
for i in range(SIZE):
print("{:2d}".format(i), end="")
print()
for i in range(SIZE):
print("{:2d} ".format(i), end="")
for j in range(SIZE):
if board[i][j] == CHESS_EMPTY:
print(". ", end="")
elif board[i][j] == CHESS_PLAYER:
print("X ", end="")
else:
print("O ", end="")
print()
if __name__ == '__main__':
play()
```
该代码实现了一个比较简单的五子棋人机对弈算法,使用了基于评估函数的博弈树搜索方法,其中评估函数主要考虑了棋子连成的线型、数量和空位等因素,从而评估每个落子位置的得分,并选择最高得分的位置作为电脑的落子位置。