Python实现黑白棋
题目要求
电脑的策略
对每个可能的落子位置,都进行尝试,计算该位置的“分值” (可以翻转的对手棋子数量),分值越高则在该位置落子越有利。计算每个可能位置的分值,选择最大值位置落子。可能有2个或多个棋盘格有相同的分值。这种情况下,选择行字母最小的棋盘格。如果两个棋盘格分值相同且在同一行,则选择列字母较小的棋盘格
游戏结束的条件
1)整个棋盘满了;
2)一方的棋子已经被对方吃光;
3)两名玩家都 没有可以落子的棋盘格;
4)一方落子在非法位置。
前 3 种情况以棋子数目来计算胜负,棋子多的一方获 胜;第 4 种情况判定对方获胜。
解题思路
关键逻辑
1)不论是电脑下棋还是人类下棋,都需要先判断是否有字可落
2)人类下棋之前,要判断落子是否合法
3)在判断落子是否合法的时候,要注意棋盘的边界
因为python的列表存在下标为-1的情况,故要注意下标的下界,另一方面,因为黑白棋要考虑尽头那个棋子是否为同色的情况,所以要注意当前搜索棋子和同方向的下一个棋子(潜在的同色可能性)是否越界。
举例:4*4棋盘的“黑 白 白 白” ,如果不考虑下一个棋子的越界情况的话,会出现从黑开始绕一个圈回来又查找到黑从而把三个白棋翻转的错误情况
4)其实翻转、检测落子是否合法,计算落子的分值用的都是同一套循环逻辑,所以只写一个然后基本复制黏贴就好了
5)用多次sort进行不同权重的比较
6)游戏结束的几种情况要分情况讨论
关键函数
Init_board:
读入棋盘大小 n(n 为偶数,且 4≤n≤26),按照要求初始化棋盘。程序使用如下字 符表示每个棋盘格的状态:
. – 未被占用 X – 被黑棋占用 O – 被白棋占用
def Init_board():
global board
board = [[0] * l for row in range(l)] #用列表生成式生成棋盘
board[int(l / 2 - 1)][int(l / 2 - 1)] = -1
board[int(l / 2 - 1)][int(l / 2)] = 1
board[int(l / 2)][int(l / 2 - 1)] = 1
board[int(l / 2)][int(l / 2)] = -1 #四个初始棋子的摆放
return board
#在这个处理中我们用0代表未落子,1代表黑棋,-1代表白棋
printBoard:
输出棋盘。例如:4×4 棋盘的初始状态如下:
a b c d
a . . . .
b . O X .
c . X O .
d . . . .
def printBoard():
l = len(board)
print(' ', end = ' ')
for i in range(l):
print(chr(ord('a') + i), end = ' ')
print()
for i in range(l):
print(chr(ord('a') + i), end = ' ')
for j in range(l):
if (board[i][j] == 0):
print('.', end = ' ')
elif (board[i][j] == 1):
print('X', end = ' ')
else:
print('O', end = ' ')
print()
computer_move:
计算机下棋。落子位置表示为“行列字母”的格式,如:“ba”代表棋子 落在行 b 列 a。
def computer_move(row, col, color): #电脑行棋和棋子翻转
global board
if (check != 0): #check中存储的是该棋子的价值(翻转的棋子数),不为0则合法
board[row][col] = color #向规定地点放上棋子
direction = ((-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1))
for i in range(8):
z = 1 #对8个方向进行搜索
while (0<= row + (z+1) * direction[i][0] < l) and (0<= col + (z+1) * direction[i][1] < l) and (
board[row + z * direction[i][0]][col + z * direction[i][1]] == -color):#搜索进行的条件,搜索的下一个位置没有超过系统边界(因为尽头是一个相同的棋子所以要多查找一步),当前位置的棋子是一个异色的棋子。
z += 1 #这里涉及到一个问题就是python列表值是存在-1值的,所以要规定列表搜索的下界只能到0,不然本质上会查找到列表最后一个(下标为-1)的值
if board[row + z * direction[i][0]]