前http://oshiete.goo.ne.jp/qa/7834519.html
で質問してとりあえず1人でやるのはできたんですが
1人だとおもしろくないのでコンピュータの対戦相手
をつくりたいと思いました。
でもプログラムがさっぱりわかりません。
どんなプログラムにすればいいでしょうか?
もうひとつは一応答えをつくるところはかぶる数字がでる
確立はかなり低いと思うんですが確率が0%ではないので0%にする方法も
教えていただければ幸いです
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include<stdio.h>
int kotae,kotae1,kotae2,kotae3;//答え、答え1桁目、答え2桁目、答え3桁目
int yosou,yosou1,yosou2,yosou3;//予想、予想1桁目、予想2桁目、予想3桁目
int Ekaunnta;//イートカウンタ
int Bkaunnta;//バイトカウンタ
int i=0;
int z=0;
int kota(void);
int guess(void);
int yoso(void);
int main(){
printf("==========================================================\n");
printf(" ヌメロン \n");
printf(" コンピュータの数字を当ててください \n");
printf("==========================================================-\n");
kota();
while(i==0){
yoso();
guess();
if(yosou==kotae){
i=1;
printf("正解!!");
}
}
rewind(stdin);
getchar();
}
int kota(void){//答えを作る関数
srand((unsigned)time(NULL));
kotae1=rand() %9+1;
kotae2=rand() %9+1;
kotae3=rand() %9+1;
while(z<1000){
if(kotae1==kotae2){
kotae1=rand() %9+1;
}
if(kotae1==kotae3){
kotae1=rand() %9+1;
}
if(kotae2==kotae3){
kotae2=rand() %9+1;
}
z++;
}
kotae=kotae1+kotae2*10+kotae3*100;
return 0;
}
int guess(void){//イート バイトを判定する関数
//----------イート判定---------
if(yosou1==kotae1){
Ekaunnta=Ekaunnta+1;
}
if(yosou2==kotae2){
Ekaunnta=Ekaunnta+1;
}
if(yosou3==kotae3){
Ekaunnta=Ekaunnta+1;
}
//--------------ここまで-------
//--------------バイト判定------
if(yosou1==kotae2){
Bkaunnta=Bkaunnta+1;
}
if(yosou1==kotae3){
Bkaunnta=Bkaunnta+1;
}
if(yosou2==kotae1){
Bkaunnta=Bkaunnta+1;
}
if(yosou2==kotae3){
Bkaunnta=Bkaunnta+1;
}
if(yosou3==kotae1){
Bkaunnta=Bkaunnta+1;
}
if(yosou3==kotae2){
Bkaunnta=Bkaunnta+1;
}
//------------ここまで---------
printf("%dE ",Ekaunnta);
printf("%dB\n",Bkaunnta);
Ekaunnta=0;
Bkaunnta=0;
return 0;
}
int yoso(void){//予想を入力
printf("あなたの予想3桁目:");
scanf("%d",&yosou3);
printf("あなたの予想2桁目:");
scanf("%d",&yosou2);
printf("あなたの予想1桁目:");
scanf("%d",&yosou1);
yosou=yosou1+yosou2*10+yosou3*100;
printf("あなたの予想:%d\n",yosou);
return 0;
}
とりあえずプログラムはこんな感じです。
かなりわかりにくいとは思いますが回答よろしくお願いします。
No.7ベストアンサー
- 回答日時:
にある、HitAndBlow.cpp なら Visual Studio 2010 (VC++ 10) で通るハズ。
できました!!
わざわざ作っていただいてありがとうございます
ゆっくりプログラムを読んで対戦型
ヌメロンを作ろうと思います
回答ありがとうございました
No.5
- 回答日時:
この回答への補足
すいません
エラー出ました
→ for ( number n : candidates ) {
↑ // nがこれまでに得られたhintと矛盾がないならば、それは正解かもしれないので候補に残す
↑ if ( all_of(begin(hints),end(hints),[&](hint h) { return judge(n,h.first) == h.second;}) ) ↑{
↑ new_candidates.push_back(n);
↑ }
←のところで
構文エラー : ',' が ':' の前にありません。
構文エラー : ';' が '{' の前にありません。
と出てしまいました
どうすればいいでしょうか?
VC++でやってます
No.4
- 回答日時:
> 1人だとおもしろくないのでコンピュータの対戦相手
> をつくりたいと思いました。
> でもプログラムがさっぱりわかりません。
> どんなプログラムにすればいいでしょうか?
1. int countEat(真の答, 予想した答) , int countByte(真の答, 予想した答) を用意する
2. for ( 0~9 のすべての組み合わせ(7200通り) X について )
for ( 今までの 予想した答 G およびその時のEat/Byte数 E,B について ) {
if ( countEat(X,G) != E || countByte(X,G) != B ) ならば X は真の答ではない
}
}
3.2によって得られた 真の答と思われる X の一つを出力し、EとBを(playerから)もらう
No.3
- 回答日時:
> 答えをつくるところはかぶる数字がでる
> 確立はかなり低いと思うんですが確率が0%ではないので0%にする方法
カブったらやり直す戦略で:
kotae1=rand() %9+1;
do {
kotae2=rand() %9+1;
} while ( kotae1 == kotae2 ); /* カブったらやり直す */
do {
kotae3=rand() %9+1;
} while ( kotae1 == kotae3 || kotae2 == kotae3 ); /* カブったらやり直す */
No.2
- 回答日時:
No1です
回答はVBAでのものなので、C言語の文法に書き換えてください
要は
kotae2は0-8のランダム値を取り、kotae1以上数値の場合は+1
kotae3は0-7のランダム値を取り、kotae1とkotae2の最小値より小さい場合はそのまま
kotae1とkotae2の最大値-2以上の場合は+2、それ以外は+1
これで重複なしにランダムな0-9の数値が3個取り出せます
No.1
- 回答日時:
>答えをつくるところはかぶる数字がでる
こちらの解決手段ですが
kotae1 = Int(10 * Rnd)
kotae2 = Int(9 * Rnd)
kotae2 = kotae2 - (kotae2 >= kotae1)
kotae3 = Int(8 * Rnd)
kotae3 = kotae3 - (kotae3 >= kotae1)
kotae3 = kotae3 - (kotae3 >= kotae2)
これで重複なしになるはずです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
1秒で動くインターバルタイマ
-
C言語初心者です。次の問題で質...
-
printf で二進表示を行いたい。
-
ヘロンの公式を作ったプルグラ...
-
C言語での数字の花形表示
-
二つの整数値の大小比較
-
インクリメント演算子をprintf...
-
strcmp
-
球の体積と表面積を表示するプ...
-
printf( " %2d", p * q );
-
C言語 プログラミング
-
コンパイルエラーについて
-
エラーの意味が…
-
Cのdoubleの浮動小数点表示につ...
-
Cプログラムについて
-
C言語 関数
-
CTRL+Dでループを抜けるには
-
hit&bolwのプログラミングがで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報