ヌメロンの対戦相手をつくるプログラム

このQ&Aのポイント
  • ヌメロンの対戦相手をコンピュータで作るプログラムについて質問です。
  • プログラムがわからないので、どのようなプログラムを作れば良いか教えてください。
  • また、確率が0%ではないので確率を0%にする方法も知りたいです。
回答を見る
  • ベストアンサー

ヌメロンの対戦相手

http://okwave.jp/qa/q7834519.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

https://skydrive.live.com/#cid=07C558F8E11E708F&id=7C558F8E11E708F%21609 にある、HitAndBlow.cpp なら Visual Studio 2010 (VC++ 10) で通るハズ。

spmz1311
質問者

お礼

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

その他の回答 (6)

回答No.6

> VC++でやってます VisualStudio 2010 (VC++ 10) 以上のバージョンじゃないとエラーになるでしょね。

回答No.5

作ってみた。参考URL参照。 # Cで書くのがめんどくせぇのでC++で。

参考URL:
http://blogs.wankuma.com/episteme/archive/2012/12/23/310246.aspx
spmz1311
質問者

補足

すいません エラー出ました  →   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 ); /* カブったらやり直す */

spmz1311
質問者

お礼

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

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.2

No1です 回答はVBAでのものなので、C言語の文法に書き換えてください 要は kotae2は0-8のランダム値を取り、kotae1以上数値の場合は+1 kotae3は0-7のランダム値を取り、kotae1とkotae2の最小値より小さい場合はそのまま kotae1とkotae2の最大値-2以上の場合は+2、それ以外は+1 これで重複なしにランダムな0-9の数値が3個取り出せます

  • web2525
  • ベストアンサー率42% (1219/2850)
