import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class MyFrame extends JFrame implements MouseListener, Runnable,
KeyListener {
int keypre = 0;
@Override
public void keyPressed(KeyEvent arg0) {
int key = arg0.getKeyCode();
int fx = player.fx;
keypre = 1;
switch (key) {
case 37:
fx = left;
break;
case 38:
fx = up;
break;
case 39:
fx = right;
break;
case 40:
fx = down;
break;
default:
//shoot(player.x, player.y, player.fx, player.v * 4);
//bullet[bulletNum - 1].isplayer = true;
//bulletInit(bullet[bulletNum - 1]);
break;
}
player.fx = fx;
if (key >= 37 && key <= 40) {
tankMove(player);
tankMove(player);
}
//System.out.println(key);
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
keypre = 0;
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public MyFrame() {
this.setIconImage(new ImageIcon("a.jpg").getImage());
this.setSize(750, 440);
this.setTitle("destiny");
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation(350, 100);
this.addMouseListener(this);
this.addKeyListener(this);
this.setResizable(false);
this.setVisible(true);
start();
te.start();
te.suspend();
te.resume();
}
private int x = 0, y = 0, flag = -1;
private int[][] map = new int[100][100];
Thread te = new Thread(this);
int rx = 0, ry = 0, score = 0, diffcult = 1;
int body[][] = new int[1000][2];
boolean end = false;
boolean getrand() {
while (true) {
rx = (int) (Math.random() * 18);
ry = (int) (Math.random() * 18);
if (map[rx][ry] == 0) {
return true;
}
}
}
int diff[] = { 100, 80, 120, 150, 180, 200 };
int moveToPlayer(Tank tank){
if(Math.random()>0.6){
return (int) (4 * Math.random());
}
int dx=Math.abs(player.x-tank.x),dy=Math.abs(player.y-tank.y);
if(dx<dy&&player.y<tank.y){
return up;
}
if(dx<dy&&player.y>tank.y){
return down;
}
if(dx>dy&&player.x<tank.x){
return left;
}
if(dx>dy&&player.x>tank.x){
return right;
}
return (int) (4 * Math.random());
}
@Override
public void run() {
int time = 0, t = 100;
while (true) {
this.repaint();
time += t;
try {
te.sleep(t);
for (int i = 0; i < enemyNum; i++) {
if (enemy[i].flag == 1
&& time - enemy[i].lastshoot > enemy[i].shootBullet) {
shoot(enemy[i].x, enemy[i].y, enemy[i].fx,
enemy[i].v * 4);
bullet[bulletNum - 1].isplayer = false;
bulletInit(bullet[bulletNum - 1]);
enemy[i].lastshoot = time;
}
tankMove(enemy[i]);
enemy[i].step--;
if (enemy[i].step <= 0) {
enemy[i].step = (int) (40 * Math.random());
enemy[i].fx=moveToPlayer(enemy[i]);
}
}
if (player.flag == 1&& time - player.lastshoot > player.shootBullet) {
shoot(player.x,player.y,player.fx,player.v*4);
bulletInit(bullet[bulletNum-1]);
bullet[bulletNum-1].isplayer=true;
player.lastshoot = time;
// System.out.println(bullet[bulletNum-1].x+" "+bullet[bulletNum-1].x+
// "-->"+player.x+" "+player.y);
}
for (int i = 0; i < bulletNum; i++) {
bulletMove(bullet[i]);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
void shoot(int x, int y, int fx, int v) {
bullet[bulletNum++] = new Bullet(x, y, fx, v);
}
Tank player = null;
Tank enemy[] = new Tank[1000];
Bullet bullet[] = new Bullet[10000];
int enemyNum = 0, bulletNum = 0;
int h[] = { 0, -1, 0, 1 }, l[] = { 1, 0, -1, 0 };
void newEnemy() {
int newx, newy, newfx;
while (true) {
newx = (int) (Math.random() * (360 - 34)) + 40 + 17;
newy = (int) (Math.random() * (360 - 34)) + 40 + 17;
newfx = (int) (Math.random() * 4);
enemy[enemyNum++] = new Tank(newx, newy, newfx, 2, 3000);
if (canMove(enemy[enemyNum - 1]) && newx >= 57 && newx <= 400 - 17
&& newy >= 57 && newy <= 400 - 17) {
break;
} else {
enemyNum--;
}
}
}
void start() {
score = 0;
enemyNum = 0;
bulletNum = 0;
player = new Tank(220, 350, up, 3, 1000);
int enemycount = 3;
while (true) {
String str = JOptionPane
.showInputDialog(this, "输入敌人数量(输入e使用默认数量):");
if (str != null && str.length() == 1 && str.charAt(0) != 'e') {
enemycount = str.charAt(0) - '0';
break;
} else if ("e".equals(str)) {
break;
} else {
JOptionPane.showMessageDialog(this, "输入有误,重新输入");
}
}
while (enemycount-- > 0) {
newEnemy();
}
}
void tankMove(Tank tank) {
if (tank.x + tank.v * h[tank.fx] >= 40 + 17
&& tank.x + tank.v * h[tank.fx] <= 400 - 17
&& tank.y + tank.v * l[tank.fx] >= 40 + 17
&& tank.y + tank.v * l[tank.fx] <= 400 - 17
&& canMove(new Tank(tank.x + tank.v * h[tank.fx], tank.y
+ tank.v * l[tank.fx], up, 3, 3000))) {
tank.x = tank.x + tank.v * h[tank.fx];
tank.y = tank.y + tank.v * l[tank.fx];
}
}
boolean canMove(Tank tank) {
int num = 0, u = 35;
if (Math.abs(tank.x - player.x) < u && Math.abs(tank.y - player.y) < u) {
num++;
}
for (int i = 0; i < enemyNum; i++) {
if (enemy[i].flag == 1 && Math.abs(tank.x - enemy[i].x) < u
&& Math.abs(tank.y - enemy[i].y) < u) {
num++;
}
}
return num == 1 ? true : false;
}
void playerdead(Bullet bullet) {
if (Math.abs(bullet.x - player.x) < 17
&& Math.abs(bullet.y - player.y) < 17) {
JOptionPane.showMessageDialog(this, "Game over");
start();
}
}
void enemydead(Bullet bullet) {
for (int i = 0; i < enemyNum; i++) {
if (enemy[i].flag == 1 && Math.abs(bullet.x - enemy[i].x) < 22
&& Math.abs(bullet.y - enemy[i].y) < 22) {
enemy[i].flag = 0;
score++;
int newx, newy, newfx;
while (true) {
newx = (int) (Math.random() * (360 - 34)) + 40 + 17;
newy = (int) (Math.random() * (360 - 34)) + 40 + 17;
newfx = (int) (Math.random() * 4);
enemy[enemyNum++] = new Tank(newx, newy, newfx, 2, 3000);
if (canMove(enemy[enemyNum - 1]) && newx >= 57
&& newx <= 400 - 17 && newy >= 57
&& newy <= 400 - 17) {
break;
} else {
enemyNum--;
}
}
}
}
}
void bulletMove(Bullet bullet) {
if (bullet.x + bullet.v * h[bullet.fx] >= 40 + 17
&& bullet.x + bullet.v * h[bullet.fx] <= 400 - 17
&& bullet.y + bullet.v * l[bullet.fx] >= 40 + 17
&& bullet.y + bullet.v * l[bullet.fx] <= 400 - 17) {
bullet.x = bullet.x + bullet.v * h[bullet.fx];
bullet.y = bullet.y + bullet.v * l[bullet.fx];
if (bullet.isplayer) {
enemydead(bullet);
} else {
playerdead(bullet);
}
} else {
bullet.flag = 0;
}
}
void bulletInit(Bullet bullet) {
if (bullet.x + bullet.v * h[bullet.fx] >= 40 + 17
&& bullet.x + bullet.v * h[bullet.fx] <= 400 - 17
&& bullet.y + bullet.v * l[bullet.fx] >= 40 + 17
&& bullet.y + bullet.v * l[bullet.fx] <= 400 - 17) {
bullet.x = bullet.x + bullet.v * h[bullet.fx];
bullet.y = bullet.y + bullet.v * l[bullet.fx];
}
}
public void paint(Graphics G) {
BufferedImage image = null, tankJPG = null;
BufferedImage bi = new BufferedImage(750, 450,
BufferedI