Java综合实验游戏界面的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《Java程序设计实验》综合课程设计报告
——英雄联盟选英雄界面设计
2014计算机科学与技术班
2016年12月2日
一、实验目的
设计一个程序来实现英雄联盟游戏时选择英雄的流程,通过此实验设计熟练掌握Java Swing的组件、容器、布局管理器、事件处理机制及java的图形处理。
二、实验原理
本实验要处理的最基本对象就是英雄及英雄菜单,因此可以设计Hero类和HeroMenu类。
程序在选择英雄过程中是分为英雄、符文、天赋三种类别来进行选择的,因此这里分别建立了RoleMenu类、FuwenMenu类、TianfuMenu类。
这三个类的父类是HeroMenu类,这样子类可以继承父类的一些属性和方法,并且可以实现多态。
登陆/选择英雄主界面设计为一个窗口,是JFrame的子类,名为OrderingWindow类。
通过该主界面切换到分类选英雄界面和显示选择明细及技能界面。
分类选择英雄界面用一个对话框来实现,设计为JDialog的子类OrderHero类来处理。
最后的选英雄界面和显示选择明细及技能界面用ShowOrderingRecord类来实现。
是JDialog的子类。
三、实验内容
1、Hero类
(1)成员变量
name、description、ATK、image分别用来表示英雄的名字、英雄的描述、英雄的攻击力、英雄的图像。
(2)成员方法
Hero(String ,String ,double,String)是构造方法,创建Hero对象时使用该构造方法,实现对Hero对象的初始化。
getName()方法。
Hero对象调用该方法返回它的名字。
getDescription()方法。
Hero对象调用该方法返回它的描述。
getATK()方法。
Hero对象调用该方法返回它的攻击力。
getImage()方法。
Hero对象调用该方法返回它的图像的引用。
代码为:
publicclass Hero{
private String name;
private String description;
privatedouble ATK;
private Image image;
public Hero(String name, String description, double ATK, String filename) {
super();
= name;
this.description = description;
this.ATK = ATK;
Toolkit toolkit=Toolkit.getDefaultToolkit();
this.image=toolkit.createImage(filename);
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
publicdoublegetATK() {
return ATK;
}
public Image getImage() {
return image;
}
}
2、HeroMenu类
(1)成员变量
HeroMenu对象是英雄对象的集合,用LinkedList数据结构来处理。
(2)成员方法
Hero(String ,String ,double ,String)是构造方法,创建Hero 对象时使用该构造方法,实现对Hero对象的初始化。
addItem(String ,String ,double ,String)方法用于往链表heroMenu中添加英雄元素。
GetHeroMenu()方法。
HeroMenu对象调用此方法可以返回英雄的链表,这个方法也是为后面初始化OrderHero窗口做准备。
代码为:
publicclass HeroMenu {
LinkedList<Hero>heroMenu;
public HeroMenu(){
heroMenu=new LinkedList<Hero>();
}
publicvoid addItem(String name,Stringdescription,double ATK ,String filename){
Hero hero=new Hero(name,description,ATK,filename);
heroMenu.add(hero);
}
public LinkedList<Hero>getRoleMenu() {
return heroMenu;
}
}
3、RoleMenu类
这个类只有一个构造方法RoleMenu()。
该方法中实现对英雄菜单的初始化,在方法内继承addItem(String ,String ,double ,String)方法,通过它来增加Hero对象。
同样也继承父类的HeroMenu链表。
代码为:
public RoleMenu(){
addItem("寒冰射手艾希","冰霜射击/致命减速艾希的暴击不造成额外伤害,但会将减速效果提升至10%",7,"寒冰射手.jpg");
addItem("刀锋之影泰隆","泰隆的技能会创伤英雄和史诗级野怪,持续6秒",9,"刀锋之影.jpg");
addItem("放逐之刃锐雯","剑刃充能,保证她的下次普攻造成额外的伤害",8,"放逐之刃.jpg");
addItem("蒸汽机器人布里茨","被动法力屏障,生命值低于20%时,将激活法力屏障",4,"蒸汽机器人.jpg");
addItem("德玛西亚之力盖伦","小兵的伤害不会中断坚韧的效果",7,"德玛西亚之力.jpg");
addItem("齐天大圣孙悟空","金刚不坏(被动),周围每个敌方英雄都会增加孙悟空护甲和魔法抗性",8,"齐天大圣.jpg");
addItem("诺克萨斯之手德莱厄斯","用斧刃对敌人造成伤害时,敌人会流血",9,"诺克萨斯之手.jpg");
addItem("蜘蛛女皇伊莉丝","人类形态,每当伊莉丝的技能命中一名敌人时,就会有一只小蜘蛛准备就绪",6,"蜘蛛女皇.jpg");
addItem("盲僧李青","疾风骤雨、李青释放技能后,接下来的2次基础攻击增加40%攻击速度第一次攻击回复20能量",8,"盲
僧.jpg");
addItem("皎月女神黛安娜","获得20%攻击速度加成。
",7,"皎月女神.jpg");
}
4、FuwenMenu类
这个类也只有一个构造方法FuwenMenu()。
该方法中实现对符文菜单的初始化,此类也继承父类的HeroMenu的属性和方法。
代码为:
public FuwenMenu(){
addItem("初级攻击机印记","+0.18物理伤害",12.0,"初级攻击机印记.jpg");
addItem("初级魔法抗性雕纹","+0.74魔法抗性",18,"初级魔法抗性雕纹.jpg");
addItem("法术强度精华","+3.82法术强度",16,"法术强度精华.jpg");
addItem("高级攻击力精华","+2.25攻击力",12,"高级攻击力精华.jpg");
addItem("高级魔法抗性雕纹","+1.34魔法抗性",8,"高级魔法抗性雕纹.jpg");
}
5、TianfuMenu类
这个类也只有一个构造方法TianfuMenu()。
该方法中实现对天赋菜单的初始化,此类也继承父类的HeroMenu的属性和方法。
代码为:
public TianfuMenu(){
addItem("雷霆领主","法令属性:你对一名敌方英雄进行的第三次攻击或施法会暴击目标周围区域",10,"雷霆领主.jpg");
addItem("战争领主的嗜血","法令属性:对抗小兵时会获得收益",12,"战争领主的嗜血.jpg");
addItem("冥火之触","法令属性:你的伤害型技能会使敌方英雄在4秒里连续受伤害",10,"冥火之触.jpg");
addItem("风暴骑手的狂涌","法令属性:获得移动速度和减速抗性",16,"风暴骑手的狂涌.jpg");
addItem("雷霆领主的法令","法令属性:你对相同敌方英雄进行的第三次攻击或伤害会召唤一次雷电打击",14,"雷霆领主的法令.jpg");
}
6、OrderingWindow类
(1)成员变量
成员变量有:pNorth、pCenter、pSouth是JPanel创建的三个容器。
roleButton、fuwenButton、tianfuBotton、showButton、stopOrderingButton是JButton创建的5个按钮。
idTextField、dateTextField是JTextField类创建的对象。
file是File类创建的文件对象。
idSet是一个HashSet<String>的散列集。
(2)成员方法
OrderingWindow()是构造方法,负责完成窗口的初始化。
actionPerfromed(ActionEvent)方法是OrderingWindow类实现的ActionListener接口中的方法,负责执行用户发出的命令。
代码为:
public OrderingWindow(){
setTitle("玩家选英雄界面");
idSet=new HashSet<String>();
pNorth=new JPanel();
idTextField=new JTextField(10);
idTextField.addActionListener(this);
dateTextField=new JTextField(20);
dateTextField.setEditable(false);
pNorth.add(new JLabel("请输入您的ID:"));
pNorth.add(idTextField);
pNorth.add(new JLabel("本次游戏日期和时间:"));
pNorth.add(dateTextField);
pCenter=new JPanel();
pCenter.setBorder(new TitledBorder(new LineBorder(Color.BL UE),"选英雄啦",TitledBorder.LEFT,TitledBorder.TOP));
RoleButton=new JButton("英雄");
RoleButton.addActionListener(this);
RoleButton.setEnabled(false);
TianfuButton=new JButton("天赋");
TianfuButton.addActionListener(this);
TianfuButton.setEnabled(false);
FuwenButton=new JButton("符文");
FuwenButton.addActionListener(this);
FuwenButton.setEnabled(false);
Box baseBox=Box.createHorizontalBox();
Box box1=Box.createVerticalBox();
box1.add(RoleButton);
//box1.add(Box.createVerticalStrut(20));
box1.add(TianfuButton);
box1.add(FuwenButton);
baseBox.add(box1);
baseBox.add(Box.createHorizontalStrut(100));
pCenter.add(baseBox);
pSouth=new JPanel();
this.showButton=new JButton("显示所选英雄及技能");
showButton.addActionListener(this);
showButton.setEnabled(false);
this.stopOrderingButton=new JButton("我已选好英雄!");
stopOrderingButton.addActionListener(this);
pSouth.add(showButton);
pSouth.add(stopOrderingButton);
add(pNorth,"North");
add(pCenter,"Center");
add(pSouth,"South");
setBounds(100,100,600,230);
this.setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
publicvoid actionPerformed(ActionEvent e) {
if(e.getSource()==this.idTextField){
if(idTextField!=null){
if(!idSet.add(idTextField.getText())){
JOptionPane.showMessageDialog(this, "此ID已有人登陆,您要另行选择啦!");
}
else {
idTextField.setEditable(false);
ClientSocket client=new ClientSocket();
Request request=new Request(8);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(pCenter, response.getResponse());
this.RoleButton.setEnabled(true);
this.TianfuButton.setEnabled(true);
this.FuwenButton.setEnabled(true);
this.showButton.setEnabled(true);
Date nowTime=new Date();
SimpleDateFormat
matter=new SimpleDateFormat("本次登陆时间:
yyyy-MM-ddHH:mm:ss");
String date=matter.format(nowTime);
this.dateTextField.setText(date);
String filename=idTextField.getText()+"所选英雄情况.txt";
file=new File(filename);
}
}
}
elseif(e.getSource()==this.showButton){
ShowOrderingRecordshowOrdering=new ShowOrderingRecord(fil e);
showOrdering.setVisible(true);
showOrdering.showRecord();
}
elseif(e.getSource()==this.stopOrderingButton){ this.idTextField.setText(null);
this.idTextField.setEditable(true);
this.dateTextField.setText(null);
this.RoleButton.setEnabled(false);
this.TianfuButton.setEnabled(false);
this.FuwenButton.setEnabled(false);
this.showButton.setEnabled(false);
}
else{
String menusName=null;
if(e.getSource()==this.RoleButton){
heroMenus=new RoleMenu();
menusName="英雄角色";
this.RoleButton.setEnabled(false);
ClientSocket client=new ClientSocket();
Request request=new Request(1);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(pCenter, response.getResponse());
}
elseif(e.getSource()==this.TianfuButton){
heroMenus=new TianfuMenu();
menusName="天赋选择";
this.TianfuButton.setEnabled(false);
ClientSocket client=new ClientSocket();
Request request=new Request(2);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(pCenter, response.getResponse());
}
elseif(e.getSource()==this.FuwenButton){
heroMenus=new FuwenMenu();
menusName="符文增加";
this.FuwenButton.setEnabled(false);
ClientSocket client=new ClientSocket();
Request request=new Request(3);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(pCenter, response.getResponse());
}
new OrderHero(heroMenus,menusName,file).setVisible(true);
}
}
7、OrderHero类
(1)成员变量
pTop,pBottom,pImage是JPanel类创建的三个容器。
menusList,orderList是JList对象。
addButton,randonButton,deleteButton,saveButton是JButton对象。
orderHero用来保存所选择的英雄。
selectedIndex表示菜单中被选择的索引,orderIndex表示玩家已选择的索引。
orderHeroNames实现列表的增加、删除元素的功能。
file用来保存选英雄明细。
(2)成员方法
OrderHreo()构造方法。
actionPerfromed(ActionEvent)方法。
valueChanged(ListSelectionEvent)方法。
OrderHero(HeroMenuheroMenu,Stringname,File file)构造方法。
paint(Graphics)用来绘制显示英雄的相关信息。
代码为:
public OrderHero(){
}
public OrderHero(HeroMenuheroMenu,Stringname,File file){
this.file =file;
setTitle(name);
heroMenus=heroMenu.getRoleMenu();
heroNames=new Vector<String>();
heroDiscriptions=new Vector<String>();
heroATK=new Vector<Double>();
heroImages=new Vector<Image>();
orderHero=new Vector<Hero>();
orderHeroNames=new DefaultListModel();
Iterator<Hero> iterator=heroMenus.iterator();
while(iterator.hasNext()){
hero=iterator.next();
heroNames.add(hero.getName());
this.heroDiscriptions.add(hero.getDescription());
this.heroImages.add(hero.getImage());
this.heroATK.add(hero.getATK());
}
setLayout(new BorderLayout());
pTop=new JPanel();
pTop.setLayout(new GridLayout(1,3));
JPanelpMenus=new JPanel();
pMenus.setLayout(new BorderLayout());
menusList=new JList(heroNames);
menusList.setSelectedIndex(0);//设置默认选择第一选项
menusList.setSelectionMode(ListSelectionModel.SINGL E_SELECTION);//设置只能单选
menusList.addListSelectionListener(this);
JScrollPanelistScrollPane=new JScrollPane(menusList) ;
pMenus.add(new JLabel("英雄
",JLabel.CENTER),"North");
pMenus.add(listScrollPane,"Center");
JPanelpButton=new JPanel();
Box box=Box.createVerticalBox();
this.addButton=new JButton("选择");
this.addButton.addActionListener(this);
this.randonButton=new JButton("随机选择");
this.randonButton.addActionListener(this);
this.deleteButton=new JButton("重新选择");
this.deleteButton.addActionListener(this);
this.saveButton=new JButton("确认");
this.saveButton.addActionListener(this);
box.add(Box.createVerticalStrut(20));
box.add(addButton);
box.add(Box.createVerticalStrut(15));
box.add(randonButton);
box.add(Box.createVerticalStrut(15));
box.add(deleteButton);
box.add(Box.createVerticalStrut(15));
box.add(saveButton);
pButton.add(box);
JPanelpOrder=new JPanel();
pOrder.setLayout(new BorderLayout());
orderList=new JList(orderHeroNames);
orderList.addListSelectionListener(this);
JScrollPane
listScrollPane2=new JScrollPane(orderList);
pOrder.add(new JLabel("已选择
",JLabel.CENTER),"North");
pOrder.add(listScrollPane2,"Center");
pTop.add(pMenus);
pTop.add(pButton);
pTop.add(pOrder);
pBottom=new ImagePanel();
add(pTop,"North");
add(pBottom,"Center");
setBounds(300,10,900,700);
this.setResizable(false);
this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON _CLOSE);
}
@Override
publicvoid actionPerformed(ActionEvent e) {
if(e.getSource()==this.addButton){
Hero hero=this.heroMenus.get(selectedIndex);
this.orderHero.add(hero);
this.orderHeroNames.addElement(hero.getName());
ClientSocket client=new ClientSocket();
Request request=new Request(4);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(addButton, response.getResponse());
}
elseif(e.getSource()==this.deleteButton ){
ClientSocket client=new ClientSocket();
Request request=new Request(6);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(deleteButton , response.getResponse());
orderIndex=orderList.getSelectedIndex();
this.orderHero.remove(orderIndex);
this.orderHeroNames.removeElementAt(orderIndex);
}
elseif(e.getSource()==this.randonButton){
int size=heroMenus.size();
Random rand=new Random();
selectedIndex=rand.nextInt(size);
menusList.setSelectedIndex(selectedIndex);
ClientSocket client=new ClientSocket();
Request request=new Request(5);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(randonButton, response.getResponse());
}
elseif(e.getSource()==this.saveButton ){
saveButton.setEnabled(false);
try {
RandomAccessFile
out=new RandomAccessFile(file,"rw");
if(file.exists()){
long length=file.length();
out.seek(length);
}
for(int i=0;i<this.orderHero.size();i++){ out.writeUTF(orderHero.get(i).getName());
out.writeDouble(orderHero.get(i).getATK());
}
out.close();
} catch (IOException e1) {
}
ClientSocket client=new ClientSocket();
Request request=new Request(7);
client.clientSent(request);
Response response=client.clientReceive();
JOptionPane.showMessageDialog(saveButton, response.getResponse());
setVisible(false);
}
}
@Override
publicvoid valueChanged(ListSelectionEvent e) { if(e.getSource()==this.menusList){
selectedIndex=menusList.getSelectedIndex();
pBottom.repaint();
}
}
class ImagePanel extends JPanel{
privatestaticfinallong serialVersionUID = 1L;
publicvoid paint(Graphics g){
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLACK);
g.setFont(new Font("楷体",Font.BOLD,18));
g.drawString(heroNames.get(selectedIndex), 260,40 );
g.drawString("攻击力:
"+heroATK.get(selectedIndex),500,40);
g.drawImage(heroImages.get(selectedIndex),200,45,60 0,360,this);
g.drawString(heroDiscriptions.get(selectedIndex),26 0,420);
}
}
四、实验总结
通过此次实验设计我们熟练掌握了Java Swing的组件、容器、布局管理器、事件处理机制及java的图形处理,受益颇多。