a simple POKER game with raylib
為什麼會有這個東東呢?
因為想要知道ai的研究是否好用,順著就寫了一個來測試機率。
#include "game.h" // 引入 game.h 頭文件,其中定義了 Game 結構體和相關常數
#include "card.h" // 引入 card.h 頭文件,其中定義了卡牌相關的結構體和函式
#include "gameproc.h" // 引入 gameproc.h 頭文件,其中定義了遊戲狀態處理的函式 (例如:DemoProc, BetProc)
#include "gui.h" // 引入 gui.h 頭文件,其中定義了 GUI 相關的函式
#include "player.h" // 引入 player.h 頭文件,其中定義了玩家相關的結構體和函式
#include "raylib.h" // 引入 raylib.h 頭文件,Raylib 繪圖函式庫
#include "timer.h" // 引入 timer.h 頭文件,其中定義了計時器相關的函式
// 初始化遊戲
void GameInit(Game* game)
{
SetWindowState(FLAG_VSYNC_HINT + FLAG_MSAA_4X_HINT);
SetTraceLogLevel(LOG_ERROR); // 設定 Raylib 的日誌等級為僅顯示錯誤訊息,以減少不必要的輸出
InitWindow(SCR_W, SCR_H, "Poker"); // 初始化 Raylib 視窗,設定寬度、高度和標題
// SetTargetFPS(FPS); // 設定遊戲的目標幀率
GuiInit(); // 初始化遊戲的 GUI 系統
CardSetInit(&game->cardSet); // 初始化遊戲的牌組
CardShuffle(&game->cardSet); // 洗牌
PlayerInit(&game->player, START_CREDIT); // 初始化玩家,設定初始信用額度
game->stepCount = 0; // 初始化遊戲步驟計數器為 0
game->gameMessage = ""; // 初始化遊戲訊息為空字串
game->messageTime = 0; // 初始化遊戲訊息顯示計時器為 0
game->winCountTime = 0; // 初始化贏錢動畫計時器為 0
game->mainStatus = GAME_DEMO; // 初始化遊戲的主要狀態為 DEMO 狀態 (演示狀態)
}
// 結束遊戲時的清理
void GameFini()
{
GuiFini(); // 清理遊戲的 GUI 系統
CloseWindow(); // 關閉 Raylib 視窗
}
// 更新遊戲狀態 (每幀調用)
void GameUpdate(Game* game)
{
UpdateTimer(GetFrameTime()); // 更新遊戲計時器,傳入自上一幀以來經過的時間
// 根據遊戲的主要狀態執行不同的處理邏輯
switch (game->mainStatus) {
case GAME_DEMO: // 遊戲演示狀態
DemoProc(game); // 調用 DemoProc 函式處理演示狀態的邏輯
break;
case GAME_START: // 遊戲開始狀態
StartProc(game); // 調用 StartProc 函式處理開始狀態的邏輯
break;
case GAME_BET: // 遊戲下注狀態
BetProc(game); // 調用 BetProc 函式處理下注狀態的邏輯
break;
case GAME_PLAY: // 遊戲進行狀態
PlayProc(game); // 調用 PlayProc 函式處理遊戲進行中的邏輯 (例如:發牌、換牌)
break;
case GAME_CHECK: // 遊戲檢查輸贏狀態
CheckProc(game); // 調用 CheckProc 函式處理檢查輸贏的邏輯
break;
case GAME_WIN: // 遊戲勝利狀態
WinProc(game); // 調用 WinProc 函式處理勝利狀態的邏輯 (例如:顯示贏錢動畫)
break;
case GAME_LOSE: // 遊戲失敗狀態
LoseProc(game); // 調用 LoseProc 函式處理失敗狀態的邏輯 (例如:顯示失敗訊息)
break;
case GAME_ACCOUNT: // 遊戲結算狀態
AccountProc(game); // 調用 AccountProc 函式處理結算狀態的邏輯
break;
}
}
// 繪製遊戲畫面 (每幀調用)
void GameDraw(Game* game)
{
GuiDrawBackground();
GuiDrawBet(game->player.bet);
GuiDrawCredit(game->player.credit);
GuiDrawOdds();
GUIDrawHeld(game);
GuiDrawMessage(game->gameMessage);
GuiDrawPlayerHandCard(game);
}
// 遊戲主循環
void GameLoop(Game* game)
{
// 當視窗沒有被要求關閉時持續循環
while (!WindowShouldClose()) {
GameUpdate(game); // 更新遊戲狀態
BeginDrawing(); // 開始繪製當前幀
ClearBackground(BLACK); // 清除背景為黑色
GameDraw(game); // 繪製遊戲畫面
EndDrawing(); // 結束當前幀的繪製
}
}