最近不知道怎得懒了许多,就是不想写总结。
想了想还是在这里说下protected的权限关系吧,怕大家在后面找不到
首先我们可能在学c++中都会听到老师说protected权限是介于public和private之间的。但protected具体权限又是如何呢,可能没有细说我们会感到迷糊。下面我大概说一下protected在Java中的权限。相对说protected的权限还是挺大的。在同一个包中protected和public权限相等,但在不同包之间protected只能在派生类中也就是子类中访问,而public均可以访问。而private的权限只能在类内部访问。最重要的是它比private多了一个功能,就是可以被继承。
下面我们以一个简单的创建游戏角色案例来说明。
实验要求以及源代码都放在了最后,有兴趣的可以看下。
首先让我们简单的看一下实验效果展示

接下来让我们一起看下如何完成这个实验。
首先当你看到这个界面后,你是否会想着直接在一个类中去完成这个任务呢。如果一眼看到就像的是在一个类完成的话,可能就有点落后于他人了。因为在我们代码的编写中,我们往往都会想要降低一个软件的耦合性,来提高软件的扩展力。但如何来降低软件耦合性呢,继承机制给我们提供了一个一个方法来实现耦合度的降低。
下面我们开始对这个页面分析:
首先我们可以从中简单的剥离出两个类一个是基本角色类也就是本文的父类Role类来创建基本信息

