C++课程设计福彩游戏设计报告.docx
《C++课程设计福彩游戏设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计福彩游戏设计报告.docx(21页珍藏版)》请在冰点文库上搜索。
C++课程设计福彩游戏设计报告
南京理工大学VC++课程设计报告
课程:
VC++课程设计
选题名称:
福彩游戏
一、程序设计要求
(1)定义一个福彩类,封装计算机开出的大奖号码及开奖过程函数和输出大奖号码的函数。
(2)定义一个用户类,封装用户输入的数字和用户所拥有的彩金。
初始化彩金为100元。
每次下注2元,可以多次下注,具体赢得大奖或二等、三等奖的奖金由自己设置,累加到用户的彩金中;二等奖或三等奖的规则也由自己设置。
其中,用户的输入的数字与福彩号码的比较函数定义为福彩类的友元函数。
(3)程序只要不选择退出且彩金允许就可以反复下注。
二、程序设计思想
(1)类的封装
改程序的数据结构比较简单,主要数据就是彩金和大奖号码,因此,只要将与这两个数字相关的操作封装起来即可。
classCCustomer//定义用户类
{
private:
intnMoney;//用户彩金
intnRank;//中奖的等级
intWelfare[6];//福彩投注号码
public:
CCustomer();//构造函数
intSetWelfare();//接收福彩投注,成功返回1
voidCompare(CWelfareLot&);//比较福彩,赋值中奖等级
voidShow();//根据中奖等级计算奖金,输出结果
};
classCWelfareLot//定义福彩类
{
private:
intLotNum[6];//大奖号码
public:
CWelfareLot();//构造函数
voidSetLot();//开奖过程
voidPointLot();//输出大奖号码
friendvoidCCustomer:
:
Compare(CWelfareLot&);
};
(2)开奖过程的编写
原程序的开奖过程比较简单,只是输出随机数结果,没有一般摇奖的效果,可以将程序加以改进,使随机数不断变换显示,最后停在大奖号码上,这样效果更加逼真。
voidCWelfareLot:
:
SetLot()
{intnRnd,nNum;
for(inti=0;i<6;i++)//要开出6个数字
{nRnd=rand();//随机取循环次数,数字变换的时间长度是随机的
for(intj=0;j{nNum=rand()%21;//随机取0~20之间的数字进行变化
if(nNum<10)
cout<else
cout<}
cout<LotNum[i]=nNum;//变换到最后的数字即为大将数字
}
(3)程序的进一步改进
①原程序要求玩家提供计算机随机数的种子,但如果种子固定,那么产生的随机数也固定,大奖的号码每次都相同,达不到原游戏的目的。
我们还是用当前的时间作为随机数种子去顺序产生随机值,使得大奖号码都是随机的。
②如果大奖号码纯粹是随机数,那么玩家获得大奖几乎是不可能的,所有的玩家玩家都希望在游戏中找到乐趣,所以可以将游戏稍稍改进一下,用指定的用户名和密码进入,首先预定好大奖号码,开奖的操作照常进行,只不过停止变换后显示的数字是我们预定的,这样就可以使您成为虚拟世界的百万富翁!
三、关键源代码注解
Ⅰ定义用户类:
classperson//用户类
{
private:
charcode[20];//用户输入的数字
intmoney;//用户拥有的彩金
friendclassGame;//将输入数字作为福彩类的友元函数
};
Ⅱ定义福彩类私有成员:
classGame//福彩类
{
private:
intplay;//记录游戏者当前所在的局数
intball;//记录游戏者总共玩的局数
intscore;//记录游戏者赢的局数
charname[20];//储存游戏者的姓名
charReply2;//储存游戏者输入的字符y或n
intseed;//储存游戏者输入的幸运数字
intPowerBall;//储存游戏者输入的PowerBall数字
inttotal;//记录游戏者得的总分数
intlevel;//储存游戏者所选的数字范围
intrule;//储存游戏者所选的游戏规则
inttruematch[6];//记录每个数字得的分数
intnum[5];//记录游戏者输入的whiteballl数字
intcp_num[6];//储存电脑所产生的随机数
intbet;//赌注
intx;//记录游戏等级
charReply3;
Ⅲ定义福彩类公有成员并构造相应函数:
public:
Game()//构造函数初始化赌资,游戏者当前所在的局数,游戏者总共玩的局数,游戏者赢的局数
{
player.money=100;play=1;ball=0;score=0;
}
voidgameboy1()//初始化姓名
{
cout<cout<<"请输入您的姓名:
[1to20characters]:
";
cin.getline(name,20);
cout<}
voidset()//设置密码
{
cout<<"您是否要设置密码[yorn]:
"<charreply5;
cin>>reply5;
if(reply5=='y'||reply5=='Y')
{
charch;
inti=0;
cout<<"请设置高级玩家密码:
";
cout.flush();//清输出缓冲区
ch=getch();
while(ch!
='#')//当输入#字符时循环结束
{
player.code[i++]=ch;
cout<<'*';
cout.flush();
ch=getch();
}
player.code[i]=0;
cout<<"\t\t密码载入中,请稍候........"<wait(2000);//真实性处理
system("cls");//执行系统命令,清屏
}
elsestrcpy(player.code,"1111");
cout<}
voidmenu()//选择游戏规则
{
cout<<"#游戏规则#"<cout<<"1大奖:
当输入的6个数字全部匹配时游戏者赢!
若赢您可获得所下赌注三倍的奖金,若输您将失去同样多的金额!
"<cout<<"************************************************************";
cout<<"2二等奖:
当输入的6个数字中至少有4个匹配时游戏者赢!
若赢您可获得所下赌注两倍的奖金,若输您将失去同样多的金额!
"<cout<<"************************************************************";
cout<<"3三等奖:
当输入的6个数字中至少有2个匹配时游戏者赢!
若赢您可获得与您所下赌注相等的奖金,若输您将失去同样多的金额!
"<cout<cout<";
cin>>x;//输入所选的游戏规则
while(x!
=1&&x!
=2&&x!
=3)//判断输入的数字是否合乎要求
{
cout<<"请重新选择!
1or2or3"<cin>>x;//重新输入数字
}
switch(x)//根据输入的数字来确定游戏规则
{
case1:
rule=6;break;
case2:
rule=4;break;
case3:
rule=2;
}
cout<<"数据载入中,请稍侯……"<wait(2000);//真实性处理
system("cls");//执行系统命令,清屏
}
void_level()//选择游戏的难易程度
{
cout<<"#游戏难易程度说明#"<cout<<"e:
简单,在1--20中选择号码!
"<cout<<"h:
困难,在1--40中选择号码!
(若赢奖金在原基础上增加一倍哦!
)"<cout<cout<";
cin>>Reply3;
while(Reply3!
='e'&&Reply3!
='h')//判断输入的字符是否合乎要求
{
cout<<"请重新输入!
eorh"<cin>>Reply3;//重新输入字符
}
switch(Reply3)//根据输入的字符初始化数字范围确定游戏难易
{
case'e':
level=20;break;
case'h':
level=40;
}
}
intgetgamenbr()//根据时间初始化随机数种子并产生随机数
{
intran;
srand((unsigned)time(NULL));
ran=rand()%level+1;//在已确定的范围内产生随机数
return(ran);
}
voidwait(intmilli)//延时函数,产生多个种子
{
clock_tstart;
start=clock();
while((clock()-start)}
void_show()//设置游戏提示信息
{
cout<<"-------------------------------\n";
cout<<"*欢迎来到福彩中心!
祝您好运!
*\n";
cout<<"-------------------------------\n";
cout<cout<<"#游戏说明#\n";
cout<<"1.本游戏设置了普通玩家与高级玩家,高级玩家可设定大奖号码;"<cout<<"2.高级玩家密码可先设定,不设则采用默认密码(1111)."<}
voidBET()//设置赌注
{
cout<<'\n';
cout<<"您拥有金钱:
¥"<cout<<"请输入您的赌注金额:
¥";
cin>>bet;
if(bet<0)
{
bet=bet*(-1);
}
system("cls");//执行系统命令,清屏
}
voidmoney_show()
{
cout<}
voidsetlot()//开奖过程
{
intnr,nn;
for(inti=0;i<6;i++)
{
nr=rand();
for(intj=0;j{
nn=getgamenbr();//调用成员函数来产生随机数
if(nn<10)
cout<else
cout<}
cout<cp_num[i]=nn;//将随机数储存在一维数组cp_num[i]中
wait(800);
}
}
voidgameover()//游戏结束并显示信息结束程序
{
cout<<’\n’<谢谢你的参与!
:
-)"<exit
(1);//结束程序
}
void_do()//游戏的执行函数
{
_show();
gameboy1();
set();
do
{menu();
system("cls");//执行系统命令,清屏
_level();
Game:
:
BET();
cout<<"\n"<cout<<"\n";
intj;//记录循环次数
for(j=0;j<5;j++)
{
cout<<"输入球号码#"<";
while(!
(cin>>num[j]))//检验输入的字符是否符合条件
{
cin.clear();//清除错误字符
while(!
(cin.get()=='\n'))//提取完在缓冲区中的字符或字符串
continue;
cout<<"对不起,您输入的数字不符合要求!
请在1--"<\n";//显示重新输入的提示信息
cout<<"输入球号码#"<";
}
if((num[j]<1))//检验输入的数字是否小于确定范围中的最小值
{
cout<<"对不起,您输入的号码小于1!
请在1--"<\n";//显示重新输入的提示信息
j--;
}
if((num[j]>level))//检验输入的数字是否大于确定范围中的最大值
{
cout<<"对不起,您输入的号码大于"<请在1--"<\n";//显示重新输入的提示信息
j--;
}
}
cout<";//显示出要求玩家输入PowerBall号码的提示信息
cin>>PowerBall;//输入PowerBall号码
charans;
cout<<'\n';
cout<<"是否要成为高级玩家:
[yorn]";
cin>>ans;
intpanduan=0;
if(ans=='Y'||ans=='y')
{
chargao[20];//验证密码
charch;
inti=0;
cout<<"请输入高级玩家验证密码(以#字符结束):
";
cout.flush();//清输出缓冲区
ch=getch();
while(ch!
='#')//当输入#字符时循环结束
{
gao[i++]=ch;
cout<<'*';
cout.flush();
ch=getch();
}
gao[i]=0;
if(!
strcmp(player.code,gao))//默认密码处理
{
wait(2000);
cout<<"\t\t您已通过密码验证"<cout<cout<<"请输入六个数字作为大奖号码"<for(intj=0;j<6;j++)
cin>>cp_num[j];
panduan=1;
}
elsecout<<"\t\t密码错误"<}
if(panduan==0)setlot();//调用开奖成员函数产生随机数
//调用成员函数来检验玩家输入的数字是否与电脑产生的随机数相匹配并将得分储存在数组truematch[6]中
truematch[0]=isMatch(num[0],cp_num);
truematch[1]=isMatch(num[1],cp_num);
truematch[2]=isMatch(num[2],cp_num);
truematch[3]=isMatch(num[3],cp_num);
truematch[4]=isMatch(num[4],cp_num);
truematch[5]=isMatch(PowerBall,cp_num);
total=(truematch[0]+truematch[1]+truematch[2]+truematch[3]+truematch[4]+truematch[5]);//计算总得分
//显示游戏结果
system("cls");//执行系统命令,清屏
cout<<"\n*********";
cout<<"\n第"<cout<<"\n*********\n";
cout<<"\n";
//显示电脑产生的随机数
cout<<"电脑产生的号码为:
"<cout<<"---------------------------------------------------------------------------\n";
//显示玩家选择的数字
cout<"<cout<<"---------------------------------------------------------------------------\n";
//显示玩家选择的各个数字的得分情况
cout<"<//显示玩家的总得分
cout<<"\n猜中总数为:
"<if(total>=rule)//根据总分判断玩家是否赢得此局
{
cout<<"恭喜"<<",您赢了!
!
"<score++;//记录赢的局数
switch(Reply3)//计算玩家剩余金额
{
case'e':
player.money=player.money+(bet*(4-x));
cout<<"您的剩余金额为"<case'h':
player.money=player.money+(bet*(4-x)*2);
cout<<"您的剩余金额为"<}
}
else
{
switch(Reply3)
{
case'e':
player.money=player.money-(bet*(4-x));
break;
case'h':
player.money=player.money-(bet*(4-x)*2);
break;
}
cout<<"对不起"<<",您输了!
"<cout<<"您的剩余金额为"<}
cout<<"\n*************************************************\n";
if(player.money<=0)//判断是否还有赌本
{
cout<<"对不起,您没有赌本了!
";
ball++;
break;
}
else
{
cout<[yorn]"<cin>>Reply2;//输入字符以确定是否要继续
play=play+1;//局数加一
ball++;//记录总共玩的局数
}
}
while(Reply2=='y'||Reply2=='y');//当输入'y'字符时继续游戏否则循环结束
gameover();
}
friendintisMatch(inttest,intcp_num[]);//将用户的输入的数字与福彩号码的比较函数定义为福彩类的友元函数
};
intisMatch(inttest,intcp_num[])//test为所要判断的数字
{
intmatch=0;//记录得分
for(inti=0;i<6;i++)//与电脑产生的所有数字对比
if(test==cp_num[i])match=1;//如果匹配则得分为1
cout<<"\n";
returnmatch;//返回得分值
}
Ⅳ主函数:
voidmain(void)//主函数
{
Gameplayer1;//建立对象
player1._do();//游戏的执行过程
}
四、设计过程中遇到的问题及解决办法
(1)用当前时间作为随机数种子产生的随机数相同。
时间间隔太小,将wait函数中的暂停时间延长
(2)虽然有开奖效果,但开出的数与产生的随机数不同。
开奖函数中取了一次随机数,函数外又以时间为种子取了一次随机数,两次操作独立开了,将开奖函数中的取随机数改为以时间为种子,删除函数外的
(3)游戏进行中如果游戏者成为高级玩家,那么大奖号码由玩家自己定,不需要电脑产生随机数作为大奖号码,所以在程序执行过程中就需要跳过产生随机数的函数,开始我使用goto成功跳过了随机数函数,但将用户输入的数字与福彩号码的比较函数定义为福彩类的友元函数后编译出现了问题,无法调用该函数。
不使用goto,增加一个if比较函数,如果返回值是1,则执行随机数函数,否则