Exemplo n.º 1
0
    def testMoveLeftUpdatesOffset(self):
        start_state = """\
4|3

1|2
"""
        board = Board.create(start_state, border=1)
        graph = CaptureBoardGraph()
        expected_state = """\
x 4|3

1|2 x
"""
        graph.walk(board)
        offset = [1, 1]  # position of bottom left corner (within border)
        expected_offset = [1, 0]  # equivalent position after move and cropping

        state = graph.move(board[1][1].domino, -1, 0, offset)

        self.assertEqual(expected_state, state)
        self.assertEqual(expected_offset, offset)
Exemplo n.º 2
0
    def testMoveLeftUpdatesOffset(self):
        start_state = """\
4|3

1|2
"""
        board = Board.create(start_state, border=1)
        graph = CaptureBoardGraph()
        expected_state = """\
x 4|3

1|2 x
"""
        graph.walk(board)
        offset = [1, 1]  # position of bottom left corner (within border)
        expected_offset = [1, 0]  # equivalent position after move and cropping

        state = graph.move(board[1][1].domino, -1, 0, offset)

        self.assertEqual(expected_state, state)
        self.assertEqual(expected_offset, offset)
Exemplo n.º 3
0
def draw_diagram(turtle, state, cell_size, solution=False):
    marks = {'>': partial(draw_arrow, turtle, cell_size),
             '^': partial(draw_arrow, turtle, cell_size, 90),
             '<': partial(draw_arrow, turtle, cell_size, 180),
             'v': partial(draw_arrow, turtle, cell_size, 270),
             '*': partial(draw_capture, turtle, cell_size)}
    pos = turtle.pos()
    lines = state.splitlines()
    turtle.up()
    turtle.forward(cell_size*0.5)
    turtle.right(90)
    turtle.forward(cell_size*len(lines)*0.5)
    turtle.left(90)
    origin = turtle.pos()
    board = Board.create(state)
    draw_board(turtle, board, cell_size)
    turtle.up()
    for y, line in enumerate(reversed(lines)):
        for x, c in enumerate(line):
            if (x+y) % 2:
                mark = marks.get(c)
                if mark is not None:
                    mark()
                    turtle.up()
            turtle.forward(cell_size*.5)
        turtle.back(cell_size*len(line)*.5)
        turtle.left(90)
        turtle.forward(cell_size*.5)
        turtle.right(90)
    turtle.setpos(pos)
    if solution:
        border = 1
        offset = [border, border]
        board = Board.create(state, border=border)
        graph = CaptureBoardGraph()
        graph.walk(board)
        solution = graph.get_solution()
        for move_num, move in enumerate(solution, 1):
            domino_name = move[:2]
            for domino in board.dominoes:
                if domino.get_name() == domino_name:
                    shade = (move_num-1) * 1.0/(len(solution)-1)
                    rgb = (0, 1-shade, shade)
                    turtle.setpos(origin)
                    turtle.forward((domino.head.x-offset[0]) * cell_size)
                    turtle.left(90)
                    turtle.forward((domino.head.y-offset[1]) * cell_size)
                    turtle.right(90)
                    turtle.setheading(domino.degrees)
                    turtle.forward(cell_size*.5)
                    dx, dy = Domino.get_direction(move[-1])
                    turtle.setheading(math.atan2(dy, dx) * 180/math.pi)
                    pen = turtle.pen()
                    turtle.pencolor(rgb)
                    circle_pos = turtle.pos()
                    turtle.width(4)
                    turtle.forward(cell_size*0.05)
                    turtle.down()
                    turtle.forward(cell_size*0.4)
                    turtle.up()
                    turtle.pen(pen)
                    turtle.setpos(circle_pos)
                    turtle.forward(8)
                    turtle.setheading(0)
                    turtle.right(90)
                    turtle.forward(8)
                    turtle.left(90)
                    turtle.down()
                    turtle.down()
                    turtle.pencolor(rgb)
                    turtle.fillcolor('white')
                    turtle.begin_fill()
                    turtle.circle(8)
                    turtle.end_fill()
                    turtle.pen(pen)
                    turtle.write(move_num, align='center')
                    turtle.up()
                    state = graph.move(domino, dx, dy, offset)
                    offset[0] += border
                    offset[1] += border
                    board = Board.create(state, border=border)
                    break
        turtle.setpos(pos)
