掷骰子游戏设计需求分析.docx
- 文档编号:25295934
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:14
- 大小:18.67KB
掷骰子游戏设计需求分析.docx
《掷骰子游戏设计需求分析.docx》由会员分享,可在线阅读,更多相关《掷骰子游戏设计需求分析.docx(14页珍藏版)》请在冰豆网上搜索。
掷骰子游戏设计需求分析
一、掷骰子游戏设计需求分析…………………………1
二、类关系图和类成员函数……………………………3
三、模块的设计分析……………………………………4
四、存在的问题与不足及总结…………………………7
五、使用说明(操作手册)……………………………8
六、程序源代码…………………………………………9
一掷骰子游戏设计需求分析
一、掷骰子游戏需求:
1、假如有n个学生排成一圈,编号从1到n,每个人有初始积分,不防设为100。
2、从1号开始掷骰子,骰子出现后,根据点数减去掷骰人的相应积分,如减去10*(6-点数),然后根据点数多少,就依次向后数掷骰的点数同等数量的人,被数到的最后一个人继续掷骰子,计算积分,依此类推。
3、如果某人掷骰后,其积分小于等于0则出列,余下的人继续按照此法进行游戏,直到剩下最后一个人,为胜利者。
4、要求打印每次出列的人的编号,掷骰子的次数,当前积分。
并打印最后胜利者的相应信息。
5、要求用环链表以及类来实现这个程序。
6、选做:
问掷骰m次后,还剩下几个人积分多少,显示出来。
二、游戏实现方式:
为了实现游戏的上述功能,在整个程序的设计中构造了一个游戏类(classplayer)。
下面是游戏类(classplayer)的成员函数实现的功能:
1、成员函数Player(char*pName,intid)用于储存参赛者的姓名和他们的编号;
2、成员函数Player:
:
Integral(intnumber)用于计算参赛者的当前积分和掷骰子的次数。
3、成员函数Player:
:
Initial()用于创建参赛者的链表。
4、成员函数Player:
:
Game()用于判断是否要有参赛者出列并记录当前参赛者的信息和掷骰子的次数、点数。
5、成员函数Display()用于打印本次游戏打印每次出列的人的编号,掷骰子的次数和最后胜利者的相应信息。
二类关系图和类主要成员函数和成员变量
Player类
code;
count
score
name[20]
numOfPlayer
Player*head;
Player*next;
Player()
Integral()
Display()
~Player()
Initial()
Game()
code//每位参赛者的编号
count//每位参赛者掷骰子的次数
score//参赛者的积分
name[20]//参赛者的姓名
numOfPlayer//参加游戏总人数
三模块的设计分析
1.游戏类(classPlayer)的说明
1).构造函数Player(char*pName,intid)用于储存参赛者的姓名和他们的编号;
Player:
:
Player(char*pName,intid)
{
code=id;
score=100;
count=0;
strcpy(name,pName);
}
先是从程序中输入参赛者人数,通过DOS屏幕的提示依次输入参赛者的姓名,系统会自动给参赛者编号,而这些信息由构造函数Player储存。
2).Player:
:
Integral(intnumber)用于计算参赛者的当前积分和掷骰子的次数。
Player:
:
~Player()
{Player*t;
Player*p=head;
for(inti=1;i<=numOfPlayer;i++)
{t=p;
if(i!
=numOfPlayer)
{p=p->next;
}
deletet;
}
}
intPlayer:
:
Integral(intnumber)
{
count=count+1;
score-=(6-number)*10;
if(score<=0)
return0;
else
return1;
}
通过构造函数Integral()来计算参赛者的当前积分和掷骰子的次数。
另外该函数被后面的Game()函数调用,用于判断是否有参赛者出列。
3).析构函数Player:
:
~Player()。
因为分配了堆内存,所以当程序结束时要把空间给释放。
4).Player:
:
Initial()用于创建参赛者的链表。
Player*ps;//创建的结点指针
Player*pend;//链尾指针,用于在其后面插入结点
Player:
:
Initial()
{
intid;
intm;
Player*ps;
Player*pend;
while
(1)
{
cout<<"下面请输入参赛者人数:
";
cin>>m;
numOfPlayer=m;
for(id=1;id<=m;id++)
{
cout<<"请输入"< "; charpName[20]; cin>>pName; ps=newPlayer(pName,id);if(head==NULL) head=ps; else pend->next=ps; pend=ps; cout< } break; } pend->next=head; } ps=newPlayer(pName,id);//新建一个结点,准备插入链表 5).Display()用于打印本次游戏打印每次出列的人的编号,掷骰子的次数和最后胜利者的相应信息。 6).Player: : Game()用于判断是否要有参赛者出列并记录当前参赛者的信息和掷骰子的次数、点数。 srand((unsigned)time(NULL)); do { intnumOfdice;//骰子数 intq; staticintk=0; k++; q=rand(); numOfdice=q%6+1;//得到一个1-6的数 } 在函数中求掷骰子的点数时用到了随机函数的模块,下面的文本框为骰子点数功能的实现。 而函数中对链表的删除借鉴了书上的Josephus程序设计,另外删除链表条件的判断调用了上面的Player: : Integral函数。 四存在的问题与不足及总结 存在的问题与不足: 1、进行游戏时,系统总是显示出“内存不能读”的对话框; 2、选做的“问掷骰m次后,还剩下几个人积分多少,显示出来”没有成功,我当时做的时候出现了重新骰子数的情况,而不是打印出刚刚出现的掷骰m次后积分。 总结: 在本程序是我只创建了一个游戏类。 各个功能的实现是通过调用类中的静态函数得已实现的。 因为静态函数不仅可以不创建类对象也可以直接使用,并且可以访问类中的保护数据成员,所以基本的功能实现都是以类的静态函数来编写的。 程序都是用链表的方式做的,因为链表比起数组可以节省不必要的内存空间分配,可以仅当需要是再分配新的空间。 数组的空间分配是有限制的,而链表可以达到无限制的空间分配。 五掷骰子游戏使用说明书(操作手册) 用户首先进入软件界面主菜单: 1、按照屏幕的提示输入参赛人数; 2、同样按照提示输入参赛者的姓名; 3、按任意键游戏开始; 4、屏幕上将会打印出整个游戏过程中所有参赛者的信息,包括出列者的和最后胜利者的信息; 5、本次游戏结束后,如果想继续玩请输入‘Y’或‘y’,输入其他字符将退出游戏。 六程序源代码 #include usingnamespacestd; #include #include #include classPlayer { public: Player(char*,int); intIntegral(intnumber);//参赛者的积分函数 staticvoidInitial();//创建参赛者的链表 staticvoidGame();//参赛者 voidDisplay(); ~Player(); protected: intcode;//每位参赛者的编号 intcount;//每位参赛者掷骰子的次数 intscore;//参赛者的积分 charname[20];//参赛者的姓名 staticintnumOfPlayer;//参加游戏总人数 staticPlayer*head; Player*next; }; Player*Player: : head; intPlayer: : numOfPlayer; voidPlayer: : Initial() { intid; intm; Player*ps;//创建的结点指针 Player*pend;//链尾指针,用于在其后面插入结点 cout< <<"**************************************************\n\n" <<"欢迎进入掷骰子游戏\n\n" <<"**************************************************\n\n" <<"比赛规则: 每人初始积分为100分,从1号开始掷骰子,骰子出现后," <<"根据点数减去掷骰人的相应积分,如减去10*(6-点数),然后" <<"根据点数多少,就依次向后数掷骰的点数同等数量的人,被数到的" <<"被数到的最后一个人继续掷骰子,计算积分,依此类推。 " <<"如果某人掷骰子后,其积分小于等于0则出列,余下的人继续按照此法进行游戏,直到剩下最后一个人,为胜利者。 " < while (1) {cout<<"下面请输入参赛者人数: "; cin>>m; numOfPlayer=m; for(id=1;id<=m;id++) { cout<<"请输入"< "; charpName[20]; cin>>pName; ps=newPlayer(pName,id);//新建一个结点,准备插入链表 if(head==NULL) head=ps; else pend->next=ps; pend=ps; cout< } break; } pend->next=head; } Player: : Player(char*pName,intid) { code=id; score=100; count=0; strcpy(name,pName); } Player: : ~Player() { Player*t; Player*p=head; for(inti=1;i<=numOfPlayer;i++) { t=p; if(i! =numOfPlayer) {p=p->next; } deletet; } } intPlayer: : Integral(intnumber)//构造参赛者的积分函数 { count=count+1; score-=(6-number)*10; if(score<=0) return0; else return1; } voidPlayer: : Display()//打印参赛者信息 { if(score<=0) { cout< 经过本次掷骰子后,"< <<"号"< "< <<"分\n他掷过骰子的次数为: "< <<"次"< } else { cout< "< <<"号"< "< <<"分\n他掷过骰子的次数为: "< <<"次"< } } voidPlayer: : Game() { intj=0;//记录删除的人数; Player*pCurrent=head;//当前结点指针 Player*pviot;//链表哨兵 srand((unsigned)time(NULL));//随机函数 do {intnumOfdice;//骰子数 intq; staticintk=0; k++; q=rand(); numOfdice=q%6+1;//得到一个1-6的数 cout<<"第"< "< intdel=pCurrent->Integral(numOfdice); if(del==0)//判断是否要删除 {pCurrent->Display(); pviot->next=pCurrent->next; pCurrent=pviot; j++; } for(inti=1;i<=numOfdice;i++) { pviot=pCurrent; pCurrent=pCurrent->next; } intLeftNum=numOfPlayer-j;//剩下的人数 cout< <<"位,他们的信息为: "< Player*Guard=pCurrent; for(intn=1;n<=LeftNum;n++) { cout< " < Guard=Guard->next; } cout<<"********************************"< } while(j pCurrent->Display(); } voidmain() { charj; chary; Player: : Initial(); cout<<"输入任意字符游戏开始"< cin>>j; cout<<"游戏开始\n\n\n\n"; Player: : Game(); cout<<"想继续玩此游戏吗? 输入'y'或'Y'则继续,输入其他字符则退出游戏。 "< cin>>y; while(y=='y'||'Y') { if(y=='y') {Player: : Initial(); cout<<"输入任意字符游戏开始"< cin>>j; cout<<"游戏开始\n\n\n\n"; Player: : Game(); } break; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 骰子 游戏 设计 需求 分析