ここから質問投稿すると、最大4000ポイント当たる!!!! >>

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

int card[4][13];
char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };
char *digit[13] = { "A", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "J", "Q", "K" };
char *mark[4] = {
"ハート",
"ダイヤ",
"スペード",
"クローバー"
};

int drawCard(int h);

int main() {
int dealer; //ディーラーの引いたカードの合計
int player; //プレイヤーの引いたカードの合計
int draw_digit; //引いたカードの数
int draw_mark; //引いたカードのマーク
char y_n; //カードを引くか引かないかの答え

srand(time(NULL));
printf("【ブラックジャック】\n");

//ディーラーが引く
draw_mark = rand() % 4 + 1;
draw_digit = rand() % 13 + 1;
card[draw_mark-1][draw_digit-1] = 1;
dealer = total[draw_digit-1];
printf("ディーラー一枚目:%sの%s\n",
mark[draw_mark-1], digit[draw_digit-1]);
printf("他は伏せる\n\n");

//プレイヤーが引く
printf("プレイヤー一枚目:");
player = drawCard(1);
printf("プレイヤー二枚目:");
player += drawCard(1);

//ディーラー2枚目以降
do{
dealer += drawCard(0);
} while(dealer <= 16);

//プレイヤー3枚目以降
while(player < 21) {
printf("もう1枚引きますか?(y/n) > ");
scanf("%c" , &y_n);
while (getchar() != '\n') { }
if(y_n == 'y') {
player += drawCard(1);
} else if (y_n == 'n') { break; }
}

printf("\nディーラー:%d点 プレイヤー:%d点\n", dealer, player);

//勝敗の判定
if ((dealer <= 21 && player > 21) || (dealer <= 21 && dealer > player)) {
printf("ディーラーの勝ち!\n");
} else if ((player <= 21 && dealer > 21)
|| (player <= 21 && player > dealer)) {
printf("プレイヤーの勝ち!\n");
} else {
printf("引き分け\n");
}
return 0;
}

/*カードを引く関数
引数 h:カード内容表示フラグ
プレイヤーターンの時は1、ディーラーターンの時は0
戻り値 r:引いたカードの点数
*/
int drawCard(int h) {
int draw_mark, draw_digit; //引いたカードのマークと数
int r; //引いたカードの点数
char y_n; //カードを11として計算するかどうかの答え

do {
draw_mark = rand() % 4 + 1;
draw_digit = rand() % 13 + 1;
} while (card[draw_mark-1][draw_digit-1]);
card[draw_mark-1][draw_digit-1] = 1;
if(h) {
printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]);
}

if(h && draw_digit == 1) { //プレイヤーターンで引いた数が1のとき
do {
printf("11として計算しますか?(y/n) > ");
scanf("%c" , &y_n);
while (getchar() != '\n') { }
if(y_n == 'y') { r = total[draw_digit-1]; }
else if (y_n == 'n') { r = 1; }
} while(!(y_n == 'y' || y_n == 'n'));
} else { r = total[draw_digit-1]; }
return r;
}
この「char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };」の部分がなぜchar型なのかとなぜ、必要なのかです
後もう一つ} while (card[draw_mark-1][draw_digit-1]);のー1はなぜですか?教えてください、おねがいします

このQ&Aに関連する最新のQ&A

A 回答 (3件)

うう~ん, total を char にする必然性はないなぁ. int でいいというか, int にする方が自然だと思う.


ちなみに A は 1 と 11 の「有利な方」で計算するのが普通です. つまり, 一応 11 で計算しておいてバストするなら 1 として計算し直す. もしくは逆に「A は 1 で計算しておいて, 11以下になるときは 1枚を 11 で計算する」という手もあります. こっちの方が「A が 10枚ある」ような謎のハンドにも自然に対応できるのでいいかもしれません.
    • good
    • 0

char型は「1文字を表せるビット幅の整数」です。


「文字」や「バイナリーデータの1バイト」として使用することが多いですが、ただの整数として使っても問題ありません。

ただ、
・ r = total[draw_digit-1]; 等と、実際の計算ではint型を使っている
・最近のPCでは、メモリが十分あるので、数十バイト程度節約しても意味がない。
・CPUが32bitだと、1バイトアクセスと比べて、32bitまとめてアクセスする方が効率がよい(少なくとも悪くなることはない)
・charだと「文字」を連想させる
等から、intの方が適切かもしれません。

更に言えば、total[]を使わなくても、draw_digitから計算できますね。
if(y_n == 'y') { r = draw_digit + 10; }
else if (y_n == 'n') { r = draw_digit; }
} while(!(y_n == 'y' || y_n == 'n'));
} else {
if (draw_digit > 10 ) { r = 10 ;}else{r= draw_digit ; }
}


ところで。Aの1か11って、引いた時に決めるんでしたっけ?
最後にオープンした時に決めればいいような覚えがあるのですが。
過去にやったことのあるコンピュータゲームでは、Aをどう使うと効果的かは、自動で計算してくれてましたし。
    • good
    • 0

>この「char total[13] = { 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };」の部分がなぜchar型なのかとなぜ、必要なのか



ブラックジャックはあまりやったことがないのですが
これはカードごとの点数でしょう。
http://www.bj-10jqka.com/rules/procedure.html

つまりchar型じゃなくてもできるはずです。どうせ1バイトで収まる点しかないのだから、char型でいいってことでしょう。


>while (card[draw_mark-1][draw_digit-1]);のー1はなぜですか?


事前に+1しているからです


draw_mark = rand() % 4 + 1;
draw_digit = rand() % 13 + 1;

draw_mark = rand() % 4;
ならば、%4は4で割った時のあまりをしめす(つまり0~3の数字)ので
マークの文字列配列の添え字になりますし

draw_digit = rand() % 13;
ならば、0~12の数字になり数字の文字列配列の添え字になります

おそらく、この数字をカードの数字に一致させるために


draw_digit = rand() % 13 + 1;

としているのですが、見る限りこの必要はないと思います。

どの道+1したかわりに、配列にアクセスするときに-1しているからです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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


人気Q&Aランキング