ジャンケンのプログラムについて

このQ&Aのポイント
  • ジャンケンのプログラムについてやり方を詳しく教えてください。
  • プログラムの実行結果が思った通りにならない場合、正しく実行するための手順を教えてください。
  • プログラムの中に使用されている関数や変数の意味について詳しく教えてください。
回答を見る
  • ベストアンサー

ジャンケンのプログラムについて

ジャンケンのプログラムについて #include <stdio.h> #include <stdlib.h> int main(void) { int a; int b; int i; srand((unsigned)time(NULL)); ////////////human printf("gu=1,cho=2,pa=3"); scanf("%d",&b); ///////////computer a=rand() % 3 + 1; if(a==1) {printf("gu");} if(a==2) {printf("cho");} if(a==3) {printf("pa");} /////////// if(a==b){printf("aiko");} /////////// if(b==1 && a==3) {printf("win! pc");} if(b==2 && a==1) {printf("win! pc");} if(b==3 && a==2) {printf("win! pc");} /////////// if(a==1 && b==3) {printf("win! human");} if(a==2 && b==1) {printf("win! human");} if(a==3 && b==2) {printf("win! human");} } このプログラムを実行したんですが、できませんでした。 どこか間違ってますか? また、なんで、printfの中身は("gu=%d,",a)というふうにしないんでしょうか? また、srand((unsigned)time(NULL))は何をしてるんですか? また、scanf("%d",&b)はなんですか? あと、a=rand() % 3 + 1はなんですか? すべて意味が分りません。 なんでこういう順でプログラムしないといけないんでしょうか? printf("gu=1,cho=2,pa=3")は出力されるときどのようになるんでしょうか? なんでprintf("gu=1,cho=2,pa=3")が必要なんですか? 実効がどのように行われているのか全過程をお願いします。

noname#191921
noname#191921
  • Mac
  • 回答数3
  • ありがとう数6

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

  • ベストアンサー
  • otaku37564
  • ベストアンサー率38% (1160/3007)
回答No.3

>参考書を読んでいたら、まず、言葉の意味から理解しないといけないんで その参考書はあなたの知識レベルにあっていない参考書です。 解説書を買うなら、まず見て、内容が理解でき、やりたいことが自分でわかるものを買ってください。 背表紙にだまされて「すぐわかる」「全辞典」など買ったとしても、ついていけなきゃダメです。 今のの状態ですとやっとひらがなが書けた小学一年生に、中学生クラスの、研究レポートを書きなさいといっているのと一緒です。 まずもっともっと優しいプログラムを組みつつ解説する問うな本を買いましょう。 みんな最初は初心者です。中途半端に理解して、中級向け本買ってついていけないより まず1/3ページくらいは内容がわかる様な本を買いましょう。 あと、どこかのサイトやHPを頼るのは大間違いですし、ありません。 仕事でもなく、酔狂で、プログラム言語が1から10まで詳しくわかるWebページなんて膨大なテキストを、誰が書くのでしょう。で、誰が得するのでしょう。 そんな知識があって、ボランティア精神あふれる人は、とうの昔に実践の第一人者になっているでしょう。 わかるような解説が帰ってこなくて憤慨するのではなく まずもっともっと最初に覚える基礎部分を予習されたらいかがですか? 私も、プログラム部分見ましたが、NO1さんのように、何でこんな書き方するんだろうと思う箇所が 多々あります。

noname#191921
質問者

お礼

分りました。自分でいろいろ調べ深めていこうと思います。

その他の回答 (2)

noname#198951
noname#198951
回答No.2

基本的なC言語の知識が乏しいように思えます。 コマンド文に関してはどれも初歩的な文ばかりですので、勉強するなら一冊でも解説書を購入して読むことをおすすめします。

noname#191921
質問者

補足

参考書を読んでいたら、まず、言葉の意味から理解しないといけないんで、1日かけてもこのプログラムは理解できないと思います。 本は自分が知りたいことが書いてあるとは限りません。そしたら、いろんな参考書を調べる必要があり、膨大な時間がかかってしまいます。実際、そんな時間はありません。 しかし、人間は、その時々に知りたいことに答えることができるんで頼っているんです。 初歩的といえども、自分にとっては難しいです。 小学生が理解できるような優しい言葉で全て表されているようならば苦労はしません。1+1=2とかのように簡単ならみんな理解できますよね。しかし、難しい言葉で書かれているから、噛み砕いて解説してほしいんです。小学生でも理解できるようなくらいに噛み砕いて説明してください。 教科書ってホントに何が書いてあるか意味が分りませんよね?小学生でも理解できる教科書にしてほしいです。いちいち細かく解説することが必要なんじゃないでしょうか?世界中にこんなに人がいるのに誰もそれを実行できないんでしょうか? もうこれ以上はないというような解説をお願いします。

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

