С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
3 / 2 / 1
Регистрация: 25.11.2021
Сообщений: 11

Фигуры на шахматной доске

10.04.2022, 16:53. Показов 3556. Ответов 4

Студворк — интернет-сервис помощи студентам
Задача: Написать программу шахмат, для двух игроков, забирание фигуры не делать.
Я написал программу шахмат с классами и фигурами, проблема в том, что фигуры могут ходить друг через друга. Пробовал это исправить в line 247, но тогда фигуры не ходят вообще. Прошу помощи)

Запускаю так:
Python
1
2
3
4
5
from chess import WHITE, BLACK, Board, Queen, Rook, Bishop, Knight, main, print_board
 
board = Board()
 
main()
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
WHITE = 1
BLACK = 2
 
def opponent(color):
    if color == WHITE:
        return BLACK
    return WHITE
 
 
class King:
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        return "K"
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        if self.row + 1 == row or \
           self.row - 1 == row or \
           self.row + 1 == row and self.col + 1 == col or \
           self.row + 1 == row and self.col - 1 == col or \
           self.row - 1 == row and self.col + 1 == col or \
           self.row - 1 == row and self.col - 1 == col or \
           self.col - 1 == col or \
           self.col + 1 == col:
            return True
        else: 
            return False
 
 
class Knight:
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        return "N"
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        if self.row + 1 == row and self.col + 2 == col or \
           self.row + 1 == row and self.col - 2 == col or \
           self.row + 2 == row and self.col + 1 == col or \
           self.row + 2 == row and self.col - 1 == col or \
           self.row - 1 == row and self.col + 2 == col or \
           self.row - 1 == row and self.col - 2 == col or \
           self.row - 2 == row and self.col + 1 == col or \
           self.row - 2 == row and self.col - 1 == col:
            return True
        else: 
            return False
 
class Bishop:
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        return "B"
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        if abs(self.row - row) == abs(self.col - col):
            return True
        else: 
            return False
 
 
class Queen:
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        return "Q"
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        if abs(self.row - row) == abs(self.col - col):
            return True
        elif not(self.row != row and self.col != col):
            return True
        else:
            return False
 
 
class Rook:
 
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        return "R"
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        # Невозможно сделать ход в клетку, которая не лежит в том же ряду
        # или столбце клеток.
        if self.row != row and self.col != col:
            return False
        return True
 
 
class Pawn:
 
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        return 'P'
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        # Пешка может ходить только по вертикали
        # "взятие на проходе" не реализовано
        if self.col != col:
            return False
 
        # Пешка может сделать из начального положения ход на 2 клетки
        # вперёд, поэтому поместим индекс начального ряда в start_row.
        if self.color == WHITE:
            direction = 1
            start_row = 1
        else:
            direction = -1
            start_row = 6
 
        # ход на 1 клетку
        if self.row + direction == row:
            return True
 
        # ход на 2 клетки из начального положения
        if self.row == start_row and self.row + 2 * direction == row:
            return True
 
        return False
 
def correct_coords(row, col):
    """Функция проверяет, что координаты (row, col) лежат
    внутри доски"""
    return 0 <= row < 8 and 0 <= col < 8
 
 
