アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

とりあえずプログラムはこんな感じです。
かなりわかりにくいとは思いますが回答よろしくお願いします。

A 回答 (7件)

https://skydrive.live.com/#cid=07C558F8E11E708F& …
にある、HitAndBlow.cpp なら Visual Studio 2010 (VC++ 10) で通るハズ。
    • good
    • 0
この回答へのお礼

できました!!
わざわざ作っていただいてありがとうございます
ゆっくりプログラムを読んで対戦型
ヌメロンを作ろうと思います
回答ありがとうございました

お礼日時:2012/12/24 22:55

> VC++でやってます



VisualStudio 2010 (VC++ 10) 以上のバージョンじゃないとエラーになるでしょね。
    • good
    • 0

作ってみた。

参考URL参照。
# Cで書くのがめんどくせぇのでC++で。

参考URL:http://blogs.wankuma.com/episteme/archive/2012/1 …

この回答への補足

すいません
エラー出ました
 →   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++でやってます

補足日時:2012/12/24 16:18
    • good
    • 0

> 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から)もらう
    • good
    • 0

> 答えをつくるところはかぶる数字がでる


> 確立はかなり低いと思うんですが確率が0%ではないので0%にする方法

カブったらやり直す戦略で:

kotae1=rand() %9+1;
do {
kotae2=rand() %9+1;
} while ( kotae1 == kotae2 ); /* カブったらやり直す */
do {
kotae3=rand() %9+1;
} while ( kotae1 == kotae3 || kotae2 == kotae3 ); /* カブったらやり直す */
    • good
    • 0
この回答へのお礼

できました!!
とてもわかりやすかったです!
回答ありがとうございました

お礼日時:2012/12/24 15:31

No1です


回答はVBAでのものなので、C言語の文法に書き換えてください

要は
kotae2は0-8のランダム値を取り、kotae1以上数値の場合は+1

kotae3は0-7のランダム値を取り、kotae1とkotae2の最小値より小さい場合はそのまま
kotae1とkotae2の最大値-2以上の場合は+2、それ以外は+1

これで重複なしにランダムな0-9の数値が3個取り出せます
    • good
    • 0

>答えをつくるところはかぶる数字がでる



こちらの解決手段ですが

kotae1 = Int(10 * Rnd)
kotae2 = Int(9 * Rnd)
kotae2 = kotae2 - (kotae2 >= kotae1)
kotae3 = Int(8 * Rnd)
kotae3 = kotae3 - (kotae3 >= kotae1)
kotae3 = kotae3 - (kotae3 >= kotae2)

これで重複なしになるはずです
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A