首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言猜拳遊戲專案:結構體封裝、動態記憶體與排行榜系統

     編輯:關於C

專案架構

  • `player_t` 結構體:姓名、密碼、總場次、勝場數。
  • 動態配置玩家物件:`malloc`/`free` 生命週期管理。
  • 選單驅動主迴圈:開始遊戲、顯示排行榜、退出。
  • 簡易 AI:`rand()%3+1` 隨機出拳。

核心資料結構

#define SIZE 20
#define PASSWD_SIZE 20

typedef struct player {
    char name[SIZE];
    char passwd[PASSWD_SIZE];
    int total;
    int victory;
} player_t;

player_t *player = NULL;

player_t *create_player() {
    player = malloc(sizeof(player_t));
    if (!player) return NULL;
    memset(player, 0, sizeof(player_t));
    strcpy(player->name, "player1");
    strcpy(player->passwd, "123456");
    player->total = player->victory = 0;
    return player;
}

void destroy_player() {
    if (player) { free(player); player = NULL; }
}

遊戲邏輯

int computer_choice() {
    return rand() % 3 + 1; // 1:石頭 2:剪刀 3:布
}

void game_loop() {
    int player_choice;
    while (1) {
        print_menu();
        do { scanf("%d", &player_choice); }
        while (player_choice < 0 || player_choice > 3);
        if (player_choice == 0) return;

        int comp = computer_choice();
        player->total++;
        int diff = player_choice - comp;

        // 勝負判斷:石頭(1)贏剪刀(2),剪刀(2)贏布(3),布(3)贏石頭(1)
        // diff: -1(贏), 2(贏), 0(平), 1(輸), -2(輸)
        if (diff == -1 || diff == 2) {
            puts("You win!"); player->victory++;
        } else if (diff == 0) {
            puts("Draw!");
        } else {
            puts("You lose!");
        }
    }
}

排行榜顯示

void show_ranking() {
    printf("\t\tRanking\n");
    printf("\t*********************\n");
    printf("Name\tTotal\tWin\tWin%%\n");
    printf("%s\t%d\t%d\t%.2f%%\n",
           player->name, player->total, player->victory,
           player->total ? (double)player->victory/player->total*100 : 0);
}

主程式

int main() {
    if (!create_player()) return 1;
    game_loop();
    show_ranking();
    destroy_player();
    return 0;
}

代碼品質問題與改進

問題改進
全域變數 `player`封裝於 `GameContext` 結構體,傳遞指標
無密碼驗證登入流程加入 `login()` 函式,驗證後進入遊戲
`srand` 未呼叫`main` 開頭 `srand(time(NULL))`
單一玩家、無持久化連結串列/檔案/資料庫支援多玩家與存檔
勝負判斷魔術數字定義 `enum {ROCK=1, SCISSORS=2, PAPER=3}`

總結

此專案展示 C 語言**結構體封裝資料、動態記憶體管理、模組化函式、選單狀態機**等工程實務技能。雖為未優化版,但架構清晰,極易擴展為完整的多玩家、持久化、網路化遊戲系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved