使用模块pygame在python中制作检查器,但遇到了一些逻辑错误,我不希望代码更改只是修复了这个问题



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))

相关内容

最新更新