掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24365

乱数
投稿者---svi(2005/11/26 16:26:01)


C++で神経衰弱を行うプログラムを作成したく、以下のようなプログラムを組みました。
*の部分のcard[52]内部の数値を指定する際の実行方法がわかりません。
どなたかご教授お願いします。

// report 3.cpp : コンソール アプリケーション用のエントリ ポイントの定義
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main(int argc, char* argv[])
{
int i,j,c,choice[2],card[52],choiced[52];
j=0;
srand((unsigned)time(NULL));
for(i=0;i<=51;i++){
choiced[i]=0;
}for(i=0;i<=12;i++){ //*
c=(double)rand()/(double)(RAND_MAX+1)*13+1;
card[i]=c;
card[i+13]=c;
card[i+26]=c;
card[i+39]=c;
}for(;;){if(j==26){
break;
}for(;;){
for(i=0;i<=12;i++){
if(choiced[i]==0){
printf("%d ",i+1);
}
}printf("\n");
for(i=13;i<=25;i++){
if(choiced[i]==0){
printf("%d ",i+1);
}
}printf("\n");
for(i=26;i<=38;i++){
if(choiced[i]==0){
printf("%d ",i+1);
}
}printf("\n");
for(i=39;i<=51;i++){
if(choiced[i]==0){
printf("%d ",i+1);
}
}printf("\n");
printf("の中で2つ数字を入力してください。\n");
scanf("%d%d",&choice[0],&choice[1]);
if(choice[0]==choice[1]){
printf("入力する数値は違う数値にしてください。\n\n");
break;
}if(choice[0]>52 || choice[1]>52 || choice[0]<1 || choice[1]<1){
printf("1以上52以下の数字を入力してください\n\n");
break;
}if(choiced[choice[0]-1]==1 || choiced[choice[1]-1]==1){
printf("既に選択済みです。\n\n");
break;
}if(card[choice[0]-1]==card[choice[1]-1]){
printf("\n%d %d\n揃いました。\n\n",card[choice[0]-1],card[choice[1]-1]);
choiced[choice[0]-1]=1;choiced[choice[1]-1]=1;//choiced flag
j++;
}if(card[choice[0]-1]!=card[choice[1]-1]){
printf("\n%d %d\n揃いませんでした。\n\n",card[choice[0]-1],card[choice[1]-1]);
}if(j==26){
printf("全て揃いました\n");
break;
}
}}
return 0;
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:乱数 24367 ぽへぇ 2005/11/26 18:26:37
<子記事> Re:乱数 24368 円零 2005/11/26 19:08:53
<子記事> Re:乱数 24370 気分屋 2005/11/26 23:22:09
<子記事> ソースの添付は字下げしてくださるようにお願いします 24374 管理人 2005/11/26 23:50:24


No.24367

Re:乱数
投稿者---ぽへぇ(2005/11/26 18:26:37)


>ソースの添付は「HTML変換ツール」で字下げします。
を守ってください。
元のソースコードで字下げされていなければ、字下げする
癖をつけてください。とても見難いです。

>*の部分のcard[52]内部の数値を指定する際の実行方法がわかりません。
>どなたかご教授お願いします。
>for(i = 0; i <= 12; i++) { //*
>   c = (double)rand()/(double)(RAND_MAX+1)*13+1;
>   card[i] = c;

で、起こっている現象は何で、どういうことが問題なんですか?
#だいたいは想像がつくけど、あえて聞いてみる



この投稿にコメントする

削除パスワード

No.24368

Re:乱数
投稿者---円零(2005/11/26 19:08:53)


たとえば…

0〜51の整数が一個ずつ詰まった要素数52個の配列positionを用意します。
最初のステップでは「0」の一枚目を置く位置を決めるために0〜51の乱数xを求めて、
position[x]を実際の置く位置とします(最初だけはx = position[x]だが以降は変化する)。
つまりcard[position[x]] = 0; です。
さて二順目では残り51か所なので乱数は0〜50となるわけですが、
そうするとposition[51]はまだ使われていない(x = 51だった場合を除く)のに使われなくなってしまいます。
一方、position[x]には既に使ってしまったのでもう使えない番号が入っています。
ということは、position[51]をposition[x]にコピーすれば良い、ということになります。

これを繰り返せば完全にランダムに配置できるはずです。

ちなみに、"choice"は名詞なんで"choiced"はおかしいですよ。


この投稿にコメントする

削除パスワード

No.24370

Re:乱数
投稿者---気分屋(2005/11/26 23:22:09)


ゲームの仕様を考えると、カードを取ったときにcard[取ったカードの位置]に
-1を入れておけば choiced[52] は必要ないと思います。
もし、カードの状態等を保存したいのであれば、カードを構造体であつかったほうがいいでしょう。

C言語のコーティングとして } の後に改行せずに
次の文を書くのはやめたほうがいいでしょう。
} for( ・・・ とか。

ランダムは下記を参考に。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_CARD    52    // カードの最大枚数
#define SHUFFLE     1        // シャッフル回数

int main( void )
{
    int i, j, idx, tmp, card[MAX_CARD];

    srand( (unsigned int)time(NULL) );

    printf( "●変更前\n" );
    for( i = 0 ; i < MAX_CARD ; i++ ) {
        card[i] = i % 13;
        printf( "%3d%c", card[i], " \n"[(i%13)==12] );
    }
    printf( "\n" );

    // ランダム
    for( j = 0 ; j < SHUFFLE ; j++ ) {
        for( i = (MAX_CARD - 1) ; i > 0 ; i-- ) {
            idx = rand() % (i + 1);
            tmp = card[i];
            card[i] = card[idx];
            card[idx] = tmp;
        }
    }

    printf( "●変更後\n" );
    for( i = 0 ; i < MAX_CARD ; i++ ) {
        printf( "%3d%c", card[i], " \n"[(i%13)==12] );
    }
    printf( "\n" );

    return 0;
}




この投稿にコメントする

削除パスワード

No.24374

ソースの添付は字下げしてくださるようにお願いします
投稿者---管理人(2005/11/26 23:50:24)


投稿上の注意をお読みの上、字下げをしたプログラムを再投稿してください。



この投稿にコメントする

削除パスワード

No.24376

Re:乱数
投稿者---svi(2005/11/27 13:20:14)


>>ぽへぇ様
思うように動作しません・・・。
何故そのような挙動をしてくれないので質問したのですが、不躾な質問と取られたようですね。
申し訳ありません。

>>円零様
なるほど・・・。
大変参考になります。
choicedは自分にわかりやすいように付けたのですが、何分英語は苦手でして・・・(苦笑
細かい指摘ありがとうございます。

>>気分屋様
大変参考になるアドバイスありがとうございます。
ソースの書式等は独学なもので、見苦しいソースになり申しわけありません。
もう少し見やすいソースを心がけます。

>>管理人様
ソースをHTMLに変更しようとすると、私の環境では何故か文字化けしてしまい、変換するに至りませんでした。
私の考えが足りず、大変申し訳ありませんでした。


この投稿にコメントする

削除パスワード

No.24377

Re:乱数
投稿者---RiSK(2005/11/27 14:45:16)


>ソースをHTMLに変更しようとすると、私の環境では何故か文字化けしてしまい、変換するに至りませんでした。

OS/文字コード/ブラウザは何ですか?
文字化けとは何がどのようになるのでしょうか?

そういう情報が大切です。


この投稿にコメントする

削除パスワード

No.24378

Re:乱数
投稿者---管理人(2005/11/27 15:35:03)


> ソースをHTMLに変更しようとすると、私の環境では何故か文字化けしてしまい、変換するに至りませんでした。

どのような環境をお使いでしょうか。
"<" は "&lt;"で、">" は "&gt;" に置き換えても字下げできませんか?

もし、タグ打ちすればうまく行くようでしたらお手数ですがツールを使わずに直接入れてください。



この投稿にコメントする

削除パスワード

No.24379

Re:乱数
投稿者---svi(2005/11/27 15:55:23)


環境はWinXP Mozilla Firefox1.0.7 EUC-JPです。
先ほど再変換してみたところ、うまく変換できたようなので、改めて投稿致します。
ご迷惑をかけてしまい申し訳ありません。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main(int argc, char* argv[])
{
    int i,j,c,choice[2],card[52],choiced[52];
    j=0;
    srand((unsigned)time(NULL));
    for(i=0;i<=51;i++){
        choiced[i]=0;
    }for(i=0;i<=12;i++){
        c=(double)rand()/(double)(RAND_MAX+1)*13+1;
        card[i]=c;
        card[i+13]=c;
        card[i+26]=c;
        card[i+39]=c;
    }for(;;){if(j==26){
        break;
    }for(;;){
        for(i=0;i<=12;i++){
            if(choiced[i]==0){
                printf("%d ",i+1);
            }
        }printf("\n");
        for(i=13;i<=25;i++){
            if(choiced[i]==0){
                printf("%d ",i+1);
            }
        }printf("\n");
        for(i=26;i<=38;i++){
            if(choiced[i]==0){
                printf("%d ",i+1);
            }
        }printf("\n");
        for(i=39;i<=51;i++){
            if(choiced[i]==0){
                printf("%d ",i+1);
            }
        }printf("\n");
        printf("の中で2つ数字を入力してください。\n");
        scanf("%d%d",&choice[0],&choice[1]);
        if(choice[0]==choice[1]){
            printf("入力する数値は違う数値にしてください。\n\n");
            break;
        }if(choice[0]>52 || choice[1]>52 || choice[0]<1 || choice[1]<1){
            printf("1以上52以下の数字を入力してください\n\n");
            break;
        }if(choiced[choice[0]-1]==1 || choiced[choice[1]-1]==1){
            printf("既に選択済みです。\n\n");
            break;
        }if(card[choice[0]-1]==card[choice[1]-1]){
            printf("\n%d %d\n揃いました。\n\n",card[choice[0]-1],card[choice[1]-1]);
            choiced[choice[0]-1]=1;choiced[choice[1]-1]=1;//choiced flag
            j++;
        }if(card[choice[0]-1]!=card[choice[1]-1]){
            printf("\n%d %d\n揃いませんでした。\n\n",card[choice[0]-1],card[choice[1]-1]);
        }if(j==26){
            printf("全て揃いました\n");
            break;
            }
    }}
    return 0;
}




この投稿にコメントする

削除パスワード

No.24389

Re:乱数
投稿者---ぽへぇ(2005/11/27 18:29:34)


>>ぽへぇ様
>思うように動作しません・・・。
>何故そのような挙動をしてくれないので質問したのですが、
>不躾な質問と取られたようですね。申し訳ありません。

乱数を生成した結果、同じ数字が発生する(カードが重複する)
ことがあるんですよね?
>環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
を守るようにしてください。

後はsviさんのセンス次第ですが、問題点を説明できるような
癖をつけると、原因がどこにあるのか、どう直せば良いのか
が(自分自身で)わかってくるようになります。

シャッフルの仕方はすでに何人の方からレスがありましたので
省かせていただきます。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