【Java实战】Java实现简易坦克对战小游戏
来源:互联网 发布:杀敌算法百度云 编辑:程序博客网 时间:2024/05/16 15:10
摘要:前期学习了Java入门的相关基础,现在通过这个小项目来熟悉巩固所学。该程序主要实现了一个简易的坦克对战小游戏,提供UI界面
//此程序用来实现一个简易的坦克对战小游戏!//Version:1.0// @Author:Yongchun_zhapackage cha09;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.*;public class L9_1 extends JFrame implements ActionListener{ Mypanel mp=null; GameStage gs=null; JMenuBar mb=null; JMenu mu=null; JMenuItem mi=null; JMenuItem mi1=null; JMenuItem mi2=null; JMenuItem mi3=null; public static void main(String[] args) { L91 l91=new L9_1(); } public L9_1() { mb=new JMenuBar(); mu=new JMenu("Game"); mu.setMnemonic('G'); mi=new JMenuItem("New Game"); mi.setMnemonic('N'); mi1=new JMenuItem("Go on Game"); mi1.setMnemonic('P'); mi2=new JMenuItem("Save&Exit"); mi2.setMnemonic('S'); mi3=new JMenuItem("Exit"); mi3.setMnemonic('E'); mi.addActionListener(this); mi.setActionCommand("newGame"); mi1.addActionListener(this); mi1.setActionCommand("goongame"); mi2.addActionListener(this); mi2.setActionCommand("saveexit"); mi3.addActionListener(this); mi3.setActionCommand("exit"); mu.add(mi); mu.add(mi1); mu.add(mi2); mu.add(mi3); mb.add(mu); this.setJMenuBar(mb); gs=new GameStage(); Thread ff=new Thread(gs); ff.start(); this.add(gs); this.setIconImage(new ImageIcon("image/tank.jpg").getImage()); this.setTitle("TANK_WAR");//设置用户界面 this.setSize(400,500);//设置窗口大小,数字代表像素 this.setLocation(300,260);//设置窗体位置 this.setResizable(false);//设置窗体大小是否可调整 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭进程 this.setVisible(true);//true 显示,false不显示 } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("newGame")) { mp=new Mypanel(); this.remove(gs); this.add(mp); Thread bb=new Thread(mp); bb.start(); this.addKeyListener(mp); this.setVisible(true); } else if(e.getActionCommand().equals("goongame")) { } else if(e.getActionCommand().equals("saveexit")) { Record record=new Record(); record.setNumAt(mp.numArmyTank); record.saveGame(); System.exit(0); } else if(e.getActionCommand().equals("exit")) { Record.writeRecord(); System.exit(0); } }}class Mypanel extends JPanel implements KeyListener,Runnable{ MyTank mt=null; ArmyTank at=null; Explode bz=null; Vector armyTankV=new Vector(); Vector bzV=new Vector(); int numArmyTank=3; Image tp1=null; Image tp2=null; Image tp3=null; public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_W ||e.getKeyCode()==KeyEvent.VK_UP) { this.mt.setDirection(0); this.mt.turnUp(); } else if(e.getKeyCode()==KeyEvent.VK_A ||e.getKeyCode()==KeyEvent.VK_DOWN) { this.mt.setDirection(1); this.mt.turnDown(); } else if(e.getKeyCode()==KeyEvent.VK_S ||e.getKeyCode()==KeyEvent.VK_LEFT) { this.mt.setDirection(2); this.mt.turnLeft(); } else if(e.getKeyCode()==KeyEvent.VK_D ||e.getKeyCode()==KeyEvent.VK_RIGHT) { this.mt.setDirection(3); this.mt.turnRight(); } if(e.getKeyCode()==KeyEvent.VK_J) { if(this.mt.zdV.size()<8) { this.mt.shutBullet(); } } this.repaint(); } public Mypanel() { Shengyin music=new Shengyin("./tank.wav"); music.start(); Record.readRecord(); mt=new MyTank(140,232); for(int i=0;i { at=new ArmyTank(i*181+5,0); at.setDirection(2); Thread cc=new Thread(at); cc.start(); Bullet zd=new Bullet(at.x+10,at.y+30,2); at.dzdV.add(zd); Thread ee=new Thread(zd); ee.start(); armyTankV.add(at); } tp1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bzxg1.gif")); tp2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bzxg2.gif")); tp3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bzxg3.gif")); } public void paint(Graphics g) { super.paint(g); g.fillRect(0, 0, 400, 300);//设置画布大小 if(mt.life==true) { this.drawTank(mt.getX(), mt.getY(), g, mt.direction , 0); } for(int i=0;i { at=armyTankV.get(i); if(at.life) { this.drawTank(at.getX(), at.getY(), g, at.direction, 1); } for(int j=0;j { Bullet zd=at.dzdV.get(j); if(zd.life) { g.setColor(Color.white); g.fill3DRect(zd.x,zd.y,3,3,false); } else { at.dzdV.remove(zd); } } } for(int i=0;i { Bullet zd=mt.zdV.get(i); if(zd!=null && mt.zd.life==true) { g.setColor(Color.white); g.fill3DRect(zd.x,zd.y , 3,3,false ); } if(zd.life==false) { mt.zdV.remove(zd); } } for(int i=0;i { bz=bzV.get(i); if(bz.lifeLength>6) { g.drawImage(tp1, bz.x, bz.y, 30,30,this); } else if(bz.lifeLength>3) { g.drawImage(tp2, bz.x, bz.y, 30,30,this); } else { g.drawImage(tp3, bz.x, bz.y, 30,30,this); } bz.lifeLengthDecrease(); if(bz.lifeLength==0) { bzV.remove(bz); } } this.showInformation(g); } public void drawTank(int x,int y,Graphics g,int direction,int type) { switch(type) { case 0://my tank g.setColor(Color.yellow); break; case 1://army's tank g.setColor(Color.green); break; } switch(direction) { case 0://up 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+5,y+10, 10, 10); g.drawLine(x+10,y+15,x+10,y-3); break; case 1://down 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+5,y+10, 10, 10); g.drawLine(x+10,y+15,x+10,y+33); break; case 2://left 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-3,y+10); break; case 3://right 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+20,y+10,x+30,y+10); break; } } public void showInformation(Graphics g) { this.drawTank(80, 330, g, 0, 0); this.drawTank(150,330, g, 0, 1); g.setColor(Color.black); g.drawString(Record.getNumAt()+"", 116,350);//整形数据后面加上“”,会把整形数据转换为String类型。 g.drawString(Record.getNumMt()+"",186,350 ); g.setFont(new Font("Bodoni MT",Font.CENTER_BASELINE,15)); g.setColor(Color.BLACK); g.setFont(new Font("Bodoni MT",Font.BOLD,20)); g.drawString("The number of Army Tanks you shutted:", 10,400); g.setColor(Color.DARK_GRAY); g.drawString(Record.getSumShutNumAt()+"",370,400 ); }public boolean shutted(Bullet zd,Tank tk) { boolean b2=false; switch(tk.direction) { case 0: case 1: if(zd.x>tk.x && zd.xtk.y && zd.y { zd.life=false; tk.life=false; Explode bz=new Explode(tk.x,tk.y); bzV.add(bz); b2=true; } break; case 2: case 3: if(zd.x>tk.x && zd.xtk.y && zd.y { zd.life=false; tk.life=false; b2=true; Explode bz=new Explode(tk.x,tk.y); bzV.add(bz); b2=true; } break; } return b2; } public void shuttedArmy() { for(int i=0;i { Bullet zd=mt.zdV.get(i); if(zd.life) { for(int j=0;j { ArmyTank at=armyTankV.get(j); if(at.life) { if(this.shutted(zd, at)) { Record.atDc(); Record.numShutAt(); } this.shutted(zd, at); } } } } } public void shuttedMine() { for(int i=0;i { ArmyTank at=armyTankV.get(i); for(int j=0;j { Bullet zd=at.dzdV.get(j); this.shutted(zd, mt); if(this.shutted(zd, mt)) { Record.mtDc(); } } this.repaint(); } } public void run() { while(true) { try { Thread.sleep(100); this.repaint(); } catch(Exception e) {} for(int i=0;i { Bullet zd=mt.zdV.get(i); if(zd.life) { for(int j=0;j { ArmyTank at=armyTankV.get(j); if(at.life) { this.shuttedArmy(); } } } this.repaint(); } for(int i=0;i { Bullet zd=at.dzdV.get(i); if(mt.life) { this.shuttedMine(); } } this.repaint(); } }}class GameStage extends JPanel implements Runnable{ int time=0; public void paint(Graphics g) { super.paint(g); g.fillRect(0,0,400,300); if(time%2==0) { g.setColor(Color.orange); g.setFont(new Font("Blackoak Std",Font.BOLD,20)); g.drawString("Welcome To", 50,140); g.setFont(new Font("Blackoak Std",Font.PLAIN,15)); g.drawString("TANK WAR GAME", 30,170); } } public void run() { while(true) { try { Thread.sleep(500); }catch(Exception e){} time++; this.repaint(); } }}//material lasspackage cha09;import java.io.*;import java.util.Vector;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;class Tank{ int x=0,y=0; int direction=0; int speed=5; boolean life=true; public int getDirection() { return direction; } public void setDirection(int direction) { this.direction = direction; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public Tank(int x,int y) { this.x=x; this.y=y; }}class Bullet implements Runnable{ int x,y; int direction; int speed=5; boolean life=true; public Bullet(int x,int y,int direction) { this.x=x; this.y=y; this.direction=direction; } public void run() { while(true) { try { Thread.sleep(50); } catch(Exception e) {} switch(direction) { case 0: y-=speed; break; case 1: y+=speed; break; case 2: x-=speed; break; case 3: x+=speed; break; } if(x<0||x>400||y<0||y>300) { this.life=false; } } }}class MyTank extends Tank{ Vector zdV=new Vector(); Bullet zd=null; public MyTank(int x,int y) { super(x,y); } public void turnUp() { y-=speed; } public void turnDown() { y+=speed; } public void turnLeft() { x-=speed; } public void turnRight() { x+=speed; } public void shutBullet() { switch(this.direction) { case 0: zd=new Bullet(x+10,y,0); zdV.add(zd); break; case 1: zd=new Bullet(x+10,y+30,1); zdV.add(zd); break; case 2: zd=new Bullet(x,y+10,2); zdV.add(zd); break; case 3: zd=new Bullet(x+30,y+10,3); zdV.add(zd); break; } Thread aa=new Thread(zd); aa.start(); }}class ArmyTank extends Tank implements Runnable{ int time=0; int direction; Bullet zd=null; Vector dzdV=new Vector(); Vector armyTankV=null; public ArmyTank(int x,int y) { super(x, y); } public boolean Impact() { boolean b=true; switch(this.direction) { case 0: case 1: for(int i=0;i { ArmyTank at=armyTankV.get(i); if(at!=this) { if(this.x>=at.x+20 || this.x+20<=at.x || (this.x<=at.x+20 && this.x+20>=at.x && (this.y+30<=at.y || this.y<=at.y+30))) { return true; } if(this.y>=at.y+20 || this.y+30<=at.y || (this.y>=at.y-30 && this.y<=at.y+20 && (this.x>at.x+30) || (this.x+20<=at.x))) { return true; } } } break; case 2: case 3: for(int i=0;i { ArmyTank at=armyTankV.get(i); if(at!=this) { if(at.x+20<=this.x || at.x>=this.x+30 || (this.x>=at.x-30 && this.x<=at.x+20 &&(this.y>=at.y+30 || this.y+20<=at.y))) { return true; } if(this.y>=at.y+20 || this.y+20<=at.y || (this.y>=at.y-20 && this.y<=at.y+20 &&(this.x>=at.x+30 || this.x+30<=at.x))) { return true; } } } break; } return b; } public void run() { int speed=2; while(true) { switch(this.direction) { case 0: for(int i=0;i<30;i++) { if(y>0 && Impact()) { y-=speed; } try { Thread.sleep(50); }catch(Exception e){} } break; case 1: for(int i=0;i<30;i++) { if(y<240 && Impact()) { y+=speed; } try { Thread.sleep(50); }catch(Exception e){} } break; case 2: for(int i=0;i<30;i++) { if(x>0 && Impact()) { x-=speed; } try { Thread.sleep(50); }catch(Exception e){} } break; case 3: for(int i=0;i<30;i++) { if(x<360 && Impact()) { x+=speed; } try { Thread.sleep(50); }catch(Exception e){} } break; } this.direction=(int)(Math.random()*4); if(this.life==false) { break; } this.time++; if(time%2==0) { if(life) { if(dzdV.size()<8) { switch(direction) { case 0: zd=new Bullet(x+10,y,0); dzdV.add(zd); break; case 1: zd=new Bullet(x+10,y+30,1); dzdV.add(zd); break; case 2: zd=new Bullet(x+10,y+10,2); dzdV.add(zd); break; case 3: zd=new Bullet(x+30,y+10,3); dzdV.add(zd); break; } Thread dd=new Thread(zd); dd.start(); } } } } }}class Explode{ int x,y; int lifeLength=9; boolean life=true; public Explode(int x,int y) { this.x=x; this.y=y; } public void lifeLengthDecrease() { if(lifeLength>0) { lifeLength--; } else { this.life=false; } }}class Record{ Vector armyTankV=null; private static int numAt=10; private static int numMt=2; private static int sumShutNumAt=0; private static FileOutputStream fo=null; private static FileInputStream fi=null; public static int getSumShutNumAt() { return sumShutNumAt; } public static void setSumShutNumAt(int sumShutNumAt) { Record.sumShutNumAt = sumShutNumAt; } public static void numShutAt() { sumShutNumAt++; } public static int getNumAt() { return numAt; } public static void setNumAt(int numAt) { Record.numAt = numAt; } public static int getNumMt() { return numMt; } public static void setNumMt(int numMt) { Record.numMt = numMt; } public static void atDc() { numAt--; } public static void mtDc() { numMt--; } public static void writeRecord() { try { fo=new FileOutputStream("F:/java/Part2/writeRecord.txt"); fo.write(sumShutNumAt); } catch(Exception e){} finally { try { fo.close(); } catch(Exception e){} } } public static void readRecord() { try { fi=new FileInputStream("F:/java/Part2/writeRecord.txt"); sumShutNumAt=fi.read(); } catch(Exception e){} finally { try { fi.close(); } catch(Exception e){} } } public void saveGame() { try { fo=new FileOutputStream("F:/java/Part2/writeRecord.txt"); fo.write(sumShutNumAt); for(int i=0;i { ArmyTank at=armyTankV.get(i); if(at.life) { int zb=at.x; int zb1=at.y; int zb2=at.direction; fo.write(zb); fo.write(zb1); fo.write(zb2); } } } catch(Exception e) {} finally { try { fo.close(); fi.close(); } catch(Exception e){} } }}class Location{ int x,y; int location; public Location(int x,int y,int location) { this.x=x; this.y=y; this.location=location; }}class Shengyin extends Thread { private String wjm; public Shengyin(String ypwj) { wjm=ypwj; } public void run() { File wjl = new File(wjm); AudioInputStream ypsrl = null; try { ypsrl = AudioSystem.getAudioInputStream(wjl); } catch (Exception e){} AudioFormat format = ypsrl.getFormat(); SourceDataLine aqsj = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); try { aqsj = (SourceDataLine) AudioSystem.getLine(info); aqsj.open(format); } catch (Exception e){} aqsj.start(); int zjtj = 0; byte[] hczj = new byte[1024]; try { while (zjtj != -1) { zjtj = ypsrl.read(hczj, 0, hczj.length); if (zjtj >= 0) aqsj.write(hczj, 0, zjtj ); } } catch (Exception e){} finally { aqsj.drain(); aqsj.close(); } }}
阅读全文
0 0
- 【Java实战】Java实现简易坦克对战小游戏
- 《Java小游戏实现》:坦克大战
- 《Java小游戏实现》:坦克大战(续2)
- 《Java小游戏实现》:坦克大战(续三)
- 《Java小游戏实现》:坦克大战(续四)
- java swing实现坦克大战小游戏源码
- Java 坦克小游戏心得
- 坦克大战小游戏(Java)
- 射击类小游戏——坦克大战(java实现)
- 《Java小游戏实现》:坦克大战(续一)
- Java实战-坦克大战
- java小游戏——坦克大战
- java小游戏-坦克大战,事后总结
- 《Java小游戏实现》:坦克大战(最后一点附加功能的实现)
- JAVA基础课程设计 简易坦克大战
- JAVA实战:一个桌球小游戏
- Java项目实战:坦克大战(1)
- JAVA技术实战 坦克大战网络版视频教程
- python读取excel
- HDU Just do it (找规律暴力)
- linux 正向代理反向代理
- __cxa_call_unexpected原因
- 对于自编译Ueditor问题
- 【Java实战】Java实现简易坦克对战小游戏
- javaseday21(缓冲区 为什么弄个int 和 char[] readLine 的实现原理 如何自己实现)
- js jq中$().eq()和$().find()的用法
- 2017 多校系列 5
- 假设检验与参数估计的R语言实现
- 【Java实战】Java实现简易音乐播放器
- Win7下32位Python2.7 安装Numpy+Scipy过程
- LintCode 前序遍历和中序遍历树构造二叉树
- linux netstat命令简介