prg-lang-2 / final / BlackJack / game.h
game.h
Raw
#ifndef GAME_H
#define GAME_H

#include "card.h"
#include "player.h"

/**
 * @brief ゲーム構造体
 *
 * デッキ、ディーラー、プレイヤー、ゲームの進行状況など
 * ゲームに関連する全ての情報を保持する中心的な構造体。
 */
typedef struct
{
    Card deck[52];   /**< トランプのデッキ */
    int deckIndex;   /**< 現在のデッキの位置 */
    Player dealer;   /**< ディーラーの情報 */
    Player *players; /**< プレイヤー(人間とボット)の配列 */
    int playerCount; /**< 全プレイヤー数 */
} Game;

/**
 * @brief プレイヤーの初期化
 *
 * 人間プレイヤーとボットプレイヤーを初期チップ数で設定する。
 *
 * @param game ゲーム状態
 * @param initChips 初期チップ数
 * @param playerCount 人間プレイヤー数
 * @param botCount ボットプレイヤー数
 */
void initPlayers(Game *game, const int initChips, const int playerCount, const int botCount);

/**
 * @brief 新しいゲームラウンドの初期化
 *
 * デッキをリセットしてシャッフルし、全ての手札とベットをクリアする。
 *
 * @param game ゲーム状態
 */
void initGame(Game *game);

/**
 * @brief カードを引く
 *
 * デッキから次のカードを取り出し、デッキの位置を進める。
 *
 * @param game ゲーム状態
 * @return Card 引いたカード
 */
Card drawCard(Game *game);

/**
 * @brief タイトル画面の表示
 *
 * "BlackJack"のタイトルを表示する。
 */
void displayTitle();

/**
 * @brief ゲーム画面の表示
 *
 * ディーラーのカード、プレイヤーのカード、賭け金など
 * 現在のゲーム状態を表示する。
 *
 * @param game ゲーム状態
 * @param init 真の場合、ディーラーのホールカードを隠す
 */
void displayBoard(const Game *game, const int init);

/**
 * @brief ゲーム結果の表示
 *
 * 勝敗を含むゲームの最終状態を表示する。
 *
 * @param game ゲーム状態
 */
void displayStatus(const Game *game);

/**
 * @brief プレイヤーの行動を表示
 *
 * プレイヤーの現在の行動(ヒット/スタンド等)を表示する。
 *
 * @param game ゲーム状態
 * @param playerIndex 現在のプレイヤーの番号
 * @param action 行動(H:ヒット/S:スタンド/D:ダブル/R:サレンダー/P:スプリット)
 * @param split スプリットハンドの行動かどうか
 */
void displayAction(const Game *game, const int playerIndex, char action, int split);

/**
 * @brief ベット結果の処理
 *
 * プレイヤーのメインハンドの勝敗を計算し、チップを精算する。
 *
 * @param game ゲーム状態
 * @param player 対象プレイヤー
 * @param bjRate ブラックジャック時の配当倍率(通常1.5)
 */
void processBet(Game *game, Player *player, const double bjRate);

/**
 * @brief スプリットハンドのベット結果処理
 *
 * プレイヤーのスプリットハンドの勝敗を計算し、チップを精算する。
 *
 * @param game ゲーム状態
 * @param player 対象プレイヤー
 * @param bjRate ブラックジャック時の配当倍率(通常1.5)
 */
void processSplitBet(Game *game, Player *player, const double bjRate);

/**
 * @brief プレイヤーの行動を処理
 *
 * プレイヤーの行動(ヒット/スタンド/ダブル/スプリット/サレンダー)を実行する。
 *
 * @param game ゲーム状態
 * @param playerIndex プレイヤーの番号
 * @param split スプリットハンドの行動かどうか
 * @param action 実行する行動(H/S/D/R/P)
 * @return int ターン終了なら1、続行可能なら0
 */
int processAction(Game *game, const int playerIndex, const int split, const char action);

#endif