class Board:
    def __init__(self):
        self.color = WHITE
        self.field = []
        for row in range(8):
            self.field.append([None] * 8)
        for col in range(8):
            self.field[1][col] = Pawn(1, col, WHITE)  
            self.field[6][col] = Pawn(6, col, BLACK) 
 
        self.field[0][0] = Rook(0, 0, WHITE)
        self.field[0][7] = Rook(0, 7, WHITE)
        self.field[7][0] = Rook(7, 0, BLACK)
        self.field[7][7] = Rook(7, 7, BLACK)
 
        self.field[0][3] = Queen(0, 3, WHITE)
        self.field[7][4] = Queen(7, 4, BLACK)
 
        self.field[0][1] = Knight(0, 1, WHITE)
        self.field[0][6] = Knight(0, 6, WHITE)
        self.field[7][1] = Knight(7, 1, BLACK)
        self.field[7][6] = Knight(7, 6, BLACK)
 
        self.field[0][2] = Bishop(0, 2, WHITE)
        self.field[0][5] = Bishop(0, 5, WHITE)
        self.field[7][2] = Bishop(7, 2, BLACK)
        self.field[7][5] = Bishop(7, 5, BLACK)
 
        self.field[0][4] = King(0, 4, WHITE)
        self.field[7][3] = King(7, 3, BLACK)
 
    def current_player_color(self):
        return self.color
 
    def cell(self, row, col):
        """Возвращает строку из двух символов. Если в клетке (row, col)
        находится фигура, символы цвета и фигуры. Если клетка пуста,
        то два пробела."""
        piece = self.field[row][col]
        if piece is None:
            return "  "
        color = piece.get_color()
        c = "w" if color == WHITE else "b"
        return c + piece.char()
 
    def move_piece(self, row, col, row1, col1):
        """Переместить фигуру из точки (row, col) в точку (row1, col1).
        Если перемещение возможно, метод выполнит его и вернет True.
        Если нет --- вернет False"""
 
        if not correct_coords(row, col) or not correct_coords(row1, col1):
            return False
        if row == row1 and col == col1:
            return False  # нельзя пойти в ту же клетку
        piece = self.field[row][col]
        if piece is None:
            return False
        # for i in range(abs(row1 - row)):
        #     if self.field[i][col] != None:
        #         return False
        # for i in range(abs(col1 - col)):
        #     if self.field[row][i] != None:
        #         return False
        if piece.get_color() != self.color:
            return False
        if not piece.can_move(row1, col1):
            return False
        self.field[row][col] = None  # Снять фигуру.
        self.field[row1][col1] = piece  # Поставить на новое место.
        piece.set_position(row1, col1)
        self.color = opponent(self.color)
        return True
 
    def is_under_attack(self, row, col, color):
        """Метод должен возвращать True, 
        если поле с координатами (row, col) находится под боем хотя бы одной фигуры цвета color."""
        for i in range(8):
            for j in range(8):
                if self.field[i][j] is not None:
                    piece = self.field[i][j]
                    if piece.get_color() == color:
                        if piece.can_move(row, col):
                            return True
 
def print_board(board): # Распечатать доску в текстовом виде (см. скриншот)
    print('     +----+----+----+----+----+----+----+----+')
    for row in range(7, -1, -1):
        print(' ', row, end='  ')
        for col in range(8):
            print('|', board.cell(row, col), end=' ')
        print('|')
        print('     +----+----+----+----+----+----+----+----+')
    print(end='        ')
    for col in range(8):
        print(col, end='    ')
    print()
 
def main():
    # Создаём шахматную доску
    board = Board()
    # Цикл ввода команд игроков
    while True:
        # Выводим положение фигур на доске
        print_board(board)
        # Подсказка по командам
        print('Команды:')
        print('    exit                               -- выход')
        print('    move <row> <col> <row1> <col1>     -- ход из клетки (row, col)')
        print('                                          в клетку (row1, col1)')
        # Выводим приглашение игроку нужного цвета
        if board.current_player_color() == WHITE:
            print('Ход белых:')
        else:
            print('Ход черных:')
        command = input()
        if command == 'exit':
            break
        move_type, row, col, row1, col1 = command.split()
        row, col, row1, col1 = int(row), int(col), int(row1), int(col1)
        if board.move_piece(row, col, row1, col1):
            print('Ход успешен')
        else:
            print('Координаты некорректы! Попробуйте другой ход!')
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2022, 16:53
Ответы с готовыми решениями:

Заданы координаты короля и ладьи на шахматной доске определить бьют ли фигуры друг друга
заданы координаты короля и ладьи на шахматной доске определить бьют ли фигуры друг друга весь код в pithon

Расстановка N ферзей на шахматной доске N×N
Требуется расставить N ферзей на шахматной доске N×N таким образом, чтобы никакие два ферзя не били друг друга. Расстановку необходимо...

