diff --git a/Checkers.html b/Checkers.html index 23ef7aa..d862968 100644 --- a/Checkers.html +++ b/Checkers.html @@ -461,6 +461,100 @@ assert ShorterToAqamarine(13,15)==True assert ShorterToAqamarine(1,8)==False +def _inside_board(p: Point, board: Board) -> bool: + return 0 <= p.x < board.GetWidth() and 0 <= p.y < board.GetHeight() + +def _forward_dir(user_id: int) -> int: + return 1 if user_id == 0 else -1 + +def NextItemStep(a_PointStart: Point, a_Board: Board) -> list: + piece = a_Board.GetItem(a_PointStart) + + + if piece.iType != BoardItemType.biChecker: + return [] + + user_id = piece.userID + forward = _forward_dir(user_id) + + result = [] + for dx in (-1, 1): + dest = Point(a_PointStart.x + dx, a_PointStart.y + forward) + if _inside_board(dest, a_Board): + if a_Board.GetItem(dest).iType == BoardItemType.biNone: + result.append(dest) + for dx in (-1, 1): + for dy in (-1, 1): + adj = Point(a_PointStart.x + dx, a_PointStart.y + dy) # соседняя клетка + land = Point(adj.x + dx, adj.y + dy) # поле после прыжка + if not (_inside_board(adj, a_Board) and _inside_board(land, a_Board)): + continue + adj_item = a_Board.GetItem(adj) + land_item = a_Board.GetItem(land) + if (adj_item.iType in (BoardItemType.biChecker, BoardItemType.biDamka) and + adj_item.userID != user_id and + land_item.iType == BoardItemType.biNone): + result.append(land) + unique = [] + for p in result: + if p not in unique: + unique.append(p) + return unique + +def TestNextItemStep(): + board = Board(8, 8) + start = Point(2, 2) + board.SetItem(start, + BoardItem(BoardItemType.biChecker, 0)) + assert sorted(NextItemStep(start, board), key=lambda p: (p.x, p.y)) == \ + sorted([Point(1,3), Point(3,3)], key=lambda p: (p.x, p.y)) + board2 = Board(8, 8) + start2 = Point(0, 0) + board2.SetItem(start2, + BoardItem(BoardItemType.biChecker, 0)) + assert NextItemStep(start2, board2) == [Point(1,1)] + + board3 = Board(8, 8) + my3 = Point(2, 2) + opp3 = Point(3, 3) # вражеская шашка + board3.SetItem(my3, + BoardItem(BoardItemType.biChecker, 0)) + board3.SetItem(opp3, + BoardItem(BoardItemType.biChecker, 1)) + assert sorted(NextItemStep(my3, board3), key=lambda p: (p.x, p.y)) == \ + sorted([Point(1,3), Point(4,4)], key=lambda p: (p.x, p.y)) + + board4 = Board(8, 8) + my4 = Point(4,4) + board4.SetItem(my4, + BoardItem(BoardItemType.biChecker, 1)) # игрок 1 – вперёд вверх + foes = [(Point(3,3), Point(2,2)), + (Point(5,3), Point(6,2)), + (Point(3,5), Point(2,6)), + (Point(5,5), Point(6,6))] + for foe, land in foes: + board4.SetItem(foe, + BoardItem(BoardItemType.biChecker, 0)) # противник + assert sorted(NextItemStep(my4, board4), key=lambda p: (p.x, p.y)) == \ + sorted([Point(2,2), Point(6,2), Point(2,6), Point(6,6)], + key=lambda p: (p.x, p.y)) + + board5 = Board(8, 8) + damka = Point(3,3) + board5.SetItem(damka, + BoardItem(BoardItemType.biDamka, 0)) + assert NextItemStep(damka, board5) == [] + + board6 = Board(8, 8) + my6 = Point(4,4) + board6.SetItem(my6, + BoardItem(BoardItemType.biChecker, 0)) + opp6 = Point(5,5) # вражеская фигура + board6.SetItem(opp6, + BoardItem(BoardItemType.biChecker, 1)) + assert sorted(NextItemStep(my6, board6), key=lambda p: (p.x, p.y)) == \ + sorted([Point(3,5), Point(6,6)], key=lambda p: (p.x, p.y)) + def TestXO(): # Игра крестики - нолики class GameVisualizerXO (GameVisualizer): @@ -548,11 +642,19 @@ TestListStartPoints() TestBoardEqual() TestStepFunctions() - TestPlaceCheck() + TestNextItemStep() myprint('Все тесты прошли без ошибок') document["button__start_test"].bind("click", Test) +#можно будет использовать в задаче №43 +#for i in range(h): +# data[h // 2][i] = "x" +# data[i][h // 2] = "x" +# data[i][i] = "x" +# j = w - 1 - i +# data[i][j] = "x" + TestXO()