[java]代码库
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class PlaneFrame extends JFrame{
PlanePanle jp;
//子弹队列
static List<Shell> list = new ArrayList<Shell>();
//boss队列
static List<Boss> bossList = new ArrayList<Boss>();
//敌方战机队列
static List<EnemyPlane> enemyList = new ArrayList<>();
//存放boss子弹对象
static ArrayList<Shell> bossBulletList=new ArrayList<Shell>();
//存放敌机子弹
static ArrayList<Shell> enemyShell = new ArrayList<Shell>();
static int enemyPlaneCount=0;//敌方的数目
static int enemyPlaneNumber=5; //设置敌人最大飞机数目
static int bossCount;//boss的数量
static int bossNumber=1;//boss的最大数量
public static String path=System.getProperty("user.dir")+"\\Resouce";
public static HashMap<String,BufferedImage> maps = new HashMap<>();
public void start() {
File[] file = new File(path).listFiles();
for(int i=0;i<file.length;i++) {
try {
maps.put(file[i].getName(), ImageIO.read(file[i]));
} catch (IOException e) {
e.printStackTrace();
}
}
}
public PlaneFrame() {
//设置窗口大小
this.setSize(640,700);
//设置窗口名称
this.setTitle("信工16级2班黄通作品--飞机游戏");
//居中
this.setLocationRelativeTo(null);
//设置不可改变大小
this.setResizable(false);
//关闭程序,释放资源
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加一个适配器
this.addKeyListener(new MyKeyListener());
//开始加载图片
start();
//添加面板
jp = new PlanePanle();
add(jp);
//设置窗口可见
setVisible(true);
}
//添加一个适配器
class MyKeyListener extends KeyAdapter{
public void keyPressed(KeyEvent e) {
jp.keyPressed(e);
}
}
public static void main(String[] args) {
new PlaneFrame();
}
}
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
class PlanePanle extends JPanel{
int key;
JLabel bossXue;//boss血量
JLabel myPlaneXue;//我方飞机血量
//初始化背景坐标
Point bgPoint = new Point(0,-2180);
//初始化我方飞机
MyPlane myPlane = new MyPlane(280,500);
//初始化一个boss
//Boss boss = new Boss();
//初始化一个敌方飞机的坐标
Point enemyPlane = new Point(280,10);
//面板构造方法,启动线程
public PlanePanle() {
this.setLayout(null);
bossXue = new JLabel("boss血量:"+Boss.life);
bossXue.setForeground(Color.BLACK);
bossXue.setBounds(300,650,100,30);
add(bossXue);
new Thread(new BgThread()).start();
}
public void paint(Graphics g) {
//调用父类paint方法
super.paint(g);
//创建一个画板
BufferedImage image = new BufferedImage(640,700,BufferedImage.TYPE_INT_RGB);
//创建一个画笔
Graphics gs = image.createGraphics();
//画背景两张背景,循环连接播放
gs.drawImage(PlaneFrame.maps.get("background2a.bmp"),bgPoint.x,bgPoint.y,this);
gs.drawImage(PlaneFrame.maps.get("background2a.bmp"),bgPoint.x,bgPoint.y-2880,this);
//画我方飞机
myPlane.drawMyPlane(gs);
//画敌方飞机
for(int i = 0;i<PlaneFrame.enemyList.size();i++) {
PlaneFrame.enemyList.get(i).drawEnemyPlane(gs);
}
//画boss
for(int i = 0;i<PlaneFrame.bossList.size();i++) {
PlaneFrame.bossList.get(i).drawBoss(gs);
}
//子弹
for(int i = 0;i<PlaneFrame.list.size();i++) {
PlaneFrame.list.get(i).drawShell(gs);
}
//gs.setFont(new Font("宋体",Font.BOLD,20));
gs.drawString("Boss的生命值:"+Integer.toString(Boss.life),400,20);
gs.drawString("我方飞机血量:"+Integer.toString(MyPlane.life),400,60);
gs.drawString("操作方法:方向键控飞机移动,空格键发子弹",200,650);
//将画板添加到JPanel
g.drawImage(image,0,0,this);
}
class BgThread implements Runnable{
@Override
public void run() {
while(true) {
//我方飞机死亡,游戏结束,提示窗口
if(MyPlane.life<=0) {
JOptionPane.showMessageDialog(null,"飞机死亡,游戏结束");
System.exit(0);
}
if(Boss.life<=0) {
JOptionPane.showMessageDialog(null,"恭喜,杀死BOSS,游戏胜利!!游戏到此结束");
System.exit(0);
}
//如果敌机小于2 ,boss的生命为整数而且大于5,重新生成小飞机
if(PlaneFrame.enemyPlaneNumber<=2&&Boss.life%10==0&&Boss.life<100) {
//boss生命小于30,生成10个飞机
if(Boss.life<30) {
PlaneFrame.enemyPlaneNumber=10;
}
else
PlaneFrame.enemyPlaneNumber=5;
PlaneFrame.enemyPlaneCount=0;
}
//创建敌机和boss
creatEnemy();
creatBoss();
//如果到到最下面,回到初始位置
if(bgPoint.y==700) {
bgPoint.y=-2180;
}
bgPoint.y+=1;
//让子弹飞
for(int i = 0;i<PlaneFrame.list.size();i++) {
PlaneFrame.list.get(i).y-=10;
//子弹越界,删除该子弹对象
if(PlaneFrame.list.get(i).y<0)
PlaneFrame.list.remove(i);
}
//线程休眠
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
//重新绘图,更新
repaint();
}
}
}
//键按下去
public void keyPressed(KeyEvent e) {
//如果按了空格键
if(e.getKeyCode()==KeyEvent.VK_SPACE) {
fire();
}
//如果按了上键
if(e.getKeyCode()==KeyEvent.VK_UP) {
myPlane.up=true;
myPlane.down=false;
myPlane.right=false;
myPlane.left=false;
}
//如果按了下键
if(e.getKeyCode()==KeyEvent.VK_DOWN) {
myPlane.down=true;
myPlane.up=false;
myPlane.right=false;
myPlane.left=false;
}
//如果按了左键
if(e.getKeyCode()==KeyEvent.VK_LEFT) {
myPlane.left=true;
myPlane.down=false;
myPlane.up=false;
myPlane.right=false;
}
//如果按了右键
if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
myPlane.right=true;
myPlane.left=false;
myPlane.down=false;
myPlane.up=false;
}
repaint();
}
//子弹发射方法
public void fire() {
PlaneFrame.list.add(new Shell(myPlane.x+30,myPlane.y-80));
}
//创建敌方战机
public void creatEnemy() {
if(PlaneFrame.enemyPlaneCount<PlaneFrame.enemyPlaneNumber) {
PlaneFrame.enemyList.add(new EnemyPlane(myPlane));
PlaneFrame.enemyPlaneCount++;
}
}
public void creatBoss() {
if(PlaneFrame.bossCount<PlaneFrame.bossNumber) {
PlaneFrame.bossList.add(new Boss(myPlane));
PlaneFrame.bossCount++;
}
}
}
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;
import org.omg.CORBA.portable.Delegate;
public class Boss {
Random random = new Random();
static int life=100;//boss的生命
int x=random.nextInt(500)-20; //初始出现boss的x坐标
int y=random.nextInt(100)+10; //初始出现boss的y坐标
int x1,x2;//boss水平移动增量
int y1,y2;//boss竖直的增量
int time;//移动一次需要的时间
static int shootTime;//boss发射子弹时间间隔
MyPlane myPlane;//传入我方飞机对象
public Boss(MyPlane myPlane) {
setMyPlane(myPlane);
}
public void setMyPlane(MyPlane myPlane) {
this.myPlane = myPlane;
}
ArrayList<Shell> bossBulletList=new ArrayList<Shell>();//存放boss子弹对象
boolean start = true;//判断游戏开始没,游戏开始产生一个boss
//画boss
public void drawBoss(Graphics g) {
timeX();
move();
if(Boss.life>0) {
g.drawImage(PlaneFrame.maps.get("boss.png"),x,y,null);
}
else {
PlaneFrame.bossList.remove(this);
}
bossShot(g);//boss发子弹
}
//boss发子弹实现
public void bossShot(Graphics g) {
shootInterval(x,y);//发弹间隔时间
ifBossShootMyPlane(g);//判断boss子弹是否射中我方战机
}
//是否击中我方飞机
public void ifBossShootMyPlane(Graphics g) {
for(int i=0;i<bossBulletList.size();i++)
{
if(bossBulletList.get(i).y>700) //如果子弹出界
{ bossBulletList.remove(bossBulletList.get(i)); } //删除子弹对象
else
{
bossBulletList.get(i).drawBossBullet(g); //画出子弹
int x1=bossBulletList.get(i).x;
int y1=bossBulletList.get(i).y;
if(x1-myPlane.x>-25&&x1-myPlane.x<60&&myPlane.y-y1<60&&y1-myPlane.y<0) {
System.out.println("子弹:"+"("+x1+","+y1+")");
System.out.println("飞机:"+"("+myPlane.x+","+myPlane.y+")");
int ex=myPlane.x;
int ey=myPlane.y;
MyPlane.life-=2;
bossBulletList.remove(bossBulletList.get(i));
Explode(ex,ey,g);
}
}
}
}
public void Explode (int x,int y,Graphics g) {
for(int i=0;i<33;i++) {
g.drawImage(PlaneFrame.maps.get((i+1)+".png"), x, y,null);
}
}
public void shootInterval(int x, int y) {
if(shootTime<=0) //每隔一定时间发射子弹
{
shootTime=time;
Shell s=new Shell(x+90,y+145);
bossBulletList.add(s);
}
shootTime--;
}
public void timeX() {
if(time<=0) {
time=random.nextInt(40)+20; //水平定向移动持续时间
x1=random.nextInt(4); //产生向右的移动增量
x2=-random.nextInt(4);
y1=random.nextInt(4); //产生向下的移动增量
y2=-random.nextInt(4); //产生向上的移动增量
while(y1+y2==0) //让正负增量之和不为0 ,为0战机就不动了,不为0就动
{y2=-random.nextInt(4);} //让正负增量之和不为0 ,为0战机就不动了,不为0就动
}
time--;
}
public void move() {
x=x+x1+x2;
y=y+y1+y2;
//防止敌方飞机出界
if(x<0){
x=0;
time=0;
}
if(x>540){
x=540;
time=0;
}
//保证boss在上方
if(y>150) {
y=150;
}
if(y<0) {
y=0;
}
}
}
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;
public class EnemyPlane {
Random random = new Random();
int x=random.nextInt(500)-20; //初始出现x坐标
int y=random.nextInt(300)+10; //初始出现y坐标
int life=1;//敌方飞机生命
int x1,x2;//飞机左右移动增量
int timeX;//水平移动的时间
int shootTime;
MyPlane myPlane;
ArrayList<Shell> enemyShell = new ArrayList<Shell>();
public EnemyPlane(MyPlane myPlane) {
setMyPlane(myPlane);
}
public void setMyPlane(MyPlane myPlane) {
this.myPlane = myPlane;
}
public void drawEnemyPlane(Graphics g) {
timeX();
move();
if(this.life>0) {
g.drawImage(PlaneFrame.maps.get("enemy8.png"), x, y+2, null);
}else {
PlaneFrame.enemyList.remove(this);
}
enemyShot(g);//敌机发子弹
}
public void enemyShot(Graphics g) {
shootInterval(x,y,110);//发弹间隔时间
ifBossShootMyPlane(g);//判断boss子弹是否射中我方战机
}
private void ifBossShootMyPlane(Graphics g) {
for(int i=0;i<enemyShell.size();i++)
{
if(enemyShell.get(i).y>700) //如果子弹出界
{ enemyShell.remove(enemyShell.get(i)); } //删除子弹对象
else
{
enemyShell.get(i).drawEnemyBullet(g); //画出子弹
int x1=enemyShell.get(i).x;
int y1=enemyShell.get(i).y;
if(x1-myPlane.x>-10&&x1-myPlane.x<70&&myPlane.y-y1<20&&y1-myPlane.y<0) {
System.out.println("子弹:"+"("+x1+","+y1+")");
System.out.println("飞机:"+"("+myPlane.x+","+myPlane.y+")");
int ex=myPlane.x;
int ey=myPlane.y;
MyPlane.life--;
enemyShell.remove(enemyShell.get(i));
Explode(ex,ey,g);
}
}
}
}
public void Explode (int x,int y,Graphics g) {
for(int i=0;i<33;i++) {
g.drawImage(PlaneFrame.maps.get((i+1)+".png"), x, y,null);
}
}
private void shootInterval(int x, int y, int i) {
if(shootTime<=0) //每隔一定时间发射子弹
{
shootTime=i;
Shell s=new Shell(x+30,y+50);
enemyShell.add(s);
}
shootTime--;
}
public void timeX() {
if(timeX<=0) {
timeX=random.nextInt(40)+20; //水平定向移动持续时间
x1=random.nextInt(4); //产生向右的移动增量
x2=-random.nextInt(4);
}
timeX--;
}
public void move() {
x=x+x1+x2;
//y=y+random.nextInt(2);
//防止敌方飞机出界
if(x<0){
x=0;
timeX=0;
}
if(x>540){
x=540;
timeX=0;
}
}
}
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import javax.swing.JOptionPane;
public class MyPlane {
static int life=5;//我方战机的生命
//我方飞机的坐标
int x,y;
//飞机速度
int speed=4;
//飞机移动方向
boolean up;
boolean down;
boolean right;
boolean left;
public MyPlane(int x,int y) {
this.x=x;
this.y=y;
}
public void drawMyPlane(Graphics g) {
if(up) {
y-=speed;
if(y<=0)y=0;
}
if(down) {
y+=speed;
if(y>620)y=620;
}
if(left) {
x-=speed;
if(x<=0)x=0;
}
if(right) {
x+=speed;
if(x>540)x=540;
}
//画我方飞机
if(life>0) {
g.drawImage(PlaneFrame.maps.get("plane.png"),x,y,null);
}
}
}
[代码运行效果截图]
[源代码打包下载]
初级程序员
by: 代码王 发表于:2018-01-04 01:46:18 顶(0) | 踩(0) 回复
GOOD
回复评论