十点半游戏是一种简单的纸牌游戏,通常使用A到10的扑克牌(除去大小王),游戏目标是通过抽取若干张牌,使得手牌的总点数尽可能接近但不超过10.5,超过10.5则爆牌,小于等于10.5则以接近10.5为优。
1、初始化:定义一副牌,并随机洗牌。
2、玩家操作:模拟玩家抽牌过程,计算总点数。
3、判断胜负:根据总点数判断是否爆牌或获胜。
4、显示结果:输出玩家的手牌和最终得分。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define DECK_SIZE 10 // 函数声明 void shuffleDeck(int deck[], int size); int drawCard(int deck[], int *size); int calculateScore(int cards[], int numCards); void displayHand(int cards[], int numCards); int main() { int deck[DECK_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // A=1, ..., 10=10 int playerHand[DECK_SIZE]; int numCards = 0; char choice; srand(time(NULL)); // 初始化随机数生成器 shuffleDeck(deck, DECK_SIZE); do { if (numCards < DECK_SIZE) { playerHand[numCards++] = drawCard(deck, &DECK_SIZE); } else { printf("Deck is empty! No more cards to draw. "); break; } printf("Your hand: "); displayHand(playerHand, numCards); printf("Current score: %d ", calculateScore(playerHand, numCards)); printf("Do you want to draw another card? (y/n): "); scanf(" %c", &choice); } while (choice == 'y' || choice == 'Y'); printf("Final score: %d ", calculateScore(playerHand, numCards)); if (calculateScore(playerHand, numCards) > 10) { printf("Busted! You lose. "); } else { printf("Good job! You win. "); } return 0; } void shuffleDeck(int deck[], int size) { for (int i = size 1; i > 0; i--) { int j = rand() % (i + 1); int temp = deck[i]; deck[i] = deck[j]; deck[j] = temp; } } int drawCard(int deck[], int *size) { return deck[--(*size)]; } int calculateScore(int cards[], int numCards) { int score = 0; for (int i = 0; i < numCards; i++) { score += cards[i]; } return score; } void displayHand(int cards[], int numCards) { for (int i = 0; i < numCards; i++) { printf("%d ", cards[i]); } printf(" "); }
1、初始化与洗牌:shuffleDeck
函数使用Fisher-Yates算法对牌组进行随机洗牌。
2、抽牌:drawCard
函数从牌组中抽取一张牌,并更新牌组大小。
3、计分:calculateScore
函数计算当前手牌的总点数。
4、显示手牌:displayHand
函数打印当前玩家的手牌。
5、主循环:程序询问玩家是否继续抽牌,并根据选择重复上述步骤,直到玩家决定停止或牌组为空。
6、胜负判断:根据最终得分判断玩家是赢是输。
Q1: 如果牌组用完了怎么办?
A1: 如果牌组中的牌被抽完,程序会提示“Deck is empty! No more cards to draw.”并退出抽牌循环,此时玩家可以根据当前手牌决定是否继续游戏或结束。
Q2: 如何确保每次游戏洗牌都是随机的?
A2: 使用srand(time(NULL))
在程序开始时设置随机数种子,这样每次运行程序时都会根据当前时间生成不同的随机序列,从而确保洗牌的随机性。
十点半游戏虽然简单,但通过编程实现可以加深对数组、循环、条件判断等基础编程概念的理解,还可以在此基础上增加更多功能,如支持多玩家、图形界面等,进一步提升游戏的趣味性和挑战性,希望这篇详细的代码解析能帮助你更好地理解和掌握C语言编程!