【C语言从不挂科到高绩点】26-卡牌游戏必备功能【抽卡功能】

 Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 

卡牌游戏相信大家并不陌生,而在每一个卡牌游戏中都会有一个抽卡的功能,而这种抽卡功能也是游戏骗氪的主要手段。今天我们来看看这种坑人的卡牌游戏是如何用C语言实现出来。

本套课程将会从0基础讲解C语言核心技术,适合人群:

  1. 大学中开设了C语言课程的同学
  2. 想要专升本或者考研的同学
  3. 想要考计算机等级证书的同学
  4. 想要从事C/C++/嵌入式开发的同学


===============点个关注吧==============

======================================

一、功能需求

在卡牌游戏中,一般抽卡有这样的功能:

现假设游戏中卡牌的等级分为 :蓝卡、紫卡、金卡

抽卡分为:单抽 和 十连抽

单抽:每次抽取一张卡牌,有 85%的概率抽出蓝卡,有 15%机率抽出紫卡,累积抽 10 次卡牌,第 10 次必出金卡

(随机 100 以内的数字,如果数字小于 85 抽蓝卡,大于等于 85 的时候抽紫卡)

10 连抽: 先从金卡中抽取一张金卡,剩下的九张卡牌几率和单抽一样。

单抽每次消耗:288 元宝

10 连抽每次消耗:2580 元宝

如果元宝不足,不能抽卡,并且提示充值(需要做充值功能)

游戏开始时:

  1. 显示菜单 : 1) 单抽 2)10 连抽 3)充值 4)查看抽取到的卡牌 5)退出游戏

二、实现步骤 

  1. 定义卡牌等级和概率

    • 蓝卡:85%的概率
    • 紫卡:15%的概率(当随机数大于等于85时)
    • 金卡:在单抽中,累积抽10次后第10次必出;在十连抽中,第一张必出。
  2. 实现抽卡功能

    • 单抽:每次消耗288元宝,随机抽取一张卡牌。
    • 十连抽:每次消耗2580元宝,先确保出一张金卡,再随机抽取剩下的九张卡牌。
  3. 实现元宝管理和充值功能

    • 玩家初始元宝数量为0。
    • 提供充值功能,允许玩家增加元宝数量。
    • 在抽卡前检查元宝是否足够。
  4. 显示菜单和交互功能

    • 显示包含单抽、十连抽、充值、查看卡牌和退出游戏选项的菜单。
    • 根据玩家的选择执行相应的功能。
  5. 记录抽卡结果

    • 提供一个功能来查看玩家抽取到的所有卡牌。

三、完整代码

