| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1587 人关注过本帖
标题:请大家帮我分析下这个程序初学者很多看不懂
只看楼主 加入收藏
monolance
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-11-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
请大家帮我分析下这个程序初学者很多看不懂
这是一个自动发牌,然后展示牌的程序

#include  <time.h>
#include  <stdio.h>
#include  <conio.h>
#include  <stdlib.h>

#define  PLAYER 4//玩家人数
#define  NUM 13//玩家拿牌数
#define  SIZE 52//所有牌数

//声明函数
void PokerRand(int *pokerRand);
void Palyer(int *pokerRand);
void Process(int *countA, int *countB, int *countC, int *countD);
void Output(int *poker, int *countA, int *countB, int *countC, int *countD);

struct PokerGame
{
 
 int A[NUM];//记录玩家手中的黑桃牌
 int B[NUM];//记录玩家手中的红桃牌
 int C[NUM];//记录玩家手中的梅花牌
 int D[NUM];//记录玩家手中的方片牌
 int manNum[NUM];//记录玩家手里所有的牌

}man[PLAYER];

//随机产生52张牌
void PokerRand(int *pokerRand)
{
 int i, j;
 
 srand((unsigned)time(NULL));

 for (i=0; i<SIZE; i++)
 {
MARK:    pokerRand[i] = rand()%52;
   for (j=0; j<i; j++)
   {
    if (pokerRand[i] == pokerRand[j])
    {
     goto MARK;
    }
   }
 }
}

//给4个玩家发牌
void Palyer(int *pokerRand)
{
 int i, j;
 int count = 0;

 for (j=0; j<NUM; j++)
 {
  for (i=0; i<PLAYER; i++)//轮流发牌
  {
   man[i].manNum[j] = pokerRand[count++];
  }
 }
}

//统计玩家手中的牌
void Process(int *countA, int *countB, int *countC, int *countD)
{
 int i, j;

 for (i=0; i<PLAYER; i++)
 {
  countA[i] = 0;
  countB[i] = 0;
  countC[i] = 0;
  countD[i] = 0;
  for (j=0; j<NUM; j++)//统计四个玩家手中的牌
  {
   if ((man[i].manNum[j] >= 0) && (man[i].manNum[j] < 13))//黑桃
   {
    man[i].A[ countA[i]++ ] = man[i].manNum[j];
   }
   else if (man[i].manNum[j] < 26)//红桃
   {
    man[i].B[ countB[i]++ ] = man[i].manNum[j];
   }
   else if (man[i].manNum[j] < 39)//梅花
   {
    man[i].C[ countC[i]++ ] = man[i].manNum[j];
   }
   else//方片
   {
    man[i].D[ countD[i]++ ] = man[i].manNum[j];
   }
  }
 }
}

//输出
void Output(int *poker, int *countA, int *countB, int *countC, int *countD)
{
 int i, j;
 
 printf("扑克牌自动发牌 %c(黑) %c(红) %c(梅) %c(方):\n", 6, 3, 5, 4);
 
 for (i=0; i<PLAYER; i++)
 {
  printf("\n第%d人 :\n", i+1);//开始输出第i个玩家

  printf("%c:\t", 6);//输出第i个玩家的黑桃牌
  for (j=0; j<countA[i]; j++)
  {
   if (poker[ man[i].A[j] ] == 10)//假如等于10,以%d格式输出
   {
    printf("%4d", poker[ man[i].A[j] ]);
   }
   else//否则以%c格式输出
   {
    printf("%4c", poker[ man[i].A[j] ]);
   }
  }
  printf("\n");

  printf("%c:\t", 3);//输出第i个玩家的红桃牌
  for (j=0; j<countB[i]; j++)
  {
   if (poker[ man[i].B[j] ] == 10)
   {
    printf("%4d", poker[ man[i].B[j] ]);
   }
   else
   {
    printf("%4c", poker[ man[i].B[j] ]);
   }
  }
  printf("\n");

  printf("%c:\t", 5);//输出第i个玩家的梅花牌
  for (j=0; j<countC[i]; j++)
  {
   if (poker[ man[i].C[j] ] == 10)
   {
    printf("%4d", poker[ man[i].C[j] ]);
   }
   else
   {
    printf("%4c", poker[ man[i].C[j] ]);
   }
  }
  printf("\n");

  printf("%c:\t", 4);//输出第i个玩家的方片牌
  for (j=0; j<countD[i]; j++)
  {
   if (poker[ man[i].D[j] ] == 10)
   {
    printf("%4d", poker[ man[i].D[j] ]);
   }
   else
   {
    printf("%4c", poker[ man[i].D[j] ]);
   }
  }
  printf("\n");
 }
}

