- 締切済み
このソースがわかりません
#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はなぜですか?教えてください、おねがいします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
うう~ん, total を char にする必然性はないなぁ. int でいいというか, int にする方が自然だと思う. ちなみに A は 1 と 11 の「有利な方」で計算するのが普通です. つまり, 一応 11 で計算しておいてバストするなら 1 として計算し直す. もしくは逆に「A は 1 で計算しておいて, 11以下になるときは 1枚を 11 で計算する」という手もあります. こっちの方が「A が 10枚ある」ような謎のハンドにも自然に対応できるのでいいかもしれません.
- kmee
- ベストアンサー率55% (1857/3366)
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をどう使うと効果的かは、自動で計算してくれてましたし。
- LongSecret
- ベストアンサー率68% (22/32)
>この「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しているからです。