0

マイクロプロセッサの LCD 画面にスプライトをランダムに表示するコードを C で書いています。現在、このコードを実行すると、上から下に 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オブジェクトが 1 つしかないことです。これをオブジェクトの配列にすると、他の問題を調べ始めることができます。次に、オブジェクトへのポインタに関してかなりの混乱があり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であるため、return ステートメントはありません。

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 に答える