




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录1、课程设计的目的52、课程设计的技术要求53、题目分析54、 算法分析与设计64.1游戏运行活动图64.2具体算法与程序流程分析65、 方法定义及调用关系75.1方法定义:75.2方法调用关系:76、 游戏细节设计76.1攻击招式统计:76.2受到攻击后响应动作统计:77、界面设计88、部分程序分析88.1 游戏初始化方法88.2 启动游戏线程方法98.3 获取两位挑战者属性的方法108.4 游戏结果返回方法108.5 游戏循环方法说明方法118.6 攻击方法说明方法128.7 防守方法148.8 休眠动作方法168.9 动作表现方法178.10游戏的循环逻辑方法189、 运行结果显示与分析199.1运行结果199.2运行结果分析2010、实验总结2011、参考文献21附录22MainGame.java22InputFun.java22GameWorld.java23Role.java30Test.java35姓名挑战游戏1、课程设计的目的 学习算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。经过查找参考资料、技术手册和撰写文档的实践,进一步培养软件工程师的综合素质。 2、课程设计的技术要求 同学在处理每一个题目的时候,要从分析题目的需求入手,按设计抽象数据类型、构思算法、通过类的设计实现抽象数据类型、编制上机程序代码并调试的步骤完成题目,最终写出完整的分析报告。见到题目,案头工作准备不足,忙于上机敲程序不是优秀程序员的工作风格。注意设计与实现过程的经验积累,编码应尽量利用前阶段的成熟数据结构包,加大代码的重用率。课程设计所安排的题目,在难度和深度方面都大于课内的上机训练。程序作业以Java完成,配有图形界面。作业一般要达到3000行以上的代码量。最后提交作业包括:课程设计报告;完整程序,应该具有可显示界面;PPT及算法说明。3、题目分析姓名挑战游戏说明:输入两个中文姓名,通过一种算法,计算出姓名的血值和攻击力,使两个名字进行对战,进行多轮回合后,决定双方输赢。在运行界面中输入两个挑战者的姓名,软件就会计算出两个挑战者初始状态的血值和攻击力之类的属性值。然后两个挑战者一边挑战,系统会自动显示目前两个挑战者的一系列属性。两个人一直挑战,直到其中一者的hp的值为0,则挑战结束,并且hp为0的一方失败。4、 算法分析与设计4.1游戏运行活动图4.2具体算法与程序流程分析1)获取挑战者与被挑战者姓名。2)通过hashcode()方法将两组姓名字符串转换成int型数值存储。3)初始化属性值:定义setAttribult()方法设置固定规则,将转换成的int型数值通过计算得到相应的hp,ap,dp,rate,hitrate,luck值,从而得到挑战者与被挑战者的一系列属性值。4)对挑战者与被挑战者的属性进行随机处理映射到相应的攻击和反应。5)不断更新二者的属性值并获取。6)直到一方hp为,挑战结束并输出挑战结果及双方最后属性值。5、 方法定义及调用关系5.1方法定义:MainGame():主函数Gameworld():游戏主程序InputFun():获取用户输入信息的子程序Role():角色属性定义子程序Test():输出控制规则5.2方法调用关系:MainGame()调用GameWorld(), GameWorld()再调用InputFun()、Role()、Test()。6、 游戏细节设计6.1攻击招式统计:1、冲向前狂咬一口2、向偷毒3、发狂对进行暴打一顿4、诅咒5、向进行连击6、向发动攻击,结果摔倒在地6.2受到攻击后响应动作统计:1、受了内伤2、小躲了一下3、防御了一下下4、被正面击中了5、刚好躲过了攻击,不受伤6、挣脱了7、被打晕了8、垂死奋斗7、界面设计8、部分程序分析8.1 游戏初始化方法/* * 参数 * 返回值void * 说明一个初始化的方法,初始决斗的玩家的属性 */ public void init() array1 = new int4; array2 = new int4; System.out.println(姓名挑战游戏); System.out.print(请输入挑战者的名字:); name1 = ifun.input(); / 接收挑战者姓名的输入 array1 = ifun.changInt(name1); /把接收的挑战者姓名转化为数组存储 System.out.print(请输入被挑战者的名字:); name2 = ifun.input(); /接收被挑战者的姓名输入 array2 = ifun.changInt(name2); /把接收的被挑战者姓名转化为数组存储 8.2 启动游戏线程方法 /* * 参数 * 返回值void * 说明启动游戏的线程 */ public void starThread() if (thread = null) thread = new Thread(this); thread.start(); 8.3 获取两位挑战者属性的方法/* * 参数 * 返回值void * 说明获得两位挑战者的各种属性 */ public void getRuleAttribult() r1.getAttribult(); /得到挑战者的属性 r2.getAttribult(); /得到被挑战者的属性 8.4 游戏结果返回方法/* * 参数 * 返回值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) 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 += 属性全面降低了点,并; 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; 8.8 休眠动作方法/* * 参数 * param i * 返回值void * 说明一个休眠的动作,根据i的值休眠 */ private void isSleep(int i) try Thread.sleep(i); catch (InterruptedException e) e.printStackTrace(); 8.9 动作表现方法/* * * 返回值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); 8.10游戏的循环逻辑方法/* * 游戏的循环逻辑方法 */ public void run() int debug = 0; try while (r1.hp 0 & r2.hp 0) long time = java.lang.System.currentTimeMillis() + 50; debug = 1; if (loop) update(r1, r2); loop = false; else update(r2, r1); loop = true; debug = 2; paint(); java.lang.Thread.yield(); while (time java.lang.System.currentTimeMillis() ; getResule(); catch (Exception e) System.err.println(run error: + e + debug: + debug); 9、 运行结果显示与分析9.1运行结果9.2运行结果分析(a)运行代码成功后运行界面跳出”姓名挑战游戏”的标题,随后显示”请输入挑战者的名字”和”请输入被挑战者的名字”的提示语句.玩家输入两个人的名字后按enter键,系统自动生成两个玩家的属性并显示在界面上,提示”比赛开始GO”。(b)挑战开始,两个挑战者依次向对方发动攻击,并且统计每轮比赛后两者的HP值。(c)挑战结束,输出挑战结果,胜负结果计算并输出。最后统计输出双方挑战结束后的各个属性值。10、实验总结学习每门课程都要学以致用,学习算法设计与分析这门课程是要培养我们自己设计算法的能力。编程不可以一拿到题目就盲目的编程,而是要先分析题目,思考解决这个问题最优的算法,选定算法后才开始进行初步的编程。这次课程设计要求代码不少于三千行,我对于我们而言是个极其艰巨的任务。除了自己构思以外,我们还上网查找了部分代码,把别人的代码和我们自己的合并在一起,最后我们都懂得了所有代码的意思,并且代码运行成功,实现了姓名挑战游戏的基本功能,比如说两个挑战者的挑战过程和结果。虽然最后实现了这个游戏的功能,但是我们也只可以说是成功了一半。因为我们的代码还没有达到三千行,并且游戏没有很好的显示界面,还需要多花时间进行更多的改进。通过这次课程设计,我们还是学会了很多东西,比如怎么设计一个合适的算法,怎样开始编程之类的,把所学的思想成功的运用到了实践中。11、参考文献 1 王晓东.算法设计与分析(第2版).北京:清华大学出版社,2008 2 孟爱国.C语言程序设计.上海:复旦大学出版社,2010.02 3 严蔚敏,吴伟民. 数据结构(C语言版). 北京:清华大学出版社,2007 附录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 int4; 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) / 当输入为英文或则是英文空格的时候默认的给转化过的值加2000 res += 20000; arrayk = 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 int4; array2 = new int4; System.out.println(人名大战); 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) 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 = java.lang.System.currentTimeMillis() + 50; debug = 1; if (loop) update(r1, r2); loop = false; else update(r2, r1); loop = true; debug = 2; paint(); java.lang.Thread.yield(); while (time java.lang.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 int4; /* 攻击的动作字符串 */ 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 += arrayi; return res; /* * * 参数 * return * 返回值 int * 说明 一个属性全面伤害的动作 中毒 */ public int chang() ap = ap - 10; hitRate = hitRate - 10; luc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆教学工作总结
- 2025年信息、零售和物流杂志:用人工智能塑造未来报告 INFOSYS CONSUMER,RETAIL,AND LOGISTICS JOURNAL SHAPING TOMORROW WITH AI
- 2026届安徽省滁州来安县英语九年级第一学期期末统考试题含解析
- 山东省新泰市实验中学2026届化学九年级第一学期期中综合测试试题含解析
- 安徽省合肥168中学2026届九年级化学第一学期期中调研模拟试题含解析
- 2025年(中级)电厂水化验员考试题库及答案
- 2025年工业机器人系统运维员考试题库及参考答案解析
- 2025年导游业务试题库简答题附带答案
- 2026届吉林省长春七十二中学九年级英语第一学期期末学业水平测试模拟试题含解析
- 2026届四川省巴中学市恩阳区化学九上期中学业质量监测试题含解析
- 农村建房技术培训课件
- 红十字救护员培训理论试题及答案
- 潍坊市2026届高三开学调研监测考试语文试题及答案
- 2025年新能源电动摆渡车景区运营绿色出行解决方案报告
- 安全素养提升培训考试题及答案解析
- 动量守恒定律模型归纳(11大题型)(解析版)-2025学年新高二物理暑假专项提升(人教版)
- 2025股权转让合同签订股权认购协议书
- 某小区改造配电室(电力)工程监理大纲
- Z20+名校联盟(浙江省名校新高考研究联盟)2026届高三第一次联考化学及答案
- 医疗器械配送应急预案模板(3篇)
- DB65-T 4803-2024 冰川厚度测量技术规范
评论
0/150
提交评论