下面是代码
package game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import model.Plane;
public class FightFrame extends JFrame implements KeyListener{
List<Plane> zds = new ArrayList<Plane>(); //子弹
List<Plane> drs = new ArrayList<Plane>(); //敌人
Plane myPlane = new Plane(); //自己
Timer timer = null; //用来产生敌人飞机
Timer gameTimer = null; //游戏逻辑线程
static int drSpeed = 5; //敌人飞机飞行速度
static int mySpeed = 8; //自己的飞机飞行速度
static int zdSpeed = 20; //子弹飞行速度
static int gameSpeed = 70; //游戏速度
public FightFrame(){
this.setTitle("打飞机");
this.getContentPane().setBackground(Color.black);
this.setSize(400, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.addKeyListener(this);
timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Random random = new Random();
int rX = random.nextInt(330);
int type = random.nextInt(2);
if(type==0){
drs.add(new Plane(rX, 55, getImage("f1.bmp"),0));
}else{
drs.add(new Plane(rX, 55, getImage("f2.bmp"),0));
}
}
});
gameTimer = new Timer(gameSpeed, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//敌人飞机往下飞
for(int i = drs.size()-1;i>=0;i--){
Plane plane = drs.get(i);
plane.setY(plane.getY()+drSpeed);
if(myPlane.getX()+55>plane.getX()&&myPlane.getX()<plane.getX()+55
&&myPlane.getY()+35>plane.getY()&&myPlane.getY()<plane.getY()+45){
myPlane.setStatus(1);
drs.get(i).setStatus(1);
paint(getGraphics());
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
JOptionPane.showMessageDialog(null, "GAME OVER!");
init();
return;
}
if(plane.getStatus()==2||plane.getY()>600){
drs.remove(i);
}
}
//子弹往上飞
for(int i = zds.size()-1;i>=0;i--){
Plane plane = zds.get(i);
plane.setY(plane.getY()+drSpeed);
plane.setY(plane.getY()-zdSpeed);
int zdX = plane.getX();//子弹中间拿来判断
int zdY = plane.getY();
boolean flag = true; //如果打到了飞机则不用判断子弹是否飞出屏幕
//判断是否打到敌方飞机
for(int j = drs.size()-1;j>=0;j--){
Plane dr = drs.get(j);
flag = true;
int drX = dr.getX();
int drY = dr.getY();
if(zdX>=drX&&zdX<=drX+60&&zdY<=drY+70&&zdY>=drY+35+zdSpeed){
drs.get(j).setStatus(1);
zds.remove(i);
flag = false;
}
}
if(plane.getStatus()==2||(flag&&plane.getY()<53)){
zds.remove(i);
}
}
repaint();
}
});
JMenuBar menu = new JMenuBar();
JMenu game = new JMenu("游戏");
JMenuItem newgame = game.add("新游戏");
final JMenuItem pause = game.add("暂停");
JMenuItem exit = game.add("退出");
newgame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
init();
}
});
pause.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(pause.getText().equals("暂停")){
timer.stop();
gameTimer.stop();
pause.setText("继续");
}else {
timer.start();
gameTimer.start();
pause.setText("暂停");
}
}
});
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(game);
this.setJMenuBar(menu);
this.setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
if(myPlane.getStatus()==0){
g.drawImage(myPlane.getImage(), myPlane.getX(), myPlane.getY(), null);
}else if(myPlane.getStatus()==1){
g.drawImage(getImage("boom.bmp"), myPlane.getX(), myPlane.getY(), null);
}
for(Plane plane : zds){
g.drawImage(plane.getImage(), plane.getX(), plane.getY(), null);
}
for(int i = 0;i<drs.size();i++){
Plane plane = drs.get(i);
if(plane.getStatus()==0){
g.drawImage(plane.getImage(), plane.getX(), plane.getY(), null);
}else if (plane.getStatus()==1) {
g.drawImage(getImage("boom.bmp"), plane.getX(), plane.getY(), null);
drs.get(i).setStatus(2);
}
}
}
public Image getImage(String path){
try {
return ImageIO.read(new File(path));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
//初始化游戏
public void init(){
timer.stop();
gameTimer.stop();
//移除子弹和敌人飞机
zds.clear();
drs.clear();
//初始化自己
myPlane = new Plane(165, 550, getImage("f3.bmp"),0);
repaint();
timer.start();
gameTimer.start();
}
public static void main(String[] args) {
new FightFrame();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == 39)//右飞行
{
myPlane.setX(myPlane.getX()+mySpeed);
if(myPlane.getX()>330)
{
myPlane.setX(330);
}
}else if(code == 37)//左飞行
{
myPlane.setX(myPlane.getX()-mySpeed);
if(myPlane.getX()<0)
{
myPlane.setX(0);
}
}else if(code == 38)//上飞行
{
myPlane.setY(myPlane.getY()-mySpeed);
if(myPlane.getY()<55)
{
myPlane.setY(55);
}
}else if(code == 40)//下飞行
{
myPlane.setY(myPlane.getY()+mySpeed);
if(myPlane.getY()>550)
{
myPlane.setY(550);
}
}else if (code == 32) { //空格开炮
zds.add(new Plane(myPlane.getX()+22, myPlane.getY(), getImage("zd.bmp"),0));
}else if(code==112){ //F1开始游戏
init();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
package model;
import java.awt.Image;
public class Plane {
private int x;
private int y;
private Image image;
private int status;
public Plane() {
}
public Plane(int x, int y, Image image, int status) {
this.x = x;
this.y = y;
this.image = image;
this.status = status;
}
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 Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}