掲示板利用宣言

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

 私は

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

掲示板2

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

No.30321

数当てゲームについて
投稿者---初心者(2007/06/17 15:27:46)


プログラミング初心者なのですが、数当てゲームのプログラミングでわからないところがあります。 どなたかアドバイスお願いします。

1000〜9999までの中から4桁の数1つを当てるゲームなのですが

これに

1.ハズレた場合、入力した数より大きいか小さいか表示する

2.n回目で当てた場合は(10-n)のポイントを入手

3.チャンスは10回(0ポイント)

4.何度も繰り返し、ポイントを加算していく

5.ゲームを続けるかどうか10回終わった時点で聞く

6.おかしな数字を入力した場合警告文を出す

7.何度もゲームを繰り返してやった場合(1ゲーム10回数当てに挑戦)
  
  の正解率を出す 


を追加したいのですが・・・
自分ではここまで作ることができませんでした。どなたかアドバイスお願いします。



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

int main(void)
{
/*問題の正解を格納*/
int secret_number;
/*回答者の回答を格納*/
int guess_number;
/*1ゲームの回答数*/
int kai, kaia;
/*ゲーム続行の回答を格納*/
int y_n;
/*ポイントを格納*/
int p;
/*ポイントの合計を格納*/
int x;

y_n = 0;
x=0;
while (1) {
/*ポイントを10に設定し、正解をランダム化する*/
p=10;


srand(time(NULL));

secret_number= rand() % 9000 +1000;

/*1ゲーム、9回超えるとループ終了*/

for(kai = 0, kaia = 9; kai <= 8 ; kai++, kaia-- ) {

printf("%d回目の数字をどうぞ?%d>>>\n", kai + 1, secret_number);
if ( scanf("%d",&guess_number) ) {
if (guess_number<secret_number) {
printf("もっと上だよ…チャンスはあと%d回!\n\n", kaia - 1);
}else if (guess_number>secret_number) {
printf("もっと下だよ…チャンスはあと%d回!\n\n", kaia - 1);
/*正解だったときの処理*/
}else if(guess_number == secret_number) {
printf("お見事!\n");
printf("ご褒美をあげよう!\n");
printf("「%d」ポイントゲット!\n", p - kai);
x = x + p;
printf("合計ポイントは「%d」だよ!\n",x);
break;
}else if (guess_number!=secret_number) {
printf("違うよ!.\n");
/*9回目でハズした場合は答えを出力*/
if ( kaia == 0){
printf("残念、おしまいなり!\n");
printf("答えは「%d」なり!\n", secret_number);
}
}
}else{
printf("不正な値です。\n");
}
}
/*ゲーム続行の質問、2ならゲーム終了*/
printf("ゲームを続行しますか?yes 1, no 2\n");
if ( scanf("%d",&y_n) ) {
if (y_n == 2){
printf("おつかれ様です\n");
break;
}
}
}
}

添削した起動確認済みのプログラムを投稿して頂けると幸いです。

宜しくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:数当てゲームについて 30322 acid 2007/06/18 11:24:22


No.30322

Re:数当てゲームについて
投稿者---acid(2007/06/18 11:24:22)


取り合えず、 
#ソースの添付は「HTML変換ツール」で字下げします。
を読んでください。

あと、
>添削した起動確認済みのプログラムを投稿して頂けると幸いです。
とありますが、ここは
#課題の丸投げはしません。
が規約です。
指摘はしますが、自分の力で解かない問題に意味などありませんよ。
基本を自力で解かないで、ポインタとか構造体になって困るのは自分です。
それとも、自主学習だったりするのかしら。

見た感じ、ちゃんと出来てるのは1番だけのようです。
(ただしguess_number != secret_numberは絶対に辿りつかないので、NGですが)

以下、それぞれミスってるところ。

2.と3.
 3の条件を見る限り、10回目で0ポイントなので、ループは1〜10のはず。
 だがループの初期値が0からなので、10-nがおかしいことになってる。
 チャンスは10回なのだから、1〜10で回るようにループの設定をすること。
 (それだと一回目で当てた時の得点が9になってしまうが、そこは曖昧な仕様が悪い)
 ついでに変数kaiaはいらない。kaiから求められる。

4.
 x = x + p;
 毎回pを加算してるので、毎回10ずつ増えてしまう。
 ここで加算するのは10-n点。

5.
 ここも仕様が曖昧だな。
 ゲームが10回なのか、入力が10回なのか。
 前者なら、このソースでは各ゲーム毎に聞いてくるので、ダメ。

6.
 いきなりaを入れたら無限ループになった。
 最近使ってなかったけど、scanfってここまでブッチギリだったっけな。
 scanfより、fgetsを使いましょう。

7.
 正答率ということで、毎ゲームの得点を確保しておく必要があるので、
 mallocで動的に配列を確保する必要がある。
 まあ恐らくは、十分に大きな配列で先生は丸をくれると思いますが。

 あと、pとかxとか、もうちょっと分かりやすい変数名をつけましょう。



この投稿にコメントする

削除パスワード

No.30323

Re:数当てゲームについて
投稿者---円零(2007/06/18 18:49:12)


>No.30321 (初心者)
>2.n回目で当てた場合は(10-n)のポイントを入手
>
>3.チャンスは10回(0ポイント)
当たって0ポイントでは全然うれしくないので、その仕様はどうかと思いますが。
と言うか項目3は日本語としてつながりが変。

>6.おかしな数字を入力した場合警告文を出す
「おかしな数字」の定義が不明。
例えば、1000〜9999の範囲を外れた場合も含むかどうか。

>7.何度もゲームを繰り返してやった場合(1ゲーム10回数当てに挑戦)の正解率を出す
「正解率」の定義が不明。

特に下二つは、はっきりしてもらわないと答える気が起きないなあ。

それと、
>printf("%d回目の数字をどうぞ?%d>>>\n", kai + 1, secret_number);
なんでいきなり答表示しちゃってるかも意味わかんない。
デバッグ用?


まあとりあえず一つだけヒント。
scanfで%dしか使わないなら、
scanf("%*[^\n]");
とかやればstdinのバッファは改行だけが残る状態にクリアできます。
勿論、acidさんの仰る通りに、そもそもscanfを使わないと言う手もありますが。


それから、
>No.30322 (acidさん)
>正答率ということで、毎ゲームの得点を確保しておく必要があるので、
>mallocで動的に配列を確保する必要がある
いや、それは必要ないのでは?
「正答率」の定義によるのかもしれませんが、
単に解答した回数と正答した回数を数えておけばいいだけのような…


この投稿にコメントする

削除パスワード

No.30324

Re:数当てゲームについて
投稿者---acid(2007/06/19 09:53:31)


>いや、それは必要ないのでは?
>「正答率」の定義によるのかもしれませんが、
>単に解答した回数と正答した回数を数えておけばいいだけのような…

一般的な正解率の定義を勘違いしてました。
いりませんね。


この投稿にコメントする

削除パスワード

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