创建任意数量的Rect,能够检查我创建的数量,并检查它们的坐标

时间:2013-09-18 01:05:56

标签: python pygame

好吧,所以我在棋盘上创造了一种益智游戏。到目前为止,为特定事物编写代码以及它们如何与其他事物进行交互相对容易,但是我遇到了一个问题,因为我似乎无法填充无法通过的空间我的头围绕着能够创造出一个,或者没有,或者20个无法通过的物体。因为那时我需要将图像blit到rects上,然后根据rect的坐标阻止移动。如果需要,我可以更具体。只需在评论中提问。提前感谢您的帮助。

编辑:有人要求更多信息....所以这里到目前为止我还有其他人帮我编写了一个函数,为棋盘上的每个空间生成了一个...

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的巨大函数。

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

一个。将图像显示在代表无法通过的地形的某些坐标上

B中。使用不可通过的地形坐标填充列表,然后检查以确保玩家将要行进的坐标不在列表中。或者,以某种其他方式,如果移动选项使他移动通过不通的地形,则在我提供的示例功能的上下文中禁止玩家的移动。

1 个答案:

答案 0 :(得分:0)

这里似乎有两个问题,应该是两个不同的问题。

  1. 确定游戏作品的合法动作列表。
  2. 以pygame显示游戏主板。
  3. 这里有一些简单的代码,用于测试给定的棋盘位置是否是国际象棋车队的有效举动。它并不完美,但它可能会给你一些如何处理这个问题的想法。请注意,在真正的国际象棋游戏中,您还需要检查目标广场的路径中没有其他棋子。

    另请注意,通常应避免使用global变量,并且此处当然不需要它们。尝试让您的函数返回一个有用的结果,您可以从提供的参数中计算出来,而不直接改变自身之外的任何数据(&#34;没有副作用&#34;)。

    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