杀人游戏.docx
《杀人游戏.docx》由会员分享,可在线阅读,更多相关《杀人游戏.docx(9页珍藏版)》请在冰豆网上搜索。
杀人游戏
课程设计说明书
课程名称:
《算法分析与设计》课程设计
设计题目:
杀人游戏
2011年12月6日
1.设计背景
1.1问题描述
周末晚上,N个人围成一圈玩杀人游戏,按顺时针编号1,2,3,4,5……..,A是杀手,构思了他的杀人计划:
A从1号开始顺时针数到第M号就杀掉第一个人,被杀掉的人要退出游戏。
如果第M个人恰好是A自己,他就杀掉他顺时针方向的下一个人。
A从被杀的人的下一个顺时针数M个人,把第M个人杀掉。
重复以上过程,直至杀掉所有人。
A把这个杀人计谋告诉了法官,法官告诉了警察,警察应该如何选择座位才能活到最后?
1.2开发环境和工具
该职工管理系统系统是在VisualC++6.0集成环境下和WindowsXP操作系统平台下开发的。
1.3开发语言
该职工管理系统使用C语言开发,C语言是一种计算机程序设计语言。
它既具有高级语言的特点,又具有汇编语言的特点。
它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
2.设计方案
2.1程序执行流程
以五人参与游戏为例,假设A选择1号为,每隔3个人杀掉一个人,过程如下:
(1)刚开始位置
(2)第一次三号位被杀
(3)转到一号位,一号位是A,转到下一个,2号位被杀
(4)因为三号以被杀,从四号还是转,转到一号位跳过,四号被杀
(5)剩余五号位,警察应该选择五号位与杀手A对决
2.2数据结构设计
1.每个玩家的数据结构设计,应包括座位号,以及状态。
2.在游戏进行时,考虑到第M个事杀手或者已死亡,需要计数器加一。
于是设计动态数组用来作为玩家,存储座位号和状态,如下:
typedefstruct{
intlength;//length待指N
int*flag;//flag为1,表示为未被杀。
为0表示被杀。
2表示为杀手
int*seat;//seat用于保存座位序号
}Player;
2.3函数功能设计
1、初始化
2、进行杀人过程
3、被杀者的状态
4、判断是否跳过
3.方案实施
3.1初始化函数
intInitPlayer(Player&Lp,intn)//初始化
{
Lp.flag=(int*)malloc(n*sizeof(int));
Lp.seat=(int*)malloc(n*sizeof(int));
if(!
Lp.flag||!
Lp.seat)exit(-2);
Lp.length=0;
return1;
}
3.2进行杀人过程
每杀死一个人,便有一人退出,于是首先考虑到递归算法,初步设计递归函数如下:
intKillMan(Player&Lp,intm,inta,intdead,inttemp)
//intN,inta,intm,intdeadN,a,m分别与main中定义照应,
{
if(temp>2)//dead表示当前被杀死的人座位号
{
dead=DeletePlayer(Lp,m+dead);//DeletePlayer(Lp,m+dead)为杀人函数
temp--;//每杀死一人,计数器temp就减1.
KillMan(Lp,m,a,dead,temp);
}
Else//表示除了杀手外只剩下警察,结束递归
{
for(intn=0;n{
if((Lp.flag[n]==1)&&(Lp.seat[n]!
=a))
{
returnn;//返回警察应该选择的座位号。
}
}
}
}
3.3被杀者的状态
递归设计好后,开始设计DeletePlayer()函数,考虑到第M个人可能是杀手或者已死亡,于是设计跳过函数JumpNext()函数,对第M号进行判断。
intDeletePlayer(Player&Lp,inti)//杀死后节点flag=0;
{
i=JumpNext(Lp,i);//检测i是否已经被杀,是否是a,是否大于N。
Lp.flag[i-1]=0;//座位号码为i,设置其flag为0,表示已死亡
printf("Player%dwasdead!
\n",Lp.seat[i-1]);
returni;//返回当前被杀死的座位号。
以进行下一轮。
}
3.4判断是否跳过
杀手杀人函数设计完成后着手设计跳过函数JumpNext(),要跳过杀手,跳过已死亡玩家,由于再设计递归时,采用的是圆圈循环结构,所以要对座位号进行判断,因为当前死亡座位号加上间隔M,可能大于总人数。
所以设计函数如下:
intJumpNext(Player&Lp,inti)
{
while(i>Lp.length)//首先对当前死亡座位号+M判断,大于总人数则
{//减去总人数,直到小于总人数。
i=i-Lp.length;
}
while(Lp.flag[i-1]==0||Lp.flag[i-1]==2||i>Lp.length)
//判断是否已死亡,或者是杀手,则+1,
{
i++;
if(i>Lp.length)//如果+1后大于总人数,则减去总人
i=i-Lp.length;//数,继续判断,直到符合规定。
}
returni;//返回处理后的i值
}
4.结果与结论
4.1出入初始状态
4.2杀人过程及结果
5.收获与致谢
在本次课程设计中,独立完成了杀人游戏算法与算法实现等模块设计,对算法使用有了更深一层次的理解。
经过调试实现了以上模块的功能。
该课程设计还有很多不足之处,例如算法结构不够简洁。
本次课程设计之中,遇到很多问题,在所有成员的努力下,把问题一一解决,共同完成了一个杀人游戏实现过程,同时也提升每个成员自身解决问题与他人合作的能力。
6.参考文献
[1]《C程序设计教程》谭浩强编著(清华大学出版社2008)
[2]《算法与分析》(C语言版)严蔚敏吴伟民编著(清华大学出版社2007)
[3]《C程序设计(课程设计)》刘振安刘燕君编著(机械工业出版社2004.9)
7.附件
killman.rar
指导教师评语:
1、课程设计报告:
a、内容:
不完整□完整□详细□
b、方案设计:
较差□合理□非常合理□
c、实现:
未实现□部分实现□全部实现□
d、文档格式:
不规范□基本规范□规范□
2、出勤:
全勤□缺勤次
3、答辩:
a、未能完全理解题目,答辩情况较差□
b、部分理解题目,部分问题回答正确□
c、理解题目较清楚,问题回答基本正确□
d、理解题目透彻,问题回答流利□
课程设计报告成绩:
,占总成绩比例:
50%
课程设计其它环节成绩:
环节名称:
出勤,成绩:
,占总成绩比例:
20%
环节名称:
答辩,成绩:
,占总成绩比例:
30%
总成绩:
指导教师签字:
年月日