import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Event.*;
public class game {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame w = new JFrame();//有标题和边框的顶层窗口。
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭窗口的小红叉
w.setSize(430, 500);//设置窗口大小
w.setBounds(650, 200, 430,500);//对框架的位置和大小进行设置(使窗口处于正中间)
w.setTitle("雷电");
MyPanel9 mp = new MyPanel9();
w.add(mp);
w.addKeyListener(mp);
mp.addKeyListener(mp);//鼠标键盘监听
Thread t = new Thread(mp);//线程
t.start();//开始线程
w.show();//展示游戏界面
w.setVisible(true);
}
}
@SuppressWarnings("serial")
class MyPanel9 extends JPanel implements Runnable,KeyListener{
int count = 1000;//发射子弹数目
int flag1 = 0;//标志flag为1时发射子弹
int m = 0;//记录已发射子弹的数目
int max = 500;//记录得分
int life = 1;//记录重新开始次数
int x = 190;//下面飞机坐标,使我方飞机处于游戏屏幕下方正中心
int y = 410;
int x1[] = new int [15];//上面飞机的坐标
int y1[] = new int [15];
int x2[] = new int [count];//发射子弹的坐标
int y2[] = new int [count];
int cnt = 0;
boolean keyLeft = false;
boolean keyRight = false;
boolean keyDown = false;
boolean keyUp = false;
boolean IsStart = false;//游戏开始提醒
boolean Regain = false;//判断是否重新开始游戏
public MyPanel9()//上面飞机随机分布
{
for(int i = 0;i < 15;i++)
{
x1[i]=(int)(Math.random()*400);
y1[i]=(int)(Math.random()*500);
}
}
public void paint(Graphics g){
super.paint(g);
Image img2 = new ImageIcon("src/images/4.jpg").getImage();//画背景图片
g.drawImage(img2, 0, 0, 430, 500, null);
Image img1 = new ImageIcon("src/images/7.jpg").getImage();//画下面的飞机
g.drawImage(img1, x, y, 30, 40, null);
if(max > 0) {
Font f = new Font("宋体",Font.BOLD,18);
g.setFont(f);
g.setColor(Color.RED);//设置字体颜色
g.drawString("分数:"+max,20, 20);//画分数
for(int i = 0;i < 10;i++) {
Image img3 = new ImageIcon("src/images/2.jpg").getImage();//画上面的飞机
g.drawImage(img3, x1[i], y1[i], 30, 40, null);
}
if(m == count) m = 0;
if(IsStart == false) {
Font fff = new Font("",Font.BOLD,20);
g.setFont(fff);
g.setColor(Color.orange);//设置字体颜色
g.drawString("准备好了吗?游戏开始喽!!", 90, 200);//画开始游戏提示
g.drawString("按返回键退出游戏", 120, 250);//提示按回车键重新开始游戏
}
if(flag1 ==1 ) {//画新的子弹位置
x2[m] = x;
y2[m] = y;
m++;
flag1 = 0;
}
for(int i = 0;i < m;i++) {//绘制子弹
g.setColor(Color.RED);
g.fillOval(x2[i]+5,y2[i], 15, 15);//使用当前颜色填充外接指定矩形框的椭圆。即子弹
}
}
else {
Font ff = new Font("",Font.BOLD,36);
g.setFont(ff);
g.setColor(Color.RED);
g.drawString("GAME OVER", 100, 200);//绘制游戏结束
g.drawString("按回车键重新开始游戏", 10, 250);//提示按回车键重新开始游戏
g.drawString("按返回键重新退出游戏", 10, 300);//提示按回车键重新开始游戏
if(Regain == true){
max = 500;
x = 190;//恢复游戏开始时我方飞机的位置
y = 410;
Regain = false;
}
}
}
public void run() {
while(true) {
//记录可更新时候
cnt++;
for(int i = 0;i<10;i++) {//飞机随机落下
y1[i]++;
if(y1[i] > 500) {
y1[i] = 0;
x1[i] = (int)(Math.random()*400);
max -= 50;
}
}
for(int j = 0;j < m;j++) {//子弹移动过程
y2[j] -= 10;
}
for(int i = 0;i < m;i++) {//子弹击中飞机过程
if(y2[i] > 0)
for(int j = 0;j < 10 ; j++) {
if(0 <= (y2[i]-y1[j]) && (y2[i]-y1[j] <= 10)) {
if(-15 <= (x2[i]-x1[j]) && (x2[i]-x1[j]) <= 10) {
max += 10;
y2[i] =-1;
x1[j] =(int)(Math.random()*400);
y1[j] = 0;
}
}
}
}
if(cnt % 10==0)
{
//按下一键后即可控制方向,不可停下来
if(keyLeft == true)
{
x -= 10;
if(x<0) {
x = 0;
}
}
if(keyRight == true)
{
x += 10;
if(x>400) {
x = 0;
}
}
if(keyDown == true) {//下面的飞机向上移动
y += 10;
if(y<0) {
y = 0;
}
}
if(keyUp == true) {//下面的飞机向上移动
y -= 10;
if(y>420) {
y = 0;
}
}
}
//if(max < 0) {//注释掉,防止出现卡顿状况
// return;
//}
try {
Thread.sleep(35);
}catch(Exception e) {}
repaint();
}
}
public void Timer()
{
}
@Override
public void keyPressed(KeyEvent e) {//按下某个键时调用此方法。
// TODO Auto-generated method stub
if( e.getKeyCode() == KeyEvent.VK_LEFT ) {//下面的飞机向左移动
keyLeft = true;
keyRight = false;
keyDown = false;
keyUp = false;
}
if( e.getKeyCode() == KeyEvent.VK_RIGHT ) {//下面的飞机向左移动
keyLeft = false;
keyRight = true;
keyDown = false;
keyUp = false;
}
if(e.getKeyCode() == KeyEvent.VK_UP) {//下面的飞机向上移动
keyLeft = false;
keyRight = false;
keyDown = false;
keyUp = true;
}
if(e.getKeyCode() == KeyEvent.VK_DOWN) {//下面的飞机向下移动
keyLeft = false;
keyRight = false;
keyDown = true;
keyUp = false;
}
if(e.getKeyCode() == KeyEvent.VK_B) {//悬停状态
keyLeft = false;
keyRight = false;
keyDown = false;
keyUp = false;
}
if(e.getKeyCode()==KeyEvent.VK_ENTER) {//重新开始游戏
Regain = true;
life ++;
}
if(e.getKeyCode() == KeyEvent.VK_SPACE) {//发射子弹
flag1 = 1;
IsStart = true;
}
if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {//退出游戏
System.exit(0);
}
this.repaint();//刷新窗口
}
@Override
public void keyReleased(KeyEvent e) {//释放某个键时调用此方法。
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {//键入某个键时调用此方法。
// TODO Auto-generated method stub
}
}