ページ 11

C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 22:00
by フリスク
C言語のプログラムでヒット・アンド・ブローをやっていて、わからないところがあったので質問しに来ました

1.四個のアルファベット、AからFから四つ選んでランダムに選択して文字列にする。(選ばれる文字はすべて異なる文字)それをユーザーが当てる
2.ユーザーが入力した文字列と選択した文字列を比較して同じ場合、ヒット、違う場合、ブローとヒントを与える。
3.ユーザーは10回まで回答するチャンスが与えられる。

というプログラムを作成していたところ、アルファべットでなく数字、当たるまで終わらないというプログラムから目的のプログラムになおせません

どなたか教えてください
ソースはこれです
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4
int main(){
int Number[N],In[N];
int i,j,hit,blow;
srand(time(NULL));
for(i=0;i<N;i++){Number=rand()%10;In=0;}
do{
printf("%d桁の数を入力!:",N);
for(i=0;i<N;i++){if((In=getchar()) ==EOF) break;
In-='0';}
fflush(stdin);hit=0,blow=0;
for(i=0;i<N;i++){if(Number==In) hit++;}
for(i=0;i<N;i++){for(j=0;j<N;j++){if(Number==In[j]) {
blow++;
break;
}}}
for(i=0;i<N;i++) printf("%d-",In);
printf("%dHit,%dBlow\n",hit,blow-hit);
}while(hit!=N);
for(i=0;i<N;i++) printf("%d",Number);
puts("\nComplete!!");
}

補足 今、なおしているんですがfflush(stdin);hit=0,blow=0;
の部分でエラーが出てしまってよくわかりません

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 22:27
by box
まずは、ヒット・アンド・ブローのルールを教えてください。
全員がルールを知っているわけではないと思います。

>fflush(stdin);hit=0,blow=0;
>の部分でエラーが出てしまってよくわかりません

何をしたときにどんなエラーが出るのですか?
なお、fflush(stdin);
つまり、標準入力に対するfflush()は動作未定義のはずです。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 22:37
by Poco
えっと、問題を整理したいんですけど、
フリスクさんが提示したソースコードは、
 ・ヒット・アンド・ブローである。
 ・入力する値は数字である。
 ・当たるまで終わらない。
 ・上記仕様では正常に動作している。
という現状で、
ここから
 ・入力する値はアルファベット(A~F)である(大文字小文字区別するのかな?)。
 ・入力する回数は最大で10回である。
という風に変更したいが、どうしたらいいか分からない、

で合ってます?

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:11
by パコネコ
おお~
数字バージョンなら知ってる…
上のやつ起動できたけどな~?

>補足 今、なおしているんですがfflush(stdin);hit=0,blow=0;
別に変なとこないけど…「,」とか?でも起動できたし…
でもfflushって意味知らないんですよね…
意味教えてもらってもいいですか?
「組み込み関数:バッファリングデータ書き込み」って書いてたんですけど…使い方(使い道)わからなくて
すいません。勉強のためにお願いします。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:18
by ふりすく
えっと・・ヒット・アンド・ブローとは、パソコンにランダムに四つの文字列を選ばせ、ユーザーが当てるゲームです。
たとえば、パソコンがACDFを選びユーザーがABCDと入力した場合、1ヒット、3ブローと表示されます

エラーというか定義されてませんと出ます・・・


・入力する値はアルファベット(A~F)である(大文字のみです)。
 ・入力する回数は最大で10回である。
という風に変更したいが、どうしたらいいか分からない、

で合ってます。何日も考えてるんですが全然作れなくて明日か明後日までに作りたいんですが・・よろしくお願いします

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:21
by パコネコ
名前間違えてますよ?
平仮名になってしまってます。
名前などを保存する押したら楽ですよ。

それともまさかの別人?

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:24
by
fflushは確か二文字目を正確に入力するために必要なものだったような気がします

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:25
by フリスク
あっ・・同一人物です

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:29
by Poco
> たとえば、パソコンがACDFを選びユーザーがABCDと入力した場合、1ヒット、3ブローと表示されます

1ヒット、2ブローですよね?

> ・入力する値はアルファベット(A~F)である(大文字のみです)。

簡単な修正で済ますなら、A~Fを0~5(1~6)と見なせば良いです。
これなら、入力する値を変換するだけで行けます(A→1、B→2、…)。

> ・入力する回数は最大で10回である。
試行回数を格納する変数を用意して、do-while文の継続条件(もしくは文中)で試行回数が10回を超えていないかチェックするだけです。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:36
by フリスク
1ヒット、2ブローですね

簡単な修正で済ますなら、A~Fを0~5(1~6)と見なせば良いです。
これなら、入力する値を変換するだけで行けます(A→1、B→2、…)。

ってことは最初のプログラムを書きなおすだけじゃできないんですか?

試行回数を格納する変数を用意して、do-while文の継続条件(もしくは文中)で試行回数が10回を超えていないかチェックするだけです