void main(void)
{
 int countA[PLAYER] = { 0 };//记录4个玩家持黑桃牌数
 int countB[PLAYER] = { 0 };//记录4个玩家持红桃牌数
 int countC[PLAYER] = { 0 };//记录4个玩家持梅花牌数
 int countD[PLAYER] = { 0 };//记录4个玩家持方片牌数
 int pokerRand[SIZE] = { 0 };//存放随机产生52张牌

 int poker[SIZE] = {65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
                 65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
               65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
           65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,};

 PokerRand(pokerRand);//洗牌

    Palyer(pokerRand);//发牌
 
    Process(countA, countB, countC, countD);//整牌
 
 Output(poker, countA, countB, countC, countD);//亮牌
 
 printf("\n\n\n");
 
 system("pause");
}
搜索更多相关主题的帖子: include 记录 
2016-12-18 15:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
感觉那个代码写得有点繁琐,我都忍不住把其改得简洁一点了,还附上相应的注释,看看这样如何~

程序代码:
#include  <time.h>
#include  <stdio.h>
#include  <conio.h>
#include  <stdlib.h>

#define  PLAYER 4//玩家人数
#define  NUM 13//玩家拿牌数
#define  SIZE 52//所有牌数
#define  CHANGE 100  //新增洗牌次数

//声明函数

void PokerRand(int *pokerRand);
void Palyer(int *pokerRand);
void Process(int *countA, int *countB, int *countC, int *countD);
void Output(int *poker, int *countA, int *countB, int *countC, int *countD);

struct PokerGame
{

 

 int A[NUM];//记录玩家手中的黑桃牌
 int B[NUM];//记录玩家手中的红桃牌
 int C[NUM];//记录玩家手中的梅花牌
 int D[NUM];//记录玩家手中的方片牌
 int manNum[NUM];//记录玩家手里所有的牌

}man[PLAYER];

//随机产生52张牌
void PokerRand(int pokerRand[])//这里改写成数组的形式好理解一点~
{
     int i,temp,temp1,temp2;

 
     srand((unsigned)time(NULL));//获取随机种子

     for (i=0;i<SIZE;i++)
         pokerRand[i]=i;     //先对每张牌编号依次赋值

         for (i=0;i<CHANGE;i++)
         {
             temp1=rand()%52;                //洗牌洗牌,当然是先有牌然后再洗牌咯
             temp2=rand()%52;                //随机获取两张交换牌的下标~

             temp=pokerRand[temp1];  
             pokerRand[temp1]=pokerRand[temp2];
             pokerRand[temp2]=temp;
         }
}

//给4个玩家发牌
void Palyer(int pokerRand[])//这里改写成数组的形式好理解一点~
{


 int i, j;

 int count = 0;    //count是当前发牌数


 for (j=0; j<NUM; j++)   //NUM  玩家拿牌数---13
      for (i=0; i<PLAYER; i++)    //轮流发牌  //PLAYER玩家人数--4
           man[i].manNum[j] = pokerRand[count++];
}