/**

在卡牌游戏中,一般抽卡有这样的功能:
现假设游戏中卡牌的等级分为 :蓝卡、紫卡、金卡
抽卡分为:单抽  和 十连抽
单抽:每次抽取一张卡牌,有 85%的概率抽出蓝卡,有 15%机率抽出紫卡,累积抽 10 次卡牌,第 10 次必出金卡
(随机 100 以内的数字,如果数字小于 85 抽蓝卡,大于等于 85 的时候抽紫卡)
10 连抽:  先从金卡中抽取一张金卡,剩下的九张卡牌几率和单抽一样。
单抽每次消耗:288 元宝
10 连抽每次消耗:2580 元宝
如果元宝不足,不能抽卡,并且提示充值(需要做充值功能)

游戏开始时:
1. 显示菜单  : 1) 单抽    2)10 连抽   3)充值   4)查看抽取到的卡牌  5)退出游戏

**/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main(){
	/*
		蓝色
	*/

	char  BLUE_STAR_MM[15][50] = {
			"1★ 钟无艳","1★ 锤子妈","1★ 黄月英",
			"1★ 米莱迪","1★ 蔡文姬","1★ 孙尚香",
			"1★ 花木兰","1★ 公孙离","1★ 伽  罗",
			"1★ 陈圆圆","1★ 赵飞燕","1★ 张星彩",
			"1★ 太平公主","1★ 祝英台","1★ 张丽华"
	};
	
	/**
	 * 紫色美眉堆
	 */
	char PURPLE_STAR_MM[15][50] = {
			"2★ 大  乔","2★ 小  乔","2★ 露  娜",
			"2★ 卓文君","2★ 虞美人","2★ 妲  己",
			"2★ 崔莺莺","2★ 王宝钏","2★ 杜十娘",
			"2★ 柳如是","2★ 董小婉","2★ 武媚娘",
			"2★ 苏若兰","2★ 潘金莲","2★ 穆桂英"	
	};
	
	/**
	 * 金色美眉堆
	 */
	char GOLD_STAR_MM[12][50] = {
			"3★ 西  施","3★ 王昭君","3★ 貂  蝉",
			"3★ 杨玉环","3★ 王语嫣", "3★ 小龙女",
			"3★ 双  儿","3★ 花小霜","3★ 柳莺莺",
			"3★ 陆无双","3★ 甄  姬","3★ 秋  香"
	};

	// 蓝卡堆的卡牌数量
	int blue_len = sizeof(BLUE_STAR_MM)/sizeof(BLUE_STAR_MM[0]);

	// 紫卡堆的卡牌数量
	int purple_len = sizeof(PURPLE_STAR_MM)/sizeof(PURPLE_STAR_MM[0]);

	// 金卡堆的卡牌数量
	int gold_len = sizeof(GOLD_STAR_MM)/sizeof(GOLD_STAR_MM[0]);

	int count = 0;// 作为计数器,记录单抽的次数

	int money = 1000;// 默认的元宝数

	// 定义字符串数组,用来存储抽到的卡牌
	char my_cards[100][20]; //  手上卡牌的容量是100

	// 用来指定抽取卡牌存放的位置,在mycards数组中的下标
	int my_index = 0;// 记录当前卡牌,,应该存放的位置

	// 死循环
	while(1){
		printf("********************************************\n");
		printf("** 1.单抽  2.10连抽 3.充值  4.查看 5.退出 **\n");
		printf("********************************************\n");
		printf("请选择:\n");
		int num = 0;
		scanf("%d",&num);
		// 设置随机数种子
		srand(time(0));

		if(num==1){  // 单抽
			// 单抽之前,检测元宝数量是否足够一次单抽
			if (money<288)
			{
				printf("元宝数量不足,请充值!\n");
				continue;// 结束本次循环,开始下一次循环
			}
			// 判断手卡是否满了(手卡最多只能放100张)
			if(my_index>=100){
				printf("手卡已满,不能再抽了!请先分解卡牌\n");
				continue;
			}

			// 元宝足够、每抽一次卡,要扣除288元宝
			money -= 288;

			count++;// 单抽次数增加1
			if(count<10){ // 前9次抽取卡牌
				// 生成一个随机数,用来判断是在蓝卡中抽还是紫卡中抽
				int idx = rand()%100;
				if(idx<85){
					// 从蓝卡堆中抽取
					// 在蓝卡堆的长度范围内随机生成下标,用来选取卡牌
					int index = rand()%blue_len;

					// 根据随机出来的下标从蓝色卡牌堆中取出卡牌
					printf("本次抽取出来的卡牌:【%s】,再抽%d次必出金卡\n",BLUE_STAR_MM[index],(10-count));
					// 将抽到的卡牌,保存到手卡数组中
					// my_cards[my_index] = BLUE_STAR_MM[index];
					// 将从蓝卡堆抽出的卡牌,复制到my_cards数组中的my_index位置上
					strcpy(my_cards[my_index],BLUE_STAR_MM[index]);
					// 当前位置向后移动
					my_index ++;
				}else{
					// 在紫卡堆的长度范围内随机生成下标,用来选取卡牌
					int index = rand()%purple_len;
					// 根据随机出来的下标从紫卡中取出卡牌
					printf("本次抽取出来的卡牌:【%s】,再抽%d次必出金卡\n",PURPLE_STAR_MM[index],(10-count));
					strcpy(my_cards[my_index],PURPLE_STAR_MM[index]);
					// 当前位置向后移动
					my_index ++;
				}

			}else{  // 第10次抽卡牌
				// 从金卡堆中抽取

				// 在金卡堆的长度范围内随机生成下标,用来选取卡牌
				int index = rand()%gold_len;
				// 根据随机出来的下标从金卡中取出卡牌
				printf("本次抽取出来的卡牌:【%s】\n",GOLD_STAR_MM[index]);
				// count 归0,重新计数
				count =0;
				strcpy(my_cards[my_index],GOLD_STAR_MM[index]);
				// 当前位置向后移动
				my_index ++;

			}
			



		}else if(num==2){
			// 判断元宝数是否够1次10连抽
			if(money<2580){
				printf("元宝数量不足,请充值!\n");
				continue;
			}
			// 如果当前的位置+10连抽之后的位置,大于了100,数组越界了
			if(my_index+10>=100){
				printf("手卡位置不足10连抽了,请先分解卡牌\n");
				continue;
			}

			//  每抽一次,元宝数要扣减2580
			money -= 2580;
			// 在金卡长度范围内随机一个整数
			int index = rand()%gold_len;
			// 抽一张金卡
			printf("【%s】\t", GOLD_STAR_MM[index]);
			strcpy(my_cards[my_index],GOLD_STAR_MM[index]);
			// 当前位置向后移动
			my_index ++;

			// 剩下的九张卡牌,和单抽一样抽取
			for (int i = 0; i < 9; ++i)
			{
				int select = rand()%100;
				if(select<85){
					// 从蓝卡堆中抽取
					// 在蓝卡堆的长度范围内随机生成下标,用来选取卡牌
					int index = rand()%blue_len;

					// 根据随机出来的下标从蓝色卡牌堆中取出卡牌
					printf("【%s】\t",BLUE_STAR_MM[index]);
					strcpy(my_cards[my_index],BLUE_STAR_MM[index]);
					// 当前位置向后移动
					my_index ++;
				}else{
					// 在紫卡堆的长度范围内随机生成下标,用来选取卡牌
					int index = rand()%purple_len;
					// 根据随机出来的下标从紫卡中取出卡牌
					printf("【%s】\t",PURPLE_STAR_MM[index]);
					strcpy(my_cards[my_index],PURPLE_STAR_MM[index]);
					// 当前位置向后移动
					my_index ++;
				}

			}
			printf("\n");




		}else if(num==3){

			printf("请输入充值元宝数量:");
			int dom = 0;
			scanf("%d",&dom);

			// 将充值元宝数累加到元宝余额中
			money += dom;

			printf("您本次充值了【%d】元宝,当前元宝数量为【%d】元宝\n",dom,money );
			
		}else if(num==4){
			
			printf("当前手上的卡牌为:\n");
			for (int i = 0; i < my_index; ++i)
			{
				printf("【%s】\t",my_cards[i] );
			}
			printf("\n");
		}else {
			break;
		}

	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听潮阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值