def test_pop_singleton():
    from double_linked_list import DoubleLinkedList
    dll = DoubleLinkedList()
    dll.append(5)
    return_value = dll.pop()
    assert return_value == 5
    assert dll.head_node is None
    assert dll.tail_node is None
def test_remove_value_not_in_list():
    from double_linked_list import DoubleLinkedList
    dll = DoubleLinkedList()
    dll.append(5)
    dll.insert(10)
    dll.append(15)
    dll.insert(20)
    with pytest.raises(ValueError):
        dll.remove('bananas')
def test_pop():
    from double_linked_list import DoubleLinkedList
    dll = DoubleLinkedList()
    dll.append(5)
    dll.insert(10)
    dll.append(15)
    dll.insert(20)
    return_value_1 = dll.pop()
    assert return_value_1 == 20
    assert dll.head_node.value == 10
def test_shift():
    from double_linked_list import DoubleLinkedList
    dll = DoubleLinkedList()
    dll.append(5)
    dll.insert(10)
    dll.append(15)
    dll.insert(20)
    # [20, 10, 5, 15]
    return_value_1 = dll.shift()
    assert return_value_1 == 15
    assert dll.tail_node.value == 5
def test_append():
    # test multiple append calls
    from double_linked_list import DoubleLinkedList
    dll = DoubleLinkedList()
    dll.append(4)
    dll.append(8)
    assert dll.head_node.value == 4
    assert dll.head_node.next.value == 8
    assert dll.head_node.previous == dll.head_sentinal

    assert dll.tail_node.value == 8
    assert dll.tail_node.next == dll.tail_sentinal
    assert dll.tail_node.previous == dll.head_node
def test_append_on_empty_list():
    # test append single element on empty list
    from double_linked_list import DoubleLinkedList
    dll = DoubleLinkedList()
    dll.append(4)
    assert dll.tail_node.value == 4
    assert dll.tail_node.next == dll.tail_sentinal
    assert dll.tail_node.previous == dll.head_sentinal

    # list is 1 element long, so head and tail are that element
    assert dll.head_node.value == 4
    assert dll.head_node.next == dll.tail_sentinal
    assert dll.head_node.previous == dll.head_sentinal
