通过本文主要向大家介绍了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"