get mouse and place函数通过拖动机制获取鼠标点击并实现时的位置。get valid moves现在只找到两条对角线,当它是一个空格时,它会找到所有的有效移动。也许我打开元组的方式是错误的,但当放置for循环之后的if语句时,不会发生任何移动。我能得到帮助吗?但不能更改整个代码。这是第二个玩家(红色棋子(的唯一有效移动
def get_mouse_pos_and_place(self, start_x, start_y, end_x, end_y, number):
end_column = int(end_x // SQUARESIZE)
end_row = int(end_y // SQUARESIZE)
start_column = int(start_x // SQUARESIZE)
start_row = int(start_y // SQUARESIZE)
if (self.board[start_row][start_column]) in (1, 2):
if np.all(self.board[start_row][start_column] == 1):
for x, y in self.white_valid_moves:
print(self.white_valid_moves)
if (x == start_column - end_column) and (y == start_row - end_row):
self.board[start_row][start_column] = 0
self.board[end_row][end_column] = number
elif np.all(self.board[start_row][start_column] == 2):
for x, y in self.red_valid_moves:
print(self.red_valid_moves)
if (x == start_column - end_column) and (y == start_row - end_row):
self.board[start_row][start_column] = 0
self.board[end_row][end_column] = number
def get_valid_moves(self, start_x, start_y, end_x, end_y):
end_column = int(end_x // SQUARESIZE)
end_row = int(end_y // SQUARESIZE)
start_column = int(start_x // SQUARESIZE)
start_row = int(start_y // SQUARESIZE)
# For one
if self.board[start_row][start_column] == 1:
self.white_valid_moves.clear()
if self.board[start_row + 1][start_column + 1] == 2:
self.white_valid_moves.append((2, 2))
self.board[start_row - 1][start_column + 1] = 0
elif self.board[start_row - 1][start_column + 1] == 2:
self.white_valid_moves.append((-2, 2))
self.board[start_row - 1][start_column + 1] = 0
elif self.board[start_row + 1][start_column + 1] == 0:
self.white_valid_moves.append((1, 1))
elif self.board[start_row - 1][start_column + 1] == 0:
self.white_valid_moves.append((-1, 1))
# For 2
elif self.board[start_row][start_column] == 2:
self.red_valid_moves.clear()
if self.board[start_row - 1][start_column - 1] == 1:
self.red_valid_moves.append((-2, -2))
self.board[start_row - 1][start_column - 1] = 0
elif self.board[start_row + 1][start_column - 1] == 1:
self.red_valid_moves.append((2, -2))
self.board[start_row + 1][start_column - 1] = 0
elif self.board[start_row - 1][start_column - 1] == 0:
self.red_valid_moves.append((-1, -1))
elif self.board[start_row + 1][start_column - 1] == 0:
self.red_valid_moves.append((1, -1))
第1部分-无移动
在您的代码中,您永远不会得到第8行的运动,因为x
是一个整数,永远不会等于一个数组。这里的代码:self.board[start_row] - self.board[end_row]
从板上取两行,鼠标开始的行和鼠标结束的行。因为这两行都是numpy数组,所以当减去它们时,会得到一个单行numpy数组。示例:
>>> h = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> h
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> h[0] - h[1] # Subtracting row one of h by row two of h
array([-3, -3, -3])
您可以在这里看到,减去两个numpy数组总是会得到另一个数组。您的x
值是一个整数,1
或-1
。整数永远不会等于长度超过一位数的数组,因此,它将始终返回False
,这意味着if语句永远不会运行。
要解决这个问题,您根本不需要参考电路板。该板的目的是告诉您阵列的每个部分是否有检查器。您已经创建了检查器移动验证系统,此if语句只需要知道您是否已移动到有效位置。替换此:
if np.all(x == self.board[start_row] - self.board[end_row]) and ...
这个:
if x == (start_row - end_row) and ...
毕竟,你所要做的就是检查,以确保它们水平移动的距离将它们放在一个有效的位置。对if语句的第二部分执行同样的操作。
第二部分-反向列和行
在if
语句中,将x值与行进行比较。x值为跨,并使用列作为表示。如果你反转这些并不是什么大不了的事,但这很烦人,因为它会打乱你的整个代码,而且这纯粹是一个逻辑错误,所以你的解释器不会发现它。只需更改你当前的if
:
if x == (start_row - end_row) and y == (start_column-end_column):
对此,反转x和y:
if x == (start_column - end_column) and y == (start_row-end_row):
第3部分-语法
你的代码中有一个错误,我相信你没有注意到,这就是这里的这一行:
if np.all(self.board[start_row][start_column] == 1 or 2):
在上面的行中,python以不同于您预期的方式分解:self.board[start_row][start_column] == 1 or 2
。首先,它检测所讨论的板瓷砖是否等于1(我认为它是黑色的(,然后它分别检测2。换句话说,您的or
在(真/假(或(2(之间进行选择。This:self.board[start_row][start_column] == 1
将返回True或False,This:2
将返回两者。然而,这两者都将运行:
>>> True or 2
True
>>> if True:
print('Hello World')
Hello World
>>> False or 2
2
>>> if 2:
print('Hello World')
Hello World
如您所见,if
语句将始终运行,从而不断检查可能的值,这意味着玩家可以点击任何位置,只要他们将鼠标对角移动,就可以在棋盘上的任何位置创建一个检查器。要解决此问题,您需要复制代码的第一部分,或者检查可接受值列表中的值是否为。方法一需要比方法二更多的代码和类型:
if (self.board[start_row][start_column] == 1) or (self.board[start_row][start_column] == 2):
这就是为什么我推荐第二种方法,尤其是因为它比if
语句的42个字符更容易更改列表:
if (self.board[start_row][start_column]) in (1 , 2):
总结:
def get_mouse_pos_and_place(self, start_x, start_y, end_x, end_y, number):
end_column = end_x // SQUARESIZE
end_row = end_y // SQUARESIZE
start_column = start_x // SQUARESIZE
start_row = start_y // SQUARESIZE
if (self.board[start_row][start_column]) in (1 , 2)::
for x, y in self.red_valid_moves:
if (x == start_column - end_column) and (y == start_row - end_row):
self.board[start_row][start_column] = 0
self.board[end_row][end_column] = number
def get_valid_moves(self, start_x, start_y, end_x, end_y):
end_column = end_x // SQUARESIZE
end_row = end_y // SQUARESIZE
start_column = start_x // SQUARESIZE
start_row = start_y // SQUARESIZE
if self.board[start_row + 1][start_column + 1] == 0:
self.red_valid_moves.append((1, 1))
elif self.board[start_row - 1][start_column + 1] == 0:
self.red_valid_moves.append((-1, 1))