前言
在很多游戏或活动中,都有抽奖系统,但这些抽奖系统概率都似乎比较感人 ,所以与其期待得到奖励,不如自制一个抽奖系统
废话不多说,我们进入正题
过程
第一步 建一个随机数函数
如果直接使用rand()函数,生成的数是算法算出来的,是伪随机数
所以,我们需要一个srand声明
程序如下:
int suiji(const int n){
srand((unsigned)time(NULL));
return rand()%n; //rand()%n指生成0~n-1的随机数,后文的程序中不用担心数组越界
}
第二步 确定元素个数、输入每个元素
建立变量n,输入变量n,开一个a[n]大小的字符串数组,再逐步输入每个元素
如果是做游戏抽奖,这些可以是静态的,我这里做一个动态的案例
程序如下:
int n;
cout<<"输入元素总数(不要输入大于2147483647或小于-2147483648的数,会让程序卡住):"; //2147483647、-2147483648分别是int型变量的最大值 、最小值
cin>>n;
string a[n]; //动态字符串数组储存元素
cout<<"输入每个元素:\n";
for(int i=0;i<n;++i) cin>>a[i];
但是我们开的数组大小不能小于等于0,所以还需要在cin>>n和string a[n]之间加一段判断,如果n<=0,给出错误提示并返回输入n
程序如下:
f:
cout<<"输入元素总数(不要输入大于2147483647或小于-2147483648的数,会让程序卡住):"; //2147483647、-2147483648分别是int型变量的最大值 、最小值
cin>>n;
if(n<=0){
cout<<"\n\n\n元素数量必须大于0,请重新输入\n\n\n"; //错误提示
goto f;
}
如果想使抽奖更生动,可以在输入n前面加一段输入题目
程序如下:
string s;
cout<<"输入题目:"; //题目
cin>>s;
第三步 输出随机的元素
输出元素中的第随机项
程序如下:
cout<<"抽到的元素:"<<a[suiji(n)]<<"\n"; //随机输出元素
完整程序
#include<bits/stdc++.h>
using namespace std;
int suiji(int n){
srand((unsigned)time(NULL));
return rand()%n;
}
int main(){
int n;string s;
cout<<"输入题目:"; //题目
cin>>s;
f:
cout<<"输入元素总数(不要输入大于2147483647或小于-2147483648的数,会让程序卡住):"; //2147483647、-2147483648分别是int型变量的最大值 、最小值
cin>>n;
srand(n);
if(n<=0){
cout<<"\n\n\n元素数量必须大于0,请重新输入\n\n\n"; //错误提示
goto f;
}
string a[n]; //动态字符串数组储存元素
cout<<"输入每个元素:\n";
for(int i=0;i<n;++i) cin>>a[i];
cout<<"抽到的元素:"<<a[suiji(n)]<<"\n"; //随机输出元素
return 0;
}
程序的优化
1.抽奖时的动画
输入完所有元素后,可以加一段动画
最简单的就是提示抽奖中,然后等待一段时间,再给出结果
程序如下:
cout<<"\n\n\n抽奖中...";
Sleep(1000); //需调用<windows.h>
2.保底
没有保底的抽奖系统是三国杀的抽奖机制(doge)
所以,我们做游戏抽奖的时候,还得加一段保底机制,没有抽到大奖时,幸运值+1,在幸运值满之前一直没抽到大奖,则这回必抽到大奖,同时幸运值清零
案例:
int a=rand()%100;
if(a<=49&&luck<33){cout<<"\n\n\n恭喜抽到C级道具!\n\n\n";luck++;}
else if(50<=a&&a<=79&&luck<33){cout<<"\n\n\n恭喜抽到B级道具!\n\n\n";luck++;}
else if(80<=a&&a<=96&&luck<33){cout<<"\n\n\n恭喜抽到A级道具!\n\n\n";luck++;}
else if((luck>=33)||(a>=97)){
cout<<"\n\n\n恭喜抽到S级道具!\n\n\n";
luck=0; //这里的幸运值需在前面的程序定义
}
完整的程序
我这里有一个案例供大家参考(案例有参考猫鼠的魔镜,但肯定比猫鼠的良心)
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int main(){
string s;
char c;
int luck=0;
srand(100);
f:
printf("幸运值:%d 干点什么? 1.开始抽奖 0.结束抽奖",luck);
cin>>c;
switch(c){
case '1':{
f_:
printf("\n\n\n幸运值:%d 输入任意字符串开始抽奖(输入0退出):",luck);
cin>>s;
if(s=="0"){
cout<<"\n\n\n结束抽奖\n\n\n";
Sleep(500);
goto f;
}
else{
cout<<"\n\n\n抽奖中...";
Sleep(1000);
int a=rand()%100;
if(a<=49&&luck<33){cout<<"\n\n\n恭喜抽到C级道具!\n\n\n";luck++;}
else if(50<=a&&a<=79&&luck<33){cout<<"\n\n\n恭喜抽到B级道具!\n\n\n";luck++;}
else if(80<=a&&a<=96&&luck<33){cout<<"\n\n\n恭喜抽到A级道具!\n\n\n";luck++;}
else if((luck>=33)||(a>=97)){
cout<<"\n\n\n恭喜抽到S级道具!\n\n\n";
luck=0;
}
system("pause");
system("cls");
goto f_;
}
}
case '0':{
cout<<"\n\n\n即将退出\n\n\n";
Sleep(500);
return 0;
}
default:
cout<<"\n\n\n输入错误...\n\n\n";
goto f;
}
}
结束语
程序虽简单,但希望能帮助到大家,谢谢!