算法分析课程设计

  • 格式:doc
  • 大小:84.50 KB
  • 文档页数:21

姓名挑战游戏1、课程设计的目的学习算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。

课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。

经过查找参考资料、技术手册和撰写文档的实践,进一步培养软件工程师的综合素质。

2、课程设计的技术要求同学在处理每一个题目的时候,要从分析题目的需求入手,按设计抽象数据类型、构思算法、通过类的设计实现抽象数据类型、编制上机程序代码并调试的步骤完成题目,最终写出完整的分析报告。

见到题目,案头工作准备不足,忙于上机敲程序不是优秀程序员的工作风格。

注意设计与实现过程的经验积累,编码应尽量利用前阶段的成熟数据结构包,加大代码的重用率。

课程设计所安排的题目,在难度和深度方面都大于课内的上机训练。

程序作业以Java完成,配有图形界面。

作业一般要达到3000行以上的代码量。

最后提交作业包括:课程设计报告;完整程序,应该具有可显示界面;PPT及算法说明。

3、题目分析姓名挑战游戏说明:输入两个中文姓名,通过一种算法,计算出姓名的血值和攻击力,使两个名字进行对战,进行多轮回合后,决定双方输赢。

在运行界面中输入两个挑战者的姓名,软件就会计算出两个挑战者初始状态的血值和攻击力之类的属性值。

然后两个挑战者一边挑战,系统会自动显示目前两个挑战者的一系列属性。

两个人一直挑战,直到其中一者的hp的值为0,则挑战结束,并且hp为0的一方失败。

