-2

好的,所以我正在棋盘上创建一种益智游戏。到目前为止,为特定事物编写代码以及它们如何与其他事物交互相对容易,但我遇到了添加不可通行空间的问题,因为我似乎无法围绕一种方式来解决问题创造一个,或没有,或 20 个不可通行的物体。因为那时我需要将图像粘贴到矩形上,然后还要根据矩形的坐标来防止移动。如果需要,我可以更具体。只是在评论中询问。提前感谢您的帮助。

编辑:有人要求提供更多信息......所以这是我到目前为止所拥有的......其他人帮助我编写了一个为板上的每个空间生成矩形的函数......

def MakeBoard(upper_x=100, upper_y=100, size=100):
global ChessBoard
ChessBoard = []
for y in range(8):
    row = []
    for x in range(8):
        coords = (upper_x + x * size, upper_y + y * size)
        row.append(pygame.Rect(coords, (size, size)))
    ChessBoard.append(row)
return ChessBoard

因此该函数会在板上生成空间。在这种类型的函数中将禁止移动,它会生成可供您使用的移动。基本上,它检查目标坐标是否在 (1,1) 和 (8,8) 之间,因此在棋盘上。可以被 ChessBoard[y][x] 引用

def RookMove(RXM, RYM):
VarReset()
if (RXM + 3) >= 1 and (RXM + 3) <= 8:
    global ROption1Exists
    ROption1Exists = True
if (RXM-3) >= 1 and (RXM-3) <= 8:
    global ROption2Exists
    ROption2Exists = True
if (RYM+3) >= 1 and (RYM+3) <= 8:
    global ROption3Exists
    ROption3Exists = True
if (RYM-3) >= 1 and (RYM-3) <= 8:
    global ROption4Exists
    ROption4Exists = True

为了禁止移动,我想在 If 语句中添加另一个条件,类似于... 列出不可通过对象的坐标并检查以确保您必须遍历的所有坐标都与元素中的元素不匹配名单。

不过,我想我可以自己解决这个问题。我遇到的主要问题是在生成列表时没有为板上的每个空间创建一个像 64 个 if 语句这样的巨大函数。

基本上,我正在寻求帮助的是如何,相对简单地,

A. 将图像粘贴到一些代表无法通过的地形的坐标上

B. 用无法通过的地形坐标填充列表,然后检查以确保玩家将要行驶的坐标不在列表中。或者,以其他方式,在我提供的示例函数的上下文中,禁止玩家移动,如果移动选项会让他穿过无法通过的地形。

4

1 回答 1

0

您在这里似乎有两个问题,这可能应该是两个单独的问题。

  1. 确定一个棋子的合法移动列表。
  2. 在 pygame 中显示游戏板。

这是一些简单的代码,用于测试给定的棋盘位置是否是国际象棋车的有效移动。它并不完美,但它可能会给你一些关于如何解决这个问题的想法。请注意,在真正的国际象棋游戏中,您还需要检查目标方格的路径中是否没有其他棋子。

另请注意,global通常应避免使用变量,这里当然不需要它们。尝试让您的函数返回一个有用的结果,该结果是您根据提供的参数计算得出的,而不直接更改它们自身之外的任何数据(“无副作用”)。

from collections import namedtuple

BoardPosition = namedtuple('BoardPosition', ['x', 'y'])

def isOnBoard(position):
    # return True if position is on the board, or else False
    return (position.x >= 0
        and position.x < 8
        and position.y >= 0
        and position.y < 8)

def sameX(posA, posB):
    # return True if both positions are on the same column
    return posA.x == posB.x

def sameY(posA, posB):
    # return True if both positions are on the same row
    return posA.y == posB.y

def isRookMove(rookPos, targetPos):
    # return True if the target position is on the game board
    # AND it is a valid move for the supplied rook position.
    return ((sameX(rookPos, targetPos) or sameY(rookPos, targetPos))
            and isOnBoard(targetPos))


# Now to test the code...
myRookPos = BoardPosition(0, 0)
print isRookMove(myRookPos, BoardPosition(0, 4)) # True  (same column)
print isRookMove(myRookPos, BoardPosition(2, 4)) # False 
print isRookMove(myRookPos, BoardPosition(0, 8)) # False (off the board)

# Here is one way to produce a list of all the valid moves for the test rook...
allLegalMoves = [BoardPosition(x, y) for x in range(8) for y in range(8)
        if isRookMove(myRookPos, BoardPosition(x, y))]
print allLegalMoves
于 2013-09-18T08:07:21.083 回答