ページ 11

簡単なゲーム作成

Posted: 2013年6月24日(月) 04:12
by yozakaru
今回過去の掲示板を元にハイ・ローゲームを作ってみたのですが何故か1回目が勝手に入力されてしまいます。

コード:

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

#define NG (0)
#define OK (!(NG))
#define KETA (4)

int isNum(char *p)
{
	int i;
	
	for (i = 0; p[i]; i++) {
		if (!isdigit(p[i])){
			return NG;
		}
	}
	return OK;
}

int main(void)
{
	int min,max,n;
	char p[KETA+2];
	int ans, num, count = 0;
	
	printf("下限を入力してください。\n");
	scanf("%d",&min);
	printf("上限を入力してください。\n");
	scanf("%d",&max);
	printf("回数を入力してください。\n");
	scanf("%d",&n);
	srand((unsigned) time(NULL));
	ans = rand() % (max - min + 1) + min;
	
	printf("%dから%dまでの数を当てるゲーム\n", min, max);
	printf("入力回数%d回まで\n", n);
	while (++count <= n) {
		printf("%d回目\n", count);
		printf("%dから%dまでの数を入力してください:", min, max);
		fgets(p, sizeof(p), stdin), rewind(stdin);
		p[strlen(p)-1] = '\0';
		if (!isNum(p)) {
			printf("数字を入力してください\n");
		}
		else {
			num = atoi(p);
			if (!((min <= num) && (num <= max))) {
				printf("%dから%dまでの数を入力してください\n", min, max);
			}
			if (num == ans) {
				printf("正解です\n");
				break;
			}
			printf("答えは%dよりも%sです\n", num, (ans < num) ? "小さい" : "大きい");
		}
	}
	if (count > n) {
		printf("答えは%dでした\n", ans);
	}
	return 0;
}
いろいろいじっていたのですがおそらく下限と上限と回数を設定できるようにしたのが原因だと思います。
どうすればいいでしょうか?

Re: 簡単なゲーム作成

Posted: 2013年6月24日(月) 07:26
by non
ここと原因は同じかな。
http://dixq.net/forum/viewtopic.php?f=3&t=13301

Re: 簡単なゲーム作成

Posted: 2013年6月24日(月) 17:52
by yozakaru
34と35の間にgetchar()を入れることで回避できましたがプログラム上問題ないですか?

Re: 簡単なゲーム作成

Posted: 2013年6月24日(月) 18:02
by non
問題ありません。

ただ、

コード:

        fgets(p, sizeof(p), stdin), rewind(stdin);
        p[strlen(p)-1] = '\0';
は、 scanf("%s",p); で良いのでは?
これなら、getcharもいらない。

また、 rewind(stdin); は機種依存です。

Re: 簡単なゲーム作成

Posted: 2013年6月30日(日) 19:28
by yozakaru
解決したのでコードを載せます。協力ありがとうございました。

コード:

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

#define NG (0)
#define OK (!(NG))
#define KETA (4)

int isNum(char *p)
{
	int i;
	
	for (i = 0; p[i]; i++) {
		if (!isdigit(p[i])){
			return NG;
		}
	}
	return OK;
}

int main(void)
{
	int min,max,n;
	char p[KETA+2];
	int ans, num, count = 0;
	
	printf("下限を入力してください。\n");
	scanf("%d", &min);
	printf("上限を入力してください。\n");
	scanf("%d", &max);
	printf("回数を入力してください。\n");
	scanf("%d", &n);
	getchar();
	ans = rand() % (max - min + 1) + min;
	
	printf("%dから%dまでの数を当てるゲーム\n", min, max);
	printf("入力回数%d回まで\n", n);
	while (++count <= n) {
		printf("%d回目\n", count);
		printf("%dから%dまでの数を入力してください:", min, max);
		scanf("%s",p);
		if (!isNum(p)) {
			printf("数字を入力してください\n");
		}
		else {
			num = atoi(p);
			if (!((min <= num) && (num <= max))) {
				printf("%dから%dまでの数を入力してください\n", min, max);
			}
			if (num == ans) {
				printf("正解です\n");
				break;
			}
			printf("答えは%dよりも%sです\n", num, (ans < num) ? "小さい" : "大きい");
		}
	}
	if (count > n) {
		printf("答えは%dでした\n", ans);
	}
	return 0;
}