回答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

  • 乱数

    #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { double n,end; printf("いくつ以上の値が出たら終了しますか?:"); scanf("%lf",&end); srand((unsigned)time(NULL)); for( ; ; ){ n=(double)rand(); printf("%f\n",n); if(n>=end) break; } return 0; } これなんですが、このまま実行すると.00000になってしまいます。 自分的には0.~にしたいのですが、どう変えればいいでしょうか? 回答お願いします。

  • C言語の、sinxのマクローリン展開を教えて下さい

    C言語の、sinxのテイラー(マクローリン)展開を求めるプログラムを教えて下さい。 sinx=x-(x^3)/3!+(x^5)/5!-(x^7)/7!+(x^9)/9!・・・ となっており、 整数nと実数xを入力すると 第n項までの和を求めるプログラムを作らないといけません。 以下は、私が作ったプログラムです。 #include<stdio.h> #include<math.h> int main(void) { int i,n; double x,kotae,tmp; printf("n=? \n"); scanf("%d",&n); printf("x=? \n"); scanf("%lf",&x); kotae=x; tmp=1; for(i=1;i<n;i++) { tmp=tmp*(-1)*x*x/(2*i)/(2*i+1); kotae=kotae+tmp; } printf("sin%fのテイラー展開第%d項までの和は%f \n",x,n,kotae); return 0; } 作ったのですが、うまくいきません n=2、x=2にすると1.3333・・・とかになってしまいます どうすればいいでしょうか? 分かる方、お願いします。

  • 毎回違う乱数を生成するにはどうしたらいいでしょうか

    C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に  >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); return 0; } お忙しい中、教えていただけたらうれしいです。

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; }

  • ifについて

    C言語を最近学び始めました。 以下をコンパイルし、実行しても予期せぬ結果になってしまい、困っています。 #include <stdio.h> #include <time.h> #include <stdlib.h> void retry(int); int main(void); int main(void) { int x,y,yn; srand(time(NULL)); x = rand()%6 +1; //Player y = rand()%6 +1; //CPU printf("Player:%d\n",x); printf("CPU:%d\n",y); if(y<<x){printf("Player > CPU\n");} else if(x<<y){printf("Player < CPU\n");} else {printf("Player = CPU\n");} retry(yn); return 0; } void retry(int yn) { printf("\nRetry ?(Yes=1/No=0)>"); scanf("%d",&yn); if (yn==1){printf("\n\n");getchar();main ();} else if(yn==0){printf("\n\nend");exit(0);} else {retry(yn);}; } サイコロを2人が振り、目が大きいほうが勝ちというものなのですが、 「Player:3 CPU:6 Plyaer>CPU」 といった具合にx,yの値に関わらず「Plyaer>CPU」と表示されます。 何が原因なのでしょうか。 よろしくお願いします。

  • 質問項目をランダムで選択する方法(C++)

    現在C++でアンケートのようなプログラムを作成しています。いまのところ… #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int mondai, q_number; int answer01, answer02, answer03; int point; point = 0; srand( (unsigned int)time(0) ); mondai = 0; for (mondai<2;) { q_number = (rand() % 3)+1; switch(q_number) { case 1: if(mondai<2) { printf("質問1 今何をしたいですか?\n"); printf("1:食べる\n"); printf("2:寝る\n"); printf("3:遊ぶ\n"); printf("4:勉強する\n"); scanf("%d",&answer01); if(answer01==1) {point=point+2;}else if(answer01==2){point=point+4;}else if(answer01==3){point=point+6;}else{point=point+8;} mondai++; } { printf("問題1を選択しましたが、すでに行ったのでパスします\n"); } break; のように作っています。10項目のなかからランダムに5つほど選択し、4択の質問の中にはそれぞれポイントが課されています。5つの質問に答えた跡にポイントを表示したいのですが、なかなかうまくいきません。 どなたかご教授願えないでしょうか?よろしくお願いいたします。

  • 数字を当てさせるゲームについて

    #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int limit=0; int no; /*当てさせる値*/ int num; /*入力する値*/ int max=9; srand(time(NULL)); no=rand()%1000; do{ printf("あと%d回入力できます。数字を入力してください。\n",max-limit); scanf("%d",&num); limit++; if(num>no) { printf("大きいです。\n"); } else if(num<no) { printf("小さいです。\n"); } }while(num!=no || limit<max) if(num==no) { printf("正解です。"); printf("%d回で当たりました。",limit); } else { printf("残念ながら不正解です。") } return 0; } これは、0以上999以下の整数を入力させて9回以内にランダムで 入力した値を当てさせるゲームです。 質問内容としては 当てさせる数字を「0以上999以下の数字」→「0以上999以下の3の倍数」に変更するにはどうすればよいかです。 よろしくお願いいたします。

  • じゃんけんゲームをつくったのですが・・・。

    自分でじゃんけんゲームを作ってみたのですが、他の人のソースで どういう風に組んでいるのか研究したいのでソースお願いします。 後、もっとこういう風にした方がいいとおもう所があればおねがいします。 <ソース> #include<stdio.h> #include<time.h> #include<stdlib.h> int main() { int i; int n; srand(time(NULL)); n=rand()%3; printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n"); printf("じゃんけんぽい!"); scanf("%d",&i); if(i==0&&n==0){ printf("あいこです\n"); } else if(i==0&&n==1){ printf("勝ちました\n"); } else if(i==0&&n==2) { printf("負けました\n"); } if(i==1&&n==0){ printf("負けました\n"); } else if(i==1&&n==1){ printf("あいこです\n"); } else if(i==1&&n==2) { printf("勝ちました\n"); } if(i==2&&n==0){ printf("勝ちました\n"); } else if(i==2&&n==1){ printf("負けました\n"); } else if(i==2&&n==2){ printf("あいこです\n"); } if(i>2) { printf("やりなおしてください\n"); } return 0; }

  • サブ関数、メイン関数

    C言語の質問です! ランダムに九九の計算を出題して、キーボードから答えを入力し、正解かどうかを判定するプログラムをつくりたいです。出題の部分をサブ関数、判定の部分をメイン関数として作成する場合、どのようなプログラムの書き方になるのか、教えてください! #include<stdio.h> #include<stdlib.h> #include<process.h> void kakezan(void); void answer(void); void hanrei(void); int a,b,c; int main() { printf("やめるときは、100と入力してください。\n");   while(1){ kakezan(); answer(); hantei(); } return 0; } void kakezan(void) { a=rand() %10; b=rand() %10; printf("%d×%d=",a,b); } void answer(void) { scanf("%d",&c); if(c==100) exit(0); } void hantei(void) { if(c==a*b) printf(">>正解\n"); else printf(">>不正解\n"); printf("\n"); return; } 一応考えてみたのですが、 ちゃんと、判定→メイン  出題→サブ関数になっているのかなとおもって・・・   このプログラムであっているのでしょうか??

専門家に質問してみよう