数当てゲームの作成

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

数当てゲームの作成

#1

投稿記事 by SOSデス » 2年前

ルール
1.答えの範囲は1~RANGE
2.入力できる回数がLIMIT回をこえるか答えが見つかるまで入力を繰り返す。
  入力を促すメッセージは「Enter(1-RANGE の値) -入力回数- : 」とせよ。
  RANGEの値はdefine文を変更した場合にも対応させ、入力回数は答えの範囲外の値が入力された  場合はノーカウントとする。
3.答えより入力値nが大きい場合は「n is BIG.」、小さい場合は「n is SMALL」という「ヒント」  を出力する。正解が入力された場合は何も出力しない。
4.LIMIT回以内の入力で答えを見つけた場合は(SMALLなどの「ヒント」は出力せずに
  「Congratulation!!」と出力、そうでない場合は「You LOSE.The answer is 答え.」と出力する。


#includ <stdio.h>
#includ <stdlib.h>
#includ <time.h>
#define RANGE 1000
#define LIMIT 8
#define FALSE 0
#define TRUE 1
int main()
{
int n;
int answer;
int flag;
int cnt;
time_t t;

srand((unsigned)time(&t));
answer = rand() % RANGE + 1;

flag = FALSE;

do{
printf("Enter(1-RANGE の値) -入力回数- : ");
scanf("%d", &n);
}while(!(

return 0;
}


わかる方いらっしゃいますでしょうか(TT)

アバター
asd
記事: 303
登録日時: 8年前

Re: 数当てゲームの作成

#2

投稿記事 by asd » 2年前

SOSデス さんが書きました: わかる方いらっしゃいますでしょうか(TT)
わかりますが、あなたはどこが分からないのでしょうか?
また、提示されているプログラムはどこまでできているのでしょうか?

段階を踏んでパワーアップしていけば目的のものができると思いますよ。

1.入力された回数をカウントしてLIMITを超えたら終了するようにする
2.カウントしている回数を表示するようにする
3.入力値を確認して1~RANGEの範囲の数値でなかったらカウントしないようにする
4.3を満たす場合には入力値と答えを比較して答えより大きい時と小さい時のメッセージ表示を行うようにする
5.答えと一致した場合に正解したことを覚えておいてから入力ループを終了するようにする
6.ループを抜けた先で、正解した場合にはその旨の表示を、正解していない場合には正しい答えの表示を行うようにする

一例ですがこんな流れかと。

あと、プログラムを提示するときはインデントを整えたうえで codeタグで囲むとよいですよ。

コード:

#includ <stdio.h>
#includ <stdlib.h>
#includ <time.h>
#define RANGE 1000
#define LIMIT 8
#define FALSE 0
#define TRUE 1
int main()
{
    int n;
    int answer;
    int flag;
    int cnt;
    time_t t;

    srand((unsigned)time(&t));
    answer = rand() % RANGE + 1;

    flag = FALSE;

    do{
        printf("Enter(1-RANGE の値) -入力回数- : ");
        scanf("%d", &n);
    }while(!(

    return 0;
}
Advanced Supporting Developer
無理やりこじつけ(ぉ

SOS

Re: 数当てゲームの作成

#3

投稿記事 by SOS » 2年前

flag = FALSE;
の下に入力部分とヒントの出力部分を繰り返す。
正解のときのみflagの値をTUREに変更する。
と出力したいのですが、do while文を使うことまで分かったのですが、
whileの後をどのようにしたらよいのか分かりません。

また、flagの値により最後のメッセージを変えて出力する場合、どの型を使えば出力されるか教えていただきたいです

コード:

#includ <stdio.h>
#includ <stdlib.h>
#includ <time.h>
#define RANGE 1000
#define LIMIT    8
#define FALSE    0
#define TRUE     1
int main()
 {
  int n;
  int answer;
  int flag;
  int cnt;
  time_t t;

  srand((unsigned)time(&t));
  answer = rand() % RANGE + 1;

 flag = FALSE;

 do{
  printf("Enter(1-RANGE の値) -入力回数- : ");
  scanf("%d", &n);
 }while(!(n>

 return 0;
}


アバター
asd
記事: 303
登録日時: 8年前

Re: 数当てゲームの作成

#4

投稿記事 by asd » 2年前

SOS さんが書きました:flag = FALSE;
の下に入力部分とヒントの出力部分を繰り返す。
正解のときのみflagの値をTUREに変更する。
と出力したいのですが、do while文を使うことまで分かったのですが、
whileの後をどのようにしたらよいのか分かりません。

また、flagの値により最後のメッセージを変えて出力する場合、どの型を使えば出力されるか教えていただきたいです
なるほど。
必要な処理はNo.2にて列挙している通りで、whileの後ろだとループを抜けた後なので、
6の処理ですね。
以下の通り条件分岐をするのでどの型というのかがよくわかりませんが、
もしこういうやり方がいい!という方法があってそこで型が出てくるのであればその旨を教えてください。

入力値のチェック(範囲内の数値かどうか)と正解との大小確認はループ内で行う想定で、
大小確認で正解と一致とみなされればflagにTRUEを代入するものとして考えましょう。

6で記載した通り、ループを抜けた先では正解したのかどうかで処理を分ければよいので、

コード:

if (flag == TRUE){
    //flagがTRUEならば正解しているのでその処理をここへ
}else{
    //flagがTRUEでないならば不正解なのでその処理をここへ
}
という分岐を書くことになろうかと思います。

ループ中の処理もコメントで書くなら、こんな感じでしょうか。

コード:

    do{
        printf("Enter(1-RANGE の値) -入力回数- : ");
        scanf("%d", &n);
        //3.入力値を確認して範囲外ならループをやり直す(または入力回数を増やさないようにする)
        //4.と5.入力値を答えの大小確認を行い、答えと一致していない場合は大きいのか小さいのかで分岐
        //  一致していた場合はflagをTRUEにしてループを抜ける
    }while(!(//ループを繰り返す条件は、入力回数がLIMIT以内であること、また正解になっていないこと

    if (flag == TRUE){
        //flagがTRUEならば正解しているのでその処理をここへ
    }else{
        //flagがTRUEでないならば不正解なのでその処理をここへ
    }
whileの後ろ+αの部分を回答してみましたが、まだわからない部分があれば遠慮なく聞いてくださいね。
Advanced Supporting Developer
無理やりこじつけ(ぉ

SOSデス

Re: 数当てゲームの作成

#5

投稿記事 by SOSデス » 2年前

一様やってみたのですがコンパイルができませんでした…
ギブアップです

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 1000
#define LIMIT    8
#define FALSE    0
#define TRUE     1
int main()
 {
  int n;
  int answer;
  int flag;
  int cnt;
  time_t t;

  srand((unsigned)time(&t));
  answer = rand() % RANGE + 1;

 flag = FALSE;


 do{
    printf("Enter(1-RANGE の値) -入力回数- : ");
    scanf("%d", &n)
     for(n = 0; n <= answer; n++;);
     if (n >= answer){
     printf("n is BIG.\n");
     }else{
     printf("n is SMALL.\n");
    }while(!(n <= LIMIT && n == answer);

    if (flag == TRUE){
     printf("Congratulation!!\n");
     }else{
     printf("Your LOSE. The answer is answer.\n");
     }

 return 0;
 }

だんごさん
記事: 273
登録日時: 7年前

Re: 数当てゲームの作成

#6

投稿記事 by だんごさん » 2年前

辛辣かもしれませんが、問題や動作以前にC言語の基本を理解する必要があるのではないでしょうか。

1.24行目「;」がありません。
2.25行目、「n++;」の「;」は必要ありません。
3.28行目、elseの「{」が閉じられていません。
4.30行目、whileの「(」が閉じられていません。

次は動作に関することです。

1.25行目、入力してもらったnをなぜanswerまでループカウントさせるのでしょうか。
2.26行目、条件式「>=」ではanswerも含みます。
3.28行目、上記を修正後、elseではanswerも含みます。
4.30行目、「n <= LIMIT」は問題に反しています。
 Dango San

アバター
asd
記事: 303
登録日時: 8年前

Re: 数当てゲームの作成

#7

投稿記事 by asd » 2年前

SOSデス さんが書きました:一様やってみたのですがコンパイルができませんでした…
ギブアップです
コンパイルができなかったということは、何かしらエラーが出ているはずです。
沢山エラーが出て面食らうかもしれませんが、最初のエラーから直してはコンパイルを繰り返して行くと
意外とあっさりエラーが出なくなることが多いです。
だんごさんの指摘も参考に、書式的におかしいところと、処理的におかしいところを直していきましょう。

さて、ギブアップする前に処理を整理する意味でまず変数が何に使われているのかを整理しておきつつ、もうちょっとコメントを変えて書いてみます。
正解、不正解のif文は書けているので、各変数が何に使われているのかを考えつつ、
処理を書いていけば完成までこぎつけられると思います。

いろんな処理を一気に書こうとすると混乱するかもなので、この処理が分からないというのがあれば
聞いてもらえれば教えますよ。
何をやろうとして書いた処理なのかをコメントなりで明示してもらえるとわかりやすくてよいと思います。

もしよくわからない箇所があれば聞いてくださいね。
SOSデス さんが書きました:

コード:

  int n;//プレーヤーの入力数値格納
  int answer;//実際の答えを格納
  int flag;//正解フラグ(正解したらTRUE)
  int cnt=0;//入力回数
  time_t t;

  srand((unsigned)time(&t));
  answer = rand() % RANGE + 1;

  flag = FALSE;


  do{
      printf("Enter(1-RANGE の値) -入力回数- : ");
      scanf("%d", &n);
      //if( 入力された値nが範囲外(1未満かRANGEより大きい) ){ ループをやり直す }
      //回数cntを1増やす
      if (n >= answer){//answerとnが一致する場合は別の処理にしないと正解しても終わらなくなります!else if()を使うと3分岐も書けます
          printf("n is BIG.\n");
      }else if( nがanswerより小さい){
          printf("n is SMALL.\n");
      }else{
          //正解なのでflagをTRUEにする
      }
  }while(/* cntがLIMIT以下 */ && /* flagがFALSEである */);

   if (flag == TRUE){
       printf("Congratulation!!\n");
   }else{
       printf("Your LOSE. The answer is answer.\n");
   }
Advanced Supporting Developer
無理やりこじつけ(ぉ

SOSデス

Re: 数当てゲームの作成

#8

投稿記事 by SOSデス » 2年前

一様だんごさんのコメントを見ながら作成してみたのですが
コンパイルしたときにカウント回数が終わりませんでした。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 1000
#define LIMIT    8
#define FALSE    0
#define TRUE     1
int main()
 {
  int n;
  int answer;
  int flag;
  int cnt;
  time_t t;

  srand((unsigned)time(&t));
  answer = rand() % RANGE + 1;

 flag = FALSE;


 do{
    printf("Enter(1-RANGE の値) -入力回数- : ");
    scanf("%d", &n);
     for(n = 0; n <= cnt; n++);
     if (n = answer){
     printf("n is BIG.\n");
     }else{
     printf("n is SMALL.\n");
    }
    }while(!(n <= cnt && n == answer));

    if (flag == TRUE){
     printf("Congratulation!!\n");
     }else{
     printf("Your LOSE. The answer is answer.\n");
     }

 return 0;
 }


アバター
asd
記事: 303
登録日時: 8年前

Re: 数当てゲームの作成

#9

投稿記事 by asd » 2年前

SOSデス さんが書きました:一様だんごさんのコメントを見ながら作成してみたのですが
コンパイルしたときにカウント回数が終わりませんでした。
カウント回数が終わりませんでしたというのはどういう状況をいうのでしょう?
何回入力しても終了にならなかったという意味でしょうか?

No.7にコメントを編集したソースを提示していたのですが、こちらは分かりづらかったでしょうか。

質問者さんが提示してくれたコードにコメントをつけます。
自分がやろうとしていた処理と差異がないかを確認してみてください。
SOSデス さんが書きました:

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 1000
#define LIMIT    8
#define FALSE    0
#define TRUE     1
int main()
 {
  int n;
  int answer;
  int flag;
  int cnt;
  time_t t;

  srand((unsigned)time(&t));
  answer = rand() % RANGE + 1;

 flag = FALSE;


 do{
    printf("Enter(1-RANGE の値) -入力回数- : ");
    scanf("%d", &n);
     for(n = 0; n <= cnt; n++);  //※プレーヤーが入力した値nに0を上書きし、入力回数cntまで増やし続けるfor文です。何をしようとしたのでしょうか?
     if (n = answer){  //※等号が1つのため代入になってしまっています。値が一致かどうかの場合は n == answer
     printf("n is BIG.\n");  //※プレーヤーが入力した値と一致していたら表示されますが正しいですか?
     }else{
     printf("n is SMALL.\n");
    }
    }while(!(n <= cnt && n == answer));  //※プレーヤーが入力した値nが入力回数cnt以下で かつ プレーヤーが入力した値nが答えanswerと一致している、この条件を満たさない場合ループを繰り返すことになりますが、意図した条件になっているでしょうか?

    if (flag == TRUE){
     printf("Congratulation!!\n");
     }else{
     printf("Your LOSE. The answer is answer.\n");
     }

 return 0;
 }

・入力回数cntを1ずつ増やす方法は分かりますか?
 →この処理をdo文の中に追加しましょう
・ループを繰り返す条件の書き方は分かりますか?
 →cntがLIMIT以下のとき かつ flagがFALSEである時になるかと思います(No.7のコード参照)

この二つを行うことで、とりあえず一定回数でループが終了するようにはなると思います。
それ以外の処理は上記ができてから引き続きやろうと思います。
Advanced Supporting Developer
無理やりこじつけ(ぉ

SOSデス

Re: 数当てゲームの作成

#10

投稿記事 by SOSデス » 2年前

皆様のアドバイスも参考にしていただきながら色々と試行錯誤して、少しずつ完成形に近づいてきました。
あとは
(1)正解の時にCongratulation!!ではなくYou Lose. The answer is_と出力されてしまう。
(2)入力回数は答えの範囲外の値が入力された場合はノーカウントとする。
としたいのですがなかなかできません。
何が問題なのでしょうか。。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 10
#define LIMIT    8
#define FALSE    0
#define TRUE     1
int main()
{
  int n;
  int answer;
  int flag;
  int cnt=0;
  time_t t;

  srand((unsigned)time(&t));
  answer = rand() % RANGE + 1;
  
/*
 printf("DEBUG : answer = %d\n", answer);
 */


  flag = FALSE;

  do{
     printf("Enter(1-%d) -%d- : ",RANGE,cnt+++1);
      scanf("%d", &n);

     if (n == answer);
      else {
      if ( n > answer )
      printf("%d is BIG.\n",n);
      else
       printf("%d is SMALL.\n",n);
    }
    }while(!(n==answer || LIMIT ==cnt));


   if (flag == TRUE)
    printf("Congratulation!!");
   else{
    printf("You Lose. The answer is %d" ,answer);
    }

 return 0;
 }

SOSデス

Re: 数当てゲームの作成

#11

投稿記事 by SOSデス » 2年前

SOSデス さんが書きました:皆様のアドバイスも参考にしていただきながら色々と試行錯誤して、少しずつ完成形に近づいてきました。
あとは
(1)正解の時にCongratulation!!ではなくYou Lose. The answer is_と出力されてしまう。
(2)入力回数は答えの範囲外の値が入力された場合はノーカウントとする。
としたいのですがなかなかできません。
何が問題なのでしょうか。。
(1)は解決しました。
(2)が解決しません。。

コード:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 10
#define LIMIT    8
#define FALSE    0
#define TRUE     1
int main()
{
  int n;
  int answer;
  int flag;
  int cnt=0;
  time_t t;

  srand((unsigned)time(&t));
  answer = rand() % RANGE + 1;
  
/*
 printf("DEBUG : answer = %d\n", answer);
*/

  flag = FALSE;
  

  do{
     printf("Enter(1-%d) -%d- : ",RANGE,cnt+++1);
      scanf("%d", &n);
      if( n < 1 || n > RANGE){}
      
      
      if ( n > answer ){
      printf("%d is BIG.\n",n);
      }else if(n < answer){
       printf("%d is SMALL.\n",n);
      }else{
       (flag =TRUE);
      }
       
    }while(!(n==answer || LIMIT ==cnt));

   

   if (flag == TRUE){
    printf("Congratulation!!");
   }else
    printf("You Lose. The answer is %d" ,answer);
    

 return 0;
 }

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: 数当てゲームの作成

#12

投稿記事 by へにっくす » 2年前

入力回数はcntですよね。
範囲外だったらデクリメント(1引く)すればいいんですよね?
オフトピック
どうでもいいけど
インデント、ちゃんとしましょうよ…
written by へにっくす

アバター
asd
記事: 303
登録日時: 8年前

Re: 数当てゲームの作成

#13

投稿記事 by asd » 2年前

・現在のループを繰り返す(やり直す)方法を調べてみてください
→繰り返し(ループ)のところでループを強制的に抜けたり、ループをやり直す方法がなかったですかね?
・へにっくすさんの方法でもよいですし、入力値の範囲チェックを超えた先でcntを加算するようにすれば正しい入力の時だけcntが加算されるようになりますよ
→No.7で後者のヒントを書いていたんですがSOSデスさんの好きな方でどうぞ

頑張ってください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

かずま

Re: 数当てゲームの作成

#14

投稿記事 by かずま » 2年前

範囲外の場合の n について、cnt を進めないのは分かるのですが、
表示はどうしたいのですか?
[1] is BIG や is SMALL を表示する
[2] is BIG や is SMALL を表示しない
[3] is BIG などの代わりに、is Out of RANGE などを表示する

余談ですが、

コード:

     printf("Enter(1-%d) -%d- : ",RANGE,cnt+++1);

コード:

     printf("Enter(1-%d) -%d- : ",RANGE,++cnt);
と同じですよ。

返信

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