我目前正试图在python 3中创建othello (又名reversi)的游戏。
我有很大的问题,在程序的一部分,它应该评估是否一个移动是有效的。
我想要创造的是:
我尝试过许多不同的功能,但我不能正确地.
下面的链接是我最近的尝试,
发布于 2021-10-16 15:59:19
检查板上的位置是否为空
首先想到的是将板表示为字符串,其中字符串中的每个字符都表示该方格的状态,从0开始(左上角)到63 (右下角)。
例如,假设您表示一个由"o"、"x"和空方块所占用的方块被白色占据,则为。“,对于起始状态,它将是:
board = "...........................ox......xo..........................."
然后,如果要检查正方形是否为空,则检查该字符是否为空:
if board[0] == ".":
#Square 0 (top left corner) is empty!检查是否有相反颜色的邻居。
为此,您可以预先存储与所有正方形邻居对应的方向元组(这也将有助于计算可能的移动):
DIRECTIONS = [
(0, -1), #Up
(1, -1), #Up-Right
(1, 0), #Right
(1, 1), #Down-Right
(0, 1), #Down
(-1, 1), #Down-Left
(-1, 0), #Left
(-1, -1), #Up-Left
]其中元组的第一项是水平移动的数量,第二项是垂直移动的数量。因此,如果您想找到颜色相反的邻居,您将得到当前方框的索引:
row, col = index // 8, index % 8 # To convert from an index from string to (x, y) values然后循环遍历方向,并检查邻居使用上面的逻辑是什么颜色。
current = board[index]
for x, y in DIRECTIONS:
r, c = index // (8), index % (8)
r += y
c += x
tile = board[r * 8 + c]
if tile != current and tile != ".": #Not same color, and not empty, so must be opposite color
#Do stuff因为这是非常基本的代码,所以它没有涵盖当前瓷砖位于拐角处边缘的可能性,在那里索引会转到一个不正确的位置,循环。一种可能是只对这些情况进行硬编码,忽略这些方向,但是也可以使用另一种(可能更优雅的方法)。与其将板表示为64个字符的字符串,还可以将其表示为包含如下边框的100个字符字符串:
? ? ? ? ? ? ? ? ? ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? ? ? ? ? ? ? ? ? ?然后,您可以简单地检查“邻居”是否是边框的一部分(在本例中,“邻居”由问号表示,但除了用来表示空空间和磁盘的内容外,还可以是其他任何内容)。
但是,您需要考虑这样一个事实:您必须适当地将索引从8x8板转换为10x10板(并将其转换回来)。
如果有这样的邻居,继续往那个方向走,看看我们是否能在不跨越空位的情况下到达我们自己的一块。
这非常简单,一旦您实现了上述逻辑,您将只需要一个will循环来检查某个方向的瓷砖,以及如果我们达到原始的颜色,是否可以使用它们。
SIZE = 8
DIRECTIONS = [....]
BORDERCHAR = "?"
def add_border(board):
edge = BORDERCHAR * (SIZE + 2)
new_board = edge
for i in range(0, SIZE ** 2, SIZE):
new_board += BORDERCHAR + board[i:i + SIZE] + BORDERCHAR
new_board += edge
return new_board
def possible_moves(board, token):
board = add_border(board) #Converting to 10x10
moves = []
if token == "x":
other = "o"
else:
other = "x"
for space in [i for i, j in enumerate(board) if j == "."]:
for x, y in DIRECTIONS:
r, c = space // (SIZE + 2), space % (SIZE + 2)
r += y
c += x
tile = board[r * (SIZE + 2) + c]
#Checking to see if we reach one of the original discs
entered = False
while tile == other:
entered = True
r += y
c += x
tile = board[r * (SIZE + 2) + c]
if entered is True and tile == token:
moves.append((space // (SIZE + 2), space % (SIZE + 2)))
break
moves = [(r - 1) * (SIZE) + (c - 1) for r, c in moves] #Converting back to 8x8
return moveshttps://stackoverflow.com/questions/40740615
复制相似问题