C 什么';我的print\u random\u sprites函数有什么问题吗?

C 什么';我的print\u random\u sprites函数有什么问题吗?,c,random,teensy,C,Random,Teensy,我正在用C编写一些代码,在微处理器的LCD屏幕上随机显示精灵。目前,当我运行这段代码时,它会产生从上到下的8行代码。所以它以随机顺序打印一些东西,但不是精灵。为什么会这样?有人能帮我吗?(注意:rand被植入了一个单独的函数中,该函数运行良好,问题就在这段代码中。) void zombies(){ 精灵僵尸; 精灵*zombie\u精灵\u指针=&zombie\u精灵; 字节僵尸_位图[]={ 字节(11100000), 字节(01000000), 字节(11100000) }; 对于(int

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

void zombies(){
精灵僵尸;
精灵*zombie\u精灵\u指针=&zombie\u精灵;
字节僵尸_位图[]={
字节(11100000),
字节(01000000),
字节(11100000)
};
对于(int i=0;i<8;i++){
精灵*僵尸精灵=&僵尸精灵[i];
初始化精灵(僵尸精灵,rand()%76,rand()%42,3,3,僵尸位图);
}
创建_僵尸();
}
无效创建僵尸(精灵*僵尸){
而(1){
清除();
绘制精灵(&僵尸精灵);
刷新();
}
返回0;
}

主要问题是
精灵僵尸\u精灵
只是一个对象。将其设置为对象数组,您就可以开始研究其他问题。接下来,在指向
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
对象的地址,所以将刚刚初始化的同一数组中第一个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]);       
}
未来的增强功能可能包括:

  • 将_僵尸的数量_更改为变量
  • 使用
    malloc
    free
    将静态数组替换为动态分配的数组
  • 将数组替换为更复杂的抽象数据类型,如列表或双链接列表,以便可以在运行时添加或删除僵尸
  • 重命名函数并重新构造调用每个函数的位置

您调用了
create_zombies()
,但没有提供参数。此行
Sprite*zombie_sprites=&zombie_sprites[i]生成编译器警告。没错,这是自参考。随机线现在看起来不同了,但它仍然没有显示精灵。它会显示一个静止的精灵吗?一个移动的精灵,即使它工作正常,也可能看起来不像你期望的那样。我是问你在尝试复杂的案例之前是否可以先做简单的案例。你能把一个精灵放在一个固定的位置吗?如果你不能做到这一点,你将无法在随机位置打印8个精灵,你也不知道为什么。
    // ...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]);       
}
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();
    }
}