こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語でのじゃんけん

こんちには。
C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、
エラーメッセージが出てしまいうまくいきません。
どこがおかしいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i,j,k;
printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n");
for(k=k; k<=10; k++)
{
srand(time(NULL));
j=rand()%3+1;
scanf("%d",&i);
if(i==1&&j==1)
printf("私はグーなので、あいこです¥n");
else if(i==1&&j==2)
printf("私はチョキなので、あなたの勝ちです¥n");
else if(i==1&&j==3)
printf("私はパーなので、あなたの負けです¥n");
else if(i==2&&j==1)
printf("私はグーなので、あなたの負けです¥n");
else if(i=2&&j==2)
printf("私はチョキなので、あいこです¥n");
else if(i==2&&j==3)
printf("私はパーなので、あなたの勝ちです¥n");
else if(i==3&&j==1)
printf("私はグーなので、あなたの勝ちです¥n");
else if(i==3&&j==2)
printf("私はチョキなので、あなたの負けです¥n");
else if(i==3&&j==3)
printf("私はパーなので、あいこです¥n");
else
printf("1か2か3を入力してください¥n");
}
}

OS mountain lionで利用中ですが、
「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」
と表示されたまま、うまく動作しません。
教えてください。

投稿日時 - 2013-03-02 11:12:48

QNo.7972113

困ってます

質問者が選んだベストアンサー

> エラーメッセージが出てしまいうまくいきません

エラーメッセージを読んでください。
修正作業はそこからがスタートです。

人に聞いたり、ネットで検索したりする場合は、エラーメッセージはそのまま貼り付けてください。
下手に意訳されるとかえって混乱します。

コンパイラは何を使ってますか?
clangを使っているなら、エラー箇所にマークを付けて表示してくれるはずです。


そのプログラムをこちらでコンパイルしたところ、エラーにはなりませんが、警告(warning)が出ました。

警告は、エラーと違って、コンパイル自体は完了します。
しかし、何かの問題が発生する可能性がある、と予想される箇所です。警告メッセージを読んで、内容を理解し、修正するべきものか、無視するものかを判断する必要があります。


あきらかにおかしく、警告が出るのは
for(k=k; k<=10; k++)

警告ではないけど、noteとして注意してくれるのが
else if(i=2&&j==2)

です。この2つは、メッセージを読んで理解できれば、簡単に修正できるはずです。

難しいのは、エラー等は出ないのに、使い方が間違っている、というものです。

> srand(time(NULL));
乱数の仕組みについて、理解が不十分です。
randで使われているのは「疑似乱数」といって、「乱数っぽく見える」値を計算で求めています。
その式はいろいろとありますが、基本は「前回まで発生させた乱数を使って、次の乱数を計算する」というものです。
計算方法から「『前回まで発生させた乱数』が同じなら、『次の乱数』も同じになる」という性質があります。

このような計算をするなら「最初の値」が必要になります。これを「種」と言います。種を設定するのがsrandです。
そして、その性質から「種」が同じなら、続く乱数列は同じものになります。

srandにtimeを使う、というのは実行時毎に違う乱数を発生させたいときによく使われる手段です。
ですが、逆に1秒以内に実行すると、timeが同じ→種が同じ→乱数が同じ、となってしまいます。
このプログラムで言えば、パーで勝ったら最大1秒間はパーで勝ち続けられます。負けたとしても、相手は最大1秒間同じ手を出しますから、簡単に勝てます。

また、疑似乱数は、何度も計算を繰り返したときに、乱数っぽくなることを目指したものです。
毎回初期化しては、その乱数っぽさが出ない可能性があります。

srandは最初に1回だけにします。


> j=rand()%3+1;

randがどう作られているか、によるのですが
C標準のrandは、特定ビットに注目すると、短い周期的でパターンが繰り返されやすい傾向があるようです。
特に下位ビットでそうなりやすく、「余り」を使うと、その影響を大きく受け、(乱数っぽくない)特定パターンの繰り返しになりやすいです。
この程度の遊びならいいかもしれませんが、本格的にやるなら、他の方法にしましょう。


> 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」
> と表示されたまま、うまく動作しません。

リアルタイムなキー入力では無いので、returnを押して確定しなければ、scanfで取り込むことはできません。
数字だけ入力しても先に進まないのは、プログラムの仕様通りです。

もし、他の現象なら、その「うまく動作しない」状況を、具体的に説明してください。

> \n

Macの場合、円マークとバックスラッシュは区別されます。
もし、これらが全て「円マーク」だったら、バックスラッシュに変更してください。
option+¥ でバックスラッシュになるはずです。

投稿日時 - 2013-03-02 12:43:09

お礼

ありがとうございます
細かく教えていただき大変参考になりました

投稿日時 - 2013-03-07 11:28:33

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-