C言語 ヒット・アンド・ブローについて
C言語 ヒット・アンド・ブローについて
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;
の部分でエラーが出てしまってよくわかりません
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言語 ヒット・アンド・ブローについて
まずは、ヒット・アンド・ブローのルールを教えてください。
全員がルールを知っているわけではないと思います。
>fflush(stdin);hit=0,blow=0;
>の部分でエラーが出てしまってよくわかりません
何をしたときにどんなエラーが出るのですか?
なお、fflush(stdin);
つまり、標準入力に対するfflush()は動作未定義のはずです。
全員がルールを知っているわけではないと思います。
>fflush(stdin);hit=0,blow=0;
>の部分でエラーが出てしまってよくわかりません
何をしたときにどんなエラーが出るのですか?
なお、fflush(stdin);
つまり、標準入力に対するfflush()は動作未定義のはずです。
Re:C言語 ヒット・アンド・ブローについて
えっと、問題を整理したいんですけど、
フリスクさんが提示したソースコードは、
・ヒット・アンド・ブローである。
・入力する値は数字である。
・当たるまで終わらない。
・上記仕様では正常に動作している。
という現状で、
ここから
・入力する値はアルファベット(A~F)である(大文字小文字区別するのかな?)。
・入力する回数は最大で10回である。
という風に変更したいが、どうしたらいいか分からない、
で合ってます?
フリスクさんが提示したソースコードは、
・ヒット・アンド・ブローである。
・入力する値は数字である。
・当たるまで終わらない。
・上記仕様では正常に動作している。
という現状で、
ここから
・入力する値はアルファベット(A~F)である(大文字小文字区別するのかな?)。
・入力する回数は最大で10回である。
という風に変更したいが、どうしたらいいか分からない、
で合ってます?
Re:C言語 ヒット・アンド・ブローについて
おお~
数字バージョンなら知ってる…
上のやつ起動できたけどな~?
>補足 今、なおしているんですがfflush(stdin);hit=0,blow=0;
別に変なとこないけど…「,」とか?でも起動できたし…
でもfflushって意味知らないんですよね…
意味教えてもらってもいいですか?
「組み込み関数:バッファリングデータ書き込み」って書いてたんですけど…使い方(使い道)わからなくて
すいません。勉強のためにお願いします。
数字バージョンなら知ってる…
上のやつ起動できたけどな~?
>補足 今、なおしているんですがfflush(stdin);hit=0,blow=0;
別に変なとこないけど…「,」とか?でも起動できたし…
でもfflushって意味知らないんですよね…
意味教えてもらってもいいですか?
「組み込み関数:バッファリングデータ書き込み」って書いてたんですけど…使い方(使い道)わからなくて
すいません。勉強のためにお願いします。
Re:C言語 ヒット・アンド・ブローについて
えっと・・ヒット・アンド・ブローとは、パソコンにランダムに四つの文字列を選ばせ、ユーザーが当てるゲームです。
たとえば、パソコンがACDFを選びユーザーがABCDと入力した場合、1ヒット、3ブローと表示されます
エラーというか定義されてませんと出ます・・・
・入力する値はアルファベット(A~F)である(大文字のみです)。
・入力する回数は最大で10回である。
という風に変更したいが、どうしたらいいか分からない、
で合ってます。何日も考えてるんですが全然作れなくて明日か明後日までに作りたいんですが・・よろしくお願いします
たとえば、パソコンがACDFを選びユーザーがABCDと入力した場合、1ヒット、3ブローと表示されます
エラーというか定義されてませんと出ます・・・
・入力する値はアルファベット(A~F)である(大文字のみです)。
・入力する回数は最大で10回である。
という風に変更したいが、どうしたらいいか分からない、
で合ってます。何日も考えてるんですが全然作れなくて明日か明後日までに作りたいんですが・・よろしくお願いします
Re:C言語 ヒット・アンド・ブローについて
> たとえば、パソコンがACDFを選びユーザーがABCDと入力した場合、1ヒット、3ブローと表示されます
1ヒット、2ブローですよね?
> ・入力する値はアルファベット(A~F)である(大文字のみです)。
簡単な修正で済ますなら、A~Fを0~5(1~6)と見なせば良いです。
これなら、入力する値を変換するだけで行けます(A→1、B→2、…)。
> ・入力する回数は最大で10回である。
試行回数を格納する変数を用意して、do-while文の継続条件(もしくは文中)で試行回数が10回を超えていないかチェックするだけです。
1ヒット、2ブローですよね?
> ・入力する値はアルファベット(A~F)である(大文字のみです)。
簡単な修正で済ますなら、A~Fを0~5(1~6)と見なせば良いです。
これなら、入力する値を変換するだけで行けます(A→1、B→2、…)。
> ・入力する回数は最大で10回である。
試行回数を格納する変数を用意して、do-while文の継続条件(もしくは文中)で試行回数が10回を超えていないかチェックするだけです。
Re:C言語 ヒット・アンド・ブローについて
1ヒット、2ブローですね
簡単な修正で済ますなら、A~Fを0~5(1~6)と見なせば良いです。
これなら、入力する値を変換するだけで行けます(A→1、B→2、…)。
ってことは最初のプログラムを書きなおすだけじゃできないんですか?
試行回数を格納する変数を用意して、do-while文の継続条件(もしくは文中)で試行回数が10回を超えていないかチェックするだけです
上のプログラムをどう変更すればいいんですか?
簡単な修正で済ますなら、A~Fを0~5(1~6)と見なせば良いです。
これなら、入力する値を変換するだけで行けます(A→1、B→2、…)。
ってことは最初のプログラムを書きなおすだけじゃできないんですか?
試行回数を格納する変数を用意して、do-while文の継続条件(もしくは文中)で試行回数が10回を超えていないかチェックするだけです
上のプログラムをどう変更すればいいんですか?
Re:C言語 ヒット・アンド・ブローについて
>ってことは最初のプログラムを書きなおすだけじゃできないんですか?
簡単な修正って書いてるじゃないですか?
if文を使うのが一番わかりやすい・・・でもcharで宣言したもので一旦受け取らないとだめな気がします。
それから変換したらどうでしょうか?
簡単な修正って書いてるじゃないですか?
if文を使うのが一番わかりやすい・・・でもcharで宣言したもので一旦受け取らないとだめな気がします。
それから変換したらどうでしょうか?
Re:C言語 ヒット・アンド・ブローについて
>}while(hit!=N);
数えるならこの部分に条件をつけ足せばOKだと思います。
たとえば
cnt++;
}while(hit!=N || cnt<10);
のような感じで…
数えるならこの部分に条件をつけ足せばOKだと思います。
たとえば
cnt++;
}while(hit!=N || cnt<10);
のような感じで…
Re:C言語 ヒット・アンド・ブローについて
>In-='0';
勉強不足でよくわからなかったのですが、
この処理って数字に直してるんですか?
文字コード表覚えてなくて…
=============
こちらこそ勉強不足ですいません
勉強不足でよくわからなかったのですが、
この処理って数字に直してるんですか?
文字コード表覚えてなくて…
=============
こちらこそ勉強不足ですいません

