好吧,所以我在棋盘上创造了一种益智游戏。到目前为止,为特定事物编写代码以及它们如何与其他事物进行交互相对容易,但是我遇到了一个问题,因为我似乎无法填充无法通过的空间我的头围绕着能够创造出一个,或者没有,或者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中。使用不可通过的地形坐标填充列表,然后检查以确保玩家将要行进的坐标不在列表中。或者,以某种其他方式,如果移动选项使他移动通过不通的地形,则在我提供的示例功能的上下文中禁止玩家的移动。
答案 0 :(得分:0)
这里似乎有两个问题,应该是两个不同的问题。
这里有一些简单的代码,用于测试给定的棋盘位置是否是国际象棋车队的有效举动。它并不完美,但它可能会给你一些如何处理这个问题的想法。请注意,在真正的国际象棋游戏中,您还需要检查目标广场的路径中没有其他棋子。
另请注意,通常应避免使用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