Python 压缩多个while循环

Python 压缩多个while循环,python,while-loop,chess,Python,While Loop,Chess,我正在进行一个(有点雄心勃勃的)项目,编写一个在Mac终端上玩的国际象棋游戏,使用代数符号输入来影响移动 我已经将我的董事会写成一个列表列表,每个嵌套列表作为董事会上的一个等级(水平线): board = [['bR', 'bN', 'bB', 'bQ', 'bK', 'bB', 'bN', 'bR'], ['bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP'], ['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e

我正在进行一个(有点雄心勃勃的)项目,编写一个在Mac终端上玩的国际象棋游戏,使用代数符号输入来影响移动

我已经将我的董事会写成一个列表列表,每个嵌套列表作为董事会上的一个等级(水平线):

board = [['bR', 'bN', 'bB', 'bQ', 'bK', 'bB', 'bN', 'bR'],
['bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP'],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['wP', 'wP', 'wP', 'wP', 'wP', 'wP', 'wP', 'wP'],
['wR', 'wN', 'wB', 'wQ', 'wK', 'wB', 'wN', 'wR']
]
然后,我编写了一个(相当长的)程序来检查一件作品有哪些合法的移动,完全基于用户希望进行的移动的输入

我试图减少代码的重复性,但我在为主教、车和女王生成可能的动作列表时遇到了麻烦。例如,对于一个bishop,我首先使用给定的输入来定位可以移动到特定正方形的bishop并存储其位置。然后,我生成主教可以移动的可能的正方形列表,使用while循环沿每个对角线的方向移动。它最终看起来像:

 elif piece == 'B':
      s,d = square[0] + square[1], square[0] - square[1]
      squares = [(r,f) for r in range(-8,0) for f in range(len(board)) if r-f == d or r+f==s]
      pos_bishop=[]
      for i in squares:
          pos = board[i[0]][i[1]]
          if pos == mover:
              pos_bishop.append(i[0])
              pos_bishop.append(i[1])
              break
      if len(pos_bishop) == 0:
          return False
      squares2 = []
      j,k = pos_bishop[0], pos_bishop[1]
      while j>-8 and k>0 and board[j-1][k-1] == 'e ':
          squares2.append((j-1,k-1))
          j-=1
          k-=1
      j,k = pos_bishop[0], pos_bishop[1]
      while j>-8 and k<8 and board[j-1][k+1] == 'e ':
          squares2.append((j-1,k+1))
          j-=1
          k+=1
      j,k = pos_bishop[0], pos_bishop[1]
      while j<-1 and k>0 and board[j+1][k-1] == 'e ':
          squares2.append((j+1,k-1))
          j+=1
          k-=1
      j,k = pos_bishop[0], pos_bishop[1]
      while j<-1 and k<8 and board[j+1][k+1] == 'e ':
          squares2.append((j+1,k+1))
          j+=1
          k+=1
      if square in squares2:
          return True
elif片段==“B”:
s、 d=平方[0]+平方[1],平方[0]-平方[1]
如果r-f==d或r+f==s,则平方=[(r,f)表示范围内的r(-8,0)表示范围内的f(-len(board))
pos_bishop=[]
对于正方形中的i:
pos=板[i[0][i[1]]
如果pos==移动器:
pos_bishop.append(i[0])
pos_bishop.append(i[1])
打破
如果len(pos_bishop)==0:
返回错误
平方2=[]
j、 k=pos_bishop[0],pos_bishop[1]
当j>-8和k>0以及电路板[j-1][k-1]=='e':
平方2.附加((j-1,k-1))
j-=1
k-=1
j、 k=pos_bishop[0],pos_bishop[1]
而j>-8和k
问题:思考一种不同的方式,以更有效的方式生成动作

如果您使用
函数对其进行概括,您也可以将其用于其他
图片。
加上其他四个方向,以及“哪些移动对给定图片有效”的知识,此
功能可用于所有图片

例如:

def compute_moves(pb0, pb1):
    m = []

    def get_moves(j, k, direction):
        if direction == 'sw':
            while j > -8 and k > 0 and board[j - 1][k - 1] == 'e ':
                m.append((j - 1, k - 1))
                j -= 1
                k -= 1
        elif direction == 'nw':
            while j > -8 and k < 8 and board[j - 1][k + 1] == 'e ':
                m.append((j - 1, k + 1))
                j -= 1
                k += 1
        elif direction == 'se':
            while j < -1 and k > 0 and board[j + 1][k - 1] == 'e ':
                m.append((j + 1, k - 1))
                j += 1
                k -= 1
        elif direction == 'ne':
            while j < -1 and k < 8 and board[j + 1][k + 1] == 'e ':
                m.append((j + 1, k + 1))
                j += 1
                k += 1

    for direction in ['sw', 'nw', 'se', 'ne']:
        get_moves(pb0, pb1, direction)

    return m       


if __name__ in "__main__":
    moves = compute_moves(pos_bishop[0], pos_bishop[1])
def compute_移动(pb0,pb1):
m=[]
def get_移动(j、k、方向):
如果方向==“sw”:
而j>-8和k>0和board[j-1][k-1]=='e':
m、 附加((j-1,k-1))
j-=1
k-=1
elif方向==“nw”:
而j>-8和k<8以及board[j-1][k+1]=='e':
m、 附加((j-1,k+1))
j-=1
k+=1
elif方向==“se”:
当j<-1和k>0且电路板[j+1][k-1]=='e':
m、 附加((j+1,k-1))
j+=1
k-=1
elif方向==“ne”:
而j<-1和k<8以及board[j+1][k+1]=“e”:
m、 附加((j+1,k+1))
j+=1
k+=1
对于[‘西南’、‘西北’、‘东南’、‘东北’]方向:
获取移动(pb0、pb1、方向)
返回m
如果“\uuuuu main\uuuuuuuuuuuuuuuuuuuuu”中的“名称”:
移动=计算移动(位置主教[0],位置主教[1])