//统计玩家手中的牌
void Process(int *countA, int *countB, int *countC, int *countD)
{

    void Process2(int *count_Player,int *count_number, int count_colour,int num);

    //新增洗牌函数2//count_Player 每个玩家与其牌色//count_number--牌色序列//count_colour-牌色的作用范围//num--当前玩家序号

    int i;

    for (i=0;i<PLAYER;i++)
    {
        Process2(man[i].A,countA,13,i);//这个是新增洗牌函数2
        Process2(man[i].B,countB,26,i);
        Process2(man[i].C,countC,39,i);
        Process2(man[i].D,countD,52,i);
    }
   
}
void Process2(int *count_Player,int *count_number,int count_colour,int num)//新增洗牌函数2
{
    int i;

    for (i=0;i<NUM;i++)   //分配每个玩家手中的牌
         if ((man[num].manNum[i] >= count_colour-13) && (man[num].manNum[i] <count_colour))
             count_Player[count_number[num]++]=man[num].manNum[i];
}
//输出
void Output(int *poker, int *countA, int *countB, int *countC, int *countD)
{
     void Output2(int *poker,int K[],int count_colour,int countplayer);

     //新增的发牌函数//count_colour发牌颜色//*countPlayer玩家参数// k[]第几个人

     int i;

     printf("扑克牌自动发牌 %c(黑) %c(红) %c(梅) %c(方):\n", 6, 3, 5, 4);

     for (i=0;i<PLAYER;i++)
     {
         printf("\n第%d人 :\n", i+1);//开始输出第i个玩家

         Output2(poker,man[i].A,6,countA[i]);  //Output2函数为新增的~6-3-5-4分别代表四种不同的颜色
         Output2(poker,man[i].B,3,countB[i]);
         Output2(poker,man[i].C,5,countC[i]);
         Output2(poker,man[i].D,4,countD[i]);
     }
}
void Output2(int *poker,int K[],int count_colour,int countplayer)
{
    int i;
    char ch=count_colour;

    printf("%c:\t", ch);                         //输出玩家的牌

    for (i=0; i<countplayer; i++)
         if (poker[ K[i] ] == 10)                //假如等于10,以%d格式输出
              printf("%4d", poker[ K[i] ]);
          else                                  //否则以%c格式输出
               printf("%4c", poker[ K[i] ]);

     printf("\n");

}
void main(void)
{
    int countA[PLAYER] = { 0 };//记录4个玩家持黑桃牌数
    int countB[PLAYER] = { 0 };//记录4个玩家持红桃牌数
    int countC[PLAYER] = { 0 };//记录4个玩家持梅花牌数
    int countD[PLAYER] = { 0 };//记录4个玩家持方片牌数
    int pokerRand[SIZE] = { 0 };//存放随机产生52张牌

    int poker[SIZE] = {65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,//65的ASCII表为'A'--10-处理不用变74-'J'-81-'Q'-75-'K'
                       65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
                       65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
                       65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75};

    PokerRand(pokerRand);//洗牌

    Palyer(pokerRand);//发牌
 
    Process(countA, countB, countC, countD);//整牌
 
    Output(poker, countA, countB, countC, countD);//亮牌
 

 printf("\n\n\n");

 

 system("pause");
}


[此贴子已经被作者于2016-12-19 06:10编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-19 06:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 九转星河
诶,改动的目的主要是训练函数调参,当参数种类多而复杂的时候很容易出错,顺便锻炼自己的解读程序能力~函数凋参搭配不熟练改了我一个通宵

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-19 06:04
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:5 
回复 2楼 九转星河
版主起好早

Code is my life.
2016-12-19 06:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 bjut_Allen
你也很早啊~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-19 08:07
xiajingran
Rank: 2
等 级:论坛游民
帖 子:32
专家分:28
注 册:2016-12-14
收藏
得分:5 
我是来找答案的

小程序大智慧
2016-12-19 11:29
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 xiajingran
答案,是指程序设计套题么~那个……我也是从老师网上download下来的,老师又说他是从别人那里找的,有时间我去看看有没有更新

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-19 12:27
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 xiajingran
图片附件: 游客没有浏览图片的权限,请 登录注册


还是没有更新答案欸~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-19 13:28
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:5 
为什么这两个源程序都编译错误呢。。。用的dev c,什么情况
2016-12-19 14:49
快速回复:请大家帮我分析下这个程序初学者很多看不懂
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028024 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved