Конденсация нескольких циклов - PullRequest
0 голосов
/ 18 октября 2018

Я беру на себя (несколько амбициозный) проект написания шахматной игры для Mac Terminal, используя входы алгебраических обозначений для выполнения ходов.

Я написал свою доску в виде списка списков.с каждым вложенным списком, служащим рангом (горизонтальная линия) на доске:

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']
]

Затем я написал (довольно длинную) процедуру, чтобы проверить, какие законные ходы доступны для фигуры, основанной исключительно наввод данных желаемого хода, который он / она хотел бы сделать.

Я пытаюсь сделать мой код менее повторяющимся, но у меня возникают проблемы при создании списка возможных ходов для слонов, ладей,и королева.Например, для епископа я сначала использую данные, чтобы найти слона, который мог бы переместиться в этот конкретный квадрат и сохранить его позицию.Затем я генерирую список возможных квадратов, по которым слон может двигаться, используя цикл 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

Как видите, есть четыре цикла while, и в начале каждого я должен переопределить переменные позиции.Это кажется громоздким, но мне трудно думать о другом способе генерировать движения более эффективным образом.(Я еще не работаю над тем, является ли этот шаг захватом, кстати, я просто смотрю, пуст ли квадрат.)

Я был бы признателен за толчок в правильном направлении, а не за явное решение;но любой совет будет приветствоваться.Спасибо!

1 Ответ

0 голосов
/ 18 октября 2018

Вопрос : подумать о другом способе генерации ходов более эффективным образом.

Если вы обобщите его, используя function, выможет использовать его и для других pices.
Добавление четырех других направлений и знание ", какие ходы действительны для данной фигуры" , этот function можно использовать для все pice

Например:

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