それでは残りの役の判定を考えましょう。
残りは、
<手役>
ストレート フラッシュ ストレートフラッシュ |
です。
フラッシュは同じスートをチェックするだけなので簡単そうに見えます。
が、ストレートと組み合わせてストレートフラッシュという役になることを考慮しなければなりません。
フラッシュとストレートは同時に成り立つので、少し工夫をします。
フラッシュ用にflushFlag、ストレート用にstraightFlagを用意します。
乱数の種をセットする直前に↓のプログラムを追加します。
<sample program 109-01>
int flushFlag; /* フラッシュ成立フラグ */ int straightFlag; /* ストレート成立フラグ */ |
ワンペアのチェックの後に、フラッシュをチェックするプログラムを書きます。
全部のスートが同じでなければフラッシュになりませんので、次のように書いてみます。
<sample program 109-02>
flushFlag = 1;
for (i = 0; i < HAND_NUM - 1; i++) {
if (hand[i].suit != hand[i + 1].suit) {
flushFlag = 0;
break;
}
}
|
フラッシュ成立フラグを1にしておきます。
繰り返しの中で、隣同士のスートを比べ、異なっていた場合はフラッシュ成立フラグを0にしてbreakします。
全部のスートが同じであればフラッシュ成立フラグは1のままです。
ただし、まだここでは「フラッシュ」の文字は表示しません。
ストレートフラッシュの可能性がありますので、次はストレートを判定します。
ストレートは数値が連続していれば成立しますが、どのようにプログラムでチェックすれば良いでしょうか?
色々な方法がありますので、その1つを書いてみます。
↓はストレートの手札です。
0 1 2 3 4 +−+−+−+−+−+ 手札|4|5|6|7|8| +−+−+−+−+−+
0番目と1番目を比較した場合、数値の差は1です。 1番目と2番目の差も1です。 2番目と3番目も、3番目と4番目の差も1です。
↓はストレートではありません。
0 1 2 3 4 +−+−+−+−+−+ 手札|4|6|7|9|10| +−+−+−+−+−+
0番目と1番目を比較した場合、数値の差は2です。 1番目と2番目の差は1です。 2番目と3番目の差は2です。 3番目と4番目の差は1です。
この場合、最初の差が「2」という時点でストレートでないことが分かります。
これを踏まえてプログラムを作ってみます。
<sample program 109-03>
straightFlag = 1;
for (i = 0; i < HAND_NUM - 1; i++) {
if (hand[i + 1].number - hand[i].number != 1) {
straightFlag = 0;
break;
}
}
|
これでフラッシュとストレートの判定が出来ました。
後はフラグを見て、役を表示するだけです。
※最後に「ノーペア」も追加します。
<sample program 109-04>
if (flushFlag == 1 && straightFlag == 1) {
printf("ストレートフラッシュ\n");
break;
}
if (flushFlag == 1) {
printf("フラッシュ\n");
break;
}
if (straightFlag == 1) {
printf("ストレート\n");
break;
}
printf("ノーペア\n");
|
デバッグコードにスートも追加して試しましょう。
/* デバッグ用コード */ hand[0].number = 1; hand[1].number = 2; hand[2].number = 3; hand[3].number = 4; hand[4].number = 5; hand[0].suit = 1; hand[1].suit = 1; hand[2].suit = 1; hand[3].suit = 1; hand[4].suit = 1; |
<実行結果>
スペード: 1 ハ ー ト: 1 ハ ー ト: 4 ハ ー ト: 9 ク ラ ブ:10 5 ハ ー ト: 1 ハ ー ト: 2 ハ ー ト: 3 ハ ー ト: 4 ハ ー ト: 5 ストレートフラッシュ 続行するには何かキーを押してください・・・
最後にプログラム全文を載せておきます。
※デバッグコードは消しました。
※手札の表示の前に「system("cls");」を追加し、画面をクリアするようにしました。
<sample program 109-05>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUMBER 13
#define MARK 4
#define CARD_NUM (NUMBER * MARK)
#define SHUFFLE_TIME 2000 /* 入れ替え回数 */
#define HAND_NUM 5 /* 手札の枚数 */
/* カード構造体 */
typedef struct
{
int number;
int suit;
int selectFlag;
} Card;
int main(void)
{
Card deck[CARD_NUM]; /* デッキ */
Card hand[HAND_NUM]; /* 手札 */
int i, j;
int index1, index2; /* シャッフル用添え字 */
Card work; /* 入れ替え用 */
int select; /* カード選択用 */
int dealCount; /* デッキ用 */
int flushFlag; /* フラッシュ成立フラグ */
int straightFlag; /* ストレート成立フラグ */
srand((unsigned int)time(NULL));
/* デッキの初期化 */
for (i = 0; i < CARD_NUM; i++) {
deck[i].suit = i / NUMBER;
deck[i].number = i % NUMBER + 1;
deck[i].selectFlag = 0;
}
/* デッキのシャッフル */
for (i = 0; i < SHUFFLE_TIME; i++) {
index1 = rand() % CARD_NUM;
index2 = rand() % CARD_NUM;
work = deck[index1];
deck[index1] = deck[index2];
deck[index2] = work;
}
/* 手札を配る */
for (i = 0; i < HAND_NUM; i++) {
hand[i] = deck[i];
}
/* 手札のソート */
for (i = 0; i < HAND_NUM - 1; i++) {
for (j = 0; j < HAND_NUM - 1; j++) {
if (hand[j].number > hand[j + 1].number) {
work = hand[j];
hand[j] = hand[j + 1];
hand[j + 1] = work;
}
}
}
/* 手札の表示 */
system("cls");
for (i = 0; i < HAND_NUM; i++) {
switch (hand[i].suit) {
case 0:
printf("スペード:");
break;
case 1:
printf("ハ ー ト:");
break;
case 2:
printf("ダ イ ヤ:");
break;
case 3:
printf("ク ラ ブ:");
break;
}
printf("%2d\n", hand[i].number);
}
for (;;) {
/* 入れ替えるカードの選択 */
do {
scanf("%d", &select);
} while (select < 0 || select > HAND_NUM);
if (select == HAND_NUM) {
break;
}
if (hand[select].selectFlag == 0) {
hand[select].selectFlag = 1;
}
else {
hand[select].selectFlag = 0;
}
/* 選択した手札の表示 */
for (i = 0; i < HAND_NUM; i++) {
switch (hand[i].suit) {
case 0:
printf("スペード:");
break;
case 1:
printf("ハ ー ト:");
break;
case 2:
printf("ダ イ ヤ:");
break;
case 3:
printf("ク ラ ブ:");
break;
}
printf("%2d", hand[i].number);
if (hand[i].selectFlag == 1) {
printf(" *\n");
}
else {
printf("\n");
}
}
}
/* 手札の交換 */
dealCount = HAND_NUM;
for (i = 0; i < HAND_NUM; i++) {
if (hand[i].selectFlag == 1) {
hand[i] = deck[dealCount];
dealCount++;
}
}
/* 手札のソート */
for (i = 0; i < HAND_NUM - 1; i++) {
for (j = 0; j < HAND_NUM - 1; j++) {
if (hand[j].number > hand[j + 1].number) {
work = hand[j];
hand[j] = hand[j + 1];
hand[j + 1] = work;
}
}
}
/* 手札の表示 */
system("cls");
for (i = 0; i < HAND_NUM; i++) {
switch (hand[i].suit) {
case 0:
printf("スペード:");
break;
case 1:
printf("ハ ー ト:");
break;
case 2:
printf("ダ イ ヤ:");
break;
case 3:
printf("ク ラ ブ:");
break;
}
printf("%2d\n", hand[i].number);
}
/* 手役の判定 */
for (;;) {
if (hand[0].number == hand[1].number &&
hand[1].number == hand[2].number &&
hand[2].number == hand[3].number) {
printf("フォーカード\n");
break;
}
if (hand[1].number == hand[2].number &&
hand[2].number == hand[3].number &&
hand[3].number == hand[4].number) {
printf("フォーカード\n");
break;
}
if (hand[0].number == hand[1].number &&
hand[1].number == hand[2].number) {
if (hand[3].number == hand[4].number) {
printf("フルハウス\n");
}
else{
printf("スリーカード\n");
}
break;
}
if (hand[1].number == hand[2].number &&
hand[2].number == hand[3].number) {
printf("スリーカード\n");
break;
}
if (hand[2].number == hand[3].number &&
hand[3].number == hand[4].number) {
if (hand[0].number == hand[1].number) {
printf("フルハウス\n");
}
else{
printf("スリーカード\n");
}
break;
}
if (hand[0].number == hand[1].number &&
hand[2].number == hand[3].number) {
printf("ツーペア\n");
break;
}
if (hand[0].number == hand[1].number &&
hand[3].number == hand[4].number) {
printf("ツーペア\n");
break;
}
if (hand[1].number == hand[2].number &&
hand[3].number == hand[4].number) {
printf("ツーペア\n");
break;
}
if (hand[0].number == hand[1].number ||
hand[1].number == hand[2].number ||
hand[2].number == hand[3].number ||
hand[3].number == hand[4].number) {
printf("ワンペア\n");
break;
}
flushFlag = 1;
for (i = 0; i < HAND_NUM - 1; i++) {
if (hand[i].suit != hand[i + 1].suit) {
flushFlag = 0;
break;
}
}
straightFlag = 1;
for (i = 0; i < HAND_NUM - 1; i++) {
if (hand[i + 1].number - hand[i].number != 1) {
straightFlag = 0;
break;
}
}
if (flushFlag == 1 && straightFlag == 1) {
printf("ストレートフラッシュ\n");
break;
}
if (flushFlag == 1) {
printf("フラッシュ\n");
break;
}
if (straightFlag == 1) {
printf("ストレート\n");
break;
}
printf("ノーペア\n");
break;
}
return 0;
}
|
長かったですが、やっと完成しました。
これでも1回しかプレイできないですし、ベット(掛け金)などもありません。
ここから遊べるゲームにするには、まだまだ改良が必要です。
ここから先は皆さんで機能の追加などを試してみてください。