本程序实现了一般扑克牌游戏的洗牌、发牌和理牌过程,程序模拟了对四个玩家的发牌,且能让各自玩家按大小顺序整理自己的手牌。牌的大小顺序按斗地主的规则(但无大小王)。
本程序定义了一个牌的结构体,其成员变量是两个字符指针。一个指向点数的字符数组,另一个指向花色的字符数组。考虑到牌的整理需要比较两张牌的大 小,而字符不太好比较,从而构造了一个辅助函数Value来实现将字符转换为整数。程序得最后还对桌牌和手牌进行了检测,看是否有重复的牌。
算法说明:
发牌算法
Void Deal(CARD *Deck,CARD (*player)[13]){
for (i = 0;i < 4; i++){
// 遍历四个玩家
for (j = 0;j < 13; j++){
// 洗牌第i个玩家的第j张牌是手牌中的第4*j+i张(轮流发牌)
player[i][j] = Deck[4*j+i];
}
}
}
排序算法
void InsertSort ( CARD *R) { // 对某一玩家R作直接插入排序,有13张牌
for ( i=1; i<n; ++i ) {
temp = R[i]; // 复制为监视哨
for ( j=i-1; j>=0; --j )
if(Value(R[j].face)<Value(temp.face))break;// 如果R[j]的牌比temp的小则调出循环,找到比temp小的 牌 else if (Value(R[j].face) == Value(temp.face) // 若face 相同 则比 较suit
? Value(R[j].suit) < Value(temp.suit) ? 1 : 0 : 0) break;
for (k = j-1; k > j;k--)
R[j+1] = R[j]; // 记录后移
R[k+1] = temp; // 插入到正确位置
}
} // InsertSort
测试算法
测试桌牌和手牌是否有重复的牌。其思想是从第一张开始与后面的牌一次比较,直到找到一张与待比较的牌相同的或者倒数第二张与最后一张牌比较后终止。
算法描述:
For(I = 0; I < 13; I++ ){
Temp = R[I]; // 将待检测的牌放入temp中
If( Locat(Temp,R)){
Print :ERROR!
break; // 如果Temp在R[I+1…13]中则返回1
}
// 若没有重复的牌不提示任何信息
变量说明:
一. 张牌(Card)都用一个 strcut card 结构体类型来表示具体定义如下 struct card{
char *face; // 指针 face 指向不同纸牌的点数
char *suit; // 指针 suit 指向不同纸牌的花色
} CARD;
再定义两个字符数组分别存储牌的点数和花色:
char *face[] = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K","A", "2"};
char *suit[] = {"/004", "/005", "/003", "/006"};
定义两个CARD型数组 deck[52],player[4][13],deck用与存储桌牌,player用于存储玩家手牌。