★ゲームを作ろう7(ポーカー:関数編2)★


前回の続きです。


4、9.手札をソートする

関数名 SortHand
戻り値 なし
引 数 手札
機 能 手札を番号の昇順でソートする
void SortHand(Card hand[HAND_NUM])
{
    int i;
    int j;

    Card work;

    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;
            }
        }
    }
}

ここでも、必要な変数は関数内で宣言します。

<sample program 144-01>

int main(void)
{
    Card deck[CARD_NUM];

    Card hand[HAND_NUM];

    srand((unsigned int)time(NULL));

     /* デッキの初期化 */
    InitializeDeck(deck);

    /* デッキのシャッフル */
    ShuffleDeck(deck);

    /* 手札を配る */
    DealCard(deck, hand);

    /* 手札をソートする */
    SortHand(hand);

    return 0;
}

5、7、10.手札を表示する

関数名 ShowHand
戻り値 なし
引 数 手札
機 能 手札を表示する
void ShowHand(const Card hand[HAND_NUM])
{
    int i;

    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");
        }
    }
}

この関数は手札を変更する際にも使いますので、選択フラグのことも考えて作ります。

当然、引数の中身に変更はありませんので「const」を付けます。

<sample program 144-02>

int main(void)
{
    Card deck[CARD_NUM];

    Card hand[HAND_NUM];

    srand((unsigned int)time(NULL));

     /* デッキの初期化 */
    InitializeDeck(deck);

    /* デッキのシャッフル */
    ShuffleDeck(deck);

    /* 手札を配る */
    DealCard(deck, hand);

    /* 手札をソートする */
    SortHand(hand);

    /* 手札を表示する */
    ShowHand(hand);

    return 0;
}

<実行結果>

ク ラ ブ: 2
スペード: 2
スペード: 6
ダ イ ヤ: 8
ハ ー ト:12
続行するには何かキーを押してください・・・

やっと結果が表示出来るようになりました。


6.変更するカードを選択する

関数名 SelectCard
戻り値 なし
引 数 手札
機 能 変更するカードを選択する
    0〜4の入力で選択(フラグを立てる)
    5の入力で関数から戻る
void SelectCard(Card hand[HAND_NUM])
{
    int select;
  
    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;
        }

        /* 手札を表示する */
        ShowHand(hand);
    }
}

この関数では、変更するカードを選択する度にカードを表示し直しますので、関数内でShowHand関数を呼び出します。

<sample program 144-03>

int main(void)
{
    Card deck[CARD_NUM];

    Card hand[HAND_NUM];

    srand((unsigned int)time(NULL));

     /* デッキの初期化 */
    InitializeDeck(deck);

    /* デッキのシャッフル */
    ShuffleDeck(deck);

    /* 手札を配る */
    DealCard(deck, hand);

    /* 手札をソートする */
    SortHand(hand);

    /* 手札を表示する */
    ShowHand(hand);

    /* 変更するカードを選択する */
    SelectCard(hand);

    return 0;
}

<実行結果>

ダ イ ヤ: 7
ハ ー ト: 8
ク ラ ブ: 8
ダ イ ヤ:11
スペード:12
0
ダ イ ヤ: 7 *
ハ ー ト: 8
ク ラ ブ: 8
ダ イ ヤ:11
スペード:12
3
ダ イ ヤ: 7 *
ハ ー ト: 8
ク ラ ブ: 8
ダ イ ヤ:11 *
スペード:12
5
続行するには何かキーを押してください・・・

続きは次回で。


次へ

戻る

目次へ