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