> なんでprintf("gu=1,cho=2,pa=3")が必要なんですか?    使い方が分からないと、ジャンケン ができないので、   操作方法を示しています。    グー  を出したいときは、 1 を、    チョキ を出したいときは、 2 を、    パー  を出したいときは、 3 を 入力してください。  という意味です。   > printf("gu=1,cho=2,pa=3")は出力されるときどのようになるんでしょうか?    "gu=1,cho=2,pa=3 > なんで、printfの中身は("gu=%d,",a)というふうにしないんでしょうか?    入力した数字をあえて再表示するよりは、 グー や チョキ、 パー と   表示した方が、 分かりやすいからです。 > srand((unsigned)time(NULL))は何をしてるんですか?    乱数の初期設定をしています。 > scanf("%d",&b)はなんですか?    グー や チョキ、 パー に相当する数字( 1 や 2、3 ) を   受け取る関数です。 > a=rand() % 3 + 1はなんですか?    コンピュータ側の出す手(グー、チョキ、パー)の数字(1、2、3)を   決めています。

noname#191921
質問者

補足

意味が分りません。 小学生でも分るような解説をお願いします。 全てを噛み砕いて説明をお願いします。

関連するQ&A

  • C言語/ランダムbeepのプログラム方法

    プログラムを書いていますが理解に苦しんでいます。 勉強し始めたばかりなのでかなりハードです。どなたか助けていただけませんか。 前に進めずにいます。 何をしたいかというと、マッチングゲームの中の一部でランダムなビープサウンドにあわせて反応して答えを返すというものです。答えられなければ点数がマイナスになります。 まず、数字をランダムに1から10の間で生成し、出た数字がある特定の数字だとビープサウンドが流れるという仕組みを考えたのですがどうでしょうか。 本当に切羽詰っています。助けてください。 // rand.cpp : Defines the entry point for the console application. // #include <stdafx.h> #include <stdlib.h> /*This header is for rand srand code)*/ int main (void) { unsigned int seed; int i,run=0; printf("Choose a level of difficulty"); scanf("%d", &seed); /*&seed is for "unsigned" int*/ printf("\n"); srand(seed); /*generate a number 0-10*/ i=1+(int) (10.0*rand()/(RAND_MAX+1.0)); /*if a number is 1, beep sound comes out*/ if(i==1) for(int j=0; j<i; j++) printf("\a"); return 0; }

  • じゃんけんゲームについてお願いします。

    #include <stdio.h> #include <stdlib.h> int main() { int n; int player; // プレイヤーの手の保存 int computer; // コンピュータの手を保存 srand(0); // 乱数列を初期化 do { printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > "); scanf("%d", &player); computer = rand() % 3 + 1; if(computer == player){ printf("あいこです\n"); }else if(player == 1 && computer == 2){ printf("プレイヤーの勝ちです\n"); }else if(player == 2 && computer == 3){ printf("プレイヤーの勝ちです\n"); }else if(player == 3 && computer == 1){ printf("プレイヤーの勝ちです\n"); }else{ printf("コンピュータの勝ちです\n"); } printf("このまま続けますか?続けない場合は 0 を入力してください > "); scanf("%d", &n); // n が 0 以外だったら続ける }while(n != 0); return 0; } このじゃんけんプログラムで一番最初に何回勝負するか指定出来るようにしたいのですが。 指定しただけ勝負して、最後に勝ち、負け、引き分けの結果を。 お願いいたします。

  • じゃんけんゲーム

    問1:ジャンケンを十回行って、何勝何敗、何引き 分けかを表示するプログラムを作れ。 問2:計算機とじゃんけんを行って、貴方が計算 機より2回多く勝つまで続けるプログラムを作れ。 上記の問題が、どうしてもわかりません。"問1を少し変えれば問2はできる"と思うのですが・・・。 コンピュータにランダムで手を出させ、かつ勝敗の回数をカウントさせたいのですがうまくいきません。 どこをどう変えればよいのか、どなたか回答願います。 できればソースを添えてお願いします。 使っている言語はC言語です。また、私はC言語初心者なので、if文やfor文、do~while文あたりまでしか使えません。 下記に示すのは私が作った、問1のソースです。参考までに。 ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <time.h> main(){ int i, a, b;time_t seed; seed=time(&seed); srand(seed*(seed%12345)); a=3.0*(float)rand()/(RAND_MAX+1.0)+1; for(i=0;i<10;i++){ printf("1、2、3 ?\n"); scanf("%d",&b); printf("PCは%d\n",a); if(a==b){ printf("アイコッ!\n"); }else{ if((a==1 && b==2) || (a==2 && b==3) || (a==3 && b==1 )){ printf("PCが勝ちッ!\n"); }else{printf("PCが負けッ!\n");} }/*if の括弧閉じ*/ }/* for の括弧閉じ*/ printf( "結果発表ッ!\n" ); printf( "私は%d 回勝ちッ!\n",b ); printf( "PCは%d 回勝ちッ!\n", a); printf( "引き分けは %d 回ッ!\n", (10 - a - b) ); return 0; }/*main() の括弧閉じ*/ -------------------------------------------------------------- --------------------------------------------------------------

  • じゃんけんゲームの応用

    • 問1:ジャンケンを十回行って、何勝何敗、何引き 分けかを表示するプログラムを作れ。 • 問2:計算機とじゃんけんを行って、貴方が計算 機より2回多く勝つまで続けるプログラムを作れ。 上記の問題で、どうしても問2がわかりません。"問1を少し変えれば問2はできる"と思うのですが・・・。 どこをどう変えればよいのか、どなたか回答願います。 使っている言語はC言語です。また、私はC言語初心者なので、if文やfor文、do~while文あたりまでしか使えません。 下記に示すのは私が作った、問1のソースです。参考までに。 ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <time.h> main(){ int i, a, b;time_t seed; seed=time(&seed); srand(seed*(seed%12345)); a=3.0*(float)rand()/(RAND_MAX+1.0)+1; for(i=0;i<10;i++){ printf("1、2、3 ?\n"); scanf("%d",&b); printf("PCは%d\n",a); if(a==b){ printf("アイコッ!\n"); }else{ if((a==1 && b==2) || (a==2 && b==3) || (a==3 && b==1 )){ printf("PCが勝ちッ!\n"); }else{printf("PCが負けッ!\n");} }/*if の括弧閉じ*/ }/* for の括弧閉じ*/ printf( "結果発表ッ!\n" ); printf( "私は%d 回勝ちッ!\n",b ); printf( "PCは%d 回勝ちッ!\n", a); printf( "引き分けは %d 回ッ!\n", (10 - a - b) ); return 0; }/*main() の括弧閉じ*/ -------------------------------------------------------------- --------------------------------------------------------------

  • このプログラムを関数で小分けしたいんですが・・・

    #include <stdio.h> #include <stdlib.h> int main(void) { int n; int player; // プレイヤーの手 int enemy; // 相手の手 srand(0); // 乱数列を初期化 do { puts("じゃん けん (グー:1 チョキ:2 パー:3) "); scanf("%d", &player); //相手の手を計算 enemy = rand() % 3 + 1; // 勝ち負けを判定 if(enemy == player) { printf("あいこ~\n"); } else if(player == 1 && enemy == 2) { printf("Win!\n"); } else if(player == 2 && enemy == 3) { printf("Win!\n"); } else if(player == 3 && enemy == 1) { printf("Win!\n"); } else { printf("Lose・・・\n"); } printf("0を押したら終了。続けるなら適当な数字"); scanf("%d", &n); // n が 0 以外だったら続ける }while(n != 0); return 0; } このように、じゃんけんをするプログラムを作ったのですが メインだけでは出来たのですが、相手の手の判定や勝ち負けの判定などを 上手く関数でコンパクトにまとめたいんですが、 関数を殆ど使った事が無いので良く分かりません。 このプログラムを上手くコンパクトに関数に分けてくれませんか?

  • 4桁の英字の3桁目を当てるプログラム

    乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを 組もうとしているのですが、コンパイラしてもいまいちうまくいきません。 特に下に書いたプログラムのこの部分が違っていると思い どのように修正したらよいのか指摘していただきたいです。 human=getchar(); if(comp[2]!=human) { ero=1; } よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return 0; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } int main(void) { int num,val,i,j; char comp[21]; char human; int ero=0; int try_count=0; int seikai=0; clock_t start,end; int num1; char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; srand(time(NULL)); puts("英字記憶トレーニング"); do{ printf("挑戦するレベル(3~20):"); scanf("%d",&num1); }while(num1<3 || num1>20); printf("%d個の英字を記録しましょう。\n",num1); start=clock(); do{ for(i=0;i<num1;i++) { comp[i]=eiji[rand()%strlen(eiji)]; } comp[num1]='\0'; printf("%s",comp); fflush(stdout); sleep(125*num1); printf("\r%*s\r3番目の英字を入力してください:",num1,""); human=getchar(); if(comp[2]!=human) { ero=1; } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); } try_count++; }while(try_count<2); end=clock(); printf("%d回中%d回成功しました。\n",try_count,seikai); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • C言語初心者です。 ジャンケンゲーム

    今、授業の課題でジャンケンゲームを作成していますが、なかなかできません。もし、良かったら何処が違うのか教えてください。 // main.c #include <stdio.h> #include <time.h> //#include <time.h> #include "my.h" main(int argc, char* argv[]){ int i; char s[7]; printf("これはジャンケンゲームです。\n"); printf("手を入力します(グー:1 チョキ:2 パー:3)\n"); scanf("%s",&s[7]); srand((unsigned)time(NULL)); printf("%s\n",jyan(dice(3))); if(s == jyan){ printf("あいこです。\n"); }else if(s == 1 && jyan ==2){ printf("あなたの勝ちです。\n"); }else if(s == 2 && jyan == 3){ printf("あなたの勝ちです。\n"); }else if(s == 3 && jyan ==1){ printf("あなたの勝ちです。\n"); }else{ printf("コンピュターの勝ちです。\n"); } } // dice.c #include <time.h> int dice(int n){ srand((unsigned)time(NULL)); return(rand()%n+1); } // jyan.c char *jyan(int n){ static char s[][7]={"グー","チョキ","パー"}; return s[--n]; } // my.h #include <stdio.h> char *jyan(int hand); //int dice(int n); 見づらくて申し訳ありません。4つのファイルに分けて作成しています。上記のプログラムだと自分の手、コンピューターの手がランダムに出てくるのですが判定が出来ませんでした。アドバイス、よろしくお願いします。 長文になってしまい申し訳ありません。

  • 型変換??

    int RANDOM_FUNCTION( int n ) { return (int)( rand() / (float)RAND_MAX * n ); } について Q1.この関数は0からn-1までの乱数を作るそうなのですが,何故ですか? 0<=rand()<=RAND_MAX だから0からnまでの乱数ができるような気がするのですが. Q2.RAND_MAXではなく(float)RAND_MAXとキャストしてある意味は何ですか? Q3.srand((unsigned)time(NULL));と srand((unsigned int)time(NULL));では何か違いますか? Q4.  static int first = 0; if (first == 0){ srand((unsigned)time(NULL)); first = 1; } という処理でsrand((unsigned)time(NULL));は最初の一回だけ呼び出されるようになっているようですが,この部分を srand((unsigned)time(NULL)); というように毎回呼び出すようにするとどうなりますか? 一回呼び出すだけで乱数系列の初期値が呼び出される時に変化しているのですか? Q5.この関数とは関係ない質問ですが,例えば a:int型 b:int型 c:double型 d:float型 のとき d = a / b + c という演算は 1 a:int型,b:int型より(a / b)の結果はint型(小数になった場合は小数点以下切り捨て) 2 (a / b):int型,c:double型,int<doubleより (a / b + c)の結果はdouble型 3 d:float型,『=のあるときは左辺の型に合わせる』よりdはfloat型 というように型変換されているという解釈でいいのでしょうか??

  • またプログラムの修正おねがいします。

    キーボードから出力した3つの整数について、以下の判定を行い 判定結果を出力するプログラムを作成する。 全部同じ 2つ同じ バラバラ * 論理演算子を使わないこと。 * インデントを正しくつけること。 #include<stdio.h> void main(void) { int a,b,c; printf("a --->"); scanf("%d",$a); printf("b --->"); scanf("%d",$b); printf("c --->"); scanf("%d",$c); if(a==b){ if(b==c){ printf("全部同じ\n"); } } else if(a!=b){ if(b==c){ printf("2つ同じ"); } else if(a==c){ printf("2つ同じ"); } else{ printf("バラバラ"); } } } 最近c言語を習ったばっかりなのでわからないとこだらけです。よろしくお願いします。

  • 配列のプログラミングを作ったのですが「

    問題:10問の計算問題を解いて、以下のような成績表を表示するプログラムを作成せよ 例) 第一問 ○ 第二問 × 第三問 × ・・・ 自分が作った解答)#include<stdio.h> #include<stdlib.h> void main() { int a,b,ans,i; int seikai=0; int huseikai=0; int kaitou[10]; srand((unsigned)time(NULL)); printf("暗算\n"); for(i=0;i<10;i++); { printf("%問\n",i+1); a=rand()%10; b=rand()%10; printf("%d+%dは?\n",a,b); scanf_s("%d",&ans); if(ans==a+b) kaitou[i+1]=seikai; else kaitou[i+1]=huseikai; } for(i=0;i<10;i++) { printf("第%d問",i+1); if(kaitou[i+1]==seikai) printf("○\n",seikai); else printf("×\n",huseikai); } } のように作成したのですが、コンパイルは成功しますが思い通りの解答になりません。 どこが間違っているのか指摘してください。