import java.util.Scanner;public class Role {protected String name;protected String sex;Scanner in= new Scanner(System.in);//创建输入信息对象public void getRole() {//创建基本角色信息System.out.print("请输入您角色的姓名:");name=in.next();System.out.print("请选择您游戏角色的性别(0男性,1女性):");int a=in.nextInt();switch(a) {case 0: sex="男性";break;case 1: sex="女性";break;default: System.out.println("输入不合法,请重新输入");this.getRole();}}

接下来就是种族信息类了,在这里我们可以在此想下如果将所有的种族信息都封装在一个类中,那么当我们以后想要去添加新的种族是否会很麻烦。先增加其他修改是不是也会很麻烦呢。举一个例子基类就好像一个房子的地基,当这个地基修好后,你想建什么房子都可以,别墅啦平房啦楼房啦。而我们要建的房子就是子类继承父类后的实现结果。就比如这次继承父类地基想建一个别墅。但下次又想建瓦房了。此时我们可以直接在此继承一个基类地基而不是把别墅扒了重建。相反如果你一开始就将所有东西都写在了一个类,就好比直接建了一个房子,当你下次想建其他房子时,你会发现没有地基可用,全都是你建的一类房子,此时你只能扒了你以前建的房子重建,或者再次挖地基重新修建。这样无疑是浪费时间经历的。
因此我大概又将种族信息类细分成了两个类,一个是基本信息Racil类

public class Racial extends Role {protected String racial;protected String career;protected  int c;//记录职业序号public void getRacial() {System.out.print("请选择您游戏角色的种族(0人类,1精灵,2兽人,3矮人,4元素,):");int b=in.nextInt();//输入种族序号switch(b) {//确定种族case 0:racial="人类";System.out.print("请选择您的职业(0狂战士,1圣骑士,2刺客,3猎手,4祭司,5巫师):");break;case 1:racial="精灵";System.out.print("请选择您的职业(2刺客,3猎手,4祭司,5巫师):");break;case 2:racial="兽人";System.out.print("请选择您的职业(0狂战士,3猎手,4祭司):");break;case 3:racial="矮人";System.out.print("请选择您的职业(0狂战士,1圣骑士,4祭司):");break;case 4:racial="元素";System.out.print("请选择您的职业(4祭司,5巫师):");break;}c=in.nextInt();//输入职业序号switch(c) {//确定职业case 0:career="狂战士";break;case 1:career="圣骑士";break;case 2:career="刺客";break;case 3:career="猎手";break;case 4:career="祭司";break;case 5:career="巫师";break;}}
}

一个是种族属性Attribute类。

public class Attribute extends Racial{protected int strength;//力量protected int aglity;//敏捷protected int physical;//体力protected int intellgence;//智力protected int wisdom;//智慧protected int hp;//生命值protected int mp;//魔法值public void getrandomNumber(int a,int b,int c,int d,int e) {//分别获取每项属性(顺序为类中所定义顺序)的随机整数strength=(int) (a-Math.random()*20%5);//提供5分之差aglity=(int) (b-Math.random()*20%5);physical=(int) (c+Math.random()*20%5);intellgence=(int) (d-Math.random()*20%5);wisdom=100-strength-aglity-physical-intellgence-wisdom;hp=(strength+physical)*10;mp=(wisdom+intellgence)*10;}public void getAttritube() {switch(this.c) {case 0:getrandomNumber(40,20,10,5,5);break;case 1:getrandomNumber(25,15,30,20,10);break;case 2:getrandomNumber(20,35,20,15,10);break;case 3:getrandomNumber(15,40,15,10,20);break;case 4:getrandomNumber(15,20,15,35,15);break;case 5:getrandomNumber(10,20,10,20,40);break;}         }public void display() {//打印信息System.out.println("==========================================================");System.out.println("姓名\t"+this.name);System.out.println("==========================================================");System.out.println("性别\t"+this.sex);System.out.println("==========================================================");System.out.println("种族\t"+this.racial);System.out.println("==========================================================");System.out.println("职业\t"+this.career);System.out.println("==========================================================");System.out.println("力量\t"+this.strength);System.out.println("==========================================================");System.out.println("敏捷\t"+this.aglity);System.out.println("==========================================================");System.out.println("体力\t"+this.physical);System.out.println("==========================================================");System.out.println("智力\t"+this.intellgence);System.out.println("==========================================================");System.out.println("智慧\t"+this.wisdom);System.out.println("==========================================================");System.out.println("生命值\t"+this.hp);System.out.println("==========================================================");System.out.println("魔法值\t"+this.mp);System.out.println("==========================================================");}
}

本次实验还有一个难点就是每一个职业的属性都是相关职业属性下随机生成,且固定和是相等的。由于本人对这个结果处理的不是太满意就不细说这个了。有兴趣的可以看下大概如何处理。
此时基本的创建工作已经完成了。
下面是文件保存类:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class File {public void reFile(Attribute a) throws IOException{  //throws IOException:异常处理FileWriter file = new FileWriter("message.txt",true);BufferedWriter write = new BufferedWriter(file);   try {write.write("姓名: "+a.name+"\t\n");  //"\t"表示空格write.write("性别 : "+a.sex+"\t\n");write.write("种族 : "+a.racial+"\t\n");write.write("职业 : "+a.career+"\t\n");write.write("力量 : "+a.strength+"\t\n");write.write("敏捷 : "+a.aglity+"\t\n");write.write("体力 : "+a.physical+"\t\n");write.write("智力 : "+a.intellgence+"\t\n");write.write("智慧 : "+a.wisdom+"\t\n");write.write("生命值: "+a.hp+"\t\n");write.write("魔法值: "+a.mp+"\r\n\n");//"\r\n"表示本次打印结束,下次以下一行最左端开始//write.write("\n");write.close(); //关闭文件file.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();   }System.out.println("玩家信息已保存成功!");//\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;//'\n' 换行,换到当前位置的下一行,而不会回到行首;}}

测试类:

import java.io.IOException;public class Main {public static void main(String[] args) {Attribute a=new Attribute();String m="n";do {a.getRole();//得到基本角色信息a.getRacial();//得到基本种族信息a.getAttritube();//得到各类属性信息a.display();//打印信息System.out.println("是否重新创建游戏角色:y(是),n(否)");java.util.Scanner s=new java.util.Scanner(System.in);m=s.next();}while(m.equals("y"));//s.close();File f=new File();try {f.reFile(a);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

本次实验的uml图:

实验要求:
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
3.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
种族/职业 狂战士 圣骑士 刺客 猎手 祭司 巫师
人类 允许 允许 允许 允许 允许 允许
精灵 不允许 不允许 允许 允许 允许 允许
兽人 允许 不允许 不允许 允许 允许 不允许
矮人 允许 允许 不允许 不允许 允许 不允许
元素 不允许 不允许 不允许 不允许 允许 允许
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
4.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
职业/属性 力量 敏捷 体力 智力 智慧
狂战士 40 20 30 5 5
圣骑士 25 15 30 20 10
刺客 20 35 20 15 10
猎手 15 40 15 10 20
祭司 15 20 15 35 15
巫师 10 20 10 20 40
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
5.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。

写在最后:希望可以帮助到大家。

用一个简单的创建游戏角色方案来理解类继承的运用以及浅淡protected权限修饰符的作用。相关推荐

  1. 几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。

    一:题目分析 1.功能描述 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色.本次上机要求编写一个简化的创建游戏角色的程序. 2.游戏 ...

  2. RPG角色生成器 1.功能描述 几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。要求编写一个简化的创建游戏角色的程序。 2.游戏角色应

    RPG角色生成器 1.功能描述 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色.本次上机要求编写一个简化的创建游戏角色的程序. 2. ...

  3. 通过java程序写一个简单的创造游戏角色的程序

    一.题目分析: 题目要求,编写一个简化的创造游戏角色的程序,游戏角色应有:姓名,性别,种族,职业,力量,敏捷,体力,智力,智慧,生命值,魔法值等属性. 题目思路:根据题目可知,无论创建什么种族角色,都 ...

  4. C++ RPG创建游戏角色

    创建游戏角色``` (1).功能描述 几乎所有的RPG游戏(一种源自<龙与地下城>的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色.本次上机要求编写一个简化的创建游戏角色的程序. ...

  5. Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

    Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布 ...

  6. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名

    上一篇,我们梳理了Python中关于字典排序的一些常用方法(杂乱无章的数据结构如何进行排序,简明讲述Python字典排序那些事).其中,我们讲到了Python的collections模块中的Order ...

  7. python与数学关系大吗_通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别...

    原标题:通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别 前言 我想很多人在小时候都玩过这么一个游戏,我记得以前的摩托罗拉的手机里面就有,那就是汉诺塔! 看到图片是不是想起来玩过这个游戏呢? ...

  8. Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)

    懒骨头(http://blog.csdn.net/iamlazybone  QQ124774397 青岛 ) 或许有天 我们羡慕和崇拜的人 因为我们的努力 也会来了解我们 说不定 还会成为好友 骨头喜 ...

  9. Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)...

    2019独角兽企业重金招聘Python工程师标准>>> 或许有天 我们羡慕和崇拜的人 因为我们的努力 也会来了解我们 说不定 还会成为好友 骨头喜欢这样与哲哲共勉 多少个夜晚 一张长 ...

最新文章

  1. Mac OS X 10.9 装gdb
  2. 【linux】【firewalld】防火墙设置
  3. JS中令人发指的valueOf方法介绍
  4. 前端学习(3290):react hook useReducer传入对象+1操作继续编辑更多
  5. 618技术特辑(三)直播带货王,“OMG买它”的背后,为什么是一连串技术挑战?
  6. 【Flink】Flink flink-runtime.version.properties generated correctly. You MUST run mvn generate-source
  7. 理解一下ThreadLocal线程存储---springcloud工作笔记160
  8. HDU4681 String(dp)
  9. ubuntu mysql5.5编码_Ubuntu下MySQL5.5编码设置
  10. [转]java classLoader 体系结构
  11. 图像处理中的数学原理归类
  12. python等待执行完毕 再继续执行_如何等待一个函数内部异步执行完毕再执行另外一个函数?...
  13. Cadence原理图DRC检查介绍
  14. RTK固定解什么意思
  15. U盘安装Linux系统教程
  16. Portainer-docker可视化工具
  17. 数字电路和模拟电路-1基础知识
  18. 【EMNLP 2021】SimCSE:句子嵌入的简单对比学习 【CVPR 2021】理解对比学习损失函数及温度系数
  19. 服务器意外终止连接,错误号:0X800CCCOF 如何解决
  20. OPJ2018年算法课第二次作业:F.求逆序对数

热门文章

  1. python实现图片切正方形
  2. VRay 3.6 for SketchUp代理物体技术应用
  3. Java数据结构与Java算法上
  4. B.FRIENDit壁虎忍者RF600+MA003无线键盘鼠标套装 超薄静音键盘 无线鼠标键盘 台式笔记本电脑办公巧克力键盘黑色
  5. 输入线宽,就可以得到阻抗值,还能匹配叠层的神器你用过吗?
  6. 一年300多万吨垃圾变宝贝 起到循环再利用
  7. 计算机查询硬盘信息,查询电脑硬件信息的方法
  8. 看到了以前一位老师的新闻,很高兴
  9. C语言九键拼音,c语言--将中文转化为拼音
  10. 专插本计算机专业跨英语专业,2021专插本英语专业考什么?