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