上のプログラムをどう変更すればいいんですか?

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:52
by パコネコ
>ってことは最初のプログラムを書きなおすだけじゃできないんですか?
簡単な修正って書いてるじゃないですか?
if文を使うのが一番わかりやすい・・・でもcharで宣言したもので一旦受け取らないとだめな気がします。
それから変換したらどうでしょうか?

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:55
by パコネコ
>}while(hit!=N);
数えるならこの部分に条件をつけ足せばOKだと思います。
たとえば
cnt++;
}while(hit!=N || cnt<10);

のような感じで…

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月21日(水) 23:56
by フリスク
実はまだまだ初心者に近くてあまり理解が追いつけなくて・・すみません

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:01
by パコネコ
>In-='0';
勉強不足でよくわからなかったのですが、
この処理って数字に直してるんですか?
文字コード表覚えてなくて…

=============
こちらこそ勉強不足ですいません 画像

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:05
by Poco
> >In-='0';
> 勉強不足でよくわからなかったのですが、
> この処理って数字に直してるんですか?
> 文字コード表覚えてなくて…

数字を数値に変換しています。
数字'0'~'9'までは連続していますので、例えば'7'は
'7'-'0'=7となります。 画像

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:05
by フリスク
確かそうだと・・

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:10
by パコネコ
そうですか!
ありがとうございます。
それならA~Fなども連続してるのでif文使わなくても変換できそうですね。
え~と、小文字が間に入るんでしたっけ?そしてその前に数字があって…それを数値に変換ですか?
文字コードは難しいですね…夏休み中に覚えなくては…あ、上のは適当です。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:17
by パコネコ
大文字の後に小文字でした…
1~Aまでは16文字、表では隣になってますね。
'A'-あれ?
16?'DLE'?どっちでしょう?どっちでもないかな?
とりあえずそれから-'0'でできますかね?
===========
あれ?「!」かな?
=======
違いました。
文字コードで16ずらせばいいんですが…あ、わかりました
下に書きます
画像

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:20
by フリスク
うーん・・難しい

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:27
by パコネコ
数字の’0’を引くってことは、
文字コードの前に数値があるんですよね。
つまり’A’のひとつ前の’@’を引けばいいんですね。
どうでしょう?
自信ありです(^^♪)
============
書き忘れてた…
つまり'A'-'@'=1ってことですよね。
'B'-'@'=2
'C'-'@'=3…

画像

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:29
by ドラ
>1.四個のアルファベット、AからFから四つ選んでランダムに選択して文字列にする。
>(選ばれる文字はすべて異なる文字
元のソースコードには重複を回避する処理が存在しませんので、
これについても考える必要がありそうです。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:30
by ISLe
C言語的には'A'~'Z'(小文字も)は連続している保証がないんですよね。

連続していない文字コードを採用しているプラットフォームもあるのです。
パソコンでお目にかかることはないと思いますけど。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 00:32
by パコネコ
そーなんですか?
文字コード表見ながらやったのに…

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 01:11
by ISLe
> 文字コード表見ながらやったのに…

アルファベットが連続している前提なら
'A'-'A'+1 → 1
'B'-'A'+1 → 2
'C'-'A'+1 → 3
としたほうが'A'の前が何かとか気にしなくて済みますよ。

プラットフォーム限定と断ってやれば良いですし。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 01:53
by パコネコ
結局数値を足すことできたんですね。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 06:54
by フリスク
すみません

寝ちゃってました

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 17:39
by フリスク
やっぱりぜんぜんできません

今日までに作りたいんで協力してくれると助かります

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 18:56
by ookami
老婆心ながら一応フリスクさんに言っておきますが、

「どうがんばった結果わからないのか」を書かなければ、切実さは伝わりません。

少なくとも私には伝わってきませんでした。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 20:36
by フリスク
数値を文字(アルファベット)に変換する方法を調べていたのですが・・理解できないものが多くて

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 21:21
by ドラ
> 数値を文字(アルファベット)に変換する方法
こんな感じでいいのではないですか?
文字列リテラルのn番目の文字を参照しているので、文字コードが
連続しているかどうかなど関係ありません。

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

int main(void)
{
int i;

srand((unsigned)time(NULL));

for (i = 0; i < 20; i++)
{
printf( "%c ", "ABCDEF"[rand()%6] );
}
putchar('\n');

return 0;
}

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 21:32
by パコネコ
そんなことできるんですね。
で、結局アルファベットを数値に変換はできたんですか?
できたんならいいですけど…

数値をアルファベットには「ドラ」さんのでできそうですね。
ドラさん勉強になりました。

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月22日(木) 21:41
by フリスク
いまからやってみます

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月23日(金) 17:06
by だいちゃん
>数値を文字(アルファベット)に変換する方法を調べていたのですが・・理解できないものが多くて

ならばせめて
調べて見つけた方法をここに転記して

>こういう方法を見つけたんですがどういう処理を行っているのか
>コードを見るだけでは理解できないので教えてください

くらいは書けますよね?

Re:C言語 ヒット・アンド・ブローについて

Posted: 2010年7月23日(金) 17:09
by パコネコ
そういえば
昨日までに作りたかったとか書いてた気が…