c语言实现斗地主

实现思想

使用结构体创建一个扑克的对象,对象中有扑克的值、花色,数量等属性。结构体中*_count属性是用来判断当前扑克值得的该花色是否被发出

typedef struct pokers
{
char *arr;//扑克值:2 3 4 5 6 7 8 9 T J Q K A W w,T代表10,W代表大王w代表小王
int  R_count;//红桃和大小王的辅助判断
int  B_count;//黑桃
int  F_count;//方块
int  H_count;//梅花
int  count;
}pokers;

 为保证发牌具有随机性,需要使用随机函数,故需要生成随机数的一个时间种子。

srand(time(NULL));

接下来就是初始化一副牌,num为生成的随机数值,color用来代表花色,sum用来统计已经发出去的牌的数量,flag用来判断每一次发牌是否有牌发出

char a[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A','W','w'};
    int i,num,color,sum=0;
    int flag;
//num:牌值,color:花色,sum:牌总数,flag:判断是否有牌发出去
//创建对象
struct pokers *poker=(struct pokers *)malloc(sizeof(pokers)*15);
for(i=0;i<15;i++)
{
	poker[i].arr=malloc(sizeof(char));
	*(poker[i].arr)=a[i];
	poker[i].R_count=1;	
	poker[i].B_count=1;
	poker[i].F_count=1;
	poker[i].H_count=1;
	poker[i].count=4;

}

接下来便是发牌,使用while(1){num=rand()%15;......}来实现,因为num是随机产生的,故需要条件进行判断该发什么牌。一共有两种情况。

首先是对对大王小王的发牌:

因为大小王均只有一张,故都只发一次,所以借助R_count来做控制保证只发一次;

num=rand()%15;
     if(num==13&&poker[num].R_count==1)
      {
        printf("大王W  ");
	poker[num].R_count=0;
	sum++;
	if(sum%6==0)
	printf("\n");
        if(sum%17==0)
	{
	 printf("\n");
	 (sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
	}
	if(sum>=54)
	{
	 printf("------------牌已发完,请开始游戏-------------\n");
	 break;
	}
	continue;
      }
     if(num==14&&poker[num].R_count==1)
      {
        printf("小王w  ");
	poker[num].R_count=0;
	sum++;
	if(sum%6==0)
	printf("\n");
        if(sum%17==0)
	{	
	 printf("\n");
	 (sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
	}
	if(sum>=54)
	{
	 printf("------------牌已发完,请开始游戏-------------\n");
	 break;
	}
	continue;
      }

其次是其他的牌:

 if(poker[num].count>0&&num<13)
      {
         //该牌还有,必须发出去一个花色
	 flag=1;//允许发牌
  	 while(flag)
          {
		color=rand()%4+1;
//此处省略switch语句
        }

使用switch--case语句来做4中花色的发牌选择,以红桃为例,

switch(color)
		{
		case 1:
		   if(poker[num].R_count)
		    {
			if(num==10)
			printf("红桃10 ");
			else
			printf("红桃%c  ",*(poker[num].arr));
			poker[num].R_count=0;
			poker[num].count--;
			sum++;
			if(sum%6==0)
			printf("\n");
			if(sum%17==0)
			{
			printf("\n");
	 		(sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
			}
	            }
			flag=0;//牌已成功发出或者该牌已不存在
			break;

            //省略其他case语句,大同小异,完整代码在文末给出
        }

 实现效果;

 以上便是斗地主游戏的实现过程,以面向对象的思维来做实现,代码逻辑简单,但是过于冗杂,若是以面向过程的思想来实现,代码的空间复杂度和时间复杂度都会减小多,后期再进行修改优化。

下面附上完整代码;

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct pokers
{
char *arr;//牌值:2 3 4 5 6 7 8 9 T J Q K A W w,T代表10,W代表大王w代表小王
int  R_count;//红桃和大小王的辅助判断
int  B_count;//黑桃
int  F_count;//方块
int  H_count;//梅花
int  count;
}pokers;
int main()
{
    srand(time(NULL));
    char a[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A','W','w'};
    int i,num,color,sum=0;
    int flag;
//num:牌值,color:花色,sum:牌总数,flag:判断是否有牌发出去
//创建对象
struct pokers *poker=(struct pokers *)malloc(sizeof(pokers)*15);
for(i=0;i<15;i++)
{
	poker[i].arr=malloc(sizeof(char));
	*(poker[i].arr)=a[i];
	poker[i].R_count=1;	
	poker[i].B_count=1;
	poker[i].F_count=1;
	poker[i].H_count=1;
	poker[i].count=4;

}
printf("---------------游戏已就绪----------------\n");
printf("player_1:\n");
//发牌
while(1)
{    //sleep(0.01);
     num=rand()%15;
     if(num==13&&poker[num].R_count==1)
      {
        printf("大王W  ");
	poker[num].R_count=0;
	sum++;
	if(sum%6==0)
	printf("\n");
        if(sum%17==0)
	{
	 printf("\n");
	 (sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
	}
	if(sum>=54)
	{
	 printf("------------牌已发完,请开始游戏-------------\n");
	 break;
	}
	continue;
      }
     if(num==14&&poker[num].R_count==1)
      {
        printf("小王w  ");
	poker[num].R_count=0;
	sum++;
	if(sum%6==0)
	printf("\n");
        if(sum%17==0)
	{	
	 printf("\n");
	 (sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
	}
	if(sum>=54)
	{
	 printf("------------牌已发完,请开始游戏-------------\n");
	 break;
	}
	continue;
      }
     if(poker[num].count>0&&num<13)
      {
         //该牌还有,必须发出去一个花色
	 flag=1;//允许发牌
  	 while(flag)
          {
		color=rand()%4+1;
		switch(color)
		{
		case 1:
		   if(poker[num].R_count)
		    {
			if(num==10)
			printf("红桃10 ");
			else
			printf("红桃%c  ",*(poker[num].arr));
			poker[num].R_count=0;
			poker[num].count--;
			sum++;
			if(sum%6==0)
			printf("\n");
			if(sum%17==0)
			{
			printf("\n");
	 		(sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
			}
	            }
			flag=0;//牌已成功发出或者该牌已不存在
			break;
		case 2:
		if(poker[num].B_count)
		  {
			if(num==10)
			printf("黑桃10 ");
			else
			printf("黑桃%c  ",*(poker[num].arr));
			poker[num].B_count=0;
			poker[num].count--;
			sum++;
			if(sum%6==0)
			printf("\n");
			if(sum%17==0)
			{
			printf("\n");
	 		(sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
			}
		   }
			flag=0;//牌已成功发出或者该牌已不存在
			break;
		case 3:
		if(poker[num].F_count)
		  {
			if(num==10)
			printf("方块10 ");
			else
			printf("方块%c  ",*(poker[num].arr));
			poker[num].F_count=0;
			poker[num].count--;
			sum++;
			if(sum%6==0)
			printf("\n");
			if(sum%17==0)
			{
			printf("\n");
	 		(sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
			}
		  } 
			flag=0;//牌已成功发出或者该牌已不存在
			break;
		case 4:
		if(poker[num].H_count)
		  {
			if(num==10)
			printf("梅花10 ");
			else
			printf("梅花%c  ",*(poker[num].arr));
			poker[num].H_count=0;
			poker[num].count--;
			sum++;
			if(sum%6==0)
			printf("\n");
			if(sum%17==0)
			{
			printf("\n");
	 		(sum/17+1)<4?printf("player_%d:\n",sum/17+1):printf("底牌:\n");
			}
		   }
			flag=0;//牌已成功发出或者该牌已不存在
			break;
		}//switch->end
	 }//while(flag)->end
}//if->end
    if(sum>=54)
     {
	printf("\n------------牌已发完,请开始游戏-------------\n");
	//printf("\n");
	break;
     }
}//while(1)->end
}

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【资源说明】 基于Linux C++和socket网络编程的即时通信系统源码+项目说明(课程设计).zip 项目内容: 本项目使用C ++实现一个具备服务器端和客户端即时通信且具有私聊功能的聊天室 目的是学习C++网络开发的基本概念,同时也熟悉了Linux下的C++程序编译和简单MakeFile的编写 需求分析: 1.服务端:能够接受新的客户连接,并将每个客户端发来的信息,广播给对应的目标客户端 2.客户端:能够连接服务器,并向服务器发送消息,同时可以接受服务器发来的消息 服务端: 1.支持多个客户端接入,实现聊天室基本功能 2.启动服务,建立监听端口等待客户端连接 3.使用epoll机制实现并发,增加效率 4.客户端连接时,发送欢迎消息,并存储连接记录 5.客户端发送消息时,根据消息类型,广播给所有用户(群聊)或者指定用户(私聊) 6.客户端请求退出时,对相应连接信息进行清理 客户端: 1.连接服务器 2.支持用户输入消息,发送给服务端 3.接受并显示服务端发来的消息 4.退出连接 客户端需要两个进程分别支持以下功能: 子进程: 1.等待用户输入信息 2.将聊天信息写入管道(pipe),并发送给父进程 父进程: 1.使用epoll机制接收服务端发来的消息,并显示给用户,使用户看到其他用户的信息 2.将子进程发送的聊天信息从管道(pipe)中读取出来,并发送给客户端 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值