java练习坦克大战40.docx
- 文档编号:24294818
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:56
- 大小:25.41KB
java练习坦克大战40.docx
《java练习坦克大战40.docx》由会员分享,可在线阅读,更多相关《java练习坦克大战40.docx(56页珍藏版)》请在冰豆网上搜索。
java练习坦克大战40
packageMyTankGame4_0;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.util.*;
importjava.io.*;
importjava.util.Vector;
importjavax.imageio.ImageIO;
importjavax.swing.*;
publicclassMyTankGame4_0extendsJFrameimplementsActionListener
{
//声明一个标志
intflag=0;
//声明一个运行面板
MyPanelmp=null;
//定义一个开始的面板
MyStartPanelmsp=null;
//做出我需要的菜单
JMenuBarjmb=null;
//开始游戏
JMenujm1=null;
JMenuItemjmi1=null;
//退出系统
JMenuItemjmi2=null;
JMenuItemjmi3=null;
JMenuItemjmi4=null;
publicstaticvoidmain(String[]args)
{
MyTankGame4_0mytankgame1=newMyTankGame4_0();
mytankgame1.setLocationRelativeTo(null);//将JFrame设置在中间
//mytankgame1.setLocation(210,140);//设置JFrame的位置
}
publicMyTankGame4_0()//构造
{//初始化菜单栏
jmb=newJMenuBar();
jm1=newJMenu("游戏(G)");
//设置快捷方式
jm1.setMnemonic('G');
jmi1=newJMenuItem("开始新游戏(N)");
jmi2=newJMenuItem("退出游戏(E)");
jmi3=newJMenuItem("存盘退出(C)");
jmi4=newJMenuItem("继续上次游戏(L)");
jmi1.setMnemonic('N');
jmi2.setMnemonic('E');
jmi3.setMnemonic('C');
jmi4.setMnemonic('L');
//对jmi1响应,注册监听,标记消息源
jmi1.addActionListener(this);
jmi1.setActionCommand("newgame");
jmi2.addActionListener(this);
jmi2.setActionCommand("exit");
jmi3.addActionListener(this);
jmi3.setActionCommand("saveandexit");
jmi4.addActionListener(this);
jmi4.setActionCommand("continuegame");
jm1.add(jmi1);
jm1.add(jmi2);
jm1.add(jmi3);
jm1.add(jmi4);
jmb.add(jm1);
//声明初始化面板
msp=newMyStartPanel();
Threadt=newThread(msp);
t.start();
//初始化窗口,构造函数的重点
this.setJMenuBar(jmb);//千万注意啊!
!
!
!
this.add(msp);
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
publicvoidactionPerformed(ActionEvente)
{
//对用户不同的点击做出不同的处理
//首先得到command字符串,判断消息源
if(e.getActionCommand().equals("newgame"))
{
this.setSize(600,500);
mp=newMyPanel(flag);
//启动mp线程
Threadt1=newThread(mp);
t1.start();
//先删除旧的面板
this.remove(msp);
this.add(mp);
//注册监听
this.addKeyListener(mp);
//显示
this.setVisible(true);
}
elseif(e.getActionCommand().equals("exit"))
{
//用户退出
//保存击毁敌人数量
Recorder.keepRecording();
System.exit(0);
}
elseif(e.getActionCommand().equals("saveandexit"))
{
Recorder.keepRecAndEnemyTank(mp.ets);
if(this.mp.hero.isLive==true)
{
Recorder.keepRecAndMyTank(this.mp.hero);
}
System.exit(0);
}
elseif(e.getActionCommand().equals("continuegame"))
{
this.setSize(600,500);
flag=1;
mp=newMyPanel(flag);
//启动mp线程
Threadt1=newThread(mp);
t1.start();
//先删除旧的面板
this.remove(msp);
this.add(mp);
//注册监听
this.addKeyListener(mp);
//显示
this.setVisible(true);
}
}
}
//开始面板起一个提示的作用
classMyStartPanelextendsJPanelimplementsRunnable
{
inttimes=0;
publicvoidpaint(Graphicsg)
{
super.paint(g);
g.fillRect(0,0,400,300);
//提示信息
if(times%2==0)
{
g.setColor(Color.yellow);
//开关信息的字体
try{
FontmyFont=newFont("华文新魏",Font.BOLD,30);
g.setFont(myFont);
}catch(Exceptione){e.printStackTrace();}
g.drawString("stage:
1",150,150);
}
}
publicvoidrun()
{
while(true)
{
try{
Thread.sleep(500);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
this.repaint();
times++;
if(times==1000)times=0;
}
}
}
classMyPanelextendsJPanelimplementsKeyListener,Runnable
{
//定义我的坦克,成员变量
Herohero=null;
//判断是续上局还是新的游戏
Stringflag="newGame";
//定义敌人的坦克组
Vector
//全局变量,声明,敌人坦克数量
staticintenSize=5;
publicstaticintgetEnSize(){
returnenSize;
}
//定义炸弹集合
Vector
//paint方法被面板适时自动调用
publicvoidpaint(Graphicsg)
{
super.paint(g);
g.fillRect(0,0,400,300);
//画出提示信息
this.showInfo(g);
//画出自己的坦克
if(hero.isLive==true)
{
this.drawTank(hero.getX(),hero.getY(),g,this.hero.direct,1);
}
//从Vectorss中取出每一颗子弹,并画出,如果有子弹
for(inti=0;i { ShotmyShot=hero.ss.get(i); //画出子弹,只画一颗子弹 if(myShot! =null&&myShot.isLive==true) { g.draw3DRect(myShot.x,myShot.y,1,1,false); } if(myShot.isLive==false) { //从ss中删除该子弹 hero.ss.remove(myShot); } } //画出炸弹 for(inti=0;i { //取出炸弹 Bombb=bombs.get(i); if(b.life>6) { g.drawOval(b.x,b.y,30,30); //g.drawImage(image1,b.x,b.y,30,30,this); } elseif(b.life>3) { g.drawOval(b.x,b.y,20,20); //g.drawImage(image2,b.x,b.y,30,30,this); } else { g.drawOval(b.x,b.y,10,10); //g.drawImage(image3,b.x,b.y,30,30,this); } //让b的生命值减小 b.lifeDown(); //如果炸弹的生命值为0,我们就剔除 if(b.life==0)bombs.remove(b); } //画出敌人的坦克 for(inti=0;i { EnemyTanket=ets.get(i); if(et.isLive) { this.drawTank(ets.get(i).getX(),ets.get(i).getY(),g,ets.get(i).getDirect(),0); //画出敌人的子弹 for(intj=0;j { //取出子弹 ShotenemyShot=et.ss.get(j); if(enemyShot.isLive) { g.draw3DRect(enemyShot.x,enemyShot.y,1,1,false); } else { //如果敌人的坦克死亡就从Vector去掉 et.ss.remove(enemyShot); } } } } } //判断我是否被击中了 publicvoidhitMe() { //取出敌人的每一颗子弹 for(inti=0;i { //取出坦克 EnemyTanket=ets.get(i); //取出每一颗子弹 for(intj=0;j { //取出子弹 ShotenemyShot=et.ss.get(j); if(hero.isLive)//&&Recorder.getMyLife()>=1 { this.hitTank(enemyShot,hero); //Recorder.setMyLife(Recorder.getMyLife()-1); } } } } //判断我的子弹是否击中敌人的坦克 publicvoidhitEnemyTank() { for(inti=0;i { ShotmyShot=hero.ss.get(i); //判断子弹是否有效 if(myShot.isLive) { //取出每个坦克,与它判断 for(intj=0;j { //取出坦克 EnemyTanket=ets.get(j); if(et.isLive) { this.hitTank(myShot,et); } } } } } //写一个函数专门判断子弹是否击中敌人坦克 publicvoidhitTank(Shots,Tanket) { //判断该坦克的方向 switch(et.direct) { //如果敌人的方向是上或者是下 case0: case2: if(s.x>et.x&&s.x<(et.x+20)&&s.y>et.y&&s.y<(et.y+30)) { //击中了 //子弹死亡 s.isLive=false; //敌人坦克也要死亡 et.isLive=false; //减少敌人数量 if(et.getClass()==EnemyTank.class)//反射机制 { Recorder.reduceEnNum(); //增加我的记录 Recorder.addEnNumRec(); } if(et.getClass()==Hero.class)//反射机制 { } //创建一个炸弹,放入Vector Bombb=newBomb(et.x,et.y); //放入Vector bombs.add(b); } case1: case3: if(s.x>et.x&&s.x<(et.x+30)&&s.y>et.y&&s.y<(et.y+20)) { //击中了 //子弹死亡 s.isLive=false; //敌人坦克也要死亡 et.isLive=false; //减少敌人数量 if(et.getClass()==EnemyTank.class)//反射机制 { Recorder.reduceEnNum(); //增加我的记录 Recorder.addEnNumRec(); } if(et.getClass()==Hero.class)//反射机制 { Recorder.setMyLife(Recorder.getMyLife()-1); } //创建一个炸弹,放入Vector Bombb=newBomb(et.x,et.y); //放入Vector bombs.add(b); } } } //画出坦克函数(扩展) publicvoiddrawTank(intx,inty,Graphicsg,intdirect,inttype) { //判断类型 switch(type) { case0: g.setColor(Color.cyan);break; case1: g.setColor(Color.yellow);break; } //判断方向 switch(direct) { //向上 case0: //画出我的坦克(到时候再封装成一个函数) //1.画出左面的矩形 //g.drawRect(hero.getX(),hero.getY(),5,30); g.fill3DRect(x,y,5,30,false); //2.画出右边的矩形 g.fill3DRect(x+15,y,5,30,false); //3.画出坦克的中间矩形 g.fill3DRect(x+5,y+5,10,20,false); //画出中间的圆 g.fillOval(x+4,y+10,10,10); //画出线 g.drawLine(x+9,y+15,x+9,y); break; case1: //炮筒向右 //画出上面的矩形 g.fill3DRect(x,y,30,5,false); g.fill3DRect(x,y+15,30,5,false); g.fill3DRect(x+5,y+5,20,10,false); g.fillOval(x+10,y+5,10,10); g.drawLine(x+15,y+10,x+30,y+10); break; case2: //向下 g.fill3DRect(x,y,5,30,false); g.fill3DRect(x+15,y,5,30,false); g.fill3DRect(x+5,y+5,10,20,false); g.fillOval(x+4,y+10,10,10); g.drawLine(x+10,y+15,x+10,y+30); break; case3: //向左 g.fill3DRect(x,y,30,5,false); g.fill3DRect(x,y+15,30,5,false); g.fill3DRect(x+5,y+5,20,10,false); g.fillOval(x+10,y+5,10,10); g.drawLine(x+15,y+10,x,y+10); break; } } publicvoidrun() { //每个一百毫秒去重画子弹 while(true) { try{ Thread.sleep(100); }catch(InterruptedExceptione){ e.printStackTrace(); } this.hitEnemyTank(); //函数,判断敌人的子弹是否击中我了 this.hitMe(); this.repaint(); //判断是否需要给坦克加入新的子弹 for(inti=0;i { EnemyTanket=ets.get(i); if(et.isLive) { if(et.ss.size()<3) { //没有子弹了 //添加 Shots=null; switch(et.direct) { case0: s=newShot(et.x+9,et.y-1,0); et.ss.add(s); break; case1: s=newShot(et.x+30,et.y+10,1); et.ss.add(s); break; case2: s=newShot(et.x+9,et.y+30,2); et.ss.add(s); break; case3: s=newShot(et.x-1,et.y+9,3); et.ss.add(s); break; } //启动子弹线程 Threadt=newThread(s); t.start(); } } } } } //定义三张图片,三张图片切换组成一颗炸弹 Imageimage1=null; Imageimage2=null; Imageimage3=null; intflagOfContinue; //构造函数 publicMyPanel(intflag) { this.flagOfContinue=flag; //恢复记录 Recorder.getRecording(); if(this.flagOfContinue==0) { //如果不是继续上次就直接建一个 hero=newHero(100,100); //初始化敌人的坦克 for(inti=0;i { //创建敌人的坦克对象 EnemyTanket=newEnemyTank((i+1)*60,0); et.setColor(0); et.setDirect (2); //将MyPanel的敌人坦克向量交给该敌人坦克 et.setEts(ets); //启动敌人的坦克 Threadt=newThread(et); t.start(); //给敌人坦克添加一颗子弹 Shots=newShot(et.x+10,et.y+30,2); et.ss.add(s); Threadt2=newThread(s); t2.start(); //加入 ets.ad
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 练习 坦克 大战 40
![提示](https://static.bdocx.com/images/bang_tan.gif)