Exemplo n.º 4
0
def draw_diagram(turtle, state, cell_size, solution=False):
    marks = {'>': partial(draw_arrow, turtle, cell_size),
             '^': partial(draw_arrow, turtle, cell_size, 90),
             '<': partial(draw_arrow, turtle, cell_size, 180),
             'v': partial(draw_arrow, turtle, cell_size, 270),
             '*': partial(draw_capture, turtle, cell_size)}
    pos = turtle.pos()
    lines = state.splitlines()
    turtle.up()
    turtle.forward(cell_size*0.5)
    turtle.right(90)
    turtle.forward(cell_size*len(lines)*0.5)
    turtle.left(90)
    origin = turtle.pos()
    board = Board.create(state)
    draw_board(turtle, board, cell_size)
    turtle.up()
    for y, line in enumerate(reversed(lines)):
        for x, c in enumerate(line):
            if (x+y) % 2:
                mark = marks.get(c)
                if mark is not None:
                    mark()
                    turtle.up()
            turtle.forward(cell_size*.5)
        turtle.back(cell_size*len(line)*.5)
        turtle.left(90)
        turtle.forward(cell_size*.5)
        turtle.right(90)
    turtle.setpos(pos)
    if solution:
        border = 1
        offset = [border, border]
        board = Board.create(state, border=border)
        for cell in board.findMatches():
            turtle.setpos(origin)
            draw_match(turtle,
                       cell_size,
                       offset,
                       cell)
        graph = CaptureBoardGraph()
        graph.walk(board)
        solution = graph.get_solution(partial=True)
        step_count = max(len(solution)-1, 1)
        for move_num, move in enumerate(solution, 1):
            domino_name = move[:2]
            for domino in board.dominoes:
                if domino.get_name() == domino_name:
                    dx, dy = Domino.get_direction(move[-1])
                    turtle.setpos(origin)
                    draw_move(turtle,
                              cell_size,
                              offset,
                              domino,
                              dx,
                              dy,
                              move_num,
                              step_count)
                    old_offset = offset[:]
                    state = graph.move(domino, dx, dy, offset)
                    new_board = Board.create(state, border=border)
                    captures = set(board.dominoes)
                    captures.difference_update(new_board.dominoes)
                    captures.discard(domino)
                    for capture in captures:
                        turtle.setpos(origin)
                        draw_capture_circle(turtle,
                                            cell_size,
                                            old_offset,
                                            capture,
                                            move_num)
                    offset[0] += border
                    offset[1] += border
                    board = new_board
                    break
        # Mark uncaptured dominoes
        for domino in board.dominoes:
            turtle.setpos(origin)
            draw_capture_circle(turtle, cell_size, offset, domino)
        turtle.setpos(pos)
Exemplo n.º 5
0
def draw_diagram(turtle, state, cell_size, solution=False):
    marks = {
        '>': partial(draw_arrow, turtle, cell_size),
        '^': partial(draw_arrow, turtle, cell_size, 90),
        '<': partial(draw_arrow, turtle, cell_size, 180),
        'v': partial(draw_arrow, turtle, cell_size, 270),
        '*': partial(draw_capture, turtle, cell_size)
    }
    pos = turtle.pos()
    lines = state.splitlines()
    turtle.up()
    turtle.forward(cell_size * 0.5)
    turtle.right(90)
    turtle.forward(cell_size * len(lines) * 0.5)
    turtle.left(90)
    origin = turtle.pos()
    board = Board.create(state)
    draw_board(turtle, board, cell_size)
    turtle.up()
    for y, line in enumerate(reversed(lines)):
        for x, c in enumerate(line):
            if (x + y) % 2:
                mark = marks.get(c)
                if mark is not None:
                    mark()
                    turtle.up()
            turtle.forward(cell_size * .5)
        turtle.back(cell_size * len(line) * .5)
        turtle.left(90)
        turtle.forward(cell_size * .5)
        turtle.right(90)
    turtle.setpos(pos)
    if solution:
        border = 1
        offset = [border, border]
        board = Board.create(state, border=border)
        for cell in board.findMatches():
            turtle.setpos(origin)
            draw_match(turtle, cell_size, offset, cell)
        graph = CaptureBoardGraph()
        graph.walk(board)
        solution = graph.get_solution(return_partial=True)
        step_count = max(len(solution) - 1, 1)
        for move_num, move in enumerate(solution, 1):
            domino_name = move[:2]
            for domino in board.dominoes:
                if domino.get_name() == domino_name:
                    dx, dy = Domino.get_direction(move[-1])
                    turtle.setpos(origin)
                    draw_move(turtle, cell_size, offset, domino, dx, dy,
                              move_num, step_count)
                    old_offset = offset[:]
                    state = graph.move(domino, dx, dy, offset)
                    new_board = Board.create(state, border=border)
                    captures = set(board.dominoes)
                    captures.difference_update(new_board.dominoes)
                    captures.discard(domino)
                    for capture in captures:
                        turtle.setpos(origin)
                        draw_capture_circle(turtle, cell_size, old_offset,
                                            capture, move_num)
                    offset[0] += border
                    offset[1] += border
                    board = new_board
                    break
        # Mark uncaptured dominoes
        for domino in board.dominoes:
            turtle.setpos(origin)
            draw_capture_circle(turtle, cell_size, offset, domino)
        turtle.setpos(pos)