Re:C言語 ヒット・アンド・ブローについて
> >In-='0';
> 勉強不足でよくわからなかったのですが、
> この処理って数字に直してるんですか?
> 文字コード表覚えてなくて…
数字を数値に変換しています。
数字'0'~'9'までは連続していますので、例えば'7'は
'7'-'0'=7となります。
> 勉強不足でよくわからなかったのですが、
> この処理って数字に直してるんですか?
> 文字コード表覚えてなくて…
数字を数値に変換しています。
数字'0'~'9'までは連続していますので、例えば'7'は
'7'-'0'=7となります。

Re:C言語 ヒット・アンド・ブローについて
そうですか!
ありがとうございます。
それならA~Fなども連続してるのでif文使わなくても変換できそうですね。
え~と、小文字が間に入るんでしたっけ?そしてその前に数字があって…それを数値に変換ですか?
文字コードは難しいですね…夏休み中に覚えなくては…あ、上のは適当です。
ありがとうございます。
それならA~Fなども連続してるのでif文使わなくても変換できそうですね。
え~と、小文字が間に入るんでしたっけ?そしてその前に数字があって…それを数値に変換ですか?
文字コードは難しいですね…夏休み中に覚えなくては…あ、上のは適当です。
Re:C言語 ヒット・アンド・ブローについて
大文字の後に小文字でした…
1~Aまでは16文字、表では隣になってますね。
'A'-あれ?
16?'DLE'?どっちでしょう?どっちでもないかな?
とりあえずそれから-'0'でできますかね?
===========
あれ?「!」かな?
=======
違いました。
文字コードで16ずらせばいいんですが…あ、わかりました
下に書きます

