C语言发牌游戏 21点

非常简单的实现发牌游戏 21点

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<ctype.h>
#define NUMBER 13
#define SIZE 1000
#define length 100
//玩家模型 
struct Player{
    char name[length];
    int points;
    int refuse;    
};
int Shuffle_cards(int S_cards[]);
int play_game();
int Reset_game(struct Player* players[],int bots);
struct Player *Create_bot(char name[]);
int IS_card(int Is_card[],int a);
//重置游戏,角色不释放 
int Reset_game(struct Player* players[],int bots){
	int i;
	for(i=0;i<bots;i++){
		players[i]->points=0;
		players[i]->refuse=1;
	}
	return 1;
} 
int Read_line(char str[],int n);
//字符串输入函数 
int Read_line(char str[],int n){
	int ch,i=0;
	while(isspace(ch=getchar()))
	;
	while(ch!='\n'&&ch!=EOF){
		if(i<n)
			str[i++]=ch;
		ch=getchar();
	}
	str[i]='\0';
	return i;
}
//当前牌在牌库中是否发完 
int IS_card(int Is_card[],int a){
  if(Is_card[a])
    return 1;
  else
    return 0;
}
//随机发牌 
int Shuffle_cards(int S_cards[]){
  int a,i;
  while(1){
    a=rand()%NUMBER+1;
    if(IS_card(S_cards,a)){
       for(i=0;i<NUMBER;i++){
        if(a==S_cards[i]){
          S_cards--;
          break;
        }
      }
      break;
    }else{break;}
  }
  return a;
}
//创建角色 
struct Player *Create_bot(void){
    struct Player *p;
    p=(Player*)malloc(sizeof(struct Player));
    if(p==NULL){
        printf("Create bot failed!\n");
    }
    Read_line(p->name,length);
    p->points=0;
    p->refuse=1;
    return p;
}
int play_game(){
  int i,bots_num,cards[NUMBER]={4},card,choose,max,maxid,players[4]={0},drawCOunt=0;
  struct Player *plays[5];
  printf("Welcome you play game!\n");
  printf("Now,I will tell you rules of the game:\n");
  printf("1.you need to choose the number of robots to fight against you.\n");
  printf("2.you will get the cards in the game.If the sum of the card points is greater than 21, you will lose the game.The cards will be distributed isx times in total.During this period,you can choose to get the cards,you will not get the cards .Finally,you can settle who has the largest sum of the card points.\n");
  printf("Please input no more than three robots to fight:");
  scanf("%d",&bots_num);
  printf("Please input you name:");
  plays[0]=Create_bot();
  i=1;
  while(bots_num--){
  	printf("Please input bots name:");	
    plays[i++]=Create_bot();
  }
  bots_num=i;
  while(1){
	  if(plays[0]->refuse){
		card=Shuffle_cards(cards);
		printf("%s Player you take a card: %d\n",plays[0]->name,card);
		plays[0]->points+=card;
		printf("Sum of current cards is:%d\n",plays[0]->points);
		if(plays[0]->points>21){
			printf("Sorry, your total points exceeded 21 and you lost the game!^M^\n");
			printf("Whether %s players continue to play the game?(Yes/1 or No/0)",plays[0]->name);
		  	scanf("%d",&choose);
		  	if(choose){
		  		Reset_game(plays,bots_num);
	  			continue;
	  		}else{
		  		return 0;
		  	}
		}		
	  }else{
	  	max=plays[0]->points;
	  	//寻找胜利者 
	  	for(i=0;i<bots_num;i++){
		  	if(max<=plays[i]->points){
		  		max=plays[i]->points;
		  		maxid=i;
		  	}
		  }
	  	//寻找平局的可能
		for(i=0;i<bots_num;i++){
			if(plays[i]->points==max){
				players[i]=1;
				drawCOunt++;
			}
		}
	  	printf("Your final total points are:%d\n",plays[0]->points);
	  	for(i=1;i<bots_num;i++){
		  	printf("Botname %s total points are:%d\n",plays[i]->name,plays[i]->points);
		}
	  	if((maxid==0)&&(drawCOunt==1)){//玩家获胜 
		  	printf("Congratulations on winning the game!^v^\n");
		  	printf("Whether %s players continue to play the game?(Yes/1 or No/0)",plays[0]->name);
		  	scanf("%d",&choose);
		  	if(choose){
		  		Reset_game(plays,bots_num);
	  			continue;
	  		}else{
		  		return 1;
		  	}
		  }	else{// 电脑获胜 
	  		printf("Botname %s won the game! Sorry you lost the game!^m^\n",plays[maxid]->name);
	  		printf("Whether %s players continue to play the game?(Yes/1 or No/0)",plays[0]->name);
		  	scanf("%d",&choose);
		  	if(choose){
		  		Reset_game(plays,bots_num);
	  			continue;
	  		}else{
		  		return 0;
		  	}
	  	}
	  	if((maxid==0)&&(drawCOunt>1)){//玩家和电脑平局 
	  		for(i=1;i<bots_num;i++){
		  		if(players[i]){
		  			printf("Botname%s draw with ",plays[i]->name);
		  		}
		  	}
		  	printf("you!\n");
		  	printf("Whether %s players continue to play the game?(Yes/1 or No/0)",plays[0]->name);
		  	scanf("%d",&choose);
		  	if(choose){
		  		Reset_game(plays,bots_num);
	  			continue;
	  		}else{
		  		return 2;
		  	}
	  	}
	  }
	  if(plays[0]->refuse){
  		for(i=1;i<bots_num;i++){
	  	if(plays[i]->refuse){
	  		if(plays[i]->points>=10){
		  		card=Shuffle_cards(cards);
		  		while(1){
		  			if(card>3) card=Shuffle_cards(cards);
		  			else break;
			  	}
		  	}
		  	plays[i]->points+=card;
			if(plays[i]->points>=19) plays[i]->refuse=1;
		  }else{
	  		continue;	
	  	}
	  }
	  printf("Do you want to continue the next deal?(Yes/1 or No/0)");
	  scanf("%d",&choose);
      plays[0]->refuse=choose; 
  	}  
  }
}
int main(){
  srand(time(NULL));
  play_game();
  return 0;
}
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值