• 締切済み

囚人のジレンマゲーム C言語

囚人のジレンマゲームをC言語で作りました。そのうちのこの部分を変えて、相手が協調の際に9回まで裏切り、後は全部協調とするにはどうしたらいいのでしょうか。 int you(int bc) //PLAYER1 { int ret; /* if(bc==COOPERATION){ret=COOPERATION;} else{ret=DEFECTION;} */ ret=DEFECTION; return(ret); }

みんなの回答

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.4

> 副作用が大きすぎると感じます。 ご指摘のとおりかと思います。 具体的に副作用を明示しないのは不親切かと思いましたので、 補足をば。 主に、ゲームを2回以上プレーしようとした際にcountを初期化する方法がないため 2ゲーム目以降、1手目で裏切ってしまうバグが発生します。 1回ごとにプロセスが終了するのであれば、この限りではありません。 他に見落としてる副作用があったら指摘していただけるとありがたいです。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

> 呼び出し側を変えたくないのであれば、static int使うといいですよ。 お奨めしかねます。 この関数は戦略を練るのが目的。カウントアップが目的じゃない。 副作用が大きすぎると感じます。

全文を見る
すると、全ての回答が全文表示されます。
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.2

呼び出し側を変えたくないのであれば、static int使うといいですよ。 int you(int bc) { static int count = 0; count++; return count <= 9 ? DEFECTION : COOPERATION; }

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

