idle python五子棋人机源码
时间: 2023-06-18 20:03:33 浏览: 67
以下是一个基于 Python 的简单五子棋人机游戏源码,你可以在 IDLE 上运行它:
```
import random
# 棋盘大小
BOARD_SIZE = 15
# 空白位置标记
EMPTY = 0
# 玩家和电脑的棋子颜色
PLAYER_PIECE = 1
COMPUTER_PIECE = 2
# 用于判断胜负的方向数组
DIRECTIONS = ((0, 1), (1, 0), (1, 1), (1, -1))
# 初始化棋盘
def init_board():
board = []
for i in range(BOARD_SIZE):
row = [EMPTY] * BOARD_SIZE
board.append(row)
return board
# 打印棋盘
def print_board(board):
print(" ", end="")
for i in range(BOARD_SIZE):
print(chr(i + ord('a')), end="")
print()
for i in range(BOARD_SIZE):
print(i + 1, end="")
for j in range(BOARD_SIZE):
if board[i][j] == PLAYER_PIECE:
print("●", end="")
elif board[i][j] == COMPUTER_PIECE:
print("○", end="")
else:
print("+", end="")
print()
# 判断是否胜利
def is_win(board, piece):
for i in range(BOARD_SIZE):
for j in range(BOARD_SIZE):
if board[i][j] == piece:
for direction in DIRECTIONS:
if is_five(board, i, j, piece, direction):
return True
return False
# 判断某个方向是否连成五子
def is_five(board, row, col, piece, direction):
for i in range(5):
row += direction[0]
col += direction[1]
if not (0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == piece):
return False
return True
# 询问玩家下棋位置
def get_player_move(board):
while True:
move = input("请输入您的下棋位置,例如 a1(输入 q 退出):")
if move == "q":
return None
if len(move) != 2 or move[0] < 'a' or move[0] >= chr(ord('a') + BOARD_SIZE) or move[1] < '1' or move[1] >= chr(ord('1') + BOARD_SIZE):
print("输入错误,请重新输入!")
continue
row = int(move[1]) - 1
col = ord(move[0]) - ord('a')
if board[row][col] != EMPTY:
print("该位置已经有棋子,请重新输入!")
continue
return row, col
# 计算电脑下棋位置
def get_computer_move(board):
blank_list = []
max_score = 0
for i in range(BOARD_SIZE):
for j in range(BOARD_SIZE):
if board[i][j] == EMPTY:
score = get_score(board, i, j, COMPUTER_PIECE)
if score > max_score:
max_score = score
blank_list = [(i, j)]
elif score == max_score:
blank_list.append((i, j))
return random.choice(blank_list)
# 计算某个位置的分数
def get_score(board, row, col, piece):
score = 0
for direction in DIRECTIONS:
score += get_line_score(board, row, col, piece, direction)
return score
# 计算某个方向上的分数
def get_line_score(board, row, col, piece, direction):
line_score = 0
for i in range(-4, 1):
row_i = row + i * direction[0]
col_i = col + i * direction[1]
if 0 <= row_i < BOARD_SIZE and 0 <= col_i < BOARD_SIZE:
line_piece = board[row_i][col_i]
if line_piece == piece:
line_score += 1
elif line_piece == EMPTY:
if is_two(board, row_i, col_i, piece, direction):
line_score += 10
else:
if i == -4 or i == 0:
line_score += 1
return line_score
# 判断某个位置是否可以成为两个棋子连成的空位
def is_two(board, row, col, piece, direction):
count = 0
for i in range(-3, 1):
row_i = row + i * direction[0]
col_i = col + i * direction[1]
if 0 <= row_i < BOARD_SIZE and 0 <= col_i < BOARD_SIZE and board[row_i][col_i] == piece:
count += 1
return count == 2
# 主函数
def main():
board = init_board()
print_board(board)
while True:
player_move = get_player_move(board)
if player_move is None:
break
row, col = player_move
board[row][col] = PLAYER_PIECE
if is_win(board, PLAYER_PIECE):
print("恭喜您获得胜利!")
break
computer_move = get_computer_move(board)
row, col = computer_move
board[row][col] = COMPUTER_PIECE
print_board(board)
if is_win(board, COMPUTER_PIECE):
print("很遗憾,您输了!")
break
if __name__ == "__main__":
main()
```
请注意,这个五子棋游戏只是一个简单的实现,它并没有考虑所有可能的情况。如果你想开发更高级的五子棋游戏,可以参考一些更复杂的算法和策略来实现。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)