4、部分程序分析4.1 角色属性定义public class Role {String playname;//角色名字int hp;//生命值int ap;//攻击力为apint dp;//防御力为dpint rate;//攻击速度int hitRate;//命中率int luck;//运气int[] array = new int[4];//名字数组String Attack_Action = ""; //攻击的动作字符串String Recovery_Action = "";//防御的动作字符串int Attact_Point = 0; //攻击的点数int Recovery_Point = 0;//抵御的点数4.2 构造函数public Role(String name, int[] getArray) {array = getArray;playname = name;setAttribult();}4.3 输入挑战者姓名后角色属性值统计在运行界面上输入两个挑战者的姓名后,界面就会自动统计每个挑战者的生命力hp,攻击力ap,防御力dp,攻击速度rate,命中率hitrate,运气luck。

public void getAttribult() {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 设置角色属性public void setAttribult() {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;}public int addFun(int index) {int res = 0;for (int i = 0; i < 4; i++) {if (i != index) {// 剔出掉vindex指向的数res += array[i];}}return res;}4.5 设置挑战期间各种攻击后各个值的属性public int chang() {//设置中毒的属性ap = ap - 10;hitRate = hitRate - 10;luck = luck - 10;rate = rate - 10;dp = dp - 10;return 0;}设置10个实例来演示两个挑战者在挑战期间的动作,例如:A向B发动攻击;B向A发动攻击;A冲上前狂咬B一口;A发狂对B暴打一顿;A向B发动攻击,结果摔倒在地;A诅咒B;A向B投毒等。

public String useAp(int index, String playname1, String playname2) {switch (index) {case 0:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 25;case 1:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 20;case 2:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 10;case 3:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 15;break;case 4:Attact_Point = 18;Attack_Action = "【" + playname1 + "】向进行" + "【" + playname2 + "】连击";break;case 5:Attact_Point = 20;Attack_Action = "【" + playname1 + "】冲向前狂咬" + "【" + playname2+ "】一口";break;case 6:Attact_Point = -18;Attack_Action = "【" + playname1 + "】向" + "【" + playname2+ "】发动攻击,结果摔到在地";break;case 7:Attact_Point = 18;Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】投毒";break;case 8:Attact_Point = 25;Attack_Action = "【" + playname1 + "】发狂对" + "【" + playname2+ "】进行暴打一顿";break;case 9:Attact_Point = 30;Attack_Action = "【" + playname1 + "】诅咒" + "【" + playname2 + "】";break;}return "";}public String useDp(int index) {//使用防御力return "";}public String useHitRate(int index) {//使用命中率return "";}public String useHp(int index) {//使用生命值return "";}public String useLuck(int index) {//使用运气return "";}public String useRate(int index) {//使用速度return "";}5、实验总结学习每门课程都要学以致用,学习算法设计与分析这门课程是要培养我们自己设计算法的能力。

编程不可以一拿到题目就盲目的编程,而是要先分析题目,思考解决这个问题最优的算法,选定算法后才开始进行初步的编程。

这次课程设计要求代码不少于三千行,我对于我们而言是个极其艰巨的任务。

除了自己构思以外,我们还上网查找了部分代码,把别人的代码和我们自己的合并在一起,最后我们都懂得了所有代码的意思,并且代码运行成功,实现了姓名挑战游戏的基本功能,比如说两个挑战者的挑战过程和结果。

虽然最后实现了这个游戏的功能,但是我们也只可以说是成功了一半。

因为我们的代码还没有达到三千行,并且游戏没有很好的显示界面,还需要多花时间进行更多的改进。

通过这次课程设计,我们还是学会了很多东西,比如怎么设计一个合适的算法,怎样开始编程之类的,把所学的思想成功的运用到了实践中。

6、参考文献1.王晓东,《算法设计与分析》,清华大学出版社。

附录MainGame.javapackage PK;public class MainGame {static GameWorld gworld;public MainGame() {}/*** 主函数*/public static void main(String[] args) {if (gworld == null) {gworld = new GameWorld();gworld.starThread();}}}InputFun.javapackage PK;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class InputFun {String name = "";/**** @返回值String* @说明用于获得用户的输入*/public String input() { // 获得用户的输入BufferedReader br1 = new BufferedReader( new InputStreamReader(System.in));try {name = br1.readLine();} catch (IOException e) {e.printStackTrace();}return name;}/**** @作者孙林娟刘术徐赫* @返回值int[]* @说明转化姓名为一个唯一的数组*/public int[] changInt(String getname) {int[] array = new int[4];while (getname.length() < 4) {getname += " ";}int res = 0;for (int k = 0; k < 4; k++) {String s = getname.substring(k, k + 1);res = s.hashCode();if (res < 1000) {// 当输入为英文或则是英文空格的时候默认的给转化过的值加2000res += 20000;}array[k] = res;}return array;}}GameWorld.javapackage PK;import java.util.Random;public class GameWorld implements Runnable {/** 用户名*/private String name1, name2;/** 输入方法*/InputFun ifun = new InputFun();/** 两个角色*/Role r1, r2;/** 随机数*/Random r = new Random();/** 线程*/Thread thread;/** 攻击的动作字符串,防御的动作字符串*/String Attack_Str = "", Recovery_Str = "";/** 攻击的点数,抵御的点数*/int operter1 = 0, operter2 = 0;/** 一个循环变换角色攻击的变量*/boolean loop = true;/** 投毒的标志*/private boolean ispoisoning;/** 由人明而转换而来的数组*/int[] array1, array2;public GameWorld() {init();r1 = new Role(name1, array1);r2 = new Role(name2, array2);getRuleAttribult();System.out.println("比赛开始GO~~");}/**** @返回值void* @说明一个初始化的方法,初始决斗的玩家的属性*/public void init() {array1 = new int[4];array2 = new int[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* @说明启动游戏的线程*/public void starThread() {if (thread == null) {thread = new Thread(this);thread.start();}}/**** @返回值void* @说明获得两个人的属性*/public void getRuleAttribult() {r1.getAttribult();r2.getAttribult();}/**** @返回值void* @说明最后的结果*/public void getResule() {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 + "】榨干血啊.");}} else if (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();// 得到最后的属性}/**** @参数* @param rule1* @参数* @param rule2* @返回值void* @说明游戏的循环方法*/public void update(Role rule1, Role rule2) {rule_Attack(rule1, rule2);rule_Recovery(rule1, rule2);}/**** @参数* @param rule1* @参数* @param rule2* @返回值void* @说明攻击的方法*/public void rule_Attack(Role rule1, Role rule2) {int state = rule1.ap;int value = getRandom();value = (state + value) / 10 / 2;// 把属性和随机数相加再除二,得到一个在属性范围内的新数switch (value) {case 0:Attack_Str = "【" + rule1.playname + "】向" + "【" + rule2.playname+ "】发动攻击";operter1 = 25;case 1:Attack_Str = "【" + rule1.playname + "】向" + "【" + rule2.playname+ "】发动攻击";operter1 = 20;case 2:Attack_Str = "【" + rule1.playname + "】向" + "【" + rule2.playname+ "】发动攻击";operter1 = 10;case 3:Attack_Str = "【" + rule1.playname + "】向" + "【" + rule2.playname+ "】发动攻击";operter1 = 15;break;case 4:operter1 = 18;Attack_Str = "【" + rule1.playname + "】向进行" + "【" + rule2.playname+ "】连击";break;case 5:operter1 = 20;Attack_Str = "【" + rule1.playname + "】冲向前狂咬" + "【"+ rule2.playname + "】一口";break;case 6:operter1 = -18;Attack_Str = "【" + rule1.playname + "】向" + "【" + rule2.playname+ "】发动攻击,结果摔到在敌";break;case 7:operter1 = 18;Attack_Str = "【" + rule1.playname + "】向" + "【" + rule2.playname+ "】投毒";ispoisoning = true;break;case 8:operter1 = 25;Attack_Str = "【" + rule1.playname + "】发狂对" + "【" + rule2.playname+ "】进行暴打一顿";break;case 9:operter1 = 30;Attack_Str = "【" + rule1.playname + "】诅咒" + "【" + rule2.playname+ "】";break;}}/**** @返回值void* @说明受到攻击,作出响应的动作*/public void rule_Recovery(Role rule1, Role rule2) {int state = rule2.dp;int value = getRandom();value = (state + value) / 10 / 2;if (operter1 > 0) {switch (value) {case 2:operter2 = 10;Recovery_Str = "【" + rule2.playname + "】受了内伤.";break;case 3:operter2 = operter1 / 10 + 10;Recovery_Str = "【" + rule2.playname + "】小躲了一下,但仍";break;case 4:operter2 = operter1 / 10;Recovery_Str = "【" + rule2.playname + "】防御了一下下.但仍";break;case 5:case 0:case 1:operter2 = operter1;Recovery_Str = "【" + rule2.playname + "】被正面击中了.结果";if (ispoisoning) {Recovery_Str += "属性全面降低了10点,并";rule2.chang();}break;case 6:operter2 = -operter1;Recovery_Str = "【" + rule2.playname + "】刚好躲过了攻击,不受伤.";break;case 7:operter2 = operter1 / 10 + 4;Recovery_Str = "【" + rule2.playname + "】挣脱了.但是仍";break;case 8:operter2 = operter1;Recovery_Str = "【" + rule2.playname + "】被打晕了.";break;case 9:operter2 = -operter1 + 10;Recovery_Str = "【" + rule2.playname + "】垂死奋斗.";break;}int result = operter1 + operter2;if (result != 0) {Recovery_Str += "受到" + (result) + " 点伤害.";rule2.hp -= (result);}} else {Recovery_Str = "【" + rule1.playname + "】自己受伤了" + (-operter1) + " 点伤害.";rule1.hp += operter1;}ispoisoning = false;}/**** @返回值int* @说明产生一个随机的数字.*/public int getRandom() {int state = Math.abs(r.nextInt(100));return state;}/**** @参数* @param i* @返回值void* @说明一个休眠的动作,根据i的值休眠*/private void isSleep(int i) {try {Thread.sleep(i);} catch (InterruptedException e) {e.printStackTrace();}}/**** @返回值void* @说明动作的表现.*/public void paint() {System.out.print(" " + Attack_Str + "; ");isSleep(1200);System.out.println(Recovery_Str);isSleep(1100);System.out.println(" 经过本轮角逐:" + r1.playname + ".hp = " + r1.hp+ " " + r2.playname + ".hp = " + r2.hp);isSleep(1200);}/*** 游戏的循环逻辑方法*/public void run() {int debug = 0;try {while (r1.hp > 0 && r2.hp > 0) {long time = ng.System.currentTimeMillis() + 50;debug = 1;if (loop) {update(r1, r2);loop = false;} else {update(r2, r1);loop = true;}debug = 2;paint();ng.Thread.yield();while (time > ng.System.currentTimeMillis()) {;}}getResule();} catch (Exception e) {System.err.println("run error:" + e + " debug:" + debug); }}}Role.javapackage PK;public class Role {/** 名字*/String playname;/** 生命值*/int hp;/** 攻击力ap */int ap;/** 防御力dp defence */int dp;/** 攻击速度*/int rate;/** 命中率hitRate */int hitRate;/** 运气*/int luck;/** 名字数组*/int[] array = new int[4];/** 攻击的动作字符串*/String Attack_Action = "";/** 防御的动作字符串*/String Recovery_Action = "";/** 攻击的点数*/int Attact_Point = 0;/** ,抵御的点数*/int Recovery_Point = 0;/** 构造函数*/public Role(String name, int[] getArray) {array = getArray;playname = name;setAttribult();}/**** @作者孙林娟刘术徐赫* @输出角色属性* @说明获得角色的属性*/public void getAttribult() {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); }/**** @作者孙林娟刘术徐赫* @返回值void* @说明设置角色的各个属性*/public void setAttribult() {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;}/**** @作者孙林娟刘术徐赫* @返回值int* @说明一个特殊的加法运算方法*/public int addFun(int index) {int res = 0;for (int i = 0; i < 4; i++) {if (i != index) {// 剔出掉vindex指向的数res += array[i];}}return res;}/**** @参数* @return* @返回值int* @说明一个属性全面伤害的动作中毒*/public int chang() {ap = ap - 10;hitRate = hitRate - 10;luck = luck - 10;rate = rate - 10;dp = dp - 10;return 0;}/**** @参数@param index* @参数@param playname1* @参数@param playname2* @参数@return* @返回值String* @说明使用攻击力*/public String useAp(int index, String playname1, String playname2) {switch (index) {case 0:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 25;case 1:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 20;case 2:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 10;case 3:Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】发动攻击";Attact_Point = 15;break;case 4:Attact_Point = 18;Attack_Action = "【" + playname1 + "】向进行" + "【" + playname2 + "】连击";break;case 5:Attact_Point = 20;Attack_Action = "【" + playname1 + "】冲向前狂咬" + "【" + playname2+ "】一口";break;case 6:Attact_Point = -18;Attack_Action = "【" + playname1 + "】向" + "【" + playname2+ "】发动攻击,结果摔到在敌";break;case 7:Attact_Point = 18;Attack_Action = "【" + playname1 + "】向" + "【" + playname2 + "】投毒";// ispoisoning = true;break;case 8:Attact_Point = 25;Attack_Action = "【" + playname1 + "】发狂对" + "【" + playname2+ "】进行暴打一顿";break;case 9:Attact_Point = 30;Attack_Action = "【" + playname1 + "】诅咒" + "【" + playname2 + "】";break;}return "";}/**** @参数* @param index* @参数* @return* @返回值String* @说明使用防御力*/public String useDp(int index) { return "";}/**** @参数* @param index* @参数* @return* @返回值String* @说明使用命中率*/public String useHitRate(int index) { return "";}/**** @参数* @param index* @参数* @return* @返回值String* @说明使用生命值*/public String useHp(int index) { return "";}/**** @参数* @param index* @参数* @return* @返回值String* @说明使用运气*/public String useLuck(int index) {return "";}/**** @参数* @param index* @参数* @return* @返回值String* @说明使用速度*/public String useRate(int index) {return "";}}Test.javapackage PK;public class Test {// 参数a为三角形的高度public void sanjiao(int a) {for (int i = 1; i <= a; i++) {// 打印每行前面的空格for (int j = 0; j < (a - i) * 2; j++) {System.out.print(" ");}// 开始打印**for (int k = 1; k <= (2 * i) - 1; k++) {System.out.print("* ");}System.out.print("\n");}}public static void main(String[] args) {Test test = new Test();test.sanjiao(3);}}21。