收藏 分销(赏)

Java综合实验游戏界面的设计.docx

上传人:仙人****88 文档编号:11398095 上传时间:2025-07-21 格式:DOCX 页数:16 大小:45.63KB 下载积分:10 金币
下载 相关 举报
Java综合实验游戏界面的设计.docx_第1页
第1页 / 共16页
Java综合实验游戏界面的设计.docx_第2页
第2页 / 共16页


点击查看更多>>
资源描述
《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对象调用该方法返回它的图像的引用。 代码为: public class Hero{ private String 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(); 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) 成员变量 HeroMenu对象是英雄对象的集合,用LinkedList数据结构来处理。 (2) 成员方法 Hero(String ,String ,double ,String)是构造方法,创建Hero对象时使用该构造方法,实现对Hero对象的初始化。 addItem(String ,String ,double ,String)方法用于往链表heroMenu中添加英雄元素。 GetHeroMenu()方法。HeroMenu对象调用此方法可以返回英雄的链表,这个方法也是为后面初始化OrderHero窗口做准备。 代码为: public class HeroMenu { LinkedList<Hero> heroMenu; public HeroMenu(){ heroMenu=new LinkedList<Hero>(); } public void addItem(String name,String description,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.BLUE),"选英雄啦",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 public void 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-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 showOrdering=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.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()); } else if(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()); } 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); 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(HeroMenu heroMenu,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<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)); JPanel pMenus=new JPanel(); pMenus.setLayout(new BorderLayout()); menusList=new JList(heroNames); menusList.setSelectedIndex(0);//设置默认选择第一选项 menusList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置只能单选 menusList.addListSelectionListener(this); JScrollPane listScrollPane=new JScrollPane(menusList); pMenus.add(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.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); JPanel pOrder=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 public void 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()); } else if(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); } else if(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()); } 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<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 public void valueChanged(ListSelectionEvent e) { if(e.getSource()==this.menusList){ selectedIndex=menusList.getSelectedIndex(); pBottom.repaint(); } } 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)); 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的图形处理,受益颇多。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服