package com.learn.exercise.tanke;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;
/*
* 游戏备注:
* 1/2选择单双人游戏
* 回车进入游戏
* wasd控制坦克移动
* 按空格进行射击
*P按键游戏暂停
* */
/**
* 游戏页面与执行类
*/
public class Panel extends JFrame{
/**双缓冲技术解决图片闪动的问题*/
//(大致思路就是讲图片和游戏页面都在Java后台绘制一个页面然后将这个页面放到画布上)
Image offScreemImage = null;
private int width=800;
private int height=610;
//定义指针图片(通过移动该图片来选择游戏模式)
private Image select=Toolkit.getDefaultToolkit().getImage("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankR.gif");
//指针初始纵坐标
private int y =150;
//游戏模式0游戏开始1、单人模式;2、双人模式 5游戏控制成功,4失败;3暂停
public int state=0;
//添加键盘事件;key作为按下按键的键值重新定义的变量a
private int a = 1;
//重绘次数(为了控制敌方坦克添加的速度;count表示画布重绘的次数)
int count = 0 ;
//已生成敌人的数量
int enenyCount = 0;
//游戏元素列表
ArrayList<Bullet> bulletList = new ArrayList<Bullet>();
ArrayList<Bot> botList = new ArrayList<Bot>();
//子弹与敌方坦克碰撞
ArrayList<Bullet> removeList = new ArrayList<Bullet>();
//子弹与我方坦克碰撞
ArrayList<Tank> playerList = new ArrayList<Tank>();
//围墙
ArrayList<Wall>wallList = new ArrayList<Wall>();
//基地
ArrayList<Base>baseList = new ArrayList<Base>();
//添加爆炸元素的列表
ArrayList<Blast>blastList= new ArrayList<Blast>();
//PlayerOne变量玩家一,默认向上
PlayerOne playerOne = new PlayerOne("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankU.gif",125,510,
this,"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankU.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankL.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankR.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankD.gif");
//PlayerTwo变量玩家二默认向上
PlayerTwo playerTwo = new PlayerTwo("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankU.gif",625,510,
this,"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankU.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankL.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankR.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\p1tankD.gif");
//Bot 敌方图片
Bot bot = new Bot("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1U.gif",500,110,
this,"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1U.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1L.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1R.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1D.gif");
//添加一个基地
Base base = new Base("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\base.png",365,560,this);
/**
* lauch()方法
*/
//窗口的启动
public void lauch(){
setTitle("坦克大战");
setSize(width,height);
setLocationRelativeTo(null);
setDefaultCloseOperation(3);
setResizable(false);
setVisible(true);
/**添加键盘监视器;调取KeyMonitor中的数据(将KeyMonitor类实例化)*/
this.addKeyListener(new Panel.KeyMonitor());
/**添加围墙*/
for (int i=0;i<14;i++){
wallList.add(new Wall("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\rsteels.jpg",
i*60,220,this));
}
wallList.add(new Wall("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\rsteels.jpg", 305,560,this));
wallList.add(new Wall("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\rsteels.jpg", 305,500,this));
wallList.add(new Wall("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\rsteels.jpg", 365,500,this));
wallList.add(new Wall("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\rsteels.jpg", 425,500,this));
wallList.add(new Wall("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\rsteels.jpg", 425,560,this));
/**添加基地*/
baseList.add(base);
/**重绘*/
// 在画直线的时候,我们应该把数据保存起来,在刷新窗体时顺便把直线也一并画出来。
//目的:在挪动窗口的时候依旧会重新绘制线条而不是挪动导致消失不见
while (true){
//游戏控制开关(胜利判断)
if (botList.size()==0&&enenyCount == 10){
state = 5;
}
//(失败判断)
if ((playerList.size() == 0 && (state==1||state ==2)) || baseList.size() == 0){
state = 4;
}
// 批量添加电脑坦克Bot
if (count % 100 ==1 && enenyCount < 6 && (state == 1|| state == 2)){//state游戏状态限制
//随机生成敌方坦克
Random random = new Random();
int rnum = random.nextInt(800);
botList.add(new Bot("E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1U.gif",rnum,110,
this,"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1U.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1L.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1R.gif",
"E:\\Program Files\\GYJ\\IntelliJ IDEA 2020.1.2\\classOne\\src\\com\\learn\\exercise\\tanke\\img\\enemy1D.gif"));
enenyCount++;
}
repaint();
try{
Thread.sleep(25);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* paint()方法
* @param g
*/
@Override
public void paint(Graphics g){
/**双缓冲技术解决图片闪动的问题部分代码*/
//创建和容量一样大小的Image图片
if (offScreemImage == null){
offScreemImage = this.createImage(width,height);
}
/**获得该图片的画笔*/
Graphics gImage = offScreemImage.getGr
评论0