
前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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語でAからZまでを表示する...
-
プログラミングについて質問で...
-
C言語の勉強しています。すみま...
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
コマンドラインに出力した文字...
-
getcharの連続について
-
cshの文字列操作(0埋め)
-
オセロを作成 助言お願いしま...
-
Cプログラム
-
勝率をプログラムに
-
C言語 タイマーのソースについて
-
ピラミッド表示プログラム。
-
【C言語教えてください】sin波...
-
C言語でマウス入力(クリックや...
-
srand(time(NULL))の使い方
-
C言語プログラミングで「コマン...
-
空Enterの扱い方
-
C言語です
-
Cプログラムについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
テキストカーソル位置の取得
-
三角形の判別
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
C言語で、「自然数nを入力し、n...
-
入力したお金の金額からお札の...
-
cshの文字列操作(0埋め)
-
switch分のケースを範囲数?に...
-
scanfに文字が入力されたときに...
-
プログラミングについての質問です
-
unsigned int型について
-
ダブルポインタで2次元配列を作成
-
円の面積を求めるプログラミン...
おすすめ情報