Количество перестановок на шахматной доске
Имеется доска n×n, окрашенная в белый и черный цвета в шахматном порядке, причем белых клеток не меньше, чем черных. Посчитайте число...

4
0 / 0 / 0
Регистрация: 10.04.2023
Сообщений: 1
11.04.2023, 14:43
в 247 строке не !=, а ==. Остальное всё верно.
Python
1
2
3
4
5
6
        for i in range(abs(row1 - row)):
             if self.field[i][col] == None:
                 return False
        for i in range(abs(col1 - col)):
             if self.field[row][i] == None:
                 return False
0
0 / 0 / 0
Регистрация: 02.03.2024
Сообщений: 4
02.05.2024, 19:02
это не помогает
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
03.05.2024, 09:21
М-да... Код автора - это образец того как решать задачу по ООП не применяя ООП. Также у автора проблемы с логикой и математикой. Кто-нибудь способен прочитать вот это?
Python
1
2
3
4
5
6
7
8
9
10
11
12
def can_move(self, row, col):
        if self.row + 1 == row or \
           self.row - 1 == row or \
           self.row + 1 == row and self.col + 1 == col or \
           self.row + 1 == row and self.col - 1 == col or \
           self.row - 1 == row and self.col + 1 == col or \
           self.row - 1 == row and self.col - 1 == col or \
           self.col - 1 == col or \
           self.col + 1 == col:
            return True
        else: 
            return False
Классы фигур почти полностью дублируют друг друга. Такое впечатление, что наследование они не проходили.
Я отнаследовал все фигуры от класса Figure, а также переписал в них метод can_move человеческим языком.
Программа стала более читаемой и уменьшилась на 64 строчки. Сама архитектура у автора не фонтан, конечно.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
WHITE = 1
BLACK = 2
BOARD_DIM = 8
 
def opponent(color):
    if color == WHITE:
        return BLACK
    return WHITE
 
class Figure:
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        pass
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        return abs(self.row - row), abs(self.col - col)
 
class King(Figure):
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "K"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row < 2 and abs_d_col < 2
 
class Knight(Figure): # конь
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "N"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row < 2 and abs_d_col < 2
 
class Bishop(Figure): # слон
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "B"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row == abs_d_col
 
class Rook(Figure): # ладья
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "R"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row * abs_d_col == 0
 
class Queen(Figure):
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "Q"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row == abs_d_col or abs_d_row * abs_d_col == 0
 
class Pawn(Figure): # пешка
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return 'P'
 
    def can_move(self, row, col):
        # Пешка может ходить только по вертикали
        # "взятие на проходе" не реализовано
        if self.col != col:
            return False
 
        # Пешка может сделать из начального положения ход на 2 клетки
        # вперёд, поэтому поместим индекс начального ряда в start_row.
        if self.color == WHITE:
            direction = 1
            start_row = 1
        else:
            direction = -1
            start_row = 6
 
        # ход на 1 клетку
        if self.row + direction == row:
            return True
 
        # ход на 2 клетки из начального положения
        if self.row == start_row and self.row + 2 * direction == row:
            return True
 
        return False
 
def correct_coords(row, col):
    """Функция проверяет, что координаты (row, col) лежат
    внутри доски"""
    return row in range(BOARD_DIM) and col in range(BOARD_DIM)
 
