プロが教える店舗&オフィスのセキュリティ対策術

トランプのシャッフルのプログラムは作れたのですが
それを利用したトランプのブラックジャックのプログラムを教えてほしいです。
どうにも組めなかったので…。

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

typedef struct{
int trump_no;
char trump_suit;
}trump_sample;

void trump_output(trump_sample *trump);
void trump_shuffle(trump_sample *trump);

int main(void){
trump_sample trump[52];

for(int i=0;i<52;i++){
//トランプ(1~13)の設定
(trump+i)->trump_no = i%13+1;
//トランプ(スート)の設定
switch(i/13){

case 0:
(trump+i)->trump_suit = 'q';
break;

case 1:
(trump+i)->trump_suit = 's';
break;

case 2:
(trump+i)->trump_suit = 'h';
break;

case 3:
(trump+i)->trump_suit = 'd';
break;
}
}
//シャッフル前のトランプの出力
trump_output(trump);
//トランプのシャッフル
trump_shuffle(trump);
//シャッフル後のトランプの出力
trump_output(trump);

return 0;
}

void trump_output(trump_sample *trump){
printf("-------------------------------------\n");
for(int i=0;i<52;i++){
printf("%c %d\n",(trump+i)->trump_suit,(trump+i)->trump_no);
}
}

void trump_shuffle(trump_sample *trump){
int a,b,tmp_no;
char tmp_suit;

srand((unsigned)time(NULL));
for(int i=0;i<52;i++){
a =rand()%52;
b =rand()%52;

//トランプの数字の入れ替え
tmp_no = (trump+a)->trump_no;
(trump+a)->trump_no = (trump+b)->trump_no;
(trump+b)->trump_no = tmp_no;

//トランプのスートの入れ替え
tmp_suit = (trump+a)->trump_suit;
(trump+a)->trump_suit = (trump+b)->trump_suit;
(trump+b)->trump_suit = tmp_suit;
}
}

ブラックジャックは最初に2枚のカードを配り、2〜10は数字通り、JとQとKは10、Aは1か11として合計し21に近いほど勝ちとなるが、21を超えると負け(バスト)というもので
まず最初にトランプをシャッフルし、2枚を先頭から順番に引き、それらのカードの数字と合計値を表示するプログラムという形でお願いします。

表示は以下の感じで
$ ./a.exe
2 7 : 合計9
$ ./a.exe
9 J : 合計19
$ ./a.exe
A K : 合計21
$

A 回答 (2件)

手札の配列を用意する


山札の配列を用意し、シャッフル済みデッキを格納
山札配列の先頭の1枚を手札配列に加える
山札配列の先頭の1枚を手札配列に加える
... (多分この辺りに操作性にかかわる処理が入る) ...
手札配列を先頭から再帰的に点数計算する
手札と点数を表示する
... (多分この辺りにゲーム性にかかわる処理が入る) ...

再帰による点数計算は、バーストしない範囲で高得点にする為
例) 手札が [2,A,A,K] の場合
2+11+11 > 21 なのでダメ → 3枚目を1と評価し直す
2+11+01+10 > 21 なのでダメ → 2枚目を1と評価し直す
2+01+11+10 > 21 なのでダメ → 3枚目を1と評価し直す
2+01+01+10 <= 21 なので点数確定

発展問題
ジョーカー2枚を入れたり複数デッキを使うルールもあるので、
山札を52枚限定としない実装を目指そう。
    • good
    • 0

> どうにも組めなかったので…。



具体的に何をどう考えられたどうのでしょう?
そして具体的にどういう処理がわからなかったのでしょう?

ちなみに・・・
(1) どういう操作仕様なのか具体的に考えられましたか?
(2) その操作仕様を実現するため、プログラムを起動してから1回のゲーム終了までプログラム内では具体的にどういう事をどういう順序で進めればよいかを日本語で順序だてて考え、それを日本語を使って箇条書きにまとめるといったことをされましたか?


> まず最初にトランプをシャッフルし

プログラム内部の処理として「カードをシャッフルする」という処理は不要でしょう。
単に「1から13の範囲の任意の整数を2つ発生させる」という処理があればよいだけと考えます。つまり範囲制限がある乱数の発生と。。。

参考まで。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています