まず、サイコロを2つ用意します。ランダムに1から6の 目を出すようにすればよいですね。これは、 第12章でやったrand()関数を使えばよいですね。
次に、プレーヤーの掛け金(?)と「丁か半」を入力します。
そして、サイコロの目を表示して、正解・不正解を判断します。
正解なら、掛け金をプレーヤーの所持金に加え、不正解なら
所持金より差し引く。こんな具合でどうでしょうか。
では、プログラムを見てみましょう。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> void saikoro(int*, int*); int main() { long kakekin, motokin; //int型でもいいが掛け金が小さくなる! int cho_han, me1, me2, kekka, cont; char kekka_str[8]; //丁、半の文字列を格納 printf("あなたの所持金は? -->"); scanf("%ld", &motokin); //motokinはlongなので%ld printf("\n"); while(1) { //永久ループ printf("掛け金を入力してください。-->"); scanf("%ld", &kakekin); printf("\n丁=0,半=1 -->"); scanf("%d", &cho_han); printf("\n"); saikoro(&me1, &me2); kekka = (me1 + me2) % 2; if (kekka == 0) strcpy(kekka_str, "丁"); else strcpy(kekka_str, "半"); printf("\nサイコロ1=%d サイコロ2=%d 結果は%sでした!\n", me1, me2, kekka_str); if (cho_han == kekka) motokin += kakekin; else { motokin -= kakekin; if (motokin <= 0L) { printf("もうお金がありません!\n"); break; //破産したらループ脱出 } } printf("\nあなたの持ち金は%ld円です\n", motokin); printf("続けますか [yes=1, no=0]"); scanf("%d", &cont); if(cont == 0) break; //やめたいときもループ脱出 } printf("\nそれではやめましょう\n"); return 0; } void saikoro(int *a, int *b) { srand((unsigned)time(NULL));//rand()だけではいつも *a = rand() % 6 + 1; //同じパターンになる *b = rand() % 6 + 1; //6で割った余りは0から5 return; //サイコロと同じにするため1を足す }
少し長いけど、1つずつ見ていくとたいして難しくはないですね。
main関数にいろいろたくさん書いてしまいましたが、
もっといろいろな関数を作ってmain関数を短くしてみてください。
それと、saikoro関数で一度に2つのさいころの目を出していますが
これを1個だけにしてreturnで返す、main関数ではsaikoro関数を
2回呼ぶ、というのはどうでしょうか。この方が簡単でスマートなように
見えます。実は筆者もそのように書いたのですが、重大な問題があります。
それはやってみればわかりますが・・・。(いつもゾロメの丁になってしまう!)
欲張ってかけすぎると負けたとき一気に破産します。
なお、このゲームを使って賭博行為を行い警察に捕まっても
筆者には何の責任もありません。
Update Nov/12/1996 By Y.Kumei