1~Aまでは16文字、表では隣になってますね。
'A'-あれ?
16?'DLE'?どっちでしょう?どっちでもないかな?
とりあえずそれから-'0'でできますかね?
===========
あれ?「!」かな?
=======
違いました。
文字コードで16ずらせばいいんですが…あ、わかりました
下に書きます

Re:C言語 ヒット・アンド・ブローについて
数字の’0’を引くってことは、
文字コードの前に数値があるんですよね。
つまり’A’のひとつ前の’@’を引けばいいんですね。
どうでしょう?
自信ありです(^^♪)
============
書き忘れてた…
つまり'A'-'@'=1ってことですよね。
'B'-'@'=2
'C'-'@'=3…

文字コードの前に数値があるんですよね。
つまり’A’のひとつ前の’@’を引けばいいんですね。
どうでしょう?
自信ありです(^^♪)
============
書き忘れてた…
つまり'A'-'@'=1ってことですよね。
'B'-'@'=2
'C'-'@'=3…

Re:C言語 ヒット・アンド・ブローについて
>1.四個のアルファベット、AからFから四つ選んでランダムに選択して文字列にする。
>(選ばれる文字はすべて異なる文字)
元のソースコードには重複を回避する処理が存在しませんので、
これについても考える必要がありそうです。
>(選ばれる文字はすべて異なる文字)
元のソースコードには重複を回避する処理が存在しませんので、
これについても考える必要がありそうです。
Re:C言語 ヒット・アンド・ブローについて
C言語的には'A'~'Z'(小文字も)は連続している保証がないんですよね。
連続していない文字コードを採用しているプラットフォームもあるのです。
パソコンでお目にかかることはないと思いますけど。
連続していない文字コードを採用しているプラットフォームもあるのです。
パソコンでお目にかかることはないと思いますけど。
Re:C言語 ヒット・アンド・ブローについて
> 文字コード表見ながらやったのに…
アルファベットが連続している前提なら
'A'-'A'+1 → 1
'B'-'A'+1 → 2
'C'-'A'+1 → 3
としたほうが'A'の前が何かとか気にしなくて済みますよ。
プラットフォーム限定と断ってやれば良いですし。
アルファベットが連続している前提なら
'A'-'A'+1 → 1
'B'-'A'+1 → 2
'C'-'A'+1 → 3
としたほうが'A'の前が何かとか気にしなくて済みますよ。
プラットフォーム限定と断ってやれば良いですし。
Re:C言語 ヒット・アンド・ブローについて
老婆心ながら一応フリスクさんに言っておきますが、
「どうがんばった結果わからないのか」を書かなければ、切実さは伝わりません。
少なくとも私には伝わってきませんでした。
「どうがんばった結果わからないのか」を書かなければ、切実さは伝わりません。
少なくとも私には伝わってきませんでした。
Re:C言語 ヒット・アンド・ブローについて
> 数値を文字(アルファベット)に変換する方法
こんな感じでいいのではないですか?
文字列リテラルの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;
}
こんな感じでいいのではないですか?
文字列リテラルの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言語 ヒット・アンド・ブローについて
そんなことできるんですね。
で、結局アルファベットを数値に変換はできたんですか?
できたんならいいですけど…
数値をアルファベットには「ドラ」さんのでできそうですね。
ドラさん勉強になりました。
で、結局アルファベットを数値に変換はできたんですか?
できたんならいいですけど…
数値をアルファベットには「ドラ」さんのでできそうですね。
ドラさん勉強になりました。
Re:C言語 ヒット・アンド・ブローについて
>数値を文字(アルファベット)に変換する方法を調べていたのですが・・理解できないものが多くて
ならばせめて
調べて見つけた方法をここに転記して
>こういう方法を見つけたんですがどういう処理を行っているのか
>コードを見るだけでは理解できないので教えてください
くらいは書けますよね?
ならばせめて
調べて見つけた方法をここに転記して
>こういう方法を見つけたんですがどういう処理を行っているのか
>コードを見るだけでは理解できないので教えてください
くらいは書けますよね?