構造体に格納した画像をランダムに表示したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
t@

構造体に格納した画像をランダムに表示したい

#1

投稿記事 by t@ » 15年前

こんにちはt@です。
また質問させてください。

1. 構造体に格納したカードの画像を、ランダムに13枚4列に並べて表示させようとしています。
カードは重複しないようにしたいのですが、まだそこには至ってません(;_;)

2.
typedef struct{
    char name[5][22][25];
    int graph[5][22];
    int score[5][22];
}card;
card c;
void start(){
int k=0,j=0,x=0,y=0;
    while(k<4){
        while(j<14){
            DrawGraph(x,y,c.graph[GetRand(3)][GetRand(13)],TRUE);
            j++,x=x+50;
        }
        k++,x=0,j=0,y=y+100;    
    }
}
ここではgraph[0][0]からgraph[3][13]まで表示させます。
カードを一枚表示したら少しずらし、カードが見えるようにしています。
13枚表示したら下にずらして別の種類のカードを表しします。

3.このプログラムだと、13x4枚のカードは表示されるのですが、表示されているカードすべてが常に高速でランダムに切り替わってしまいます。
変数の宣言を関数の外に出すと、カードは一瞬だけ表示され画面には残りません。
画像は止まってますが、実際にはかなり動いてます。

4.プログラム自体、「繰り返している間表示」になってるからだと思うんですが、どうすれば思うようにできるのかがわかりません。構造体に格納したカードの画像を13枚x4列ランダムに表示し、並べたいです。

5.学校で習って、成績は真ん中くらいです。

windows Vista
Visual C++ Express Edition
Dxライブラリ
画像

バグ

Re:構造体に格納した画像をランダムに表示したい

#2

投稿記事 by バグ » 15年前

ちょっと手を加えてしまいましたが、下記のような感じでいかがでしょうか?
init関数は実装していませんので、画像ハンドルの取得やその他の値の初期化を実装してください。

// カードデッキではなく、カード1枚分のデータを構造体にした方が
// 管理が楽なので変更しました。
typedef struct
{
    char name[25];
    int graph;
    int score;
}card;

// カード5×22=110枚分という事で、構造体の配列としています。
card c[5 * 22];

// start関数を呼ぶ前にここで構造体配列へでーたセットしておいてください。
void init(void)
{
    for (int i = 0; i < 5 * 22; ++i)
    {
        // ここでcard構造体のデータを初期化しておく
    }
}

void start(void)
{
    // 描画されるカードのインデックス
    int i = 0;

    // とりあえず、配列の先頭から順番に13×4=52枚分を描画します。
    for (int y = 0; y < 4; ++y, ++i)
    {
        for (int x = 0; x < 13; ++x)
        {
            DrawGraph(x * 50, y * 100, c.graph, TRUE);
        }
    }
}

バグ

Re:構造体に格納した画像をランダムに表示したい

#3

投稿記事 by バグ » 15年前

すみません、start関数のループが間違ってますね(^_^;)
void start(void)
{
    // 描画されるカードのインデックス
    int i = 0;

    // とりあえず、配列の先頭から順番に13×4=52枚分を描画します。
    for (int y = 0; y < 4; ++y)
    {
        for (int x = 0; x < 13; ++x, ++i)
        {
            DrawGraph(x * 50, y * 100, c.graph, TRUE);
        }
    }
}

t@

Re:構造体に格納した画像をランダムに表示したい

#4

投稿記事 by t@ » 15年前

回答ありがとうございます。
ですが、まだ画像の件が解決できません。

協力お願いします!

t@

Re:構造体に格納した画像をランダムに表示したい

#5

投稿記事 by t@ » 15年前

すみません。質問を変えてみます。

私が今やりたいことは、乱数を呼び出し78種類のカードをランダムに表示させることです。

ですが、実行するとカードの画像は常に高速でランダムに切り替わってしまいます。
これを動かないようにし、毎回違う乱数を呼び出して画像をランダムに表示させたいです。

typedef struct{
    char name[5][22][25];
    int graph[78];
    int score[5][22];
}card;
card c;
void start(){
   int i = 0;
    for (int y = 0; y < 4; ++y){
        for (int x = 0; x < 13; ++x, ++i){
            DrawGraph(x * 50, y * 100, c.graph, TRUE);
        }
    }
}


ちなみにこれを実行すると毎回画像のようになります。
DrawGraph(x * 50, y * 100, c.graph, TRUE);を
DrawGraph(x * 50, y * 100, c.graph[GetRand(78)], TRUE);にすると高速で動き続けます。

どうか力を貸してください。

Mist

Re:構造体に格納した画像をランダムに表示したい

#6

投稿記事 by Mist » 15年前

typedef struct{
char name[5][22][25];
int graph[78];
int score[5][22];
  int draw_num[4*13]; // 乱数を入れる
}card;
card c;
void start(){
int i = 0;
for (int y = 0; y < 4; ++y){
for (int x = 0; x < 13; ++x, ++i){
DrawGraph(x * 50, y * 100, c.graph[(c.draw_num)], TRUE);
}
}
}

ソースは上記のように変更する。
draw_num[0] ~ [51]にはループの外側で乱数をセットしておく。
とすれば希望する動作になるのではないでしょうか。


> バグさん

指摘ありがとうございます。
修正しました。 画像

バグ

Re:構造体に格納した画像をランダムに表示したい

#7

投稿記事 by バグ » 15年前

>>Mistさん
>>DrawGraph(x * 50, y * 100, c.graph[(c.draw_num[x*y])], TRUE);
ここのdraw_num[x*y]はdraw_numでないとマズくないですか?


>>t@さん
カードの総数も分かったので、ついでにカードシャッフル用の関数も追加してみました。
78枚のカードをシャッフルし、その中から52枚分の数値をdraw_numへ代入します。
乱数発生用の関数はrandを使用していますが、DxLibにはGetRandという関数が用意されていますので、気に入らなければ置き換えてください。
#include <stdlib.h>

#define CARD_NUMBER        78    // カードの総枚数

typedef struct
{
    char name[5][22][25];
    int graph[CARD_NUMBE[/url];
    int score[5][22];
    int draw_num[4 * 13];
}card;

card c;

void shuffle(void)
{
    int i, j, k, id[CARD_NUMBE[/url];

    // シャッフル用の数値配列の初期化
    for (i = 0; i < CARD_NUMBER; ++i)
    {
        id = i;
    }

    // シャッフル処理
    for (i = CARD_NUMBER - 1; i > 0; --i)
    {
        j = rand() % i;
        k = id;
        id = id[j];
        id[j] = k;
    }

    // シャッフルした値を代入する
    for (i = 0; i < 4 * 13; ++i)
    {
        c.draw_num = id;
    }
}

void start(void)
{
    int i = 0;

    for (int y = 0; y < 4; ++y)
    {
        for (int x = 0; x < 13; ++x, ++i)
        {
            DrawGraph(x * 50, y * 100, c.graph[(c.draw_num)], TRUE);
        }
    }
}

toyo

Re:構造体に格納した画像をランダムに表示したい

#8

投稿記事 by toyo » 15年前

ですが、実行するとカードの画像は常に高速でランダムに切り替わってしまいます。
これを動かないようにし、毎回違う乱数を呼び出して画像をランダムに表示させたいです。


ループ中でstart( )をずっと呼び続けているのでしょう
何かキーを押したときだけstart( )関数を呼ぶようにしたらどうでしょう

閉鎖

“C言語何でも質問掲示板” へ戻る