算法分析课程设计.docx
《算法分析课程设计.docx》由会员分享,可在线阅读,更多相关《算法分析课程设计.docx(31页珍藏版)》请在冰点文库上搜索。
算法分析课程设计
姓名挑战游戏
1、课程设计的目的
学习算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。
课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。
经过查找参考资料、技术手册和撰写文档的实践,进一步培养软件工程师的综合素质。
2、课程设计的技术要求
同学在处理每一个题目的时候,要从分析题目的需求入手,按设计抽象数据类型、构思算法、通过类的设计实现抽象数据类型、编制上机程序代码并调试的步骤完成题目,最终写出完整的分析报告。
见到题目,案头工作准备不足,忙于上机敲程序不是优秀程序员的工作风格。
注意设计与实现过程的经验积累,编码应尽量利用前阶段的成熟数据结构包,加大代码的重用率。
课程设计所安排的题目,在难度和深度方面都大于课内的上机训练。
程序作业以Java完成,配有图形界面。
作业一般要达到3000行以上的代码量。
最后提交作业包括:
课程设计报告;完整程序,应该具有可显示界面;PPT及算法说明。
3、题目分析
姓名挑战游戏说明:
输入两个中文姓名,通过一种算法,计算出姓名的血值和攻击力,使两个名字进行对战,进行多轮回合后,决定双方输赢。
在运行界面中输入两个挑战者的姓名,软件就会计算出两个挑战者初始状态的血值和攻击力之类的属性值。
然后两个挑战者一边挑战,系统会自动显示目前两个挑战者的一系列属性。
两个人一直挑战,直到其中一者的hp的值为0,则挑战结束,并且hp为0的一方失败。
4、部分程序分析
4.1角色属性定义
publicclassRole{
Stringplayname;//角色名字
inthp;//生命值
intap;//攻击力为ap
intdp;//防御力为dp
intrate;//攻击速度
inthitRate;//命中率
intluck;//运气
int[]array=newint[4];//名字数组
StringAttack_Action="";//攻击的动作字符串
StringRecovery_Action="";//防御的动作字符串
intAttact_Point=0;//攻击的点数
intRecovery_Point=0;//抵御的点数
4.2构造函数
publicRole(Stringname,int[]getArray){
array=getArray;
playname=name;
setAttribult();
}
4.3输入挑战者姓名后角色属性值统计
在运行界面上输入两个挑战者的姓名后,界面就会自动统计每个挑战者的生命力hp,攻击力ap,防御力dp,攻击速度rate,命中率hitrate,运气luck。
publicvoidgetAttribult(){
System.out.println(playname+"的属性:
");
System.out.println("生命值hp="+hp);
System.out.println("攻击力attack="+ap);
System.out.println("防御力recovery="+dp);
System.out.println("攻击速度rate="+rate);
System.out.println("命中率hit="+hitRate);
System.out.println("运气luck="+luck);
}
4.4设置角色属性
publicvoidsetAttribult(){
hp=addFun(4)/500;
ap=100-addFun(0)/1900;
dp=100-addFun
(1)/2100;
rate=100-addFun
(2)/2100;
hitRate=100-addFun(3)/2400;
luck=100-addFun(4)/1700;
}
publicintaddFun(intindex){
intres=0;
for(inti=0;i<4;i++){
if(i!
=index){//剔出掉vindex指向的数
res+=array[i];
}
}
returnres;
}
4.5设置挑战期间各种攻击后各个值的属性
publicintchang(){//设置中毒的属性
ap=ap-10;
hitRate=hitRate-10;
luck=luck-10;
rate=rate-10;
dp=dp-10;
return0;
}
设置10个实例来演示两个挑战者在挑战期间的动作,例如:
A向B发动攻击;B向A发动攻击;A冲上前狂咬B一口;A发狂对B暴打一顿;A向B发动攻击,结果摔倒在地;A诅咒B;A向B投毒等。
publicStringuseAp(intindex,Stringplayname1,Stringplayname2){
switch(index){
case0:
Attack_Action="【"+playname1+"】向"+"【"+playname2+"】发动攻击";
Attact_Point=25;
case1:
Attack_Action="【"+playname1+"】向"+"【"+playname2+"】发动攻击";
Attact_Point=20;
case2:
Attack_Action="【"+playname1+"】向"+"【"+playname2+"】发动攻击";
Attact_Point=10;
case3:
Attack_Action="【"+playname1+"】向"+"【"+playname2+"】发动攻击";
Attact_Point=15;
break;
case4:
Attact_Point=18;
Attack_Action="【"+playname1+"】向进行"+"【"+playname2+"】连击";
break;
case5:
Attact_Point=20;
Attack_Action="【"+playname1+"】冲向前狂咬"+"【"+playname2+"】一口";
break;
case6:
Attact_Point=-18;
Attack_Action="【"+playname1+"】向"+"【"+playname2+"】发动攻击,结果摔到在地";
break;
case7:
Attact_Point=18;
Attack_Action="【"+playname1+"】向"+"【"+playname2+"】投毒";
break;
case8:
Attact_Point=25;
Attack_Action="【"+playname1+"】发狂对"+"【"+playname2+"】进行暴打一顿";
break;
case9:
Attact_Point=30;
Attack_Action="【"+playname1+"】 诅咒 "+"【"+playname2+"】";
break;
}
return"";
}
publicStringuseDp(intindex){//使用防御力
return"";
}
publicStringuseHitRate(intindex){//使用命中率
return"";
}
publicStringuseHp(intindex){//使用生命值
return"";
}
publicStringuseLuck(intindex){//使用运气
return"";
}
publicStringuseRate(intindex){//使用速度
return"";
}
5、实验总结
学习每门课程都要学以致用,学习算法设计与分析这门课程是要培养我们自己设计算法的能力。
编程不可以一拿到题目就盲目的编程,而是要先分析题目,思考解决这个问题最优的算法,选定算法后才开始进行初步的编程。
这次课程设计要求代码不少于三千行,我对于我们而言是个极其艰巨的任务。
除了自己构思以外,我们还上网查找了部分代码,把别人的代码和我们自己的合并在一起,最后我们都懂得了所有代码的意思,并且代码运行成功,实现了姓名挑战游戏的基本功能,比如说两个挑战者的挑战过程和结果。
虽然最后实现了这个游戏的功能,但是我们也只可以说是成功了一半。
因为我们的代码还没有达到三千行,并且游戏没有很好的显示界面,还需要多花时间进行更多的改进。
通过这次课程设计,我们还是学会了很多东西,比如怎么设计一个合适的算法,怎样开始编程之类的,把所学的思想成功的运用到了实践中。
6、参考文献
1.王晓东,《算法设计与分析》,清华大学出版社。
附录
MainGame.java
packagePK;
publicclassMainGame{
staticGameWorldgworld;
publicMainGame(){
}
/**
*主函数
*/
publicstaticvoidmain(String[]args){
if(gworld==null){
gworld=newGameWorld();
gworld.starThread();
}
}
}
InputFun.java
packagePK;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
publicclassInputFun{
Stringname="";
/**
*
*@返回值String
*@说明用于获得用户的输入
*/
publicStringinput(){//获得用户的输入
BufferedReaderbr1=newBufferedReader(
newInputStreamReader(System.in));
try{
name=br1.readLine();
}catch(IOExceptione){
e.printStackTrace();
}
returnname;
}
/**
*
*@作者孙林娟刘术徐赫
*@返回值int[]
*@说明转化姓名为一个唯一的数组
*/
publicint[]changInt(Stringgetname){
int[]array=newint[4];
while(getname.length()<4){
getname+="";
}
intres=0;
for(intk=0;k<4;k++){
Strings=getname.substring(k,k+1);
res=s.hashCode();
if(res<1000){//当输入为英文或则是英文空格的时候默认的给转化过的值加2000
res+=20000;
}
array[k]=res;
}
returnarray;
}
}
GameWorld.java
packagePK;
importjava.util.Random;
publicclassGameWorldimplementsRunnable{
/**用户名*/
privateStringname1,name2;
/**输入方法*/
InputFunifun=newInputFun();
/**两个角色*/
Roler1,r2;
/**随机数*/
Randomr=newRandom();
/**线程*/
Threadthread;
/**攻击的动作字符串,防御的动作字符串*/
StringAttack_Str="",Recovery_Str="";
/**攻击的点数,抵御的点数*/
intoperter1=0,operter2=0;
/**一个循环变换角色攻击的变量*/
booleanloop=true;
/**投毒的标志*/
privatebooleanispoisoning;
/**由人明而转换而来的数组*/
int[]array1,array2;
publicGameWorld(){
init();
r1=newRole(name1,array1);
r2=newRole(name2,array2);
getRuleAttribult();
System.out.println("比赛开始GO~~");
}
/**
*
*@返回值void
*@说明一个初始化的方法,初始决斗的玩家的属性
*/
publicvoidinit(){
array1=newint[4];
array2=newint[4];
System.out.println("人名PK大战");
System.out.print("请输入挑战者的名字:
");
name1=ifun.input();//接收玩家的输入
array1=ifun.changInt(name1);
System.out.print("请输入被挑战者的名字:
");
name2=ifun.input();
array2=ifun.changInt(name2);
}
/**
*
*@返回值void
*@说明启动游戏的线程
*/
publicvoidstarThread(){
if(thread==null){
thread=newThread(this);
thread.start();
}
}
/**
*
*@返回值void
*@说明获得两个人的属性
*/
publicvoidgetRuleAttribult(){
r1.getAttribult();
r2.getAttribult();
}
/**
*
*@返回值void
*@说明最后的结果
*/
publicvoidgetResule(){
System.out.println("******************************");
if(r1.hp<=0){
if(r1.hp==0){
System.out.println("【"+r1.playname+"】被打败了.");
}else{
r1.hp=0;
System.out.println("【"+r2.playname+"】真残忍真想把【"+r1.playname
+"】榨干血啊.");
}
}elseif(r2.hp<=0){
if(r2.hp==0){
System.out.println("【"+r2.playname+"】被打败了.");
}else{
r2.hp=0;
System.out.println("【"+r1.playname+"】真残忍真想把【"+r2.playname
+"】榨干血啊.");
}
}
System.out.println("******************************");
getRuleAttribult();//得到最后的属性
}
/**
*
*@参数
*@paramrule1
*@参数
*@paramrule2
*@返回值void
*@说明游戏的循环方法
*/
publicvoidupdate(Rolerule1,Rolerule2){
rule_Attack(rule1,rule2);
rule_Recovery(rule1,rule2);
}
/**
*
*@参数
*@paramrule1
*@参数
*@paramrule2
*@返回值void
*@说明攻击的方法
*/
publicvoidrule_Attack(Rolerule1,Rolerule2){
intstate=rule1.ap;
intvalue=getRandom();
value=(state+value)/10/2;//把属性和随机数相加再除二,得到一个在属性范围内的新数
switch(value){
case0:
Attack_Str="【"+rule1.playname+"】向"+"【"+rule2.playname
+"】发动攻击";
operter1=25;
case1:
Attack_Str="【"+rule1.playname+"】向"+"【"+rule2.playname
+"】发动攻击";
operter1=20;
case2:
Attack_Str="【"+rule1.playname+"】向"+"【"+rule2.playname
+"】发动攻击";
operter1=10;
case3:
Attack_Str="【"+rule1.playname+"】向"+"【"+rule2.playname+"】发动攻击";
operter1=15;
break;
case4:
operter1=18;
Attack_Str="【"+rule1.playname+"】向进行"+"【"+rule2.playname+"】连击";
break;
case5:
operter1=20;
Attack_Str="【"+rule1.playname+"】冲向前狂咬"+"【"+rule2.playname+"】一口";
break;
case6:
operter1=-18;
Attack_Str="【"+rule1.playname+"】向"+"【"+rule2.playname+"】发动攻击,结果摔到在敌";
break;
case7:
operter1=18;
Attack_Str="【"+rule1.playname+"】向"+"【"+rule2.playname+"】投毒";
ispoisoning=true;
break;
case8:
operter1=25;
Attack_Str="【"+rule1.playname+"】发狂对"+"【"+rule2.playname
+"】进行暴打一顿";
break;
case9:
operter1=30;
Attack_Str="【"+rule1.playname+"】 诅咒 "+"【"+rule2.playname
+"】";
break;
}
}
/**
*
*@返回值void
*@说明受到攻击,作出响应的动作
*/
publicvoidrule_Recovery(Rolerule1,Rolerule2){
intstate=rule2.dp;
intvalue=getRandom();
value=(state+value)/10/2;
if(operter1>0){
switch(value){
case2:
operter2=10;
Recovery_Str="【"+rule2.playname+"】受了内伤.";
break;
case3:
operter2=operter1/10+10;
Recovery_Str="【"+rule2.playname+"】小躲了一下,但仍";
break;
case4:
operter2=operter1/10;
Recovery_Str="【"+rule2.playname+"】防御了一下下.但仍";
break;
case5:
case0:
case1:
operter2=operter1;
Recovery_Str="【"+rule2.playname+"】被正面击中了.结果";
if(ispoisoning){
Recovery_Str+="属性全面降低了10点,并";
rule2.chang();
}
break;
case6:
operter2=-operter1;
Recovery_Str="【"+rule2.playname+"】刚好躲过了攻击,不受伤.";
break;
case7:
operter2=operter1/10+4;
Recovery_Str="【"+rule2.playname+"】挣脱了.但是仍";
break;
case8:
operter2=operter1;
Recovery_Str="【"+rule2.playname+"】被打晕了.";
break;
case9:
operter2=-operter1+10;
Recovery_Str="【