いったい何がわからんのですか? int you(int 回数) {  return (回数<=9) ? DEFECTION : COOPERATION; } /* 呼び出し側も適切に書き換えてください */

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 囚人のジレンマ

    2人繰り返し囚人のジレンマゲームのアルゴリズムを考えなければいかず、有名な”しっぺ返し”や”全部裏切り(協調)”や”ランダム性のあるもの”など以外で何かありましたらお願いします。 ちなみにノイズ入りです。ノイズの確率はランダムに設定されています。 パブロフ戦略などがいいと思ったのですが、これは”しっぺ返し”の応用なため、あまり・・・ 何かオリジナルかつそこそこ強いアルゴリズムを教えていただけたら幸いです。 よろしくお願いします。

  • 囚人のディレンマにおけるプレーヤーの行動原理

    囚人のディレンマにおけるプレーヤーは合理主義者なのですか? 完備情報下でのゲームにおいては特に断りのない限りプレーヤーは合理主義者という判断でいいですかね?

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語の関数の質問です

    C言語の質問です 最近C言語を始めました。以下の問題がわかりません。 int型の数値を入力して結果をdouble型の戻り値を返すことはできないのか。 関数の値のやり取りでも暗黙の型変換や明示的な型変換はできるのか。 #include <stdio.h> double square(int x); int main(void) { int num;   double ret;   scanf("%d",num); ret = square(num);    printf("%ld",ret); return(0); } double square(int x){ return(x*x); }

  • C言語のことについて教えてください

    C言語のことで教えてください。お願いします #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <windows.h> int main(int argc, char* argv[]) { char *data[] = {"おひつじ","おうし","ふたご","かに","しし","おとめ","てんびん", "さそり","いて","やぎ","みずがめ","うお"}; int data_len = 12; //データの数 char input[10]; //プレイヤーの入力値 int i,p,start; int win = 1; int mawari = 1; //内回りの場合は1 int p_turn = 0; //プレイヤーのターン if ((argc > 1) && (strcmp(argv[1], "-soto") == 0)) { mawari = 0; } srand(time(NULL)); start = rand()%data_len; printf("古今東西山手線ゲ~ム!\n"); printf("お題:星座の名前\n"); for(p = start,i = 1; i<= data_len; i++,p_turn = !p_turn ) { sleep(500); if(p_turn == 0) {printf("コンピューター");} else if (p_turn == 1) {printf("プレイヤー");} sleep(500); printf("ちゃん! >"); if(p_turn == 0) { printf("%s\n",*(data+p)); } else { scanf("%s", input); while (getchar() != '\n') { } if(strcmp(*(data+p),input) != 0) { win = 0; break; } } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } if(win == 1) {printf("あなたの勝ち");} else {printf("あなたの負け");} return 0; } なんですが、どうしても } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } 変数Pに今は乱数1-12がはいっているのに、なぜこの処理を行うかがわかりません。どうしてなんですか?教えてください。

  • エラー C言語 プログラミングについて

    #include<stdio.h> int leapYear(int); int main(void){ int year,i; for(i=2001;i=2999;i++){ year=i; printf("%d leap = %d \n",i,leapYear(int year)); return 0; } } int leapYear(int year){ if(year%100==0){ return 0; } else if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } } をコンパイルすると11行目に式の構文エラーが出るんですが どうしてでしょうか?? 間違ってない気がするんですけど。。

  • C言語のプログラムについて質問

    明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) {  if (x > y)   return (x);  else   return (y); } int main(void) {  int na, nb;  puts("二つの整数を入力してください。");  printf("整数1:"); scanf("%d", &na);  printf("整数1:"); scanf("%d", &na);  printf("大きいほうの値は%dです。\n", maxof(na, nb));  return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) {  return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) {  if (w > x)   return (w);  else   return (x); } maxof(y, z) {  if(y > z)   return (y);  else   return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x)   return (w); if (w < x)   return (x); if (y > z)   return (y); if (y < z)   return (z); if (maxof(w, x) > maxof(y, z))   return (maxof(w, x)); if (maxof(w, x) < maxof(y, z))   return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。

  • C言語初心者です。

    大学に入ってからC言語を授業で習い始めました。なので、すごい初歩的なことですが丁寧に教えてくださると嬉しいです。いくつか分からないことがあるので教えてください。   1・よくprintf("");なので%dや%fを使いますが、これはint(整数)の時が%dで、double(小数点付)の時に%fを使えばいいのか。 2・mul(呼び出す)、return(戻る)の意味、使い方 3・if(aaaa%4==0){ if(aaaa%100!=0)printf("閏年である。\n"); else{if(aaaa%400==0)printf("閏年である。\n"); else printf("閏年ではない。\n"); の意味は、もしaaaaが4で割り切れ、100で割り切れなかったら閏年で、そうではなく100で割り切れ400で割り切れたら閏年である。という意味でいいのか。 4・andとor,whileの使い方が分からない。 5・授業でやったことなのですが、 # include<studio.h>  int passWordInput(); main(){    int a, pw=1234, a=passWordInput(); if(a==pw)printf("ok\n"); else{a=passWordInput(); if(a==pw)printf("ok\n"); else{a=passWordInput(); if(a==pw)printf("ok\n"); else printf("Byw!!\n"); } } } int passWordInput(){ int wk; printf("パスワード:");scanf("%d",&wk); return wk; } がよく分かりませんでした。特にwkが出てくるあたりからです。 一応全て自分なりに本とか見てみましたが、あまり理解出来なかったので詳しい回答をしてくださると嬉しいです。よろしくお願いします。

  • C言語 間違ったところを見つけてください。

    /* 自動検索装置        */ /* 2012年9月4日  MICR0904  */ /* AT90S2323/2343       */ #include <avr\io.h> int main (void) /*   汎用レジスターの指定     */ { long ka; long ke; long ke1; long k10; int kk; int pa; long tm1; long tm2; long tm3; DDRB = 0xfe; /* 11111110 PB0;入力 PB1;出力 */ if (!(PINB && BV(PB0)) tm2=0; tm1++; pa=tm1/100; if (pa>=10) { ka =12345; /* カルテNO ka=1~99999 */ ke = 0; /* 検索アドレス */ ke1 = 0; /* 桁検索アドレス */ k10 = 1; /* 桁x10 */ kk = 0; /* 桁カウンタ   */ pa = 0; /* 信号カウンタ */ tm1 = 0; /* 信号ONタイマ */ tm2 = 0; /* 信号OFFタイマ */ tm3 = 0; /* LED,ON-OFFタイマ */ } return 0; else ( (PINB && BV (PB0)) tm1=0; tm2++; if {(tm2!=100) return 0;} else if (tm2==100) if {(kk>5) return 0; } else if (kk<=4) ke1 = pa*k10; ke = ke+ke1; k10 = k10*10; kk ++; pa = 0; ke1 =0; tm2 = 0; if (kk!=5) return 0; else if (kk==5) if( !(PINB & BV (PB0)) return 0; else if ((PINB && BV (PB0)) if (ka !=ke) return 0; else if (ka==ke) do{ tm3=800; do{ tm3--; if (tm3>400) POBTB 0xff; else if (tm3<400) PORTB 0xfe; } while (tm3 !=0); } while (tm3 ==0); /* end of file */ }