簡単なロシアンルーレット

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kkkob

簡単なロシアンルーレット

#1

投稿記事 by kkkob » 6年前

一人ロシアンルーレットをつくっています。
条件分岐で2ルートに分かれ、それから繰り返しを組んでいます。
(プログラムは片方のルートしか組めていません)

ですが、6発式の拳銃を使っている設定なのに、6回以内に死んでくれません。
また、勝負を降りるときに最後の掛け金をもらえるところで、さらに2倍した金額が出てきてしまいます。


正しくルートを遂行するにはどうしたらよいのでしょうか。
お知恵をお貸しください。
 

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(void){

	int scenario, money, con=2, gan;
	


	gan = rand() % 6 + 1;
	srand((unsigned)time(NULL));
	
	printf("ここは西部。酒場のカウンターには1丁の拳銃があった。\nバーテンはふらりと現れた流れ者のガンマンに声をかけた。\n『兄ちゃん、ちょっとやってみるかい?』\n");
	printf("\n1 : 向こう見ずのガンマンが挑戦する\n2 : 思慮深いガンマンが挑戦する\n");

	printf("シナリオを選択してください : ");
	scanf_s("%d", &scenario);

	if (scenario == 1){
		money = 100;

		printf("How much do you bet? : $%d", money);
		scanf_s("%d", &money);

		do{

			
			printf("\nYou current bet is $%d" ,money);
			money *= 2;

			printf("\n\nOK, Let's show time!\n");
			if (gan == 3){
				
				printf("\nHAHAHA. Conglaturations.\n");
				printf("\nGAME OVER");

			}
			else{
				if (con == 0){
					printf("Here is your gain, $%d.", money);
				}
				printf("\nOh, my god...");
				printf("\nAre you brave to continue?  (1:Yes, 0:No)");
				scanf_s("%d", &con);
				if (con == 0){
					printf("Here is your gain, $%d.", money);
				}
			
			}

		} while (con == 1);

	}


	return 0;
}

アバター
みけCAT
記事: 6297
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 簡単なロシアンルーレット

#2

投稿記事 by みけCAT » 6年前

kkkob さんが書きました:ですが、6発式の拳銃を使っている設定なのに、6回以内に死んでくれません。
ganの値は何回実行しても同じになるはずであり、さらにループ内にカウンタがないので、
死ぬ環境(処理系)なら何回実行しても一発で死に、死なない環境なら何回挑戦しても死にません。
オフトピック
1回引いたときに独立で1/6の確率で当たるクジを6回引いても、確実に当たりを引けるわけではないというのは大丈夫ですね?
今はそれ以前の問題ですが。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6297
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 簡単なロシアンルーレット

#3

投稿記事 by みけCAT » 6年前

kkkob さんが書きました:また、勝負を降りるときに最後の掛け金をもらえるところで、さらに2倍した金額が出てきてしまいます。
こちらで実行してみましたが、そのような動作は確認できませんでした。
「さらに2倍した金額」とは、何に比べてですか?

実行例

コード:

ここは西部。酒場のカウンターには1丁の拳銃があった。
バーテンはふらりと現れた流れ者のガンマンに声をかけた。
『兄ちゃん、ちょっとやってみるかい?』

1 : 向こう見ずのガンマンが挑戦する
2 : 思慮深いガンマンが挑戦する
シナリオを選択してください : 1
How much do you bet? : $100100

You current bet is $100

OK, Let's show time!

Oh, my god...
Are you brave to continue?  (1:Yes, 0:No)1

You current bet is $200

OK, Let's show time!

Oh, my god...
Are you brave to continue?  (1:Yes, 0:No)0
Here is your gain, $400.
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kopi
記事: 19
登録日時: 6年前

Re: 簡単なロシアンルーレット

#4

投稿記事 by kopi » 6年前

初心者ながら私も気付いた点を指摘させていただきます。

コード:

gan = rand() % 6 + 1;
srand((unsigned)time(NULL));
これだと同じ乱数列になるような。

異なる乱数列が欲しいのなら

コード:

srand((unsigned)time(NULL));
gan = rand() % 6 + 1;
だと思うのですが。

また、ganという変数はリボルバーの何発目に弾が入っているのか、という値だと思うので、
一度ロシアンルーレットに挑戦するたびに用意した変数(ここではhensuuとする)をカウントアップして

コード:

if(gan == hensuu)
  printf("GAME OVER\n");
みたいな条件文で分岐すれば6回以内には絶対GAME OVERになると思います。

それとも一度挑戦するたびにリボルバーを回転させるんですかね?
それでしたら確率こそ1/6でも、6回打ってもGAME OVERになるとは限りません。

さいころだって6が出る確率は1/6ですが、6回振れば必ず6が出るわけではありませんし。

閉鎖

“C言語何でも質問掲示板” へ戻る