0

我正在用 C 语言编写一些代码,在微处理器的 LCD 屏幕上随机显示精灵。目前,当我运行此代码时,它会产生从上到下运行的 8 行。所以它以随机顺序打印一些东西,但不是精灵。为什么是这样?有人可以帮我吗?(注意: rand 是在一个单独的函数中播种的,它工作正常,问题就在这段代码中。)

void zombies() {

    Sprite zombie_sprite;
    Sprite * zombie_sprite_pointer = &zombie_sprite;
    byte zombie_bitmap [] = {
    BYTE( 11100000 ),
    BYTE( 01000000 ),
    BYTE( 11100000 )
};

    for (int i = 0; i < 8; i++) {
        Sprite * zombie_sprites = &zombie_sprites[i];
        init_sprite(zombie_sprites, rand()%76, rand()%42, 3, 3, zombie_bitmap);
        }
    create_zombies();       
}

void create_zombies(Sprite * zombie_sprites) {
    while(1) {
    clear();
    draw_sprite( &zombie_sprites );
    refresh();
    }
    return 0;
}
4

1 回答 1

0

主要问题是Sprite zombie_sprite只有一个对象。把它变成一个对象数组,你就可以开始研究其他问题了。Sprite接下来,对于指向对象的指针存在相当多的混淆。为了简化一些事情,我们可以调整zombies函数中的变量,以及一些“整理”以获得最佳实践。

// Start by using a compile-time constant to define the number of zombies.
// This could be changed to a vriable in the, once the simple case is working.
#define NUMBER_OF_ZOMBIES 8

void zombies()
{
    // Eight zombies are required, so define an array of eight sprites.
    Sprite zombie_sprites[NUMBER_OF_ZOMBIES];
    byte zombie_bitmap [] = 
    {
        BYTE( 11100000 ),
        BYTE( 01000000 ),
        BYTE( 11100000 )
    };

// Continued below...

这使得初始化精灵的函数的其余部分更容易。这一次,可以获得指向i数组中第 th 个元素的指针。此外,您将看到该create_zombies函数需要一个参数:Sprite对象的地址,因此将刚刚初始化的同一数组中的第一个精灵的地址传递给它。

再一次,稍微整理一下,函数的其余部分看起来像这样:

    // ...continued from above

    for (int i = 0; i < NUMBER_OF_ZOMBIES; i++)
    {
        // Initialise the ith sprite using the address of its element
        // in the zombie_sprites array.
        init_sprite(&zombie_sprites[i], rand()%76, rand()%42,
                    3, 3, zombie_bitmap);
    }

    // Animate the zombies in the array.
    create_zombies(&zombie_sprites[0]);       
}

最后,create_zombies函数本身需要一个小的改动来循环遍历作为其参数传递的数组中的所有精灵。此外,作为它的类型void,它没有返回语句。

void create_zombies(Sprite * zombie_sprites)
{
    while(1)
    {
        clear();

        // loop round drawing all of the sprites.
        for(int zombie_index = 0; zombie_index < NUMBER_OF_ZOMBIES; zombie_index++)
        {
            draw_sprite( &zombie_sprites[zombie_index] );
        }

        refresh();
    }
}

未来的增强可能包括:

  • 将 NUMBER_OF_ZOMBIES 更改为变量。
  • malloc使用和将静态数组替换为动态分配的数组free
  • 用更复杂的抽象数据类型(例如列表或双向链表)替换数组,以便可以在运行时添加或删除僵尸。
  • 重命名函数并重组每个函数被调用的地方。
于 2015-05-12T11:08:20.110 回答