摘要本文论述了通过JAVA多线程、基于JAVA Swing的GUI图形用户界面设计、IO输入输出流、JDBC技术,实现了游戏系统的UI设计、游戏数据的存储、关卡的设置、用户头像的上传与更改、游戏数据实时更新、技能施放、角色的控制(跳跃,行走,释放技能)、角色和敌人血量的计算、敌人自动攻击与移动、用户登录注册功能的方法。

关键词:UI设计;数据存储;关卡设计;实时更新;上传与更改;角色控制;自动攻击;血量计算;登录注册;

1 研究目标

本文的研究旨在提升开发者的编程能力、解决问题的能力。需要实现的功能有:登录注册功能、健康游戏系统、游戏主界面设计、用户数据实时更新、用户数据存储、角色控制、血量计算、关卡设置、角色强化、资源获取与使用、游戏道具展示与购买。 玩家通过注册账号、登录账号进入游戏主界面,在主界面,玩家可以点击相应的图标进入角色界面、强化界面、商城界面、奖励界面、任务界面、技能学习界面、设置界面。主界面对当前角色、装备、玩家数据(账号、昵称、经验、金币、钻石、强化石、当前关卡、当前战力指数、攻击、生命、防御、移速)以及所有关卡进行展示,并且可以进入已解锁的关卡(已通过关卡、当前关卡)。角色界面展示出所有的角色(包括角色的属性、价格、形象),玩家可以再次购买角色并出战。商城界面罗列出所有的装备(包括武器、护甲、头盔、战靴、拳套)、回血瓶(在战斗中可以恢复角色血量)。玩家可以消耗钻石或金币进行购买和装备。用户可以在强化界面消耗金币和强化石强化装备,从而提升装备的属性加成,达到增强角色属性的作用。用户可以在奖励界面领取奖励(包括金币、钻石还有极低的概率领取到装备或者角色)。玩家可以在任务界面领取任务,完成后可获得相应奖励。在技能学习界面,玩家可以消耗金币提升技能等级,增强技能释放的伤害或者护盾。在设置界面,玩家可以关闭背景音乐。点击头像可以上传并跟换头像。点击关卡按钮后再点击主界面的开始战斗按钮后进入游戏。(若当前关卡未解锁,则弹出对话框提示关卡未解锁且无法进入游戏)。进入游戏后,受到攻击会降低血量,当血量降低至0时游戏结束闯关失败,无法获取关卡奖励;当击杀所有的小兵或BOSS时,游戏胜利,解锁下一关卡并结算奖励,关卡难度逐渐提升。

系统开发工具

在本次课题研究中,用到以下工具开发:eclipse、MySQL、jlayer-1.0.1、mysql-connector-java-8.0.28,本节对eclipse、MySQL进行简要介绍。

3 相关技术简介

3.1 基于Java Swing的GUI图形化用户界面设计

图形用户界面GUI实现应用与用户的交互,是应用程序的重要组成部分[5]。本节将对所用到的Swing组件及方法等进行一个简单介绍。

3.1.1 顶层容器JFrame

在本次课题研究中,将使用JFrame作为用户与计算机交互的窗口。

JFrame的构造方法:

①JFrame();

②JFrame(String title);//title为字符串类型,作为窗口的标题;

常用方法:

设置单击关闭窗口:frame.setDefaultCloseOperation(int operation);//frame为JFrame的实例;

可选择的参数:

①JFrame.DO_NOTHING_ON_CLOSE:不做任何动作;

②JFrame.HIDE_ON_CLOSE:隐藏窗口;

③JFrame.DISPOSE_ON_CLOSE:关闭窗口;

④JFrame.EXIT_ON_CLOSE:退出应用程序

3.1.2 通用容器 JPanel

通用容器通常用来存放JButton、JLabel、等组件,其对象可作为顶层容器(在此课题中主要指的是JFrame)的Content Pane使用。

①构造方法:JPanel();

②设置大小:panel.setSize();

③设置背景颜色:panel.setBackground(Color());

添加组件panel.add(组件的实例对象);

①设置布局管理器:panel.setLayout();

②作为顶层容器(frame)的Content Pane:frame.setContentPane(panel);

3.1.3 卡片布局管理器 CardLayout

CardLayout可以使多个组件(一般指的是Panel)共享一个显示空间,一个时刻只显示一个组件。

构造方法;

①CardLayout();//无边界间隙。

②CardLayout(int hgap,int vgap);//hgap指定左右间隙,vgap指定上下间隙。

常用方法(Card为CardLayout的实例):

①显示第一张卡片:Card.first(Container parent);

②显示下一张卡片(如果当前卡片是最后一张,则显示第一张):Card.next(Container parent);

③显示前一张卡片:Card.previous(Container parent);

④显示最后一张卡片:Card.last(Container parent);

⑤显示指定名称的组件:Card.show(Container parent,String name);

3.1.4 滚动面板JScrollPane 

通俗地说就是可以通过指定大小的视口对客户组件进行滚动显示的容器,创建时需要指定客户组件,也可以指定显示策略。

构造方法:JScrollPane(Component view,int vsbPolicy,int hsbPolicy);

view指定客户组件, vsbPolicy和hsbPolicy指定水平和垂直滚动策略。

3.1.5 文本类组件

在本次研究中,涉及到用户输入账号密码,因此需要使用到文本类组件。用户名输入使用JTextField,密码输入使用JPasswordField。

JTextField常用方法(JText为JTextField的实例):

①构造方法:JTextField();

②设置边框:JText.setBorder();

③设置字体:JText.setFont();

④设置字体颜色:JText.setFontground();

JPasswordField常用方法(JPass为JPasswordField的实例):

①构造方法:JPasswordField());

②设置边框:JPass.setBorder();

③设置字体:JPass.setFont();

④设置字体颜色:JPass.setFontground();

⑤设置显示字符:JPass.setEchoChar(char ch);//ch为要显示的字符。

3.1.6 标签Jlabel

标签分为文字标签和图标标签,在本次研究中,可用于设置背景,显示角色、用户数据、技能特效、敌人等(label为JLabel的实例)。

常用方法:

①构造文字标签:JLabel(String str);//str为要显示的字符串;

②构造图标标签:JLabel(new Imageicon(String str));//str为要显示的图片所在路径;

③修改标签文字:label.setText(String st);//st为修改后的字符串

④修改标签图片:label.setIcon(new ImageIcon(String str));/str为要修改的图片所在路径;

⑤设置标签大小及位置(无布局管理器):label.setbounds(int x,int y,int w,int h);

3.1.7 按钮 JButton

按钮可以注册监听事件,是实现打开指定页面的必备组件

常用方法:

①构造文字按钮:JButton(String str);//str为要显示的字符串;

②构造图标按钮:JButton(new Imageicon(String str));//str为要显示的图片所在路径;

③修改按钮文字:label.setText(String st);//st为修改后的字符串

④修改按钮图片:label.setIcon(new ImageIcon(String str));/str为要修改的图片所在路径;

⑤设置按钮大小及位置(无布局管理器):label.setbounds(int x,int y,int w,int h);

3.2 Applet多媒体支持

对于一个游戏来说,背景音乐也是必不可少的,我们可以通过Applet多媒体支持为游戏添加背景音乐、音效等。在此,我们只需要添加背景音乐即可,当然也可用此方法添加游戏音效。 具体代码如下:(此处实现方法为请教老师得出,因此不做过多解释)

try {Clip clip = AudioSystem.getClip();AudioInputStream audioInput = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(bgm)));clip.open(audioInput);clip.loop(Clip.LOOP_CONTINUOUSLY);while(clip.isOpen()) {Thread.sleep(10);if(kszt%2==0)  clip.loop(Clip.LOOP_CONTINUOUSLY);else if(kszt%2==1) clip.stop();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (LineUnavailableException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedAudioFileException e) {// TODO Auto-generated catch blocke.printStackTrace();}

常用方法(clip为Clip的实例):

①从头播放:clip.play();

②循环播放:clip.loop();

③停止播放:clip.stop();

3.3 线程

在本课题中,线程是功能实现最为重要的技术。本课题需要通过线程技术实现角色移动、技能释放、血量计算、实时数据更新,点击不同的按钮后展示不同的角色、武器等。

此次研究,我们采用匿名类的方式创建线程,并通过以下结构实现对线程的控制以及功能的实现。以每隔20ms刷新图标按钮B5的图标代码为例如下:

t1=new Thread(new Runnable() {@Overridepublic void run() {while(true) {B5.setIcon(UICON);try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}
});

在此结构中,通过休眠线程(sleep())实现while循环间隔20ms,而每次while循环都会执行一次B5.setIcon(UICON),从而实现每20ms刷新B5图标。同样的,通过这个方法也可以每隔一定的时间修改JLabel的位置,从而实现人物移动......

常用方法:

①t.stop();强行终止线程;

②t.start();唤醒线程;

③t.sleep();线程休眠。

3.4 JDBC技术

JDBC是java访问数据库的标准API,利用JDBC开发数据库应用一般包含如下步骤:

①建立连接:通过Class.forName()方法加载JDBC驱动程序,然后通过getConnection()方法建立连接;

②执行SQL语句:常用的SQL语句有:

  1. use test;//选中库在建表之前必须要选择数据库
  2. show tables;//在选中的数据库之中查看所有的表
  3. create table 表名 (字段1 类型, 字段2 类型);//创建表
  4. desc 表名;//查看所在的表的字段
  5. drop table 表名;//删除表
  6. show create table 表名;//查看创建表的详细信息
  7. alter table 表名 modify 字段 字段类型;//修改字段类型
  8. alter table 表名 add 字段 字段类型;//添加字段
  9. alter table 表名 add 字段 字段类型after字段;//添加字段并指定位置;
  10. alter table 表名 drop 字段名;//删除表字段
  11. Alter table 表名 change 原字段名字 新的字段名字 字段类型
  12. 增加数据方式:insert into 表名 values(值1,值2,...)
  13. update表名set字段1=值1,字段2=值2 where条件  //更新数据
  14. delete from 表名 where 条件;//删除数据,注意:where 条件必须加,否则数据会被全部删除
  15. 查询数据:查询表中的所有数据:select * from 表名 where 条件 //根据条件查询来的数据

③处理结果集;

结果集可以保存数据库查询返回的结果,是ResultSet的对象,可通过游标控制具体记录的访问,使用next()方法移动游标(注:rs.next()必须作为while的循环换条件,rs为ResultSet的实例),然后通过getXXX();方法获取游标所在列的值。

④关闭数据库连接(注:一般先释放Statement对象)。 

4 主要功能设计

4.1 登录注册功能

4.1.1 登录界面的实现效果

玩家在登录注册界面输入账号及密码登录进入游戏。有了用户的注册登录才可以实现每个用户信息的私有化,才能更好的实现健康游戏系统。该功能需实现用户的注册、以及登录。将用户的账号以及密码存储在数据库中,方便下次登录时使用之前的游戏数据。实现效果如图:

 

登录、注册实现方法如下:

界面中的组件均添加于通用容器JPanel的实例中,然后将该JPanel作为顶层容器(JFrame)的Content Pane。

①界面背景:构建图标标签JLanel的实例,图片为背景图片,如图所示:

②账号、密码输入框:在背景中,已经将输入框背景添加上去,因此,此处我们只需将输入框添加上去后,将其调整到合适位置,并设置输出框无边框,背景透明即可。

③登录、注册按钮:该界面中的登录注册按钮均为图标按钮,且“登录”、“注册”字样已添加到图标中,因此,我们只需将按钮添加上去后,将其调整到合适位置,并设置按钮无边框,背景透明即可。

④为登录注册按钮添加事件:添加方式已通过2.1.8 GUI中的事件处理一节

进行介绍,此处不作过多赘述。登录和注册按钮分别调用相应的类方法。

⑤登录事件类方法:在登录时需要通过JDBC技术查询数据库中的用户名、密码,然后通过str.equals()(str为String的实例)方法分别对查询到的用户名、密码和用户输入的用户名、密码进行比较,完全一致则登录成功,否则跳出提示窗提示登录不成功。

⑥注册事件类方法:在注册时需要用户确认密码并输入昵称。若两次输入的密码完全一致,则注册成功并通过JDBC技术将账户信息及一些游戏初始化数据添加到数据库中,若不一致则弹出提示信息,注册失败。

登录、注册窗口代码如下:

import java.awt.Color;import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;public class MJP {public static JTextField Uname=new JTextField(10);public static JPasswordField UPassword=new JPasswordField(11);MJP(){new slz();slz.P=(JPanel)((JFrame) slz.F).getContentPane();slz.P.setOpaque(true);slz.P.setLayout(null);ImageIcon icon=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/背景.png");ImageIcon icon1=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/dl.png");ImageIcon icon2=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/zc.png");JLabel label=new JLabel(icon);label.setBounds(0,0,icon.getIconWidth(),icon.getIconHeight());JLabel label2=new JLabel("请登录或注册游戏账号");slz.P.getRootPane().add(label2);label2.setBounds(5,5,150,15);Font font=new Font("宋体",Font.PLAIN,25);Uname.setEditable(true); // 设置输入框允许编辑Uname.setColumns(10); // 设置输入框的长度为9个字符Uname.setFont(font);Uname.setForeground(Color.WHITE);Uname.setBorder(null);Uname.setOpaque(false);slz.P.getRootPane().add(Uname);Uname.setBounds(900,185,200, 40);       UPassword.setEditable(true); // 设置密码框允许编辑UPassword.setColumns(6); UPassword.setFont(font);// 设置密码框的长度为11个字符UPassword.setEchoChar('*'); // 设置密码框的回显字符。默认的回显字符为圆点UPassword.setForeground(Color.WHITE);UPassword.setBorder(null);UPassword.setOpaque(false);     slz.P.getRootPane().add(UPassword); // 在面板上添加密码框UPassword.setBounds(900,245,200,40);JButton button1 = new JButton(icon1);JButton button2 = new JButton(icon2);slz.P.getRootPane().add(button1);button1.setBorder(null);button1.setBounds(860,300,icon1.getIconWidth(),icon1.getIconHeight());button1.setContentAreaFilled(false);slz.P.getRootPane().add(button2);button2.setBorder(null);button2.setBounds(990,300,icon2.getIconWidth(),icon2.getIconHeight());button2.setBorder(null);button2.setContentAreaFilled(false);button1.addActionListener(new ButtonHandler1());button2.addActionListener(new ButtonHandler2());slz.P.getRootPane().add(label,new Integer(Integer.MIN_VALUE));slz.P.setOpaque(false);slz.F.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                                 slz.F.setSize(1200,800);slz.F.setVisible(true); }
}

登录功能实现方法及代码:

登录功能实现:登录时,查询数据库,若账号密码正确,则直接进入游戏主界面。若密码或账号错误则登录失败并弹出窗口提示。

import java.awt.Font;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class ButtonHandler1 implements ActionListener {public static String[] user=new String[10];@SuppressWarnings("deprecation")@Overridepublic void actionPerformed(ActionEvent e) {Font font=new Font("宋体",Font.PLAIN,30);if(MJP.Uname.getText().equals("")||MJP.UPassword.getText().equals("")) {JFrame F=new JFrame("登录失败");JPanel P=(JPanel) F.getContentPane();JLabel L=new JLabel("账号或密码为空!");L.setFont(font);L.setBounds(60, 0,240,30);JLabel L1=new JLabel("请关闭窗口后重新登录!");L1.setFont(font);L1.setBounds(15, 40,330,30);P.add(L);P.add(L1);F.setLocationRelativeTo(null);F.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                                 F.setSize(360,180);F.setVisible(true);    }String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";String up="";String up1="";for(int i=0;i<8;i++) {user[i]="";}try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {user[0]=rs.getString("用户名");user[1]=rs.getString("密码");user[2]=rs.getString("金币");user[3]=rs.getString("钻石");user[4]=rs.getString("强化石");user[5]=rs.getString("关卡");user[6]=rs.getString("装备");user[7]=rs.getString("昵称");user[8]=rs.getString("经验");}up=user[0]+user[1];up1=MJP.Uname.getText()+MJP.UPassword.getText();if(!MJP.Uname.getText().equals("")&&!MJP.UPassword.getText().equals("")) {if(up.equals(up1)) {slz.F.dispose();new SLZDL();}else if(!up.equals(up1)) {JFrame F=new JFrame("登录失败");JPanel P=(JPanel) F.getContentPane();JLabel L=new JLabel("账号或密码错误!");L.setFont(font);L.setBounds(60, 0,240,30);JLabel L1=new JLabel("请关闭窗口后重新登录!");L1.setFont(font);L1.setBounds(15, 40,330,30);P.add(L);P.add(L1);F.setLocationRelativeTo(null);F.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                                 F.setSize(360,180);F.setVisible(true); }}stmt.close();conn.close();}catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}// TODO Auto-generated method stub}}

实现效果:

登录成功:

登录失败:

注册功能实现及代码:

注册时,需要用户再次输入密码及昵称并确认注册,若两次输入的密码一致则注册成功:

实现效果:

实现代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class ButtonHandler2 implements ActionListener {private Font font=new Font("宋体",Font.PLAIN,25);private Font font1=new Font("宋体",Font.PLAIN,20);public static JTextField UPassword=new JTextField(11);public static JTextField UNC=new JTextField(11);@Overridepublic void actionPerformed(ActionEvent e) {JFrame F=new JFrame("游戏注册");JPanel P=(JPanel)((JFrame) F).getContentPane();JLabel label=new JLabel("请再次输入密码");P.setOpaque(true);P.getRootPane().add(label);label.setOpaque(true);label.setFont(font1);label.setBorder(BorderFactory.createLineBorder(Color.black));label.setBackground(Color.white);label.setForeground(Color.black);label.setBounds(10,10,160,40);label.setOpaque(true);UPassword.setEditable(true); // 设置密码框允许编辑UPassword.setColumns(6); UPassword.setFont(font);// 设置密码框的长度为11个字符P.getRootPane().add(UPassword); // 在面板上添加密码框UPassword.setBounds(180,10,240,40);JLabel label1=new JLabel("请输入您的昵称");P.setOpaque(true);P.getRootPane().add(label1);label1.setOpaque(true);label1.setFont(font1);label1.setBorder(BorderFactory.createLineBorder(Color.black));label1.setBackground(Color.white);label1.setForeground(Color.black);label1.setBounds(10,60,160,40);label1.setOpaque(true);UNC.setEditable(true); // 设置密码框允许编辑UNC.setColumns(6); UNC.setFont(font);// 设置密码框的长度为11个字符P.getRootPane().add(UNC); // 在面板上添加密码框UNC.setBounds(180,60,240,40);JButton button=new JButton("确定");P.getRootPane().add(button);button.setBounds(200,110,60,40);button.addActionListener(new ButtonHandler9());P.setOpaque(false);F.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                                 F.setSize(450,200);F.setVisible(true); // TODO Auto-generated method stub}}

4.2 游戏主体

在游戏主界面可以进入关卡(闯关模式),并且将当前出战角色、装备展示出来,同时添加了背景音乐,其实现效果及方法如下:

4.2.1 游戏主界面

实现方法:

主界面功能及实现方法介绍

①主界面布局:在此处,我们需要实现点击游戏上方的按钮,在同一个窗口中显示出相应的界面。于是,此处采用卡片布局管理器(CardLayout)实现。首先,我们为主窗口设置背景(与登录注册背景图片设置方法相同,此处不作赘述),并设置布局管理器为卡片布局管理器。然后,将各个界面分别设置为“Card1”、“Card2”、“Card3”......最后使用actionPerformed(ActionEvent e)方法注册按钮事件通过e.getSource()方法监听用户点击的按钮,并使用show()方法显示对应的卡片。

②用户数据(包括数据和当前角色、装备)实时更新:通过一个线程(程序运行时均启动)每隔500ms查询一次数据库中的用户数据(包括头像路径),然后获取结果集中的各个数据,并通过相应的setIcon()方法跟换标签或按钮中显示的文字或图片。

③更换头像:通过图标按钮的方式显示用户头像(在注册时,已默认用户头像,并将相应路径添加到数据库中),注册按钮事件,通过文件选择器选择用户指定的图片,并通过输入/输出流将用户指定的图片复制到指定文件夹中,然后通过jc.getSelectedFile().getAbsolutePath();方法获取复制后的图片路径,并将其通过JDBC技术更新到数据库中的相应字段。通过②就可以将新头像更新出来跟换前如图:

跟换后如图:

④关卡按钮的添加及监听事件:在此,需要将关卡按钮添加到滚动面板(JScrollPane)中,需要添加的按钮比较多,因此通过for循环添加,同时给按钮注册事件监听(在for循环中,用final修饰I,并将i赋值于I,在按钮事件中,将I的值赋予全局变量m)。通过线程访问数据库中的当前关卡字段(int型),当i等于该值时,修改该按钮图标为“当前图标”,若i大于该值则修改为灰色图标,若i小于该值则不修改。

⑤进入关卡:点击相应的关卡按钮后,通过一个线程时刻访问m的值,并更新界面右下角显示的关卡数。m与3取余,结果为0,1,2分别对应不同的图片编号,然后通过setIcon()方法修改右下角显示标签中的图片,添加关卡按钮时,也是通过类似的方法实现添加不同的按钮图标。点击“开始战斗”图标后进入关卡(该图标注册了关卡事件,稍后再作介绍)。

主界面实现效果已在上面呈现,接下来直接上代码:

import java.applet.Applet;import java.applet.AudioClip;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class SLZDL extends JFrame implements ActionListener{AudioClip BGM;public static String tx="D:/eclipse/zhaoxiao/image/头像/UICON.png";public static ImageIcon UICON=new ImageIcon(tx);public static double[][] JS=new double[11][4]; public static int kszt=0;ImageIcon BJ=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/背景1.png");ImageIcon FH=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/返回.png");ImageIcon SZ=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/设置.png");ImageIcon JL=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/奖励.png");ImageIcon RW=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/任务.png");ImageIcon icon1=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/学习.png");ImageIcon icon2=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/无尽.png");ImageIcon icon3=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/商城.png");ImageIcon icon4=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/强化.png");ImageIcon icon5=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/角色.png");ImageIcon icon6=new ImageIcon("D:/eclipse/zhaoxiao/image/bt6.png");ImageIcon icon7=new ImageIcon("D:/eclipse/zhaoxiao/image/bt7.png");ImageIcon iconbj1=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/边界—竖.png");ImageIcon iconbj2=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/边界—横.png");JButton bt0=new JButton(FH);JButton bt1=new JButton(icon1);JButton bt2=new JButton(icon2);JButton bt3=new JButton(icon3);JButton bt4=new JButton(icon4);JButton bt5=new JButton(icon5);JButton bt6=new JButton(icon6);JButton bt7=new JButton(icon7);JButton bt8=new JButton(SZ);JButton bt9=new JButton(JL);JButton bt10=new JButton(RW);JLabel L1=new JLabel(iconbj1);JLabel L2=new JLabel(iconbj2);JLabel L3=new JLabel(iconbj1);JLabel L4=new JLabel(iconbj2);JLabel L=new JLabel(BJ);JButton B5=new JButton();JLabel L6=new JLabel();JLabel L7=new JLabel();JLabel L8=new JLabel();JLabel L9=new JLabel();JLabel L10=new JLabel();JLabel L11=new JLabel();JLabel L12=new JLabel();JLabel L13=new JLabel();JLabel L14=new JLabel();JLabel L15=new JLabel();JLabel L16=new JLabel();JLabel L17=new JLabel();private Thread t;public static CardLayout CLOUT=new CardLayout();public static String JN="";
private JButton[] JB=new JButton[] {bt0,bt6,bt3,bt4,bt1,bt2,bt5,bt8,bt9,bt10,bt7};
private JPanel JP=new JPanel();
public static JPanel Jp=new JPanel();
private Thread t1;
public static Thread t2;
@SuppressWarnings({ "removal", "deprecation" })
public SLZDL() throws MalformedURLException {this.setLayout(null);L.setBounds(0,0,BJ.getIconWidth(),BJ.getIconHeight());JPanel p=(JPanel) this.getContentPane();p.setOpaque(false);p.getRootPane().add(L,new Integer(Integer.MIN_VALUE));for(int i=0;i<11;i++) {JS[i][0]=200*(1+i*0.1);JS[i][1]=500*(1+i*0.1);JS[i][2]=20*(1+i*0.1);}bt0.setBounds(10,600,FH.getIconWidth(),FH.getIconHeight());bt1.setBounds(720,0,icon1.getIconWidth(),icon1.getIconHeight());bt2.setBounds(0,420,icon2.getIconWidth(),icon2.getIconHeight());bt3.setBounds(360,0,icon3.getIconWidth(),icon3.getIconHeight());bt4.setBounds(240,0,icon4.getIconWidth(),icon4.getIconHeight());bt5.setBounds(120,0,icon5.getIconWidth(),icon5.getIconHeight());bt6.setBounds(5,480,icon6.getIconWidth(),icon6.getIconHeight());bt7.setBounds(5,540,icon7.getIconWidth(),icon7.getIconHeight());bt8.setBounds(1100,0,SZ.getIconWidth(),SZ.getIconHeight());bt9.setBounds(480,0,JL.getIconWidth(),JL.getIconHeight());bt10.setBounds(600,0,RW.getIconWidth(),RW.getIconHeight());L1.setBounds(120,110,iconbj1.getIconWidth(),iconbj1.getIconHeight());L2.setBounds(120,660,iconbj2.getIconWidth(),iconbj2.getIconHeight());L3.setBounds(1175,110,iconbj1.getIconWidth(),iconbj1.getIconHeight());L4.setBounds(120,100,iconbj2.getIconWidth(),iconbj2.getIconHeight());L6.setBounds(0,115,110,20);L7.setBounds(0,140,110,20);L8.setBounds(0,165,110,20);L9.setBounds(0,190,110,20);L10.setBounds(0,215,110,20);L11.setBounds(0,240,110,20);L12.setBounds(0,265,110,20);L13.setBounds(0,285,110,20);L14.setBounds(0,310,110,20);L15.setBounds(0,335,110,20);L16.setBounds(0,360,110,20);L17.setBounds(0,385,110,20);bt0.setContentAreaFilled(false);bt0.setBorderPainted(false);bt1.setContentAreaFilled(false);bt1.setBorderPainted(false);bt2.setContentAreaFilled(false);bt2.setBorderPainted(false);bt3.setContentAreaFilled(false);bt3.setBorderPainted(false);bt4.setContentAreaFilled(false);bt4.setBorderPainted(false);bt5.setContentAreaFilled(false);bt5.setBorderPainted(false);bt8.setContentAreaFilled(false);bt8.setBorderPainted(false);bt9.setContentAreaFilled(false);bt9.setBorderPainted(false);bt10.setContentAreaFilled(false);bt10.setBorderPainted(false);B5=new JButton(UICON);B5.setBounds(5,5,100,100);B5.addActionListener(new GGTX());t1=new Thread(new Runnable() {@Overridepublic void run() {while(true) {B5.setIcon(UICON);try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}
});t=new Thread(new Runnable() {String[] user=new String[10];String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";String sql1="select *from 装备 where 用户='"+MJP.Uname.getText()+"';";@Overridepublic void run() {double GJ,SM,FY,YS,ZL;String DQZB ="";String DQZBDJ="";for(int i=0;i<8;i++) {user[i]="";}String DQJS ="";String[] ZB=new String[15];String[] ZBDJ=new String[15];t1.start();while(true) {int m=0,n=0,d=0;try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {   user[0]=rs.getString("用户名");user[1]=rs.getString("密码");user[2]=rs.getString("金币");user[3]=rs.getString("钻石");user[4]=rs.getString("强化石");user[5]=rs.getString("关卡");user[6]=rs.getString("装备");user[7]=rs.getString("昵称");user[8]=rs.getString("经验");DQJS=rs.getString("当前角色");d=rs.getInt("当前角色等级");tx=rs.getString("头像");}if(DQJS.equals("孙尚香")) m=1;else if(DQJS.equals("黄忠"))m=2;else if(DQJS.equals("马超"))m=3;else if(DQJS.equals("貂蝉"))m=4;else if(DQJS.equals("刘备"))m=5;else if(DQJS.equals("诸葛亮"))m=6;else if(DQJS.equals("张飞"))m=7;else if(DQJS.equals("关羽"))m=8;else if(DQJS.equals("赵云"))m=9;else if(DQJS.equals("吕布"))m=10;UICON=new ImageIcon(tx);ResultSet rs1=stmt.executeQuery(sql1);while(rs1.next()) {    DQZB=rs1.getString("当前装备");DQZBDJ=rs1.getString("当前装备等级");}for(int i=0;i<15;i++) {ZB[i]="";ZBDJ[i]="";}for(int i=0;i<DQZB.length();i++) {if(DQZB.charAt(i)=='+') {n+=1;}else {ZB[n]=ZB[n]+String.valueOf(DQZB.charAt(i));ZBDJ[n]=ZBDJ[n]+String.valueOf(DQZBDJ.charAt(i));}}stmt.close();conn.close();}      catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}try {Thread.sleep(100); } catch (InterruptedException e) {e.printStackTrace();}GJ=Math.round(JS[m-1][0]*(1+(Integer.valueOf(ZB[0])*Integer.valueOf(ZBDJ[0])+d)*0.1));SM=Math.round(JS[m-1][1]*(1+(Integer.valueOf(ZB[1])*Integer.valueOf(ZBDJ[1])+d)*0.1));FY=Math.round(JS[m-1][2]*(1+(Integer.valueOf(ZB[2])*Integer.valueOf(ZBDJ[2])+d)*0.1));YS=JS[m-1][3]+50;ZL=GJ*5+SM*3+FY*2;B5.setIcon(UICON);L6.setText("账号:"+user[0]);L7.setText("昵称:"+user[7]);L8.setText("经验:"+String.valueOf(Integer.valueOf(user[8])));L9.setText("金币:"+user[2]);L10.setText("钻石:"+String.valueOf(Integer.valueOf(user[3])/10));L11.setText("强化石:"+String.valueOf(Integer.valueOf(user[4])/10));L12.setText("关卡:"+user[5]);L13.setText("战力:"+ZL);L14.setText("攻击:"+GJ);L15.setText("生命:"+SM);L16.setText("防御:"+FY);L17.setText("移速:"+YS);}}// TODO Auto-generated method stub   });t.start();for(int i=0;i<JB.length;i++) {this.add(JB[i]);JB[i].addActionListener(this);}this.add(L1);this.add(L2);this.add(L3);this.add(L4);L6.setForeground(Color.WHITE);L7.setForeground(Color.WHITE);L8.setForeground(Color.WHITE);L9.setForeground(Color.WHITE);L10.setForeground(Color.WHITE);L11.setForeground(Color.WHITE);L12.setForeground(Color.WHITE);L13.setForeground(Color.WHITE);L14.setForeground(Color.WHITE);L15.setForeground(Color.WHITE);L16.setForeground(Color.WHITE);L17.setForeground(Color.WHITE);this.add(B5);this.add(L6);this.add(L7);this.add(L8);this.add(L9);this.add(L10);this.add(L11);this.add(L12);this.add(L13);this.add(L14);this.add(L15);this.add(L16);this.add(L17);new Card();JP.setLayout(new CardLayout());JP.setBounds(130,110, 1045, 550);JP.add("card0",Card.card0);JP.add("card1",Card.card1);JP.add("card2",Card.card2);JP.add("card3",Card.card3);JP.add("card4",Card.card4);JP.add("card5",Card.card5);JP.add("card6",Card.card6);JP.add("card7",Card.card7);JP.add("card8",Card.card8);JP.add("card9",Card.card9);bt7.addActionListener(new ButtonHandler10());this.add(JP);this.setTitle("欢迎来到狩猎者");this.setSize(1200,720);this.setLocationRelativeTo(null);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent a)
{CardLayout cl = (CardLayout) JP.getLayout();   //获取卡片布局管理器引用if(a.getSource()==JB[0]){cl.show(JP,"card0");}if(a.getSource()==JB[1]){cl.show(JP,"card1");}else if(a.getSource()==JB[2]){cl.show(JP,"card2");}else if(a.getSource()==JB[3]){cl.show(JP,"card3");}else if(a.getSource()==JB[4]){cl.show(JP,"card4");}else if(a.getSource()==JB[5]){cl.show(JP,"card5");}else if(a.getSource()==JB[6]){cl.show(JP,"card6");}else if(a.getSource()==JB[7]){cl.show(JP,"card7");}else if(a.getSource()==JB[8]){cl.show(JP,"card8");}else if(a.getSource()==JB[9]){cl.show(JP,"card9");}
}
}

头像上传与更改实现方法:

实现方法已经说过,接下来直接上代码:

1.头像按钮绑定事件类(GGTX类)代码:

import java.awt.event.ActionEvent;import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class GGTX implements ActionListener {private ImageIcon TJ=new ImageIcon("D:/eclipse/zhaoxiao/image/TJ.png");private Thread t1;private Thread t2;public static Thread t;public static JFrame F=new JFrame("跟换头像");private ImageIcon ICON;@Overridepublic void actionPerformed(ActionEvent e) {JPanel P=(JPanel) F.getContentPane();P.setOpaque(false);P.setLayout(null);JLabel L=new JLabel(SLZDL.UICON);L.setBounds(20,30,100,100);P.add(L);JLabel L1=new JLabel("原始头像:");L1.setBounds(20,10,100,15);P.add(L1);t1=new Thread(new Runnable() {@Overridepublic void run() {while(true) {L.setIcon(ICON);try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}
});t2=new Thread(new Runnable() {String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";@Overridepublic void run() {t1.start();while(true) {String tx="";try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {    tx=rs.getString("头像");}ICON=new ImageIcon(tx);stmt.close();conn.close();}catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}try {Thread.sleep(200); } catch (InterruptedException e) {e.printStackTrace();}}}// TODO Auto-generated method stub    });t2.start();JLabel L2=new JLabel("选择头像:");L2.setBounds(150,10,100,15);P.add(L2);JButton B1=new JButton(TJ);B1.setBounds(150,30,100,100);B1.addActionListener(new Xztx());P.add(B1);JButton B2=new JButton("确认更换");B2.addActionListener(new QD());B2.setBounds(95,150,100,30);P.add(B2);F.setLocationRelativeTo(null);F.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                                 F.setSize(300,240);F.setVisible(true);    // TODO Auto-generated method stubt=new Thread(new Runnable() {@Overridepublic void run() {while(true) {B1.setIcon(Xztx.TJ);try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}
});}}

2.选择头像的代码(Xztx类):

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;public class Xztx implements ActionListener {public static ImageIcon TJ;private Thread t;@Overridepublic void actionPerformed(ActionEvent e) {Copy_Frame ad = new Copy_Frame();ad.setVisible(true);t=new Thread(new Runnable() {@Overridepublic void run() {GGTX.t.start();while(true) {TJ=new ImageIcon(Copy_Frame.TJ1);try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}
});t.start();// TODO Auto-generated method stub}}

3.复制头像到指定文件夹代码(Copy_Frame类):

import java.awt.Color;import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;public class Copy_Frame extends JFrame
//implements Runnable
{//创建窗口组件public static String TJ1;JProgressBar progressbar;JLabel jl1 = new JLabel("源  文  件:");JTextField jtf1 = new JTextField(25);JButton jb1 = new JButton("浏览");JButton copyjb = new JButton("开始上传");JLabel copylbed=new JLabel("上传成功");//构造函数public Copy_Frame() {try {//界面设置成Windows风格UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch (ClassNotFoundException | InstantiationException | IllegalAccessException| UnsupportedLookAndFeelException e) {// TODO Auto-generated catch blocke.printStackTrace();}//创建进度条progressbar = new JProgressBar();// 显示当前进度值信息progressbar.setStringPainted(true);// 设置进度条边框不显示progressbar.setBorderPainted(false);// 设置进度条的前景色progressbar.setForeground(new Color(0, 210, 40));// 设置进度条的背景色progressbar.setBackground(new Color(188, 190, 194));//设置进度条位置大小progressbar.setBounds(0,270,500,30);//设置窗口属性    this.setTitle("头像上传");this.setLayout(new GridLayout(5, 1));this.setSize(500, 300);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//被复制文件控件JPanel jp1 = new JPanel();jp1.add(jl1);jp1.add(jtf1);jp1.add(jb1);this.add(jp1);jb1.addMouseListener(new ButtonListener());//复制文件控件JPanel jp2 = new JPanel();this.add(jp2);//开始复制控件JPanel jp3 = new JPanel();jp3.add(copyjb);this.add(jp3);copyjb.addMouseListener(new ButtonListener());//设置监听器this.add(progressbar);//进度条控件JPanel jp4 = new JPanel();jp4.add(progressbar);this.add(jp4);progressbar.setVisible(false);//隐藏进度条//复制完成按钮控件JPanel jp5= new JPanel();jp5.add(copylbed);this.add(jp5);copylbed.setVisible(false);//隐藏文本}//使用内部类进行文件选择class ButtonListener extends MouseAdapter{@Overridepublic void mouseClicked(MouseEvent e) { //点击开始复制后的操作JFileChooser jc = new JFileChooser();//若点击开始复制if(e.getSource()==copyjb) {progressbar.setVisible(true);//显示进度条//开始新线程,开始复制,进度条开始加载new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {copying(jtf1.getText(),"D:\\eclipse\\zhaoxiao\\Image\\头像");  } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}//点击需要复制的文件的"浏览"设置路径if(e.getSource()==jb1) {int val = jc.showOpenDialog(null);if (val==JFileChooser.APPROVE_OPTION){//判断是否选中文件String copyFromFilePath1 = jc.getSelectedFile().getAbsolutePath();//打印文件路径System.out.println(copyFromFilePath1);//输出文件路径在控制台jtf1.setText(copyFromFilePath1);//设置文本框的值为需要复制的文件路径}else{System.out.println("没有选中文件!");//未选择文件}}//点击需要被复制的文件的"浏览"设置路径             }}public void copying(String copy,String be_copyed) throws IOException {//复制方法FileInputStream in  = new FileInputStream(copy);//文件输入流//创建一个文件对象File f=new File(copy);//在目的地后面加上被复制文件名FileOutputStream out  = new FileOutputStream(be_copyed+"\\"+f.getName());//拼接,在目录后加上文件名,表示要将此文件复制到哪个位置TJ1="D:/eclipse/zhaoxiao/image/头像/"+f.getName()+"";System.out.print("\n");System.out.print("#####");System.out.print(TJ1);System.out.print("\n");System.out.print("##"+f.getName());byte[] b = new byte[1024];//设置缓存数组,每次缓存1024个字节int n;//当前一次循环缓存字节数long k;//需要缓存的次数k=f.length()/1024+1;long j=k/100;//进度条每进行1%需要进行的缓存次数long y=j;//设置初值long i=0;int p=0;int x=0;//run();//n是文件的字节数while ((n=in.read(b))!=-1){out.write(b,0,n);i++;//缓存次数if(i==j){j+=y;//进度条下一次加载需要缓存的次数p++;//进度条的值progressbar.setValue(p);//设置进度条当前的值System.out.println("文件复制当前进度"+p+"%");if(p==100){copylbed.setVisible(true);//弹出复制已完成label}}}//关闭文件输入输出流in.close();out.close();System.out.println("头像上传成功!");System.out.println(TJ1);}//JOptionPane.showMessageDialog(this, "加载完成");//this.dispose();关闭窗口,释放资源//this.pack();使控件适合窗口}

4.确定更换头像代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;import javax.swing.JFileChooser;public class QD implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();String sql="update users set 头像='"+Copy_Frame.TJ1+"' where 用户名='"+MJP.Uname.getText()+"'";stmt.executeUpdate(sql);stmt.close();conn.close();}catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}// TODO Auto-generated method stub}}

主界面使用了CardLayout布局管理器,因此需将所有卡片(界面)设计都在一个类中完成(此处类名为Card),Card类代码如下:

import java.awt.CardLayout;import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.print.DocFlavor.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.plaf.IconUIResource;
public class Card extends JPanel {String bgm="D:/eclipse/ShouLZ/Image/music/1.WAV";public static JPanel card0=new JPanel();public static JPanel card1=new JPanel();public static JPanel card2=new JPanel();public static JPanel card3=new JPanel();public static JPanel card4=new JPanel();public static JPanel card5=new JPanel();public static JPanel card6=new JPanel();public static JPanel card7=new JPanel();public static JPanel card8=new JPanel();public static JPanel card9=new JPanel();    private Thread t;private Thread t1;private Thread t2;private Thread t3;private Integer gk;public static int gslx=5900;public static int coung=980;public static int kszt=0;ImageIcon[] ICon=new ImageIcon[10];JButton[] BUt=new JButton[10];JPanel P6=new JPanel();JButton JJs=new JButton();int m,GK,mm;private int n=0;private Thread t4;private JPanel PPP;private Thread t5;private Thread t12;public Thread t6;Card(){Font font=new Font("宋体",Font.PLAIN,24);JPanel P0=new JPanel();P0.setLayout(null);JPanel P1=new JPanel();P1.setLayout(null);JPanel P2=new JPanel();P2.setLayout(null);JPanel P3=new JPanel();P3.setLayout(null);JPanel P4=new JPanel();P4.setLayout(null);JPanel P5=new JPanel();P5.setLayout(null);P6.setLayout(null);  JPanel P7=new JPanel();P7.setLayout(null);card0.setLayout(SLZDL.CLOUT);card0.setOpaque(false);P0.setLayout(null);ImageIcon rwcc=new ImageIcon("D:/eclipse/ShouLZ/image/场景/人物背景.gif");ImageIcon icon=new ImageIcon("D:/eclipse/ShouLZ/image/场景/平台.png");ImageIcon JS=new ImageIcon("D:/eclipse/ShouLZ/image/孙尚香/孙尚香—展示.gif");ImageIcon iconbjs=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/边界—竖.png");ImageIcon iconbjh=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/边界—横.png");ImageIcon JSM=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/当前角色.png");JLabel L0=new JLabel(rwcc);L0.setBounds(0,0,rwcc.getIconWidth(),rwcc.getIconHeight());JLabel L1=new JLabel(iconbjs);L1.setBounds(560,0,iconbjs.getIconWidth(),iconbjs.getIconHeight());JButton B0=new JButton(icon);B0.setBounds(130,375,icon.getIconWidth(),icon.getIconHeight());B0.setContentAreaFilled(false);B0.setBorderPainted(false);JButton B1=new JButton(JS);B1.setBounds(180,100,JS.getIconWidth(),JS.getIconHeight());B1.setContentAreaFilled(false);B1.setBorderPainted(false);      JButton B2=new JButton(JSM);B2.setBounds(150,5,JSM.getIconWidth(),JSM.getIconHeight());B2.setContentAreaFilled(false);B2.setBorderPainted(false);  B2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JFrame DQJSCZ=new JFrame("当前角色");DQJSCZ.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                                 DQJSCZ.setSize(400,900);DQJSCZ.setVisible(true);JPanel p=new JPanel();  p=(JPanel)((JFrame) DQJSCZ).getContentPane();p.setLayout(null);JButton[] B=new JButton[6];    String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";String sql1="select *from 装备 where 用户='"+MJP.Uname.getText()+"';";ImageIcon ICON;ImageIcon[] Icon=new ImageIcon[6];               String[] ZB=new String[6];int n=0;int x=0;int y=100;String Js="D:/eclipse/ShouLZ/image/";String js="";String DQZB="";String Zb="D:/eclipse/ShouLZ/image/装备/装备展示/";String[] zb=new String[6];               for(int i=0;i<6;i++) {ZB[i]="";}               try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {  js=rs.getString("当前角色");}ResultSet rs1=stmt.executeQuery(sql1);while(rs1.next()) {  DQZB=rs1.getString("当前装备");}                 for(int i=0;i<DQZB.length();i++) {if(DQZB.charAt(i)=='+') {n+=1;}else {ZB[n]=ZB[n]+String.valueOf(DQZB.charAt(i));}}                     Js=Js+js+"/"+js+"—展示.gif";zb[0]=Zb+"武器/"+ZB[0]+".png";zb[1]=Zb+"战甲/"+ZB[1]+".png";zb[2]=Zb+"头盔/"+ZB[2]+".png";zb[3]=Zb+"战靴/"+ZB[3]+".png";zb[4]=Zb+"拳套/"+ZB[4]+".png";ICON=new ImageIcon(Js);for(int i=0;i<5;i++) {final int I=i;Icon[i]=new ImageIcon(zb[i]);B[i]=new JButton(Icon[i]);B[i].setBounds(10,120*i+y,100,100);B[i].setContentAreaFilled(false);B[i].setBorderPainted(false);B[i].addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {mm=I;// TODO Auto-generated method stub}});p.add(B[i]);}stmt.close();conn.close();}catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}
//              JButton QHzb=new JButton();// TODO Auto-generated method stub}});JButton[] B=new JButton[6];  P0.add(B2);P0.add(B1);P0.add(L0);P0.add(L1);P0.add(B0);     t2=new Thread(new Runnable() {String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";String sql1="select *from 装备 where 用户='"+MJP.Uname.getText()+"';";ImageIcon ICON;ImageIcon[] Icon=new ImageIcon[6];@Overridepublic void run() {t1=new Thread(new Runnable() {@Overridepublic void run() {while(true) {B1.setIcon(ICON);try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}}});t1.start();while(true) {String[] ZB=new String[6];int n=0;int x=0;int y=180;String Js="D:/eclipse/ShouLZ/image/";String js="";String DQZB="";String Zb="D:/eclipse/ShouLZ/image/装备/装备展示/";String[] zb=new String[6];             for(int i=0;i<6;i++) {ZB[i]="";}               try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {  js=rs.getString("当前角色");}ResultSet rs1=stmt.executeQuery(sql1);while(rs1.next()) {  DQZB=rs1.getString("当前装备");}for(int i=0;i<DQZB.length();i++) {if(DQZB.charAt(i)=='+') {n+=1;}else {ZB[n]=ZB[n]+String.valueOf(DQZB.charAt(i));}}                      Js=Js+js+"/"+js+"—展示.gif";zb[0]=Zb+"武器/"+ZB[0]+".png";zb[1]=Zb+"战甲/"+ZB[1]+".png";zb[2]=Zb+"头盔/"+ZB[0]+".png";zb[3]=Zb+"战靴/"+ZB[1]+".png";zb[4]=Zb+"拳套/"+ZB[0]+".png";ICON=new ImageIcon(Js);for(int i=0;i<5;i++) {if(i==2||i==3) {x+=225;if(i==2) {y-=360;}if(x==3) {y+=330;}}Icon[i]=new ImageIcon(zb[i]);B[i]=new JButton(Icon[i]);B[i].setBounds(x,120*i+y,100,100);B[i].setContentAreaFilled(false);B[i].setBorderPainted(false);P0.add(B[i]);}stmt.close();conn.close();}catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}try {Thread.sleep(500); } catch (InterruptedException e) {e.printStackTrace();}}}// TODO Auto-generated method stub  });t2.start();JPanel P0p=new JPanel();JButton[] GKBt=new JButton[100];ImageIcon IGKBt=new ImageIcon();
//      P0p.setPreferredSize(new Dimension(20000,180));
//      P0p.setLayout(null);for(int i=0;i<99;i++) {GKBt[i]=new JButton();IGKBt=new ImageIcon("D:/eclipse/ShouLZ/image/关卡/关卡图标1.png");GKBt[i].setIcon(IGKBt);if((i+1)%3==0) GKBt[i].setIcon(new ImageIcon("D:/eclipse/ShouLZ/image/关卡/关卡图标BOSS.png"));final int GKS=i;GKBt[i].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {GK=GKS;                 // TODO Auto-generated method stub                  }});GKBt[i].setContentAreaFilled(false);GKBt[i].setBorderPainted(false);
//          GKBt[i].setBounds(i*100,0,IGKBt.getIconWidth(),IGKBt.getIconHeight());P0p.add(GKBt[i]);}t5=new Thread(new Runnable() {@Overridepublic void run() {while(true) {String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {  gk=Integer.valueOf(rs.getString("关卡"));}for(int i=0;i<99;i++) {ImageIcon iion=new ImageIcon();if(i>gk) iion=new ImageIcon("D:/eclipse/ShouLZ/image/关卡/关卡未解锁.png");else if(i==gk)iion=new ImageIcon("D:/eclipse/ShouLZ/image/关卡/当前关卡.png");else if(i<gk) {if(i%3==2) iion=new ImageIcon("D:/eclipse/ShouLZ/image/关卡/关卡图标BOSS.png");if(i%3!=2) iion=new ImageIcon("D:/eclipse/ShouLZ/image/关卡/关卡图标1.png");}GKBt[i].setIcon(iion);}stmt.close();conn.close();}        catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}try {Thread.sleep(3000); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}});t5.start();JButton BGK=new JButton("");JButton GBGK=new JButton(new ImageIcon());t=new Thread(new Runnable() {@Overridepublic void run() {while(true) {String UIBGK="第"+String.valueOf(GK+1)+"关";BGK.setText(UIBGK);ImageIcon IGBGK=new ImageIcon();if((GK+1)%3!=0) {if((GK+1)%3==1) {IGBGK=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/敌人—展示1.gif");GBGK.setIcon(IGBGK);GBGK.setBounds(700, 300,IGBGK.getIconWidth(),IGBGK.getIconHeight());}if((GK+1)%3==2)  {IGBGK=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/敌人—展示2.gif");GBGK.setIcon(IGBGK);GBGK.setBounds(550,180,IGBGK.getIconWidth(),IGBGK.getIconHeight());}}else if((GK+1)%3==0) {IGBGK=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/敌人—展示3.gif");GBGK.setIcon(IGBGK);GBGK.setBounds(550,180,IGBGK.getIconWidth(),IGBGK.getIconHeight());} try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}});t.start();       ImageIcon IKSZD=new ImageIcon("D:/eclipse/ShouLZ/image/关卡/开始战斗.png");JButton KSZD=new JButton(IKSZD);KSZD.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {   gk=Integer.valueOf(rs.getString("关卡"));}stmt.close();conn.close();}      catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}if(gk>=GK) {KSZDGK(GK);}else if(gk<GK) {String sGK="第"+String.valueOf(GK)+"关";JOptionPane JOP=new JOptionPane();JButton QD1=new JButton();JOP.showMessageDialog(QD1, "当前关卡未解锁!",sGK,JOptionPane.WARNING_MESSAGE);P0.add(JOP);}// TODO Auto-generated method stub               }private void KSZDGK(int n) {new KeyFrame(GK);                      }});        KSZD.setBounds(585,440,IKSZD.getIconWidth(),IKSZD.getIconHeight());KSZD.setContentAreaFilled(false);KSZD.setBorderPainted(false);P0.add(KSZD);      BGK.setFont(font);BGK.setForeground(Color.WHITE);BGK.setBounds(750,210,120,40);BGK.setContentAreaFilled(false);BGK.setBorderPainted(false);     GBGK.setContentAreaFilled(false);GBGK.setBorderPainted(false);      P0.add(GBGK);P0.add(BGK);JLabel JLb1=new JLabel(new ImageIcon("D:/eclipse/ShouLZ/image/关卡/背景g.png"));JLb1.setOpaque(false);JLb1.setBounds(570, 180,480,410);P0.add(JLb1);    JScrollPane JSP0=new JScrollPane(P0p,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);     JSP0.setOpaque(false);JSP0.setBounds(570,0,480,180);P0.setBounds(0,0,550,550);P0.add(JSP0);card0.add(P0);card1.setLayout(SLZDL.CLOUT);JLabel label4=new JLabel("游戏中包含人物、武器(近战武器、枪械、投掷武器)、人物技能(跳跃、躲闪、护盾)可以躲避");label4.setBounds(5,10,1050,50);JLabel label5=new JLabel("野兽的伤害。人物与野兽有一定的血量,血量消耗完了视为击杀,击杀野兽可以获得资源,被野兽");label5.setBounds(5,70,1050,50);JLabel label6=new JLabel("击杀视为通关失败。分为闯关模式与无尽模式。闯关模式:击杀BOSS(或完成关卡任务)为闯关");label6.setBounds(5,130,1050,50);JLabel label7=new JLabel("通过,被野兽、BOSS击杀(或落入陷阱)为通关失败。荆棘丛可对人物造成伤害(需通过跳跃越");label7.setBounds(5,190,1050,50);JLabel label8=new JLabel("过荆棘丛),当人物血量为零时也视为闯关失败。每个关卡野兽的伤害及血量逐渐增加,玩家需通");label8.setBounds(5,250,1050,50);JLabel label9=new JLabel("过无尽模式或闯关模式获取资源升级装备、购买物资才能提升战斗能力。可在主界面更换人物(不");label9.setBounds(5,310,1050,50);JLabel label10=new JLabel("同的人物有不同的属性);军备库更换、升级武器武器;在商城购买武器。");label10.setBounds(5,370,1050,50);label4.setFont(font);label5.setFont(font);label6.setFont(font);label7.setFont(font);label8.setFont(font);label9.setFont(font);label10.setFont(font);P1.add(label4);P1.add(label5);P1.add(label6);P1.add(label7);P1.add(label8);P1.add(label9);P1.add(label10);card1.add(P1);card2.setLayout(SLZDL.CLOUT); card2.add(P2);card3.setLayout(SLZDL.CLOUT);JLabel L30=new JLabel(iconbjs);L30.setBounds(210,50,iconbjs.getIconWidth(),iconbjs.getIconHeight()-50);P3.add(L30);JLabel L31=new JLabel(iconbjs);L31.setBounds(420,50,iconbjs.getIconWidth(),iconbjs.getIconHeight()-50);P3.add(L31);JLabel L32=new JLabel(iconbjs);L32.setBounds(630,50,iconbjs.getIconWidth(),iconbjs.getIconHeight()-50);P3.add(L32);JLabel L33=new JLabel(iconbjs);L33.setBounds(840,50,iconbjs.getIconWidth(),iconbjs.getIconHeight()-50);P3.add(L33);JLabel L34=new JLabel("武器库");L34.setBounds(500,0, 40, 20);P3.add(L34);        JLabel L35=new JLabel(iconbjh);L35.setBounds(0,40,iconbjh.getIconWidth(),iconbjh.getIconHeight());P3.add(L35);JScrollPane[] JSP3=new JScrollPane[5];JPanel[] p3=new JPanel[5];JButton[][] ZBK=new JButton[5][20];for(int i=0;i<5;i++) {p3[i]=new JPanel();p3[i].setPreferredSize(new Dimension(200,2000));for(int t=0;t<20;t++) {String Strz="";String Strz1="D:/eclipse/ShouLZ/image/装备/";String Strz2="";if(i==0) Strz2="武器";else if(i==1) Strz2="战甲";else if(i==2) Strz2="头盔";else if(i==3) Strz2="战靴";else if(i==4) Strz2="拳套";final String ZBLX=Strz2;final int T=t+1;Strz=Strz1+Strz2+"/"+String.valueOf(t+1)+".png";ZBK[i][t]=new JButton(new ImageIcon(Strz));ZBK[i][t].setBounds(0,t*100,100,100);ZBK[i][t].setContentAreaFilled(false);ZBK[i][t].setBorderPainted(false);                ZBK[i][t].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JFrame ZBCZ=new JFrame(ZBLX); String sql="select *from 装备 where 用户='"+MJP.Uname.getText()+"';";String strr="";String Zb="";String[] Zbb=new String[20];int s=0;int a=0;for(int n=0;n<20;n++) {if(String.valueOf(T).equals(Zbb[n])) {ZBCZ.setTitle("当前装备已拥有");}else {ZBCZ.setTitle("当前装备未拥有");}}ZBCZ.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);ZBCZ.setSize(400,400);ZBCZ.setVisible(true);    // TODO Auto-generated method stub}});File file=new File(Strz);if(file.exists()) p3[i].add(ZBK[i][t]);}JSP3[i]=new JScrollPane(p3[i],JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);JSP3[i].setBounds(210*i+10,60,200,500);P3.add(JSP3[i]);}card3.add(P3);card4.setLayout(SLZDL.CLOUT);    card4.add(new JButton("学习"));card5.setLayout(SLZDL.CLOUT);card5.add(new JButton("无尽模式"));card6.setLayout(SLZDL.CLOUT);String[] JJS= {"孙尚香","黄忠","马超","貂蝉","刘备","诸葛亮","张飞","关羽","赵云","吕布"};String IN="D:/eclipse/ShouLZ/image/人物合集/";String icn="";   JPanel Pp=new JPanel();JButton SXi=new JButton();JButton IBTs=new JButton();     JButton JNi1=new JButton();JButton JNi2=new JButton();JButton JNi3=new JButton();JButton JNi4=new JButton();        JButton JBJg=new JButton();JButton ZSJg=new JButton();        JButton JSCZ=new JButton();        JLabel JLb=new JLabel(new ImageIcon("D:/eclipse/ShouLZ/image/人物合集/背景.png"));JLb.setOpaque(false);JLb.setBounds(0, 0,1050,400);Pp.setBounds(0, 0,1500,1500);JScrollPane JSP=new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);        JSP.setOpaque(false);JSP.setBounds(0,400,1050,150);for(int i=0;i<10 ;i++) {icn=IN+String.valueOf(i)+".png";ICon[i]=new ImageIcon(icn);BUt[i]=new JButton(ICon[i]);BUt[i].setBounds(0,110*i,100,100);BUt[i].setOpaque(false);BUt[i].setBorderPainted(false);BUt[i].setContentAreaFilled(false); Pp.add(BUt[i]);final int I=i;BUt[i].addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {m=I;// TODO Auto-generated method stub  }           });}        String sql1="select * from 角色 where 用户名="+MJP.Uname.getText();String YJS="";String[] YYJS=new String[10];try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql1);while(rs.next()) {   YJS=rs.getString("拥有角色");}           for(int i=0;i<10;i++) {YYJS[i]="";}for(int i=0;i<YJS.length();i++) {if(YJS.charAt(i)=='+') {n+=1;}else {YYJS[n]=YYJS[n]+String.valueOf(YJS.charAt(i));}}stmt.close();conn.close();}     catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}        t3=new Thread(new Runnable() {Font font=new Font("宋体",Font.PLAIN,25);@Overridepublic void run() {while(true) {final int JBJG,ZSJG;JBJG=250*(m+8);ZSJG=JBJG/25;String Ii="D:/eclipse/ShouLZ/image/"+JJS[m]+"/"+JJS[m]+"—展示.gif";ImageIcon II=new ImageIcon(Ii);                  String ISx="D:/eclipse/ShouLZ/image/"+JJS[m]+"/"+JJS[m]+"—属性.png";String BTis="D:/eclipse/ShouLZ/image/"+JJS[m]+"/"+JJS[m]+"—M.png";String JNI1="D:/eclipse/ShouLZ/image/"+JJS[m]+"/"+"技能1.jpg";String JNI2="D:/eclipse/ShouLZ/image/"+JJS[m]+"/"+"技能2.jpg";String JNI3="D:/eclipse/ShouLZ/image/"+JJS[m]+"/"+"技能3.jpg";String JNI4="D:/eclipse/ShouLZ/image/"+JJS[m]+"/"+"技能4.jpg";                                      ImageIcon JnI1=new ImageIcon(JNI1);ImageIcon JnI2=new ImageIcon(JNI2);ImageIcon JnI3=new ImageIcon(JNI3);ImageIcon JnI4=new ImageIcon(JNI4);                    JBJg.setText(String.valueOf(JBJG));ZSJg.setText(String.valueOf(ZSJG));JBJg.setFont(font);ZSJg.setFont(font);JBJg.setBounds(840, 110,200, 30);ZSJg.setBounds(840, 175,200, 30);                  JNi1.setIcon(JnI1);JNi2.setIcon(JnI2);JNi3.setIcon(JnI3);JNi4.setIcon(JnI4);                    JNi1.setBounds(550,60,JnI1.getIconWidth(),JnI1.getIconHeight());JNi2.setBounds(390,60,JnI2.getIconWidth(),JnI2.getIconHeight());JNi3.setBounds(550,200,JnI3.getIconWidth(),JnI3.getIconHeight());JNi4.setBounds(390,200,JnI4.getIconWidth(),JnI4.getIconHeight());                  ImageIcon IS=new ImageIcon(ISx);ImageIcon IBTS=new ImageIcon(BTis);IBTs.setIcon(IBTS);IBTs.setBounds(80,-100,IS.getIconWidth(),IS.getIconHeight());SXi.setIcon(IS);SXi.setBounds(80, 80,IS.getIconWidth(),IS.getIconHeight());JJs.setBounds(400,0,II.getIconWidth(),II.getIconHeight());JJs.setIcon(II);          try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}});t3.start();        JButton JSCL=new JButton();t4=new Thread(new Runnable() {@Overridepublic void run() {while(true) {String JSSi ="";for(int i=0;i<10;i++) {if(!YYJS[i].equals("")) {if(JJS[m].equals(YYJS[i])) {JSSi="D:/eclipse/ShouLZ/image/组件及背景/购买.png";}else {JSSi="D:/eclipse/ShouLZ/image/组件及背景/已拥有.png";}}}JSCL.setIcon(new ImageIcon(JSSi));try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub}});t4.start();     JSCZ.setContentAreaFilled(false);JSCZ.setBorderPainted(false);      JBJg.setContentAreaFilled(false);JBJg.setBorderPainted(false);ZSJg.setContentAreaFilled(false);ZSJg.setBorderPainted(false);        JNi1.setContentAreaFilled(false);JNi1.setBorderPainted(false);JNi2.setContentAreaFilled(false);JNi2.setBorderPainted(false);JNi3.setContentAreaFilled(false);JNi3.setBorderPainted(false);JNi4.setContentAreaFilled(false);JNi4.setBorderPainted(false);        IBTs.setContentAreaFilled(false);IBTs.setBorderPainted(false);SXi.setContentAreaFilled(false);SXi.setBorderPainted(false);JJs.setContentAreaFilled(false);JJs.setBorderPainted(false);  P6.add(JSCZ);       P6.add(JNi1);P6.add(JNi2);P6.add(JNi3);P6.add(JNi4);        P6.add(JBJg);P6.add(ZSJg);      P6.add(IBTs);P6.add(SXi);P6.add(JJs);P6.add(JLb);JSP.setViewportView(Pp);P6.add(JSP);card6.add(P6);card7.setLayout(SLZDL.CLOUT);ImageIcon ztksI1=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/暂停.png");JButton ZTKS=new JButton(ztksI1);ZTKS.setBorderPainted(false);ZTKS.setContentAreaFilled(false);ImageIcon ztksI2=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/开始1.png");ZTKS.addActionListener(new ActionListener() {          @Overridepublic void actionPerformed(ActionEvent e) {if(kszt%2==0) {ZTKS.setIcon(ztksI2);}else if(kszt%2==1) {ZTKS.setIcon(ztksI1);}kszt+=1;// TODO Auto-generated method stub               }});ZTKS.setBounds(20,100,100,100);P7.add(ZTKS);card7.add(P7);card8.setLayout(SLZDL.CLOUT);card8.add(new JButton("奖励"));card9.setLayout(SLZDL.CLOUT);card9.add(new JButton("任务"));t6=new Thread(new Runnable() {@Overridepublic void run() {while(true) {try {Clip clip = AudioSystem.getClip();AudioInputStream audioInput = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(bgm)));clip.open(audioInput);clip.loop(Clip.LOOP_CONTINUOUSLY);while(clip.isOpen()) {Thread.sleep(10);if(kszt%2==0)  clip.loop(Clip.LOOP_CONTINUOUSLY);else if(kszt%2==1) clip.stop();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (LineUnavailableException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedAudioFileException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}                    // TODO Auto-generated method stub}}});
t6.start();}}

4.2.3 各个界面及功能实现介绍

角色界面实现效果图如图:

强化界面效果图:

设置(播放背景音乐):

暂停播放:

实现方法及功能介绍:在角色图标按钮对应的卡片上添加一个滚动面板(JScrollPane),和一个通用容器(JPanel)。通用容器用已显示角色属性、价格、角色形象,滚动面板添加角色图标按钮,点击不同的按钮可以显示不同的角色属性、形象和价格。

在此有一个原计划功能未实现,原计划在此可以购买角色,但由于技术问题未能实现。

①原计划:通过线程实时访问数据库,查询用户已有的角色,若用户未拥有该角色,则显示购买图标按钮并确认购买(在事件窗口),在扣除相应的金币或钻石后,将对应角色添加到用户已有角色中。

②遇到的问题:在线程实时访问数据库时,也会修改购买图标按钮及其监听事件。若此时点击图标,则会无限地弹出事件窗口导致程序卡死。

其他界面类似于角色界面,因此不作重复介绍。

4.3 关卡设置

通过主界面点击“开始战斗”图标按钮,若当前关卡已解锁则调用键盘事件监听类(该类为自己编写,在关卡类中注册了键盘事件监听),若未解锁则弹出对话框提示关卡未解锁。

键盘事件监听类:若按下“F”则释放技能,若按下“G”则向右移动,若按下“D”则向左移动,若按下“R”则向上跳跃。

关卡设置:通过JLabel添加背景,BOSS,角色,角色血条框,角色血条(绿色),BOSS血条框,BOSS血条(红色)

4.3.1 关卡实现效果

实现效果:(敌方攻击如图)

释放技能如图

4.3.2 实现方法

①释放技能:注册事件监听,按下F后,蓝色SP标签减短,构建并运行一个线程,通过该线程修改角色图标(将行走.gif修改为技能.gif);构建另一个线程,创建技能特效图标标签,并修改其横坐标(通过while(x<2000)循环,while循环一次,横坐标加1,通过sleep线程控制每隔20ms循环一次)。

再构建一个线程,每隔500ms,蓝色SP标签长度+1,若技能击中BOSS,则红色血条标签减短(减短的长度将会随着关卡编号的提升而变短,也会随着角色攻击属性的提升而变长),并且向右移动一段距离。

②角色移动:按下G后,构建并启动一个线程,实现背景图片向左移动(背景图片为:长30000像素,宽800像素),当背景图横坐标小于28000时,角色移动。

③角色跳跃:按下R后,创建并启动一个线程改变角色图标标签的纵坐标,到达一定值时,又逐渐变回原来的值(角色向左移动实现方法与此类似,因此不作重复赘述)。

④当BOSS红色血条标签长度(使用getHeight()方法获取)小于等于0时,更新数据库users表中当前关卡的值。

代码如下:

import java.awt.Color;import java.awt.Font;
import java.awt.Frame;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class KeyFrame{private Thread t;private int BJx=0;private double[][] GKJS=new double[11][4];private double GKGJ;private double GKSM;private double GKFY;private double GKZL;private double GKYS;public static String iDQJS="";private int jsx=100;private String DQJS="";private int BOSSx=29500;public static int RCS=0;private int k=0;private int XTGKBOSSW=380;private int ln=0;private int XLZ=0;private int SPZ=0; private Thread t7;private Thread t8;private Thread t9;private Thread t10;public KeyFrame(int n){
//      JLabel[][] LXB=new JLabel[5][5];//     ImageIcon[][] IXB=new ImageIcon[5][5];String str="";JFrame F=new JFrame("");     JPanel JP1=(JPanel)((JFrame) F).getContentPane();ImageIcon IXTBoss=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/血条.png");JLabel JLXTGKBoss=new JLabel(IXTBoss);JLabel JLXTGKBoss1=new JLabel(new ImageIcon("D:/eclipse/ShouLZ/image/敌人/血条1.png"));JLabel SPZBZ=new JLabel("");ImageIcon IXTJSs=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/血条.png");JLabel XTJSS=new JLabel(IXTJSs);ImageIcon IXTJSsP=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/蓝条.png");JLabel XTJSSP=new JLabel(IXTJSsP);XTJSS.setBounds(130,52,IXTJSs.getIconWidth(),15);XTJSSP.setBounds(130,72,IXTJSsP.getIconWidth(),15);Font font=new Font("宋体",Font.PLAIN,25);JLXTGKBoss1.setBounds(815,53,400,35);JLXTGKBoss.setBounds(815,53,XTGKBOSSW,35);JLXTGKBoss.setBackground(Color.black);JP1.setOpaque(false);JP1.setLayout(null);String s="                                                                       ";str="第"+String.valueOf(n+1)+"关"+s+s+"消灭"+String.valueOf(Integer.valueOf(slz.QZ(100*(1+n*0.1))))+"个小兵";int b=n;k=n+1;ImageIcon jsxtK=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/血条框.png");ImageIcon BossxtK=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/BOSS血条框.png");System.out.print(jsxtK.getIconHeight());JLabel BOSSXTK=new JLabel(BossxtK);JLabel JSXTK=new JLabel(jsxtK);JSXTK.setBounds(0,0,jsxtK.getIconWidth(),jsxtK.getIconHeight());BOSSXTK.setBounds(640,15,BossxtK.getIconWidth(),BossxtK.getIconHeight());
//       if((n+1)%3==1) {//          String s="                                                                       ";//        str="第"+String.valueOf(n+1)+"关"+s+s+"消灭"+String.valueOf(Integer.valueOf(slz.QZ(100*(1+n*0.1))))+"个小兵";//      for(int i=0;i<3;i++) {//      for(int a=0;a<2;a++) {//      IXB[i][a]=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/敌人—展示1.gif");//  LXB[i][a]=new JLabel(IXB[i][a]);
//                  int XBx=900+100*a;//                  LXB[i][a].setBounds(XBx,200,IXB[i][a].getIconWidth(),IXB[i][a].getIconHeight());//              JP1.add(LXB[i][a]);//       }//     }//}F.setTitle(str);F.setBounds(1,2,1300,800);F.setVisible(true);JLabel GKBJ=new JLabel(new ImageIcon("D:/eclipse/ShouLZ/image/场景/bj.png"));GKBJ.setBounds(BJx,0,30000,800);GKBJ.setOpaque(false);JLabel YXSLL=new JLabel(new ImageIcon());YXSLL.setBounds(400,100,400,450);JLabel ZSJS=new JLabel("");ZSJS.setFont(font);ZSJS.setBounds(580,360,100,50);JLabel JBJS=new JLabel("");JBJS.setFont(font);JBJS.setBounds(580,410,100,50);JLabel QHSJS=new JLabel("");QHSJS.setFont(font);QHSJS.setBounds(580,460,100,50);String str1="D:/eclipse/ShouLZ/image/敌人/敌人—BOSS"+String.valueOf(n+1)+".gif";ImageIcon Boss=new ImageIcon(str1);JLabel GKBOSS=new JLabel(Boss);GKBOSS.setBounds(BOSSx,50,Boss.getIconWidth(),Boss.getIconHeight());int m=0;int d=0;String DQZB="";String DQZBDJ="";String[] ZB=new String[15];String[] ZBDJ=new String[15];String sql="select *from users where 用户名='"+MJP.Uname.getText()+"';";String sql1="select *from 装备 where 用户='"+MJP.Uname.getText()+"';";JLabel JNTX1=new JLabel(new ImageIcon());try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);while(rs.next()) {    DQJS=rs.getString("当前角色");d=rs.getInt("当前角色等级");}         if(DQJS.equals("孙尚香")) m=1;else if(DQJS.equals("黄忠"))m=2;else if(DQJS.equals("马超"))m=3;else if(DQJS.equals("貂蝉"))m=4;else if(DQJS.equals("刘备"))m=5;else if(DQJS.equals("诸葛亮"))m=6;else if(DQJS.equals("张飞"))m=7;else if(DQJS.equals("关羽"))m=8;else if(DQJS.equals("赵云"))m=9;else if(DQJS.equals("吕布"))m=10;iDQJS="D:/eclipse/ShouLZ/image/"+DQJS+"/"+DQJS+"—";         ResultSet rs1=stmt.executeQuery(sql1);while(rs1.next()) {  DQZB=rs1.getString("当前装备");DQZBDJ=rs1.getString("当前装备等级");}for(int i=0;i<15;i++) {ZB[i]="";ZBDJ[i]="";}for(int i=0;i<DQZB.length();i++) {if(DQZB.charAt(i)=='+') {ln+=1;}else {ZB[ln]=ZB[ln]+String.valueOf(DQZB.charAt(i));ZBDJ[ln]=ZBDJ[ln]+String.valueOf(DQZBDJ.charAt(i));}}stmt.close();conn.close();}     catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();}ImageIcon IDQJS=new ImageIcon(iDQJS+"走.gif");JLabel DQGKJS=new JLabel(IDQJS);DQGKJS.setBounds(jsx,200,IDQJS.getIconWidth(),IDQJS.getIconHeight());for(int i=0;i<11;i++) {GKJS[i][0]=200*(1+i*0.1);GKJS[i][1]=500*(1+i*0.1);GKJS[i][2]=20*(1+i*0.1);}       GKGJ=Math.round(GKJS[m-1][0]*(1+(Integer.valueOf(ZB[0])*Integer.valueOf(ZBDJ[0])+d)*0.1));GKSM=Math.round(GKJS[m-1][1]*(1+(Integer.valueOf(ZB[1])*Integer.valueOf(ZBDJ[1])+d)*0.1));GKFY=Math.round(GKJS[m-1][2]*(1+(Integer.valueOf(ZB[2])*Integer.valueOf(ZBDJ[2])+d)*0.1));GKYS=GKJS[m-1][3]+50;GKZL=GKGJ*5+GKSM*3+GKFY*2;         F.addKeyListener(new KeyAdapter() {       private Thread t1;private Thread t2;private Thread t3;private String iJDQJS1;private String IJDQJS1;private Thread t4;private Thread t6;private Thread t8;
//          private Thread t8;@Overridepublic void keyPressed(KeyEvent e) {//获得键盘的键对应的码int keycode=e.getKeyCode();//               System.out.println(keycode);               if(keycode==KeyEvent.VK_G){iDQJS="";iDQJS="D:/eclipse/ShouLZ/image/"+DQJS+"/"+DQJS+"—"; iDQJS=iDQJS+"走.gif";ImageIcon IIGK=new ImageIcon(iDQJS);DQGKJS.setIcon(IIGK);System.out.println("    ##");System.out.println(iDQJS);System.out.println("    ##");System.out.println("\n");DQGKJS.setBounds(jsx,200,IIGK.getIconWidth(),IIGK.getIconHeight());if(BJx>=-28500) {t=new Thread(new Runnable() {              int x=0;@Overridepublic void run() {while(x<=3) {GKBJ.setBounds(BJx,0,30000,800);GKBOSS.setBounds(BOSSx,50,Boss.getIconWidth(),Boss.getIconHeight());//                                  for(int i=0;i<3;i++) {//                                  for(int a=0;a<2;a++) {//                                      IXB[i][a]=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/敌人—展示1.gif");//                                  LXB[i][a]=new JLabel(IXB[i][a]);//                                 int XBx=LXB[i][a].getX();//                                XBx-=10;//                             LXB[i][a].setBounds(XBx,200,IXB[i][a].getIconWidth(),IXB[i][a].getIconHeight());//                          JP1.add(LXB[i][a]);//                       }//                     }BOSSx-=10;BJx-=10;x+=1;try {Thread.sleep(1); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub                            }});t.start();System.out.print(GKBOSS.getX());}else if(BJx<=-28000) {t1=new Thread(new Runnable() {int x=0;@Overridepublic void run() {while(x<=3) {if(jsx>=1000) {jsx-=2;}DQGKJS.setBounds(jsx,200,IIGK.getIconWidth(),IIGK.getIconHeight());jsx+=2;x+=1;try {Thread.sleep(1); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub                          }});t1.start();}                    }else if(keycode==KeyEvent.VK_D){                    iDQJS="";iDQJS="D:/eclipse/ShouLZ/image/"+DQJS+"/"+DQJS+"—";   iDQJS=iDQJS+"走.gif";ImageIcon IIGK=new ImageIcon(iDQJS);DQGKJS.setIcon(IIGK);System.out.println("    ##");System.out.println(iDQJS);System.out.println("    ##");System.out.println("\n");DQGKJS.setBounds(jsx,200,IIGK.getIconWidth(),IIGK.getIconHeight());                               if(BJx<=-27500) {t2=new Thread(new Runnable() {int x=0;@Overridepublic void run() {BJx=-28000;while(x<=3&&jsx>=0) {DQGKJS.setBounds(jsx,DQGKJS.getY(),IIGK.getIconWidth(),IIGK.getIconHeight());jsx-=10;x+=1;try {Thread.sleep(1); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub                         }});t2.start();}else if(BJx<=0&&BJx>-27500) {t3=new Thread(new Runnable() {int x=0;@Overridepublic void run() {while(x<=3) {if(BJx>=-28000) {BJx+=2;}GKBJ.setBounds(BJx,0,30000,800);x+=1;try {Thread.sleep(1); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub                            }});t3.start();}                    }else if(keycode==KeyEvent.VK_F){if(IXTJSsP.getIconWidth()>94) {iJDQJS1="";iJDQJS1="D:/eclipse/ShouLZ/image/"+DQJS+"/"+DQJS;    IJDQJS1=iJDQJS1+"—技能1.gif";System.out.print(IJDQJS1);                           ImageIcon  IIJDQJS1=new ImageIcon(IJDQJS1);DQGKJS.setIcon(IIJDQJS1);int X=DQGKJS.getX();DQGKJS.setBounds(X,200,IIJDQJS1.getIconWidth(),IIJDQJS1.getIconHeight());int Y=DQGKJS.getY();JNTX1.setBounds(X, Y,1,1);SPZ=IXTJSsP.getIconWidth();IXTJSsP.setImage(IXTJSsP.getImage().getScaledInstance(SPZ-94, 15,Image.SCALE_DEFAULT));XTJSSP.setIcon(IXTJSsP);XTJSSP.setBounds(140,72,IXTJSsP.getIconWidth(),15);t4=new Thread(new Runnable() {                     int x=0;private Thread t5;@Overridepublic void run() {while(x<=3) {DQGKJS.setIcon(IIJDQJS1); x+=1;                          try {Thread.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}}t5=new Thread(new Runnable() {   //创建技能1技能特效;int X=DQGKJS.getX();int Y=DQGKJS.getY();int XTBOSSX=JLXTGKBoss.getX();private int IGK;private Thread t11;                                                                                @Overridepublic void run() {while(X<=2000) {System.out.print("当前BOSSX:");System.out.print(GKBOSS.getX());System.out.print("\n");ImageIcon ico=new ImageIcon();ico=new ImageIcon("D:/eclipse/ShouLZ/image/"+DQJS+"/"+"技能特效1.png");JNTX1.setBounds(X+200, Y+50,ico.getIconWidth(),ico.getIconHeight());JNTX1.setIcon(ico);X+=4;                                       try {Thread.sleep(3); } catch (InterruptedException e) {e.printStackTrace();}System.out.print("当前技能X:");System.out.print(X);System.out.print("\n");if(X+200==GKBOSS.getX()&&((Y+100>=GKBOSS.getY())&&Y-100<=GKBOSS.getY())) {XTGKBOSSW-=Integer.valueOf(String.valueOf(slz.QZ(Math.ceil(GKGJ/10)*3/k)));XTBOSSX+=Integer.valueOf(String.valueOf(slz.QZ(Math.ceil(GKGJ/10)*3/k)));}JLXTGKBoss.setBounds(XTBOSSX,53,XTGKBOSSW,35);if(XTGKBOSSW<=0) {String sqlgk="select *from users where 用户名='"+MJP.Uname.getText()+"';";int JY=0,JB=0,ZS=0,QHS=0;try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql1?false&useUnicode&characterEncoding=utf-8","root","123456");Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sqlgk); while(rs.next()) {IGK=rs.getInt("关卡");JY=rs.getInt("经验");JB=rs.getInt("金币");ZS=rs.getInt("钻石");QHS=rs.getInt("强化石");}JY=JY+5;JB=JB+1;ZS=ZS+1;QHS=QHS+1;System.out.print(JY);                                               String sqlgk1="update users set 关卡="+String.valueOf(k)+" where 用户名="+MJP.Uname.getText()+";";String sqlgk2="update users set 经验="+JY+",金币="+JB+",钻石="+ZS+",强化石="+QHS+" where 用户名="+MJP.Uname.getText()+";";if(k==IGK+1) {   System.out.print(sqlgk1);stmt.executeUpdate(sqlgk1);}stmt.executeUpdate(sqlgk2);stmt.close();conn.close();}     catch(ClassNotFoundException e1) {System.out.println("对不起,找不到驱动程序");e1.printStackTrace();}catch(SQLException e1) {e1.printStackTrace();}catch(Exception e1) {e1.printStackTrace();} t11=new Thread(new Runnable() {@Overridepublic void run() {ImageIcon CGCGI=new ImageIcon("D:/eclipse/ShouLZ/image/组件及背景/战斗结算.png");YXSLL.setIcon(CGCGI);  String strtzs="+"+String.valueOf(30*(1+n));ZSJS.setText(strtzs);JBJS.setText("+"+String.valueOf(300*(1+n)));QHSJS.setText("+"+String.valueOf(30*(1+n)));// TODO Auto-generated method stub                                                  }});t11.start();}}// TODO Auto-generated method stub}});t5.start();iDQJS="";iDQJS="D:/eclipse/ShouLZ/image/"+DQJS+"/"+DQJS+"—";   iDQJS=iDQJS+"走.gif";ImageIcon IIGK=new ImageIcon(iDQJS);DQGKJS.setIcon(IIGK); DQGKJS.setBounds(X,Y,IIGK.getIconWidth(),IIGK.getIconHeight());// TODO Auto-generated method stub}});t4.start();}else if(IXTJSsP.getIconWidth()<=94) {SPZBZ.setText("SP值不足!");SPZBZ.setFont(font);SPZBZ.setForeground(Color.red);SPZBZ.setBorder(null);SPZBZ.setBounds(500,240,300,50);}}else if(keycode==KeyEvent.VK_R&&DQGKJS.getY()==200){t6=new Thread(new Runnable() {              int Y=DQGKJS.getY();  int y=0;@Overridepublic void run() {while(y<22) {DQGKJS.setBounds(DQGKJS.getX(),Y,IDQJS.getIconWidth(),IDQJS.getIconHeight());if(y<10) {Y-=25;}else if(y==10) {try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}}else if(y>10&&y<22) {Y+=25;}try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}y+=1;}System.out.print(DQGKJS.getY());}                     });t6.start();                      }                   }});t7=new Thread(new Runnable() {                     @Overridepublic void run() {while(true) {if(IXTJSsP.getIconWidth()<470) {SPZ=IXTJSsP.getIconWidth();IXTJSsP.setImage(IXTJSsP.getImage().getScaledInstance(SPZ+1, 15,Image.SCALE_DEFAULT));XTJSSP.setIcon(IXTJSsP);XTJSSP.setBounds(140,72,IXTJSsP.getIconWidth(),15);}try {Thread.sleep(200); } catch (InterruptedException e) {e.printStackTrace();}}// TODO Auto-generated method stub              }});t7.start();t8=new Thread(new Runnable() {@Overridepublic void run() {while(true) {                                    try {Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace();}SPZBZ.setText("");}// TODO Auto-generated method stub}});t8.start();JLabel LDGJ=new JLabel(new ImageIcon());t10=new Thread(new Runnable() {int x=0;int X=GKBOSS.getX();private int BSH;@Overridepublic void run() {              while(true) {X=GKBOSS.getX();System.out.print("##");System.out.print(X);System.out.print("\n");if(x%3==0&&X<=1000&&JLXTGKBoss.getWidth()>0) {ImageIcon LDGJI=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/雷电攻击.png");LDGJ.setIcon(LDGJI);LDGJ.setBounds(90,150,LDGJI.getIconWidth(),LDGJI.getIconHeight());if(DQGKJS.getX()<=300&&DQGKJS.getY()>=100) {BSH=(int) Math.round(470*(176-GKFY*3)/GKSM);XTJSS.setBounds(XTJSS.getX(),XTJSS.getY(),XTJSS.getWidth()-BSH,XTJSS.getHeight());}}else if(JLXTGKBoss.getWidth()<0) {ImageIcon LDGJI=new ImageIcon("D:/eclipse/ShouLZ/image/敌人/游戏结束.png");LDGJ.setIcon(LDGJI);LDGJ.setBounds(90,150,LDGJI.getIconWidth(),LDGJI.getIconHeight());}else if(x%3!=0) {ImageIcon LDGJI=new ImageIcon();LDGJ.setIcon(LDGJI);LDGJ.setBounds(90,150,LDGJI.getIconWidth(),LDGJI.getIconHeight());}try {Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace();}x+=1;}}
//              if(GKBOSS.getX()==100) {//                while(GKBOSS.getX()<=1030) {    //              GKBOSS.setBounds(GKBOSS.getX()+11,GKBOSS.getY(),Boss.getIconWidth(),Boss.getIconHeight());//            try {//                Thread.sleep(60); //        } catch (InterruptedException e) {//        e.printStackTrace();//}
//                  }//         }               // TODO Auto-generated method stub});t10.start();JP1.add(QHSJS);JP1.add(JBJS);JP1.add(ZSJS);JP1.add(YXSLL);JP1.add(LDGJ);JP1.add(SPZBZ);JP1.add(BOSSXTK);JP1.add(JLXTGKBoss);JP1.add(JLXTGKBoss1);JP1.add(XTJSS); JP1.add(XTJSSP);JP1.add(GKBOSS);JP1.add(JNTX1);      JP1.add(JSXTK);JP1.add(DQGKJS);JP1.add(GKBJ);F.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}
}

注:代码中通过“//”注释掉部分代码,该代码为添加小兵的代码,由于博主电脑配置低,该部分代码一起运行会导致程序卡死。

以上为基于Java多线程的打怪升级类游戏设计与开发实现的全部过程,本文仅供参考,系博主毕业论文,请勿随意转发和使用!

基于Java多线程的打怪升级类游戏设计与开发相关推荐

  1. 【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏

    基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的推箱子游戏设计与实现,文章末尾附有本毕业设计的论文 ...

  2. 【java毕业设计】基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码)——坦克大战游戏

    基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+Eclipse的坦克大战游戏设计与实现,文章末尾附有本毕业设 ...

  3. java毕业设计——基于java+J2ME+sqlserver的打飞机游戏设计与实现(毕业论文+程序源码)——打飞机游戏

    基于java+J2ME+sqlserver的打飞机游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME+sqlserver的打飞机游戏设计与实现,文章末尾附有本毕业设计的 ...

  4. 基于java框架的图书分享系统的设计与开发计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java框架的图书分享系统的设计与开发计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java框架的图书分享系统的设计与开发计算机毕业设计源码+系统+lw文档+mysql数据库 ...

  5. 基于java的创意项目众筹平台的设计与开发计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java的创意项目众筹平台的设计与开发计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java的创意项目众筹平台的设计与开发计算机毕业设计源码+系统+lw文档+mysql数据库 ...

  6. 基于Java的果蔬购物商城网站的设计与开发

    springboot,html,mysql数据库,前台用户+后台管理,有一万五千字论文,完美运行. 随着社会的飞速发展,我们已经进入了一个信息化的时代,互联网为我们提供了许多的方便.在这样的背景下,果 ...

  7. java小游戏:蜡笔小新!!!基于JAVA面向对象实现的跑酷类游戏(小新跑酷)(简单小游戏,仅仅使用Java面向对象基础实现(附上源码))

    一起来看一下蜡笔小新,很好看的,解压!!!!!!!!!!!!!!! 由于Java面向对象基础的游戏,有一定的局限,但是我觉得这款的可玩性已经很高了,话不多说一起来看游戏: 游戏界面,点击空格跳跃来躲避 ...

  8. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  9. 基于Java+Swing+Socket实现泡泡堂游戏

    基于Java+Swing+Socket实现泡泡堂游戏 一.功能展示 1.游戏登陆 2.房间 3.对战 二.代码展示 三.其他系统 前言 <泡泡堂>是由韩国游戏公司Nexon开发的一款休闲游 ...

最新文章

  1. 动态内存管理和智能指针 2.0 -- shared_ptr
  2. [docker]docker压力测试
  3. 从0到1,关于产品冷启动阶段。
  4. 手机端h5页面字体大小适配
  5. Android四大组件之BroadCast(续)
  6. NOIP2018提高组模拟题(六)
  7. 【渝粤教育】电大中专混凝土结构作业 题库
  8. 浅谈CSS3 响应式布局--Media Queries
  9. java判断string字符串是不是json格式
  10. js php后端 安全,前端JS RSA加密,PHP后端解密实现密码安全传输
  11. 如何使用bat批处理命令打开WSL
  12. Hadoop的详细配置(持续更新)
  13. windows配置mysql环境变量-mysql-5.7
  14. opencv的core组件——像素,ROI,图像混合(3)
  15. 虚拟现实下的手势识别综述
  16. 广义瑞利商_瑞利商定义和广义瑞利商
  17. 10.27 正睿提高9
  18. 适用智能电表,热能表,气表等段码LCD液晶显示驱动芯片I2C 接口VK2C22A/B,RAM映射44*4, 40*4
  19. 3dmax模型单位转换问题解决方法
  20. 思维拓展:不相邻问题插空法

热门文章

  1. 微信开放平台分享功能的app签名怎么获取
  2. layui隐藏侧边栏_layui禁用侧边导航栏点击事件的处理方法
  3. 外卖+电商类小程序——微信小程序心得分享
  4. Blockchain is Watching You: Profiling and Deanonymizing Ethereum Users
  5. Linux基本常用命令(一)
  6. 利用php实现图片相似度搜索的简单原理
  7. 淘淘商城系列(一)—— 系统架构(三)
  8. hadoop如何发音
  9. vue项目px转vw
  10. C语言 - 通讯录详解