📄 planegame.java
字号:
}
}
//游戏结束的对话框
class GameOver extends JFrame implements ActionListener
{
JPanel pnl;
JButton btnyes;
JButton btnnew;
JButton btnexit;
JTextArea textarea;
GameOver()
{
pnl=new JPanel();
pnl.setLayout(null);
btnnew=new JButton("重 来");
btnnew.setBounds(215,100,70,30);
btnyes=new JButton("确 定");
btnyes.setBounds(215,180,70,30);
btnexit=new JButton("离 开");
btnexit.setBounds(215,260,70,30);
textarea=new JTextArea(20,20);
textarea.setBounds(5,5,200,400);
textarea.setLineWrap(true);
pnl.add(textarea);
pnl.add(btnyes);
pnl.add(btnnew);
pnl.add(btnexit);
textarea.append(" ★★★ 十 佳 排 行 榜 ★★★ "+"\n");
textarea.append(" 姓名 分数 排名"+"\n");
btnyes.addActionListener(this);
btnnew.addActionListener(this);
btnexit.addActionListener(this);
this.setResizable(false);
this.setContentPane(pnl);
this.setTitle("游戏结束");
this.setLocation(400,200);
this.setResizable(false);
this.setSize(300,400);
this.setVisible(true);
new Connet();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btnyes)
{
this.setVisible(false);
}
else if(e.getSource()==btnnew)
{
this.setVisible(false);
fra.setVisible(false);
fra=null;
count.lbllife=5;
count.level=0;
count.mark=0;
new MyFrame(count.UserName,count);
}
else if(e.getSource()==btnexit)
{
System.exit(1);
}
}
//游戏结束时,把分数存进数据库.并从数据库取出数据,进行排列,得出前十名
class Connet
{
Connection conn; //连接对象
Statement stm; //陈述对象
ResultSet rst; //结果集
String uName;
public Connet()
{
try
{
String strSQL;
String strDBDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
Class.forName(strDBDriver); //注册驱动
String strConnStr="jdbc:microsoft:sqlserver://localhost;DatabaseName=PlaneGame";
String strUserName = "sa";
String strPassword = "123456";
conn = DriverManager.getConnection(strConnStr,strUserName,strPassword);
stm = conn.createStatement(); //取得陈述对象
System.out.println("连接数据库成功...等待数据操作.....");
strSQL = "update login set mark="+count.mark+" where username='"+count.UserName+"'";
System.out.println("上传分数成功!分数是:"+count.mark+"; 姓名是 "+count.UserName);
stm.executeUpdate(strSQL);
////////////////////////////
String strS ;
ResultSet rstShowAll;
strS = "select * from login order by mark desc";
rstShowAll=stm.executeQuery(strS);
int i=1;
while(rstShowAll.next()==true)
{
if(i<11)
{
textarea.append(rstShowAll.getString("UserName")+" "+rstShowAll.getString("mark")+" "+i+"\n");
}
i++;
}
}
catch(Exception e)
{
System.out.println("上传分数出现的异常"+e);
}
}
}
}
//以随机的时间,在随机的位置出现敌机,并按照分数,设定出现敌机的数量,以提高游戏难度
class ShowEPlane extends Thread
{
ShowEPlane()
{
new Thread(this).start();
}
public void run()
{
Random way=new Random(12340L);
while(true&&count.wincontral==false)
{
if(count.mark<100) //分数每加100,敌机出现的架数加多+1
{
count.level=0;
}
else if(100<=count.mark&&count.mark<200)//
{
count.level=1;
}
else if(200<=count.mark&&count.mark<300) //
{
count.level=2;
}
else if(300<=count.mark&&count.mark<400) //
{
count.level=3;
}
else if(400<=count.mark&&count.mark<500) //
{
count.level=4;
}
else if(500<=count.mark&&count.mark<600) //
{
count.level=5;
}
else if(600<=count.mark&&count.mark<700) //
{
count.level=6;
}
else if(700<=count.mark&&count.mark<800) //
{
count.level=7;
}
else if(800<=count.mark&&count.mark<900) //
{
count.level=8;
}
try
{
sleep(100);
}
catch(Exception ee)
{
System.out.println("ShowEPlane 睡眠出错1"+ee);
}
if(planeEVector.size()<(6+count.level)&&picPlane.isVisible()==true)
{
try
{
intSleep=sleep.nextInt(11)*5; //控制飞机的运动速度
int s=way.nextInt(5);
if(intSleep==0)
{
intSleep=30;
}
if(s==1)
{
new PlaneEClass1(intSleep); //创建一个敌机
}
else if(s==2)
{
new PlaneEClass2(intSleep); //创建一个敌机
}
else if(s==3)
{
new PlaneEClass3(intSleep); //创建一个敌机
}
else if(s==4)
{
new PlaneEClass4(intSleep); //创建一个敌机
}
sleep(1000);
}
catch(Exception e)
{
System.out.println("ShowEPlane 的休眠出错2:"+e);
}
}
}
}
}
//我方飞机控制的线程,我方飞机开始行动
class PlaneThread extends Thread
{
public PlaneThread()
{
picPlane.setVisible(true);
new Thread(this).start();
}
public void run()
{
while(true)
{
if(picPlane.getY()<20)
{
KeyUp=0;
}
if(picPlane.getY()>550)
{
KeyDown=0;
}
if(picPlane.getX()<-10)
{
KeyLeft=0;
}
if(picPlane.getX()>500)
{
KeyLight=0;
}
if(KeyUp==1)
{
picPlane.setLocation(picPlane.getX(),picPlane.getY()-15);
}
if(KeyDown==1)
{
picPlane.setLocation(picPlane.getX(),picPlane.getY()+15);
}
if(KeyLeft==1)
{
picPlane.setLocation(picPlane.getX()-15,picPlane.getY());
}
if(KeyLight==1)
{
picPlane.setLocation(picPlane.getX()+15,picPlane.getY());
}
if(KeyBit==1) ///
{
if(count.BitContral<6)
{
new FireClass(picPlane);
count.BitContral++;
}
}
if(KeyDaoDan==1)
{
if(count.DaoDan>0)
{
new DaoDanClass();
count.DaoDan--;
SaveLine.setText("安全线:"+count.DaoDan);
System.out.println("还有安全线:"+count.DaoDan);
}
else
{
System.out.println("没有安全线了!!");
}
}
try
{
sleep(100);
}
catch(Exception e)
{
}
}
}
}
//我方飞机控制的事件类 ,使飞机可以平滑地移动
class PlaneControl implements KeyListener
{
public void keyTyped(KeyEvent e)
{
}
public void keyPressed(KeyEvent e) ////当按下S W A D 或J 键时,判断它的参数设为0
{
switch(e.getKeyChar())
{
case 'w':
KeyUp=1;
break;
case 's':
KeyDown=1;
break;
case 'a':
KeyLeft=1;
break;
case 'd':
KeyLight=1;
break;
case 'j': //我方飞机发射子弹
if(picPlane.isVisible()==true) //如果我们飞机还没有被击中,则Visible为true,则可以发射子弹
{ //如果我们飞机被击中了,则Visible为false,则不可以发射子弹
KeyBit=1;
}
break;
case 'k':
if(picPlane.isVisible()==true)
{
KeyDaoDan=1;
}
}
}
public void keyReleased(KeyEvent e) //当不按S W A D 或J 键时,判断它的参数设为0
{
switch(e.getKeyChar())
{
case 'w':
KeyUp=0;
break;
case 's':
KeyDown=0;
break;
case 'a':
KeyLeft=0;
break;
case 'd':
KeyLight=0;
break;
case 'j':
if(picPlane.isVisible()==true) //如果我们飞机还没有被击中,则Visible为true,则可以发射子弹
{ //如果我们飞机被击中了,则Visible为false,则不可以发射子弹
KeyBit=0;
}
case 'k':
if(picPlane.isVisible()==true)
{
KeyDaoDan=0;
}
}
}
}
//我方飞机子弹线程
class FireClass extends Thread
{
JLabel picP; //用于显示我方飞机
JLabel picPE; //用于显示敌机
JLabel picB; //用于显示我方飞机子弹
EPlaneInfor planeEInfor; //敌机用于取出敌机信息的对象
public FireClass(JLabel pP)
{
picP=pP;
picB = new JLabel(picBullet);
picB.setBounds(picP.getX(),picP.getY()-45,100,100);//我方飞机子弹的初始位置
pnl.add(picB);
picB.setLocation(picB.getX(),picB.getY()+5);
new Thread(this).start();
}
public void run()
{
try
{
this.sleep(100);
}
catch(InterruptedException e)
{
System.out.println("我方飞机子弹线程 Sleep2 Error11!! :"+e);
}
//如果子弹没有到达40这个底线,则子弹向前移动
while(picB.getY()>-40)
{
picB.setLocation(picB.getX(),picB.getY()-20);
//检查每一架敌机是否被击中
for(int j=0;j<planeEVector.size();j++)
{
//从Vector中取出一架敌机进行判断
planeEInfor=(EPlaneInfor)planeEVector.elementAt(j);
picPE=planeEInfor.planeLabel;
//判断敌机的位置跟子弹的位置是否符合,如果符合则表示击中敌机
if(picB.getX()>(picPE.getX()-30) && picB.getX()<(picPE.getX()+30) && picB.getY()>(picPE.getY()-50) && picB.getY()<(picPE.getY()+20))
{
count.mark+=10; //如果敌机被击中,成绩+10
mark.setText("分数:"+Integer.toString(count.mark));
if(count.mark==200||count.mark==400||count.mark==600||count.mark==800)
{ //传递count.mark到LifeClass,为了取得心的位置
new LifeClass(count.mark);
}
else if(count.mark==1000)
{
count.wincontral=true;
new GameOver();
this.stop();
System.out.println("你取得了胜利!!"+count.wincontral);
}
//如果敌机被击中,则设Visible为false,并杀死线程,从Vector中移除敌机信息对象
planeEInfor.section=true;
planeEInfor.planeLabel.setVisible(false);
planeEInfor.planeLabel.setLocation(-100,-100);
planeEInfor.planeThread.stop();
planeEVector.removeElement(planeEInfor);
if(count.bool==true)
{
new BombSound(); //子弹爆炸声
}
//通过图片的更替显示,显示爆炸效果
for(int i=1;i<16;i++)
{
picB.setIcon(imgBullet[i]);
try
{
this.sleep(200);
}
catch(InterruptedException e)
{
System.out.println("Sleep Error!! :"+e);
}
}
picB.setVisible(false);
if(picB.isVisible()==true)
{
count.BitContral--;
}
picB.setLocation(-100,-100);
this.stop();
}
}
try
{
this.sleep(50);
}
catch(InterruptedException e)
{
System.out.println("我方飞机子弹线程 Sleep2 Error!! :"+e);
}
}
//如果子弹到达-40这个底线,则不显示,并杀死子弹线程,子弹减1
count.BitContral--;
picB.setVisible(false);
picB.setLocation(-100,-100);
this.stop();
}
}
//我方飞机安全line线程
class DaoDanClass extends Thread
{
int i=0;
JLabel picLine; //用于显示我方飞机
public DaoDanClass()
{
picLine=new JLabel(anBullet);
picLine.setBounds(0,picPlane.getY(),650,4);
pnl.add(picLine);
new Thread(this).start();
}
public void run()
{
while(i<7)
{
picLine.setLocation(picLine.getX(),picLine.getY()-7);
count.saveline=picLine.getY();
i++;
try
{
this.sleep(200);
}
catch(InterruptedException e)
{
System.out.println("我方飞机子弹线程 Sleep2 Error!! :"+e);
}
}
picLine.setVisible(false);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -