数字当てゲームについて

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

数字当てゲームについて

#1

投稿記事 by aitoma » 14年前

1. 自分は今、数字当てゲームを作りたくて、仕様は
1~99までの数字
0以下の数字、100以上の数字、文字は打ってしまったら、再度打ちこみをしろと命令を出させる
正解が66の場合、55と打ったら、数が大きい
77と打ったら、数が小さいという風にする。
制限回数が10回までで、10回を越えた場合、終わり。

2. 作ったプログラムは下記内容です。

3. どのようなエラーやトラブルで困っていて
文字(例えばKと打った場合)を打ったら、おかしな文章になって上手く出来ない。

4. 自分は何が解らないのか、知りたいのか

コード:

moji = getchar();
		if (isdigit(moji!= 0) {
			printf("文字は打てないn");
			count--;
この部分を変更したいのと、


scanf("%d", &input);のエラーを直したいです。

5. 今のCの知識はどの程度なのか

ほとんど初心者です。
宜しくお願い致します。


コード:


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

int main(void) {
	int moji,answer, input, count = 1;
	
	
	srand((unsigned) time(NULL));
	answer = rand() % 99+1;

	
	while (count <= 10) {
		printf("", count);
		scanf("%d", &input);
		if (input >= 100){
			printf("100以上の数字は打てないn");
			count--;
		}
		if (input <=0){
			printf("0以下の数字は打てないn");
			count--;
		}
		moji = getchar();
		if (isdigit(moji!= 0) {
			printf("文字は打てないn");
			count--;
		}
		
		if (input == answer) {
			printf("正解\n");
			break;
		}
		else if(input < answer) { 
			printf("数が大きい\n");
		} 
		else{
			printf("数が小さい\n");
		}
		count++;
	}

	if (count > 10) {
		printf("また挑戦してね");
	}
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 数字当てゲームについて

#2

投稿記事 by softya(ソフト屋) » 14年前

フォーラムルールに書いてあると思いますが、codeタグを使ってくださいね。今回は直しておきました。

で質問は、scanfを止めて独自に数字チェックと数値を変換行いたいと言う事でしょうか?

【補足】残念ながらscanf()で入力したのと同じ文字をgetchar()で取得することが出来ません。getchar()とscanf()は別の入力として扱われます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

aitoma

Re: 数字当てゲームについて

#3

投稿記事 by aitoma » 14年前

>>で質問は、scanfを止めて独自に数字チェックと数値を変換行いたいと言う事でしょうか?

はい、そうです。
ただ、やり方がわからなくて・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 数字当てゲームについて

#4

投稿記事 by softya(ソフト屋) » 14年前

gets()で文字列として入力して、1文字づつチェックして全部数値ならOK。それ以外はエラーとするのでどうでしょうか?
配列、文字列を理解している必要がありますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

aitoma

Re: 数字当てゲームについて

#5

投稿記事 by aitoma » 14年前

<gets()で文字列として入力して、1文字づつチェックして全部数値ならOK。それ以外はエラーとするのでどうでしょうか?
<配列、文字列を理解している必要がありますけど。

すいません・・・全然わからなくて・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 数字当てゲームについて

#6

投稿記事 by softya(ソフト屋) » 14年前

C言語は何処まで学ばれたのでしょうか?
下記サイトだと何章相当ですか?
「苦しんで覚えるC言語」
http://9cguide.appspot.com/

あと聞いておかないと行けないことが。
もし課題なら、習っていない技術を使ってもOKですか?
課題でないなら全然気にしなくて良いのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 14年前

Re: 数字当てゲームについて

#7

投稿記事 by box » 14年前

数字以外の文字を入力したときに思った動きをしない点はさておき、
aitoma さんが書きました:

コード:

		if (input >= 100){
			printf("100以上の数字は打てないn");
			count--;
		}
		if (input <=0){
			printf("0以下の数字は打てないn");
			count--;
		}
100以上、もしくは0以下の数値を入力したときにトライ回数を減らす、
という動きは仕様どおりですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

aitoma

Re: 数字当てゲームについて

#8

投稿記事 by aitoma » 14年前

>softya(ソフト屋) さん

学んだのも自己流ですが、12章あたりだと思います。
使ってない内容でもOKです。


>boxさん

はい、仕様どうりです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 数字当てゲームについて

#9

投稿記事 by softya(ソフト屋) » 14年前

じゃあ、とりあえず文字列と配列はなしで組んでみましょう。
あとで文字列と配列を使った例も紹介します。
今回は、scanf()を止めてgetchar()だけで組んでみます。

説明。
getchar()は一文字のキー入力を受け取れます。
なので、一文字を得る毎に数値かチェックした上でOKなら変数inputに蓄えるようにします。
問題は一文字づつinputに数値を蓄える方法ですが、キーボードから得られるのは上位の桁からで、一桁づつと言う所に注目します。

たとえば、142と入力されたとします。
これは、1 x 100 + 4 x10 + 2と同じですね。 ← この桁毎の分解に意味があります。
これを更に読み替えます。
(1x10 + 4) x10 + 2
法則性がありませんか?
ax10+bが基本になっていますよね。 ← a=1でb=4なら(1x10 + 4)、 a= (1x10 + 4)でb=2なら(1x10 + 4) x10 + 2です。
ここがポイントです。
前の計算値を10倍して新しい桁の値を加えるだけで、どんどん桁上げが出来るわけです。
これをプログラムに書くと、
(1)moji = getchar();
(2)ENTERチェック
(3)数値チェック
(4)文字数値変換。
(5)input = input*10 + hitoketa;
となります。

(2)はgetchar();でENTERは文字の

コード:

if( moji=='\n') {
で判定できます。

(4)は、文字コードから数値に変換する必要があります。
文字コードは環境により変化するのでややこしいのですが、Windowsパソコンに限定して説明します。
文字コードも数値なのですが、'0'と言う文字は数値にすると48と言う値です。
「ASCIIコード表」
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
以下49,50…57まで連続していますよね。
なので、
int hitoketa = moji - '0';
で計算できます。

どうでしょう。理解できましたか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

白い時空
記事: 18
登録日時: 14年前
住所: 埼玉県さいたま市

Re: 数字当てゲームについて

#10

投稿記事 by 白い時空 » 14年前

私としてはscanfの戻り値を調べるだけでいいかなと思います。

scanfの戻り値は普通、読み込めたデータ数になります。(EOFが来た場合のみ-1になります)

コード:

scanf("%d",&input);
この場合、数字の読み込みに成功すると1、失敗すると0が返ります。

簡単なサンプルを打ったので、文字でも入れて試してみてください。

コード:

#include <stdio.h>

int main(){
	int input,n;
	n = scanf("%d",&input);
	
	printf("n=%d\n",n);
	if(n==1){
		printf("input=%d\n",input);
	}else{
		printf("読み込み失敗\n");
	}
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 数字当てゲームについて

#11

投稿記事 by softya(ソフト屋) » 14年前

白い時空さんの方法でOKとみなすかどうかだと思います。
1kと打った場合は白い時空さんの方法ではエラーになりません。kまたはk1とかならエラーになります。
私の提案の方法はENTERまでの間に0から9以外の文字があったらエラーとする方法です。
決めるのは、aitomaさんです。

あっそれと仕様の
>boxさん
はい、仕様どうりです。
の件は、boxさんの指摘が正しいと思います。
0以下の数字、100以上の数字、文字は打ってしまったら、再度打ちこみをしろと命令を出させる
って打ち間違えたらエラーカウントするって意味には見えないですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 14年前

Re: 数字当てゲームについて

#12

投稿記事 by non » 14年前

後で、count++するから、その分をcount--しているのでしょうけど、その後の、answerとの比較処理に
入ってしまうので、流れとしておかしいですね。
non

aitoma

Re: 数字当てゲームについて

#13

投稿記事 by aitoma » 13年前

結局はどういったソースコードになるのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 数字当てゲームについて

#14

投稿記事 by softya(ソフト屋) » 13年前

どの手法を選ぶのか、どの様に書くかはaitomaさんが選ぶべきことですよ。
学習のために書いているなら色々書いてみるのも勉強になります。
仕様が曖昧なので、答えは一つではありませんからね。

とりあえず、1つめをどうするか選んで分からない事があれば質問してくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 14年前

Re: 数字当てゲームについて

#15

投稿記事 by box » 13年前

aitoma さんが書きました:結局はどういったソースコードになるのでしょうか?
そこを『自分の頭で考える』ことが、プログラミングの醍醐味ではないんでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

aitoma

Re: 数字当てゲームについて

#16

投稿記事 by aitoma » 13年前

それが出来たら、質問していません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 数字当てゲームについて

#17

投稿記事 by softya(ソフト屋) » 13年前

私の方法で行くのか、白い時空さんの方法で行くのかを検討してください。
メリットとデメリットは提示してあります。選ぶのはaitomaさんです。
他人が選んでも意味ないですから。

その上で分からないことを聞いてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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