示例#7
0
class Model:
    def __init__(self):
        self.pellets = DoubleLinkedList()
        self.blobs = DoubleLinkedList()
        self.bullet_blobs = DoubleLinkedList()
        self.blob_families = []
        self.controllers = []
        self.lastime = time.time()

        for _ in range(SMALL_PELLET_NUM):
            self.__generate_pellet()

        for _ in range(LARGE_PELLET_NUM):
            self.__generate_large_pellet()

    def update(self):
        dt = self.__get_dt()
        self.__move(dt)
        self.__resolve_collisions()

    def get_board_size(self):
        return (BOARD_WIDTH, BOARD_HEIGHT)

    def get_items(self):
        return [pellet.get() for pellet in self.pellets] + [
            bullet_blob.get() for bullet_blob in self.bullet_blobs
        ] + [blob.get() for blob in self.blobs]

    def register_controller(self, controller):
        blob_family = BlobFamily(self, len(self.controllers))
        blob = Blob(self, self.__random_position(100), len(self.controllers),
                    blob_family)
        blob_family.add_blob(blob)
        controller.set_manipulator(Manipulator(blob_family, self))

        self.controllers.append(controller)
        self.blobs.append(blob)
        self.blob_families.append(blob_family)

    def add_blob(self, blob):
        self.blobs.append(blob)

    def add_bullet_blob(self, bullet_blob):
        self.bullet_blobs.append(bullet_blob)

    def __move(self, dt):
        for controller in self.controllers:
            controller.update()
        for family in self.blob_families:
            family.update(dt)
        for bullet_blob in self.bullet_blobs:
            bullet_blob.get().update(dt)
        for pellet in self.pellets:
            if isinstance(pellet.get(), LargePellet): pellet.get().update(dt)

    def __get_dt(self):
        currentTime = time.time()
        dt = currentTime - self.lastime
        self.lastime = currentTime
        return dt

    def __random_position(self, offset):
        return (random.randint(offset, BOARD_WIDTH - offset),
                random.randint(offset, BOARD_HEIGHT - offset))

    def __resolve_collisions(self):
        blob_iter = self.blobs.get_first_iterator()
        while blob_iter is not None:

            self.__resolve_collisions_blob_pellets(blob_iter.get())

            if self.__resolve_collisions_blob_other_blobs(blob_iter):
                tmp = blob_iter.get_next()
                self.blobs.delete(blob_iter)
                blob_iter.get().remove_from_family()
                blob_iter = tmp
                continue

            blob_iter = blob_iter.get_next()

        bullet_blob = self.bullet_blobs.get_first_iterator()
        while bullet_blob is not None:

            if self.__resolve_collisions_bullet_blobs(bullet_blob.get(
            )) or self.__resolve_collisions_bullet_pellets(bullet_blob.get()):
                tmp = bullet_blob.get_next()
                self.bullet_blobs.delete(bullet_blob)
                bullet_blob = tmp
            else:
                bullet_blob = bullet_blob.get_next()

    def __resolve_collisions_blob_pellets(self, blob):
        pellet = self.pellets.get_first_iterator()
        while pellet is not None:
            if blob.collides(pellet.get()):
                pellet.get().affect(blob)

                if isinstance(pellet.get(), LargePellet):
                    self.__generate_large_pellet()
                else:
                    self.__generate_pellet()

                tmp = pellet.get_next()
                self.pellets.delete(pellet)
                pellet = tmp

            else:
                pellet = pellet.get_next()

    def __resolve_collisions_blob_other_blobs(self, blob_iter_1):
        # returns true if blob_iter_1.get() should be deleted

        blob_1 = blob_iter_1.get()
        blob_iter_2 = blob_iter_1.get_next()

        can_merge = not blob_1.get_blob_family().should_stay_divided()

        while blob_iter_2 is not None:

            blob_2 = blob_iter_2.get()
            same_family = blob_1.get_blob_family() is blob_2.get_blob_family()

            if blob_1.collides(blob_2):
                if (not same_family and blob_1.can_eat(blob_2)) or (
                        same_family and can_merge
                        and blob_1.get_weight() >= blob_2.get_weight()):
                    blob_1.add_weight(blob_2.get_weight())
                    tmp = blob_iter_2.get_next()
                    self.blobs.delete(blob_iter_2)
                    blob_2.remove_from_family()
                    blob_iter_2 = tmp
                    continue

                elif (not same_family and blob_2.can_eat(blob_1)) or (
                        same_family and can_merge
                        and blob_1.get_weight() <= blob_2.get_weight()):
                    blob_2.add_weight(blob_1.get_weight())
                    return True

            if same_family and not can_merge and blob_1.touches(blob_2):
                blob_1.repel_from_each_other(blob_2)

            blob_iter_2 = blob_iter_2.get_next()

    def __resolve_collisions_bullet_blobs(self, bullet_blob):
        for blob in self.blobs:
            if bullet_blob.collides(blob.get()):
                blob.get().push(bullet_blob, BULLET_BLOB_STRENGTH)
                blob.get().add_weight(BULLET_EAT_RATIO *
                                      bullet_blob.get_weight())
                return True
        return False

    def __resolve_collisions_bullet_pellets(self, bullet_blob):
        for pellet in self.pellets:
            if isinstance(pellet.get(),
                          LargePellet) and pellet.get().collides(bullet_blob):
                pellet.get().push(bullet_blob, BULLET_PELLET_STRENGTH)
                return True
        return False

    def __generate_pellet(self):
        weight = random.randint(1, 5)
        pellet = Pellet(self.__random_position(10), weight)

        while True:
            for blob in self.blobs:
                if blob.get().touches(pellet):
                    break
            else:
                break
            pellet.position = self.__random_position(50)

        self.pellets.append(pellet)

    def __generate_large_pellet(self):
        pellet = LargePellet(self, self.__random_position(50))

        while True:
            for blob in self.blobs:
                if blob.get().touches(pellet):
                    break
            else:
                break
            pellet.position = self.__random_position(50)

        self.pellets.append(pellet)
示例#8
0
from double_linked_list import DoubleLinkedList

d = DoubleLinkedList()
d.is_empty()
d.append(17)
d.is_empty()
d.append(34)
d.append(41)
d.append(3)
d.transversal()
d.remove_from_head(17)
d.transversal()
d.get_size()
d.reverse_transversal()
d.remove_from_tail(17)
d.find_from_head(3)
d.find_from_tail(3)