1、《Java程序设计实验》综合课程设计报告 ——英雄联盟选英雄界面设计 2014计算机科学与技术班 2016年12月2日 一、 实验目的 设计一个程序来实现英雄联盟游戏时选择英雄的流程,通过此实验设计熟练掌握Java Swing的组件、容器、布局管理器、事件处理机制及java的图形处理。 二、 实验原理 本实验要处理的最基本对象就是英雄及英雄菜单,因此可以设计Hero类和HeroMenu类。程序在选择英雄过程中是分为英雄、符文、天赋三种类别来进行选择的,因此这里分别建立了RoleMe
2、nu类、FuwenMenu类、TianfuMenu类。这三个类的父类是HeroMenu类,这样子类可以继承父类的一些属性和方法,并且可以实现多态。登陆/选择英雄主界面设计为一个窗口,是JFrame的子类,名为OrderingWindow类。通过该主界面切换到分类选英雄界面和显示选择明细及技能界面。分类选择英雄界面用一个对话框来实现,设计为JDialog的子类OrderHero类来处理。最后的选英雄界面和显示选择明细及技能界面用ShowOrderingRecord类来实现。是JDialog的子类。 三、 实验内容 1、 Hero类 (1) 成员变量 name、description、AT
3、K、image分别用来表示英雄的名字、英雄的描述、英雄的攻击力、英雄的图像。 (2) 成员方法 Hero(String ,String ,double ,String)是构造方法,创建Hero对象时使用该构造方法,实现对Hero对象的初始化。 getName()方法。Hero对象调用该方法返回它的名字。 getDescription()方法。Hero对象调用该方法返回它的描述。 getATK()方法。Hero对象调用该方法返回它的攻击力。 getImage()方法。Hero对象调用该方法返回它的图像的引用。 代码为: public class Hero{ private S
4、tring name; private String description; private double ATK; private Image image; public Hero(String name, String description, double ATK, String filename) { super(); this.name = name; this.description = description; this.ATK = ATK; Toolkit toolkit=Toolkit.getDefaultToolkit(
5、); this.image=toolkit.createImage(filename); } public String getName() { return name; } public String getDescription() { return description; } public double getATK() { return ATK; } public Image getImage() { return image; } } 2、 HeroMenu类 (1) 成员变量 H
6、eroMenu对象是英雄对象的集合,用LinkedList数据结构来处理。 (2) 成员方法 Hero(String ,String ,double ,String)是构造方法,创建Hero对象时使用该构造方法,实现对Hero对象的初始化。 addItem(String ,String ,double ,String)方法用于往链表heroMenu中添加英雄元素。 GetHeroMenu()方法。HeroMenu对象调用此方法可以返回英雄的链表,这个方法也是为后面初始化OrderHero窗口做准备。 代码为: public class HeroMenu { Linked
7、List
8、eturn heroMenu; } } 3、 RoleMenu类 这个类只有一个构造方法RoleMenu()。该方法中实现对英雄菜单的初始化,在方法内继承addItem(String ,String ,double ,String)方法,通过它来增加Hero对象。同样也继承父类的HeroMenu链表。 代码为: public RoleMenu(){ addItem("寒冰射手艾希","冰霜射击/致命减速艾希的暴击不造成额外伤害,但会将减速效果提升至10%",7,"寒冰射手.jpg"); addItem("刀锋之影泰隆","泰隆的技能会创伤英雄和史诗
9、级野怪,持续6秒",9,"刀锋之影.jpg"); addItem("放逐之刃锐雯","剑刃充能,保证她的下次普攻造成额外的伤害",8,"放逐之刃.jpg"); addItem("蒸汽机器人布里茨","被动法力屏障,生命值低于20%时,将激活法力屏障",4,"蒸汽机器人.jpg"); addItem("德玛西亚之力盖伦","小兵的伤害不会中断坚韧的效果",7,"德玛西亚之力.jpg"); addItem("齐天大圣孙悟空","金刚不坏(被动),周围每个敌方英雄都会增加孙悟空护甲和魔法抗性",8,"齐天大圣.jpg"); addItem("诺克萨斯之手德莱厄斯","用
10、斧刃对敌人造成伤害时,敌人会流血",9,"诺克萨斯之手.jpg"); addItem("蜘蛛女皇伊莉丝","人类形态,每当伊莉丝的技能命中一名敌人时,就会有一只小蜘蛛准备就绪",6,"蜘蛛女皇.jpg"); addItem("盲僧李青","疾风骤雨、李青释放技能后,接下来的2次基础攻击增加40%攻击速度第一次攻击回复20能量",8,"盲僧.jpg"); addItem("皎月女神黛安娜","获得20%攻击速度加成。 ",7,"皎月女神.jpg"); } 4、 FuwenMenu类 这个类也只有一个构造方法FuwenMenu()。该方法中实现对符文菜单的初始化,
11、此类也继承父类的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魔法抗性"
12、8,"高级魔法抗性雕纹.jpg"); } 5、 TianfuMenu类 这个类也只有一个构造方法TianfuMenu()。该方法中实现对天赋菜单的初始化,此类也继承父类的HeroMenu的属性和方法。 代码为: public TianfuMenu(){ addItem("雷霆领主","法令属性:你对一名敌方英雄进行的第三次攻击或施法会暴击目标周围区域",10,"雷霆领主.jpg"); addItem("战争领主的嗜血","法令属性:对抗小兵时会获得收益",12,"战争领主的嗜血.jpg"); addItem("冥火之触","法令属性:你的伤害型技能
13、会使敌方英雄在4秒里连续受伤害",10,"冥火之触.jpg"); addItem("风暴骑手的狂涌","法令属性:获得移动速度和减速抗性",16,"风暴骑手的狂涌.jpg"); addItem("雷霆领主的法令","法令属性:你对相同敌方英雄进行的第三次攻击或伤害会召唤一次雷电打击",14,"雷霆领主的法令.jpg"); } 6、 OrderingWindow类 (1) 成员变量 成员变量有:pNorth、pCenter、pSouth是JPanel创建的三个容器。roleButton、fuwenButton、tianfuBotton、showButton、stopOr
14、deringButton是JButton创建的5个按钮。idTextField、dateTextField是JTextField类创建的对象。file是File类创建的文件对象。idSet是一个HashSet
15、英雄界面");
idSet=new HashSet
16、abel("本次游戏日期和时间:")); pNorth.add(dateTextField); pCenter=new JPanel(); pCenter.setBorder(new TitledBorder(new LineBorder(Color.BLUE),"选英雄啦",TitledBorder.LEFT,TitledBorder.TOP)); RoleButton=new JButton("英雄"); RoleButton.addActionListener(this); RoleButton.setEnabled(false); Ti
17、anfuButton=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
18、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.addAc
19、tionListener(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"); se
20、tBounds(100,100,600,230); this.setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==this.idTextField){ if(idTextField!=null){ if(!idSet.add(idTextField.getText()
21、)){ JOptionPane.showMessageDialog(this, "此ID已有人登陆,您要另行选择啦!"); } else { idTextField.setEditable(false); ClientSocket client=new ClientSocket(); Request request=new Request(8); client.clientSent(request); Response response=client.clientReceive(); JOp
22、tionPane.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 SimpleDateF
23、ormat("本次登陆时间:yyyy-MM-dd HH:mm:ss"); String date=matter.format(nowTime); this.dateTextField.setText(date); String filename=idTextField.getText()+"所选英雄情况.txt"; file=new File(filename); } } } else if(e.getSource()==this.showButton){ ShowOrderingRecord showOr
24、dering=new ShowOrderingRecord(file); showOrdering.setVisible(true); showOrdering.showRecord(); } else if(e.getSource()==this.stopOrderingButton){ this.idTextField.setText(null); this.idTextField.setEditable(true); this.dateTextField.setText(null); this.RoleButton.setEna
25、bled(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.setEna
26、bled(false); ClientSocket client=new ClientSocket(); Request request=new Request(1); client.clientSent(request); Response response=client.clientReceive(); JOptionPane.showMessageDialog(pCenter, response.getResponse()); } else if(e.getSource()==this.TianfuButton){
27、 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(pCent
28、er, response.getResponse()); } else if(e.getSource()==this.FuwenButton){ heroMenus=new FuwenMenu(); menusName="符文 增加"; this.FuwenButton.setEnabled(false); ClientSocket client=new ClientSocket(); Request request=new Request(3); client.clientSent(request);
29、 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,rand
30、onButton,deleteButton,saveButton是JButton对象。 orderHero用来保存所选择的英雄。 selectedIndex表示菜单中被选择的索引,orderIndex表示玩家已选择的索引。 orderHeroNames实现列表的增加、删除元素的功能。 file用来保存选英雄明细。 (2) 成员方法 OrderHreo()构造方法。 actionPerfromed(ActionEvent)方法。 valueChanged(ListSelectionEvent)方法。 OrderHero(HeroMenu heroM
31、enu,String name,File file)构造方法。
paint(Graphics)用来绘制显示英雄的相关信息。
代码为:
public OrderHero(){
}
public OrderHero(HeroMenu heroMenu,String name,File file){
this.file =file;
setTitle(name);
heroMenus=heroMenu.getRoleMenu();
heroNames=new Vector
32、ons=new Vector
33、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)); JPanel pMenus=new JPanel(); pMenus.set
34、Layout(new BorderLayout()); menusList=new JList(heroNames); menusList.setSelectedIndex(0);//设置默认选择第一选项 menusList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置只能单选 menusList.addListSelectionListener(this); JScrollPane listScrollPane=new JScrollPane(menusList); pMenus.ad
35、d(new JLabel("英雄",JLabel.CENTER),"North"); pMenus.add(listScrollPane,"Center"); JPanel pButton=new JPanel(); Box box=Box.createVerticalBox(); this.addButton=new JButton("选 择"); this.addButton.addActionListener(this); this.randonButton=new JButton("随机选择"); this.randon
36、Button.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.createVerti
37、calStrut(15)); box.add(randonButton); box.add(Box.createVerticalStrut(15)); box.add(deleteButton); box.add(Box.createVerticalStrut(15)); box.add(saveButton); pButton.add(box); JPanel pOrder=new JPanel(); pOrder.setLayout(new BorderLayout()); orderList=new JList(orderHe
38、roNames); 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 Im
39、agePanel(); add(pTop,"North"); add(pBottom,"Center"); setBounds(300,10,900,700); this.setResizable(false); this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==this.addButton){
40、 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(); JOptionPan
41、e.showMessageDialog(addButton, response.getResponse()); } else if(e.getSource()==this.deleteButton ){ ClientSocket client=new ClientSocket(); Request request=new Request(6); client.clientSent(request); Response response=client.clientReceive(); JOptionPane.showMessageDialog(
42、deleteButton , response.getResponse()); orderIndex=orderList.getSelectedIndex(); this.orderHero.remove(orderIndex); this.orderHeroNames.removeElementAt(orderIndex); } else if(e.getSource()==this.randonButton){ int size=heroMenus.size(); Random rand=new Random(); selecte
43、dIndex=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
44、));
}
else if(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 45、 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.cli 46、entReceive();
JOptionPane.showMessageDialog(saveButton, response.getResponse());
setVisible(false);
}
}
@Override
public void valueChanged(ListSelectionEvent e) {
if(e.getSource()==this.menusList){
selectedIndex=menusList.getSelectedIndex();
pBottom.repaint();
} 47、
}
class ImagePanel extends JPanel{
private static final long serialVersionUID = 1L;
public void paint(Graphics g){
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLACK);
g.setFont(new Font("楷体",Font.BOLD,18));
48、 g.drawString(heroNames.get(selectedIndex), 260,40 );
g.drawString("攻击力:"+heroATK.get(selectedIndex),500,40);
g.drawImage(heroImages.get(selectedIndex),200,45,600,360,this);
g.drawString(heroDiscriptions.get(selectedIndex),260,420);
}
}
四、 实验总结
通过此次实验设计我们熟练掌握了Java Swing的组件、容器、布局管理器、事件处理机制及java的图形处理,受益颇多。






