当前位置:编程学习 > C/C++ >>

模拟人工发牌程序 C语言

模拟人工发牌
说明:用计算机模拟发牌程序。假设一副扑克牌有52张,共4个玩家,编写程序统计出各玩家手里拿的牌的牌面(牌面包括纸牌的大小和花色)。
题目难度:一般
设计要求:要求使用C语言编程,定义合适的数据结构。最后,需要说明设计思想,同时给出能够运行的源程序,并给出对应的程序流程图。
设计提示:
定义一个4行13列的整数类型的二维数组,每一行分别表示一种花色:黑桃、红桃、草花、方块。每一列分别表示A到K 共十三个牌点。数组各元素的初始值为0,表示还没有发牌。然后给每个数组元素赋予1到4之间的随机数,表示这张牌随机地发给某个玩家。例如第一行第七列的元素,表示黑桃7,其值为2,表示这张牌发给了第2个玩家。依此类推。


能帮我用C写一下这个程序吗
注释尽量详细一点
能顺便写一下思路就更谢谢了
补充:能说说设计的思路吗
追问:运行出来就一个DOS框,什么也没有,用WINTC运行的
答案:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>


// 初始化牌组,初始状态是每个玩家一种颜色的牌
void init(int a[][13])
{
int i, j;
for(i = 0; i < 4; ++i)
for(j = 0; j < 13; ++j)
a[i][j] = i+1; // 同一行为相同花色的13张牌
}

// 用于洗牌的交换函数
void swap(int* a, int* b)
{
int t;
t = *a; *a = *b; *b = t;
}

// 随机打乱,原理是随机交换52张牌所属的玩家
// 参数为牌组的首地址和超尾地址(最后一个元素的后一个位置)
void shuffle(int* begin, int* end)
{
int* temp;
for(temp = begin; temp != end; ++temp)
swap(temp, begin + rand() % (end-begin));
}

// 输出各个玩家的牌
void show(int a[][13])
{
int i, j, k;
for(k = 0; k < 4; ++k) { // 4个玩家
printf("person%d: ", k+1);
for(i = 0; i < 4; ++i) // 4种花色
for(j = 0; j < 13; ++j) // 13张牌
if(a[i][j] == k+1) { // 如果这种花色的这张牌属于k+1这个人
putchar(i+3); // 输出花色
switch(j) { // 输出牌点
case 0: putchar('A'); break;
case 11:putchar('J'); break;
case 12:putchar('Q'); break;
case 13:putchar('K'); break;
default:printf("%d", j+1);
}
putchar(' ');
}
printf("\n"); // 换行输出下一个玩家
}
}

int main()
{
int a[4][13], *p;

srand(time(0)); // 初始化随机数种子

init(a); // 初始化牌组
p = (int*)a; // 用于传值给shuffle函数
shuffle(p, p+4*13); // 将牌组的首尾指针传给shuffle函数
show(a); // 输出
return 0;
}
#include<stdlib.h>
#include<stdio.h>
int comp(const void *j,const void *i);
void p(int b[],char n[]);

int main(void)
{
static char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
int a[53],b1[13],b2[13],b3[13],b4[13];
int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i;
while(t<=52) /*控制发52张牌*/
{
m=rand()%52; /*产生0到51之间的随机数*/
for(flag=1,i=1;i<=t&&flag;i++)/*查找新产生的随机数是否已经存在*/
if(m==a[i]) flag=0; /*flag=1:产生的是新的随机数flag=0:新产生的随机数已经存在*/

if(flag)
{
a[t++]=m; /*如果产生了新的随机数,则存入数组*/
if(t%4==0) b1[b11++]=a[t-1]; /*根据t的模值,判断当前*/
else if(t%4==1) b2[b22++]=a[t-1]; /*的牌应存入哪个数组中*/
else if(t%4==2) b3[b33++]=a[t-1];
else if(t%4==3) b4[b44++]=a[t-1];
}
}

qsort(b1,13,sizeof(int),comp); /*将每个人的牌进行排序*/
qsort(b2,13,sizeof(int),comp);
qsort(b3,13,sizeof(int),comp);
qsort(b4,13,sizeof(int),comp);
p(b1,n); p(b2,n); p(b3,n); p(b4,n); /*分别打印每个人的牌*/

return 0;
}

void p(int b[],char n[])
{
int i;
printf("\n\006 "); /*打印黑桃标记*/
for(i=0;i<13;i++) /*将数组中的值转换为相应的花色*/
if(b[i]/13==0) printf("%c ",n[b[i]%13]); /*该花色对应的牌*/
printf("\n\003 "); /*打印红桃标记*/

for(i=0;i<13;i++)
if((b[i]/13)==1) printf("%c ",n[b[i]%13]);
printf("\n\004 "); /*打印方块标记*/
for(i=0;i<13;i++)
if(b[i]/13==2) printf("%c ",n[b[i]%13]);
printf("\n\005 "); /*打印梅花标记*/
for(i=0;i<13;i++)
if(b[i]/13==3||b[i]/13==4) printf("%c ",n[b[i]%13]);
printf("\n");
}

int comp(const void *j,const void *i) /*qsort调用的排序函数*/
{
return(*(int*)i-*(int*)j);
}
#include<iostream>
#include<iomanip>
#include<ctime>
#include<cstdlib>
using namespace std;
void Swap(int*,int*);
void push(int stack[],int MAX,int val);
int top=-1;
int main(void)
{
int card[52],stack[52]={0};
int i,j,k=0;
char ascVal;
int style;
srand((unsigned)time(NULL));
for(i=0;i<52;i++)
card[i]=i+1;
cout<<"[洗牌中,请稍后....]"<<endl;
while(k<30)
{ for(i=0;i<51;i++)
for(j=i+1;j<52;j++)
if(rand()%52==2)
Swap(&card[i],&card[j]);//洗牌
k++;
}
i=0;
while(i!=52)
{ push(stack,52,card[i]);//将52张牌放入堆栈
i++;
}
cout<<"[逆时针发牌]"<<endl;
cout<<"[显示各家牌面]"<<endl;cout<<"东家\t北家\t西家\t南家"<<endl;
cout<<"=============================="<<endl;
while(top>=0)
{ style=(stack[top]-1)/13; //计算牌面花色
switch(style)
{ case 0:
ascVal=5; //梅花
break;
case 1:
ascVal=4; //方片
break;
case 2:
ascVal=3; //红桃
break;
case 3:
ascVal=6; //黑桃
break;
}
cout<<"["<<ascVal;
switch(stack[top]%13+1)
{ case 1:
cout<<setw(2)<<"A";break;
case 11:
cout<<setw(2)<<"J";break;
case 12:
cout<<setw(2)<<"Q";break;
case 13:
cout<<setw(2)<<"K";break;
default:
cout<<setw(2)<<stack[top]%13+1;break;
}
cout<<"]\t";
if(top%4==0)
cout<<endl;
top--;
}
return 0;
}
void push(int stack[],int MAX,int val)
{ if(top>=MAX-1)
cout<<"[堆栈已经满了]"<<endl;
else
{ top++;
stack[top]=val;
}
}
void Swap(int* a,int* b)
{ int temp;
temp=*a;
*a=*b;
*b=temp;
}

看看这个怎么样

上一个:初中文凭能否学C语言
下一个:C语言表达式求值

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,