class Board:
    def __init__(self):
        self.color = WHITE
        self.field = []
        for row in range(BOARD_DIM):
            self.field.append([None] * BOARD_DIM)
        for col in range(BOARD_DIM):
            self.field[1][col] = Pawn(1, col, WHITE)
            self.field[6][col] = Pawn(6, col, BLACK)
 
        self.field[0][0] = Rook(0, 0, WHITE)
        self.field[0][7] = Rook(0, 7, WHITE)
        self.field[7][0] = Rook(7, 0, BLACK)
        self.field[7][7] = Rook(7, 7, BLACK)
 
        self.field[0][3] = Queen(0, 3, WHITE)
        self.field[7][4] = Queen(7, 4, BLACK)
 
        self.field[0][1] = Knight(0, 1, WHITE)
        self.field[0][6] = Knight(0, 6, WHITE)
        self.field[7][1] = Knight(7, 1, BLACK)
        self.field[7][6] = Knight(7, 6, BLACK)
 
        self.field[0][2] = Bishop(0, 2, WHITE)
        self.field[0][5] = Bishop(0, 5, WHITE)
        self.field[7][2] = Bishop(7, 2, BLACK)
        self.field[7][5] = Bishop(7, 5, BLACK)
 
        self.field[0][4] = King(0, 4, WHITE)
        self.field[7][3] = King(7, 3, BLACK)
 
    def current_player_color(self):
        return self.color
 
    def cell(self, row, col):
        """Возвращает строку из двух символов. Если в клетке (row, col)
        находится фигура, символы цвета и фигуры. Если клетка пуста,
        то два пробела."""
        piece = self.field[row][col]
        if piece is None:
            return "  "
        color = piece.get_color()
        c = "w" if color == WHITE else "b"
        return c + piece.char()
 
    def move_piece(self, row, col, row1, col1):
        """Переместить фигуру из точки (row, col) в точку (row1, col1).
        Если перемещение возможно, метод выполнит его и вернет True.
        Если нет --- вернет False"""
 
        if not correct_coords(row, col) or not correct_coords(row1, col1):
            return False
        if row == row1 and col == col1:
            return False  # нельзя пойти в ту же клетку
        piece = self.field[row][col]
        if piece is None:
            return False
        # for i in range(abs(row1 - row)):
        #     if self.field[i][col] != None:
        #         return False
        # for i in range(abs(col1 - col)):
        #     if self.field[row][i] != None:
        #         return False
        if piece.get_color() != self.color:
            return False
        if not piece.can_move(row1, col1):
            return False
        self.field[row][col] = None  # Снять фигуру.
        self.field[row1][col1] = piece  # Поставить на новое место.
        piece.set_position(row1, col1)
        self.color = opponent(self.color)
        return True
 
    def is_under_attack(self, row, col, color):
        """Метод должен возвращать True,
        если поле с координатами (row, col) находится под боем хотя бы одной фигуры цвета color."""
        for i in range(BOARD_DIM):
            for j in range(BOARD_DIM):
                if self.field[i][j] is not None:
                    piece = self.field[i][j]
                    if piece.get_color() == color:
                        if piece.can_move(row, col):
                            return True
 
def print_board(board):  # Распечатать доску в текстовом виде (см. скриншот)
    print('     +----+----+----+----+----+----+----+----+')
    for row in range(7, -1, -1):
        print(' ', row, end='  ')
        for col in range(BOARD_DIM):
            print('|', board.cell(row, col), end=' ')
        print('|')
        print('     +----+----+----+----+----+----+----+----+')
    print(end='        ')
    for col in range(BOARD_DIM):
        print(col, end='    ')
    print()
 
def main():
    # Создаём шахматную доску
    board = Board()
    # Цикл ввода команд игроков
    while True:
        # Выводим положение фигур на доске
        print_board(board)
        # Подсказка по командам
        print('Команды:')
        print('    exit                               -- выход')
        print('    move <row> <col> <row1> <col1>     -- ход из клетки (row, col)')
        print('                                          в клетку (row1, col1)')
        # Выводим приглашение игроку нужного цвета
        if board.current_player_color() == WHITE:
            print('Ход белых:')
        else:
            print('Ход черных:')
        command = input()
        if command == 'exit':
            break
        move_type, row, col, row1, col1 = command.split()
        row, col, row1, col1 = int(row), int(col), int(row1), int(col1)
        if board.move_piece(row, col, row1, col1):
            print('Ход успешен')
        else:
            print('Координаты некорректы! Попробуйте другой ход!')
 
#from chess import WHITE, BLACK, Board, Queen, Rook, Bishop, Knight, main, print_board
 
board = Board()
main()
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
03.05.2024, 21:14
Исправил ошибку хода коня:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
WHITE = 1
BLACK = 2
BOARD_DIM = 8
 
def opponent(color):
    if color == WHITE:
        return BLACK
    return WHITE
 
class Figure:
    def __init__(self, row, col, color):
        self.row = row
        self.col = col
        self.color = color
 
    def set_position(self, row, col):
        self.row = row
        self.col = col
 
    def char(self):
        pass
 
    def get_color(self):
        return self.color
 
    def can_move(self, row, col):
        return abs(self.row - row), abs(self.col - col)
 
class King(Figure):
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "K"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row < 2 and abs_d_col < 2
 
 
class Knight(Figure):  # конь
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "N"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row * and abs_d_col == 2
 
 
class Bishop(Figure):  # слон
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "B"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row == abs_d_col
 
 
class Rook(Figure):  # ладья
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "R"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row * abs_d_col == 0
 
 
class Queen(Figure):
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return "Q"
 
    def can_move(self, row, col):
        abs_d_row, abs_d_col = super().can_move(row, col)
        return abs_d_row == abs_d_col or abs_d_row * abs_d_col == 0
 
 
class Pawn(Figure):  # пешка
    def __init__(self, row, col, color):
        super().__init__(row, col, color)
 
    def char(self):
        return 'P'
 
    def can_move(self, row, col):
        # Пешка может ходить только по вертикали
        # "взятие на проходе" не реализовано
        if self.col != col:
            return False
 
        # Пешка может сделать из начального положения ход на 2 клетки
        # вперёд, поэтому поместим индекс начального ряда в start_row.
        if self.color == WHITE:
            direction = 1
            start_row = 1
        else:
            direction = -1
            start_row = 6
 
        # ход на 1 клетку
        if self.row + direction == row:
            return True
 
        # ход на 2 клетки из начального положения
        if self.row == start_row and self.row + 2 * direction == row:
            return True
        return False
 
def correct_coords(row, col):
    """Функция проверяет, что координаты (row, col) лежат
    внутри доски"""
    return row in range(BOARD_DIM) and col in range(BOARD_DIM)
 
class Board:
    def __init__(self):
        self.color = WHITE
        self.field = []
        for row in range(BOARD_DIM):
            self.field.append([None] * BOARD_DIM)
        for col in range(BOARD_DIM):
            self.field[1][col] = Pawn(1, col, WHITE)
            self.field[6][col] = Pawn(6, col, BLACK)
 
        self.field[0][0] = Rook(0, 0, WHITE)
        self.field[0][7] = Rook(0, 7, WHITE)
        self.field[7][0] = Rook(7, 0, BLACK)
        self.field[7][7] = Rook(7, 7, BLACK)
 
        self.field[0][3] = Queen(0, 3, WHITE)
        self.field[7][4] = Queen(7, 4, BLACK)
 
        self.field[0][1] = Knight(0, 1, WHITE)
        self.field[0][6] = Knight(0, 6, WHITE)
        self.field[7][1] = Knight(7, 1, BLACK)
        self.field[7][6] = Knight(7, 6, BLACK)
 
        self.field[0][2] = Bishop(0, 2, WHITE)
        self.field[0][5] = Bishop(0, 5, WHITE)
        self.field[7][2] = Bishop(7, 2, BLACK)
        self.field[7][5] = Bishop(7, 5, BLACK)
 
        self.field[0][4] = King(0, 4, WHITE)
        self.field[7][3] = King(7, 3, BLACK)
 
    def current_player_color(self):
        return self.color
 
    def cell(self, row, col):
        """Возвращает строку из двух символов. Если в клетке (row, col)
        находится фигура, символы цвета и фигуры. Если клетка пуста,
        то два пробела."""
        piece = self.field[row][col]
        if piece is None:
            return "  "
        color = piece.get_color()
        c = "w" if color == WHITE else "b"
        return c + piece.char()
 
    def move_piece(self, row, col, row1, col1):
        """Переместить фигуру из точки (row, col) в точку (row1, col1).
        Если перемещение возможно, метод выполнит его и вернет True.
        Если нет --- вернет False"""
 
        if not correct_coords(row, col) or not correct_coords(row1, col1):
            return False
        if row == row1 and col == col1:
            return False  # нельзя пойти в ту же клетку
        piece = self.field[row][col]
        if piece is None:
            return False
        # for i in range(abs(row1 - row)):
        #     if self.field[i][col] != None:
        #         return False
        # for i in range(abs(col1 - col)):
        #     if self.field[row][i] != None:
        #         return False
        if piece.get_color() != self.color:
            return False
        if not piece.can_move(row1, col1):
            return False
        self.field[row][col] = None  # Снять фигуру.
        self.field[row1][col1] = piece  # Поставить на новое место.
        piece.set_position(row1, col1)
        self.color = opponent(self.color)
        return True
 
    def is_under_attack(self, row, col, color):
        """Метод должен возвращать True,
        если поле с координатами (row, col) находится под боем хотя бы одной фигуры цвета color."""
        for i in range(BOARD_DIM):
            for j in range(BOARD_DIM):
                if self.field[i][j] is not None:
                    piece = self.field[i][j]
                    if piece.get_color() == color:
                        if piece.can_move(row, col):
                            return True
 
def print_board(board):  # Распечатать доску в текстовом виде (см. скриншот)
    print('     +----+----+----+----+----+----+----+----+')
    for row in range(7, -1, -1):
        print(' ', row, end='  ')
        for col in range(BOARD_DIM):
            print('|', board.cell(row, col), end=' ')
        print('|')
        print('     +----+----+----+----+----+----+----+----+')
    print(end='        ')
    for col in range(BOARD_DIM):
        print(col, end='    ')
    print()
 
def main():
    # Создаём шахматную доску
    board = Board()
    # Цикл ввода команд игроков
    while True:
        # Выводим положение фигур на доске
        print_board(board)
        # Подсказка по командам
        print('Команды:')
        print('    exit                               -- выход')
        print('    move <row> <col> <row1> <col1>     -- ход из клетки (row, col)')
        print('                                          в клетку (row1, col1)')
        # Выводим приглашение игроку нужного цвета
        if board.current_player_color() == WHITE:
            print('Ход белых:')
        else:
            print('Ход черных:')
        command = input()
        if command == 'exit':
            break
        move_type, row, col, row1, col1 = command.split()
        row, col, row1, col1 = int(row), int(col), int(row1), int(col1)
        if board.move_piece(row, col, row1, col1):
            print('Ход успешен')
        else:
            print('Координаты некорректы! Попробуйте другой ход!')
# from chess import WHITE, BLACK, Board, Queen, Rook, Bishop, Knight, main, print_board
 
board = Board()
main()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2024, 21:14
Помогаю со студенческими работами здесь

Количество расстановок N ферзей на шахматной доске N×N
Требуется подсчитать количество расстановок N ферзей на шахматной доске N×N таким образом, чтобы никакие два ферзя не били друг друга. ...

Задача про белые и чёрные клетки на шахматной доске
Условие: На шахматной доске отмечены 2 клетки. Если они белого цвета (обе), то выводим &quot;True&quot;, а если чёрного, выводим...

На шахматной доске n на n стоит слон. Сколько у него есть вариантов хода?
На шахматной доске n на n стоит слон. Сколько у него есть вариантов хода? Формат входных данных Вводятся три целых числа n, x и y (1...

Все фигуры на доске
Переработайте приведённую в уроке программу «шахматы» таким образом, чтобы фигуры (за исключением коня) не могли ходить друг сквозь друга. ...

Все фигуры на доске
Переработайте приведённую в уроке программу «шахматы» таким образом, чтобы фигуры (за исключением коня) не могли ходить друг сквозь друга. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru