麻烦高人帮我指点我的程序,小弟感激不尽
程序代码:
// 扑克牌发牌游戏 -- 第一次上机作业 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> // 纸牌结构 -- 数据部分 typedef struct card{ // 每张牌(Card)都用一个 strcut card 结构体类型来表示 char *face; // 指针 face 指向不同纸牌的点数 char *suit; // 指针 suit 指向不同纸牌的花色 } CARD; // CRAD deck[52] -- 存放52张扑克牌,除大小王 int Value[13]={0,1,2,3,4,5,6,7,8,9,10,11,12}; // 比较时用的牌值 /* 整个程序由三部分组成 1.扑克牌初始化 2.洗牌 3.发牌 4.玩家各自将手牌排序(按黑红紫坊从小到大的排序,2点最大) */ // 函数声明 void initDeck (CARD * , char *[] , char *[]); // 扑克牌的初始化 void shuffle (CARD *); // 洗牌 void deal (CARD * , CARD (*)[]); // 发牌 void sort (CARD (*)[]); // 排序 int *value (char *); // 从牌面到牌大小的映射,用于排序 sort 函数的辅助 // 主函数 int main(){ CARD deck[52], player[4][13]; // deck为桌牌 player 代表玩家(四个玩家,每个13张牌) char *face[] = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K","A", "2"}; char *suit[] = {"\006", "\003", "\005", "\004"}; srand(time(NULL)); // 初始化随机数种子 initDeck (deck, face, suit); // 填新牌 shuffle (deck); // 洗牌 deal (deck, player); // 发牌 sort (player); // 对玩家的手牌进行排序 return 0; } // 函数定义 void initDeck (CARD *wDeck, char *wface[], char *wsuit){ /* wDeck 结构体指针,指向待初始化桌牌 deck[52] wface 字符数组指针,指向点数 wsuit 字符数组指针,指向花色 该函数用于初始化桌牌 deck[52] */ int i; for (i = 0; i <= 51; i++){ wDeck[i].face = wface[i%13]; // 点数初始化 wDeck[i].suit = wsuit[i/13]; // 花色初始化 } } void shuffle (CARD *wDeck){ // 用产生的随机数 j 依次与前面的牌交换 int i, j; CARD temp; for (i = 0; i <= 51; i++){ // 洗牌 j = rand()%52; // 产生0到51之间的随机数 temp = wDeck[i]; // 交换纸牌 wDeck[i] = wDeck[j]; wDeck[j] = temp; } } void deal (CARD *wDeck , CARD (*wplayer)[13]) { int i, j; // i为玩家编号,j为手牌编号 for (i = 0;i < 4; i++){ for (j = 0;j < 13; j++){ // 洗牌第i个玩家的第j张牌是手牌中的第4*j+i张(轮流发牌) wplayer[i][j] = wDeck[i][4*j+i]; } } } void sort (CARD (*wplayer)[13]){ // 运用插入排序法分别对四个玩家的手牌排序 int i, j, p, q; // i为玩家编号,j为手牌编号,p, q 为工作指针 CARD temp; for (i = 0;i < 4; i++){ // 外层循环,对四个玩家遍历 for (j = 1;j < 13; j++){ // 内层循环,开始排序 // 先比较face 再比较suit temp = player[i][j]; // 待插入的牌 for (p = j-1; p >= 0; p--){ // 从后往前找出第一个小于temp的牌的序号 if (*value(*player[i][p].face) < *value(*temp.face)) // 找到比temp小的牌 break; else (*value(*player[i][p].face) == *value(*temp.face) // 若face 相同 则比较suit ? *value(*player[i][p].suit) < *value(*temp.suit) ? 1 : 0) break; } for (q = j-1; q > p; q--){ // 插入操作 player[i][q+1] = player[i][q]; } player[i][q+1] = temp; } } int *value (char *str){ // 将传递过来的字符映射为可比较大小的整数 // 返回值为字符在数组中的位置 int i = 0; // 第一个元素的位序 char *p; // 工作指针 // face 的映射 p = face; // p指向face 的第一个字符 while (i < 13 && strcmp(*str,*p++)) i++; if (i < 13) return Value+i; else p = suit; // p指向suit 的第一个字符 while (i < 4 && strcmp(*str,*p++)) i++; return Value+i; }