Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.95 KB | None | 0 0
  1. WHITE = 1
  2. BLACK = 2
  3.  
  4.  
  5. # Фигуры
  6.  
  7. class Pawn:
  8.     '''Пешка'''
  9.  
  10.     def __init__(self, row, col, color):
  11.         self.row = row
  12.         self.col = col
  13.         self.color = color
  14.  
  15.     def set_position(self, row, col):
  16.         self.row = row
  17.         self.col = col
  18.  
  19.     def char(self):
  20.         return 'P'
  21.  
  22.     def get_color(self):
  23.         return self.color
  24.  
  25.     def can_move(self, row, col):
  26.         # Пешка может ходить только по вертикали
  27.         # "взятие на проходе" не реализовано
  28.         if self.col != col:
  29.             return False
  30.  
  31.         # Пешка может сделать из начального положения ход на 2 клетки
  32.         # вперёд, поэтому поместим индекс начального ряда в start_row.
  33.         if self.color == WHITE:
  34.             direction = 1
  35.             start_row = 1
  36.         else:
  37.             direction = -1
  38.             start_row = 6
  39.  
  40.         # ход на 1 клетку
  41.         if self.row + direction == row:
  42.             return True
  43.  
  44.         # ход на 2 клетки из начального положения
  45.         if self.row == start_row and self.row + 2 * direction == row:
  46.             return True
  47.  
  48.         return False
  49.  
  50. class Bishop:
  51.     def __init__(self, row, col, color):
  52.         self.row = row
  53.         self.col = col
  54.         self.color = color
  55.  
  56.     def set_position(self, row, col):
  57.         self.row = row
  58.         self.col = col
  59.  
  60.     def char(self):
  61.         return 'B'
  62.  
  63.     def get_color(self):
  64.         return self.color
  65.  
  66.     def can_move(self, row, col):
  67.         pass
  68.  
  69.  
  70. class Rook(Pawn):
  71.     '''Ладья'''
  72.  
  73.     def __init__(self, row, col, color):
  74.         super().__init__(row, col, color)
  75.  
  76.     def char(self):
  77.         return 'R'
  78.  
  79.     def can_move(self, row, col):
  80.         if self.row != row and self.col != col:
  81.             return False
  82.         return True
  83.  
  84.  
  85. # Доска
  86. class Board:
  87.     def __init__(self):
  88.         self.color = WHITE
  89.         self.field = []
  90.         for row in range(8):
  91.             self.field.append([None] * 8)
  92.         # Пешка белого цвета в клетке E2.
  93.         self.field[1][4] = Pawn(1, 4, WHITE)
  94.         self.field[0][0] = Rook(0, 0, WHITE)
  95.  
  96.     def current_player_color(self):
  97.         return self.color
  98.  
  99.     def cell(self, row, col):
  100.         """Возвращает строку из двух символов. Если в клетке (row, col)
  101.        находится фигура, символы цвета и фигуры. Если клетка пуста,
  102.        то два пробела."""
  103.         piece = self.field[row][col]
  104.         if piece is None:
  105.             return '  '
  106.         color = piece.get_color()
  107.         c = 'w' if color == WHITE else 'b'
  108.         return c + piece.char()
  109.  
  110.     def move_piece(self, row, col, row1, col1):
  111.         """Переместить фигуру из точки (row, col) в точку (row1, col1).
  112.        Если перемещение возможно, метод выполнит его и вернет True.
  113.        Если нет --- вернет False"""
  114.  
  115.         if not correct_coords(row, col) or not correct_coords(row1, col1):
  116.             return False
  117.         if row == row1 and col == col1:
  118.             return False  # нельзя пойти в ту же клетку
  119.         piece = self.field[row][col]
  120.         if piece is None:
  121.             return False
  122.         if piece.get_color() != self.color:
  123.             return False
  124.         if not piece.can_move(row1, col1):
  125.             return False
  126.         self.field[row][col] = None  # Снять фигуру.
  127.         self.field[row1][col1] = piece  # Поставить на новое место.
  128.         piece.set_position(row1, col1)
  129.         self.color = opponent(self.color)
  130.         return True
  131.  
  132.  
  133. def correct_coords(row, col):
  134.     """Функция проверяет, что координаты (row, col) лежат
  135.    внутри доски"""
  136.     return 0 <= row < 8 and 0 <= col < 8
  137.  
  138.  
  139. def opponent(color):
  140.     if color == WHITE:
  141.         return BLACK
  142.     return WHITE
  143.  
  144.  
  145. def print_board(board):  # Распечатать доску в текстовом виде (см. скриншот)
  146.     print('     +----+----+----+----+----+----+----+----+')
  147.     for row in range(7, -1, -1):
  148.         print(' ', row, end='  ')
  149.         for col in range(8):
  150.             print('|', board.cell(row, col), end=' ')
  151.         print('|')
  152.         print('     +----+----+----+----+----+----+----+----+')
  153.     print(end='        ')
  154.     for col in range(8):
  155.         print(col, end='    ')
  156.     print()
  157.  
  158.  
  159. def main():
  160.     # Создаём шахматную доску
  161.     board = Board()
  162.     # Цикл ввода команд игроков
  163.     while True:
  164.         # Выводим положение фигур на доске
  165.         print_board(board)
  166.         # Подсказка по командам
  167.         print('Команды:')
  168.         print('    exit                               -- выход')
  169.         print('    move <row> <col> <row1> <col1>     -- ход из клетки (row, col)')
  170.         print('                                          в клетку (row1, col1)')
  171.         # Выводим приглашение игроку нужного цвета
  172.         if board.current_player_color() == WHITE:
  173.             print('Ход белых:')
  174.         else:
  175.             print('Ход черных:')
  176.         command = input()
  177.         if command == 'exit':
  178.             break
  179.         move_type, row, col, row1, col1 = command.split()
  180.         row, col, row1, col1 = int(row), int(col), int(row1), int(col1)
  181.         if board.move_piece(row, col, row1, col1):
  182.             print('Ход успешен')
  183.         else:
  184.             print('Координаты некорректы! Попробуйте другой ход!')
  185.  
  186.  
  187. if __name__ == '__main__':
  188.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement