• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言实现斗地主的核心算法

C语言实现斗地主的核心算法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言斗地主,c语言斗地主代码,c语言斗地主游戏代码,c语言斗地主发牌程序,dijkstra算法c语言等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

数据结构只选择了顺序表,没有选择链表,灵活性和抽象性不足,不能普适。

head.h

#ifndef     __HEAD_H__
#define     __HEAD_H__
#define     MAXLEVEL 15
typedef struct CARD{
  int number;
  int level;
  char *flower;
  char point;
}card;//卡
 
typedef struct DECK{
  int top;
  int arr[55];
}deck;//牌堆
 
typedef struct PLAYERS{
  int id;
  int status;
  card handcard[21];
  int size;
}players;//玩家
 
typedef struct GAMES{
  int type;
  int level;
  int sum;
  int who;
  int count;
  int arr[16];
}games;//桌面
 
typedef struct BUFFERS{
  int arr[16];
  int brr[20];
  int sum;
}buffers;//出牌缓冲区
/*--------------------------------*/
void game_init();
void turning(); 
void handcard_sort();
void print();
int win();
void turn_switch();
#endif
</div>

op.c

#include<stdio.h>
#include<stdlib.h>
#include"head.h"
#include<string.h>
static int type_buffer();
static char point[]={'0','3','4','5','6','7','8','9','X','J','Q','K','A','2','w','W'};
static char *farr[]={"方片","梅花","红桃","黑桃"};
static char* type_arr[]={"弃权","单张","对子","王炸","骷髅","骷髅单","炸弹","骷髅对","炸带单","顺子","炸带一对","飞机不带","连对","飞机单","飞机带对"};
static char* sta_arr[2]={"农民","地主"};
static players player[3];//玩家
static games game;
 
/*洗牌堆*/
static deck* deck_init(){
  int i,j;
  srand(time(0));
  deck *p_deck=(deck*)malloc(sizeof(deck));
  if(!p_deck){
    printf("分配内存失败\n");
    return NULL;
  }
  for(i=1;i<=54;i++){
    p_deck->arr[i]=rand()%54;
    for(j=1;j<i;j++){
      if(p_deck->arr[i]==p_deck->arr[j]){
        i--;
        break;
      }
    }
  }
  p_deck->top=54;
  return p_deck;
}
 
/*初始化玩家(洗牌,id,身份 手牌,总数)*/
static void player_init(){
  int i,j;
  for(j=0;j<3;j++){
    for(i=1;i<=20;i++){
      player[j].handcard[i].number=100;
      player[j].handcard[i].level =0;
    }
  }
  deck *p=deck_init();
  if(!p){
    printf("没有牌堆\n");
    return ;
  }
  int which=0;
  which=rand()%3;
  game.who=which;
  for(i=0;i<3;i++){
    player[i].id=i;
    if(i==which){//地主
      player[i].status=1;
      for(j=1;j<=20;j++){
        player[i].handcard[j].number=p->arr[(p->top)--];
      }
      player[i].size=20;
    }
    else{//农民
      player[i].status=0;
      for(j=1;j<=17;j++){
        player[i].handcard[j].number=p->arr[(p->top)--];
      }
      player[i].size=17;
    }
  }
  free(p);
  p=NULL;
}
 
/*手牌信息补完*/
static void handcard_init(){
  int i,j;
  for(i=0;i<3;i++){
    for(j=1;j<=20;j++){
        int number=player[i].handcard[j].number;
        int *p_level=&(player[i].handcard[j].level);
        char **pp_flower=&(player[i].handcard[j].flower);
        char *p_point=&(player[i].handcard[j].point);
      if(number>=0&&number<=51){
        *p_level=number/4+1;
        *p_point=point[number/4+1];
        *pp_flower=farr[number%4];
      }
      else if(number==52){
        *p_level=14;
        *p_point='w';
        *pp_flower="小王";
      }
      else if(number==53){
        *p_level=15;
        *p_point='W';
        *pp_flower="大王";
      }
      else {
        *p_level=0;
        *p_point=' ';
        *pp_flower=" ";
      }
    }
  }
}
 
/*打印当前玩家手牌*/
void print(){
  int i,j;
  for(i=0;i<3;i++){
    if (i!=game.who) continue;
    for(j=1;j<=player[i].size;j++){
      //printf("======");
      if(player[i].handcard[j].number == 100){
        printf("  ");
      }
      else {
        char *p_tmp=player[i].handcard[j].flower;
        printf("%s ",p_tmp);
      }
    }
    printf("\n");
    for(j=1;j<=player[i].size;j++){
      if(player[i].handcard[j].number == 100){
        printf(" ");
      }
      else {
        printf(" %c  ",player[i].handcard[j].point);
      }
    }
  }
  printf("\n");
  for(j=1;j<=player[game.who].size;j++){
    if(! (j>9))
      printf("(%d) ",j);
    else
    printf("(%d) ",j);
  }
  printf("\n");
}
 
/*游戏初始化*/
void game_init(){
  game.count=2;//弃权次数
  player_init();//洗牌 发牌
  handcard_init();//手牌信息补完
}
 
int fcmp(const void *pa,const void *pb){//升序
  return *(int*)pa-*(int*)pb;
}
 
static void rehandcard_sort(players *p_player,int* p_number){//真正的排序函数
  int *base=p_number;
  size_t nmemb=p_player->size;
  size_t size= sizeof(card);
  qsort(base,20,size,fcmp);
}
 
void handcard_sort(){//外壳排序函数
  rehandcard_sort(&player[0],&(player->handcard[1].number));
  rehandcard_sort(&player[1],&((player+1)->handcard[1].number));
  rehandcard_sort(&player[2],&((player+2)->handcard[1].number));
}
 
/*询问是否出牌*/
static int require(){ //1表示出牌 0表示弃权
  if(game.type == 3 ){
    if(game.count != 2){
      printf("要不起!\n");
      return 0;
    }
    else
      return 1;
  }
  if(game.count !=2){
    printf("出牌吗?(y表示出牌,n弃权):");
    char choice;
    scanf("%c",&choice);
    scanf("%*[^\n]");
    scanf("%*c");
    if(choice == 'n' || choice == 'N'){
      return 0;
      }
    else return 1;
  }
  else {
    printf("继续出牌\n");
    return 1;
  }
}
 
buffers buffer={};//出牌缓冲区
 
/*清空出牌缓冲区*/
static void reset(){
  int a;
  for(a=0;a<16;a++)
    buffer.arr[a]=0;
  for(a=0;a<20;a++)
    buffer.brr[a]=0;
  buffer.sum=0;
}
 
/*放牌进入缓冲区*/
static void buffer_put(){
  char intput[40]={};//把字符串转换为数字
  int brr[20]={};
  int i=0;
  int j;
  int sum;
  int flag=0;
  while(1){
    reset();
sig:  printf("请输入要放的牌...:");
    fgets(intput,40,stdin);
    if(strlen(intput)==39&&intput[38]!='\n'){
      scanf("%*[^\n]");
      scanf("%*c");
    }
    for(j=0,i=0,sum=0;i<strlen(intput);i++){//记录出牌下标
      if(intput[i]>='0'&&intput[i]<='9'){
        sum=sum*10+(intput[i]-'0'); 
        flag=1;
      }
      else {
        if(flag)
        brr[j] = sum;
        sum=0;
        j++;
        flag=0;
      }
    }
    int k;
    printf("要出: ");
    for(k=0;brr[k];k++)
      printf("%d ",brr[k]);
    printf("号牌\n");
    int who = game.who;
    players* p_player=&(player[who]);
    int index;
    for(i=0;brr[i];i++){//记录出的牌是什么
       index=brr[i];
        if(index>(p_player->size) || index<=0 ){//输入的字符串范围有误
          printf("输入内容超出范围,重新输入\n");
          goto sig;
        }
        else{
          int level=p_player->handcard[index].level;
           ++(buffer.arr[level]);
          buffer.brr[i] =brr[i];
          }
    }
  for(i=1;i<=15;i++)//记录出了多少张牌
    buffer.sum+=buffer.arr[i];
    char aff= 'N';
    int type = type_buffer();
    if(type != -1)
      printf("要出的类型是:%s\n\n",type_arr[type]);
    else {
      printf("不存在此类型的牌\n\n");
      reset();
      return;
    }
    printf("确定要这样出吗?(确定输入y,否则按其它)");
    scanf("%c",&aff);
    scanf("%*[^\n]");
    scanf("%*c");
    if(aff == 'y' || aff =='Y')
      break;
  }
}
 
static void turnstart(){
  char u;
  printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n==============================================================斗地主======================================================\n\n\n\n\n");
  printf("轮到下一家");
  scanf("%c",&u);
  int i;
  printf("\n\n\n\n\n\n\n牌面张数为%d张\n",game.sum);
  printf("牌面类型为:  %s%c\n",type_arr[game.type],point[game.level]);
  printf("=============================================================%s的回合==========================================================\n\n",sta_arr[player[game.who].status]);
  printf("现在轮到玩家%d"



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言实现斗地主的核心算法

相关文章

  • 2017-05-28显示内存状态示例分享
  • 2017-05-28详解C语言中accept()函数和shutdown()函数的使用
  • 2017-05-28C++利用静态成员或类模板构建链表的方法讲解
  • 2017-05-28汇编语言常见错误信息中文注解
  • 2017-05-28大家注意vector, list, set, map成员函数erase
  • 2017-05-28Objective-C的内省(Introspection)用法小结
  • 2017-05-28static关键字的作用详解
  • 2017-05-28C++卸载程序功能示例
  • 2017-05-28C++初始化列表学习
  • 2017-05-28C语言单向链表的表示与实现实例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言实现两个递减数列中寻找某一个数
    • C++通过自定义函数求一元二次方程的根
    • C++结构体用法实例分析
    • 详解C++中StringBuilder类的实现及其性能优化
    • c语言实现bfs状态搜索
    • C++基础学生管理系统
    • 贪吃蛇游戏C++命令行版实例代码
    • C++实现查壳程序代码实例
    • C++ 双链表的基本操作(详解)
    • 简单介绍C语言中的umask()函数和truncate()函数

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有