java实现游戏对战过程_【Java实战】Java实现简易坦克对战小游戏

本文介绍如何使用 Java 实现一个简单的坦克对战小游戏,包括游戏菜单、坦克移动、射击等功能。通过创建不同的类来管理游戏元素,如坦克、子弹和碰撞检测,实现了游戏逻辑和用户交互。
摘要由CSDN通过智能技术生成

//此程序用来实现一个简易的坦克对战小游戏!

//Version:1.0

// @Author:Yongchun_zha

package 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 lass

package 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();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值