📄 hstank2.java
字号:
import java.awt.* ;
import javax.swing.* ;
import java.awt.event.*;
import java.util.EventListener;
public class HsTank2 extends JFrame
{
HsTank2(String title)
{
this.setTitle(title) ; //标题
this.setSize(620, 650) ; //
this.setLocation(300 , 100) ;
this.setBackground(Color.WHITE) ; //背景颜色设置
MyTank mp = new MyTank() ;
this.add(mp) ; //
this.addKeyListener(mp) ;//主窗口添加键盘监听器(注册了的键盘事件监听接口,用于响应键盘事件)
new Thread(mp).start() ;
}
public static void main(String[] args)
{
HsTank2 h = new HsTank2("坦克大战") ;
h.setVisible(true) ; //使可视化组建h(如窗口、面板等)可见
}
}
//主战坦克
class MyTank extends JPanel implements KeyListener , Runnable
{
int x = 280, y = 280 ;//坦克的初始位置
int direction = 1 ;//坦克的移动方向
int color = 0 ;
int colorf=0;
int score = 0 ; //分数
int difficult = 1 ; //设置游戏难度
int tankspeed = 10;//坦克的速度
int tankbullet = 4 ;//坦克的子弹速度
int tankfbullet = 4 ;//敌军的子弹速度
int life = 100 ;//生命
long currenttime1;
long currenttime2;
int bulletstatus=0;
double bulletdelay=3.0;
//子弹
int bulletx = 295 , bullety = 295 ;
int bulletx1 = 295 , bullety1 = -10 ;
int bulletx2 = 600 , bullety2 = 295 ;
int bulletx3 = 295 , bullety3 = 600 ;
int bulletx4 = -10 , bullety4 = 295 ;
//敌军坦克
int num = 5 ;//敌军坦克数量
int[] xf = new int[num] ; //坦克X坐标
int[] yf = new int[num] ; //坦克Y坐标
int[] directionf = new int[num] ;//坦克方向
int[] bulletxf = new int[num] ;
int[] bulletyf = new int[num] ;
int[] bulletxf1 = new int[num] ;
int[] bulletyf1 = new int[num] ;
int[] bulletxf2 = new int[num] ;
int[] bulletyf2 = new int[num] ;
int[] bulletxf3 = new int[num] ;
int[] bulletyf3 = new int[num] ;
int[] bulletxf4 = new int[num] ;
int[] bulletyf4 = new int[num] ;
//构造函数,初始化敌军坦克的位置和状态
MyTank()
{
for (int i = 0; i<num; i++)
{
xf[i] = (int) (Math.random() * 560) ; //随机生成敌军坦克坐标
yf[i] = (int) (Math.random() * 510+50) ;
bulletxf[i] = xf[i] + 15 ;
bulletyf[i] = yf[i] + 15 ;
}
for (int i = 0; i<num; i++)
{
bulletxf1[i] = 295 ; bulletyf1[i] = -10 ;
bulletxf2[i] = 600 ; bulletyf2[i] = 295 ;
bulletxf3[i] = 295 ; bulletyf3[i] = 600 ;
bulletxf4[i] = -10 ; bulletyf4[i] = 295 ;
}
}
//主面版
public void paint(Graphics g)
{
super.paint(g) ;
this.setBackground(Color.WHITE) ;
g.setColor(Color.red) ;
g.drawString("生命:" , 10 , 20 ) ;
g.fillRect(50 , 10 , life * 5 , 10) ;
g.drawRect(50 , 10 , 500 , 10) ;
g.drawString("得分: "+ score , 10 , 40) ;
g.drawString("难度: "+ difficult , 110 , 40) ;
g.drawString("坦克速度: "+ tankspeed , 210 , 40) ;
g.drawString("坦克子弹速度: "+ tankbullet , 310 , 40) ;
g.drawString("坦克发弹间隔: "+ bulletdelay+"秒" , 410 , 40) ;
if(direction == 1)
{
g.setColor(Color.green) ;
g.fillRect(x , y , 40 , 40) ; //坦克主体
switch (color % 2)
{
case 0: g.setColor(Color.red) ; break;
case 1: g.setColor(Color.black) ; break;
}
//坦克10个轮子
g.fillOval(x - 5 , y - 5 , 10 , 10) ; //使用当前颜色填充外接指定矩形框的椭圆
//x - 要填充椭圆的左上角的 x 坐标。
//y - 要填充椭圆的左上角的 y 坐标。
//width - 要填充椭圆的宽度。
//height - 要填充椭圆的高度。
g.fillOval(x - 5 , y + 5 , 10 , 10) ; //左2轮
g.fillOval(x - 5 , y + 15 , 10 , 10) ; //左3轮
g.fillOval(x - 5 , y + 25 , 10 , 10) ; //左4轮
g.fillOval(x - 5 , y + 35 , 10 , 10) ; //左5轮
g.fillOval(x + 35 , y - 5 , 10 , 10) ; //右1轮
g.fillOval(x + 35 , y + 5 , 10 , 10) ; //右2轮
g.fillOval(x + 35 , y + 15 , 10 , 10) ; //右3轮
g.fillOval(x + 35 , y + 25 , 10 , 10) ; //右4轮
g.fillOval(x + 35 , y + 35 , 10 , 10) ; //右5轮
g.setColor(Color.black) ;
g.fillRect(x + 15 , y - 20 , 10 , 40) ; //坦克炮管
g.setColor(Color.yellow) ;
g.fillOval(x + 5 , y + 30 , 10 , 10) ;
g.fillOval(x + 25 , y + 30 , 10 , 10) ;
}
if(direction == 2)
{
g.setColor(Color.green) ;
g.fillRect(x , y , 40 , 40) ;
switch (color % 2)
{
case 0: g.setColor(Color.red) ; break;
case 1: g.setColor(Color.black) ; break;
}
g.fillOval(x - 5 , y - 5 , 10 , 10) ;
g.fillOval(x + 5 , y - 5 , 10 , 10) ;
g.fillOval(x + 15 , y - 5 , 10 , 10) ;
g.fillOval(x + 25 , y - 5 , 10 , 10) ;
g.fillOval(x + 35 , y - 5 , 10 , 10) ;
g.fillOval(x - 5 , y+35 , 10 , 10) ;
g.fillOval(x + 5 , y+35 , 10 , 10) ;
g.fillOval(x + 15 , y+35 , 10 , 10) ;
g.fillOval(x + 25 , y+35 , 10 , 10) ;
g.fillOval(x + 35 , y+35 , 10 , 10) ;
g.setColor(Color.black) ;
g.fillRect(x + 20 , y + 15 , 40 , 10) ;
g.setColor(Color.yellow) ;
g.fillOval(x , y + 5 , 10 , 10) ;
g.fillOval(x , y + 25 , 10 , 10) ;
}
if(direction == 3)
{
g.setColor(Color.green) ;
g.fillRect(x , y , 40 , 40) ;
switch (color % 2)
{
case 0: g.setColor(Color.red) ; break;
case 1: g.setColor(Color.black) ; break;
}
g.fillOval(x - 5 , y - 5 , 10 , 10) ;
g.fillOval(x - 5 , y + 5 , 10 , 10) ;
g.fillOval(x - 5 , y + 15 , 10 , 10) ;
g.fillOval(x - 5 , y + 25 , 10 , 10) ;
g.fillOval(x - 5 , y + 35 , 10 , 10) ;
g.fillOval(x + 35 , y - 5 , 10 , 10) ;
g.fillOval(x + 35 , y + 5 , 10 , 10) ;
g.fillOval(x + 35 , y + 15 , 10 , 10) ;
g.fillOval(x + 35 , y + 25 , 10 , 10) ;
g.fillOval(x + 35 , y + 35 , 10 , 10) ;
g.setColor(Color.black) ;
g.fillRect(x + 15 , y + 20 , 10 , 40) ;
g.setColor(Color.yellow) ;
g.fillOval(x + 5 , y , 10 , 10) ;
g.fillOval(x + 25 , y , 10 , 10) ;
}
if(direction == 4)
{
g.setColor(Color.green) ;
g.fillRect(x , y , 40 , 40) ;
switch (color % 2)
{
case 0: g.setColor(Color.red) ; break;
case 1: g.setColor(Color.black) ; break;
}
g.fillOval(x - 5 , y - 5 , 10 , 10) ;
g.fillOval(x + 5 , y - 5 , 10 , 10) ;
g.fillOval(x + 15 , y - 5 , 10 , 10) ;
g.fillOval(x + 25 , y - 5 , 10 , 10) ;
g.fillOval(x + 35 , y - 5 , 10 , 10) ;
g.fillOval(x - 5 , y+35 , 10 , 10) ;
g.fillOval(x + 5 , y+35 , 10 , 10) ;
g.fillOval(x + 15 , y+35 , 10 , 10) ;
g.fillOval(x + 25 , y+35 , 10 , 10) ;
g.fillOval(x + 35 , y+35 , 10 , 10) ;
g.setColor(Color.black) ;
g.fillRect(x - 20 , y + 15 , 40 , 10) ;
g.setColor(Color.yellow) ;
g.fillOval(x + 30 , y + 5 , 10 , 10) ;
g.fillOval(x + 30 , y + 25 , 10 , 10) ;
}
g.setColor(Color.black) ;
g.fillOval(bulletx , bullety , 10 , 10) ;
g.fillOval(bulletx1 , bullety1 , 10 , 10) ;
g.fillOval(bulletx2 , bullety2 , 10 , 10) ;
g.fillOval(bulletx3 , bullety3 , 10 , 10) ;
g.fillOval(bulletx4 , bullety4 , 10 , 10) ;
for (int i = 0; i<num; i++)
{
if(directionf[i] == 1)
{
g.fillRect(xf[i] , yf[i] , 40 , 40) ;
g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 5 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 15 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 25 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 5 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 15 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 25 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;
g.fillRect(xf[i] + 15 , yf[i] - 20 , 10 , 40) ;
g.fillOval(xf[i] + 5 , yf[i] + 30 , 10 , 10) ;
g.fillOval(xf[i] + 25 , yf[i] + 30 , 10 , 10) ;
}
if(directionf[i] == 2)
{
g.fillRect(xf[i] , yf[i] , 40 , 40) ;
g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 5 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 15 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 25 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 5 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 15 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 25 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;
g.fillRect(xf[i] + 20 , yf[i] + 15 , 40 , 10) ;
g.fillOval(xf[i] , yf[i] + 5 , 10 , 10) ;
g.fillOval(xf[i] , yf[i] + 25 , 10 , 10) ;
}
if(directionf[i] == 3)
{
g.fillRect(xf[i] , yf[i] , 40 , 40) ;
g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 5 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 15 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 25 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 5 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 15 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 25 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;
g.fillRect(xf[i] + 15 , yf[i] + 20 , 10 , 40) ;
g.fillOval(xf[i] + 5 , yf[i] , 10 , 10) ;
g.fillOval(xf[i] + 25 , yf[i] , 10 , 10) ;
}
if(directionf[i] == 4)
{
g.fillRect(xf[i] , yf[i] , 40 , 40) ;
g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 5 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 15 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 25 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;
g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 5 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 15 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 25 , yf[i] + 35 , 10 , 10) ;
g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;
g.fillRect(xf[i] - 20 , yf[i] + 15 , 40 , 10) ;
g.fillOval(xf[i] + 30 , yf[i] + 5 , 10 , 10) ;
g.fillOval(xf[i] + 30 , yf[i] + 25 , 10 , 10) ;
}
g.fillOval(bulletxf1[i] , bulletyf1[i] , 10 , 10 ) ;
g.fillOval(bulletxf2[i] , bulletyf2[i] , 10 , 10 ) ;
g.fillOval(bulletxf3[i] , bulletyf3[i] , 10 , 10 ) ;
g.fillOval(bulletxf4[i] , bulletyf4[i] , 10 , 10 ) ;
}
}
public void keyTyped(KeyEvent e)
{
}
//键盘控制坦克的移动,发弹
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_UP)
{
color ++ ;
direction = 1 ;
y = y - tankspeed ;
bullety = bullety - tankspeed ;
if(y <= 50)
{
y = y + tankspeed ;
bullety = bullety + tankspeed ;
}
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT)
{
color ++ ;
direction = 2 ;
x = x + tankspeed ;
bulletx = bulletx + tankspeed ;
if(x >= 560)
{
x = x - tankspeed ;
bulletx = bulletx - tankspeed ;
}
}
if(e.getKeyCode() == KeyEvent.VK_DOWN)
{
color ++ ;
direction = 3 ;
y = y + tankspeed ;
bullety = bullety + tankspeed ;
if(y >= 560)
{
y = y - tankspeed ;
bullety = bullety - tankspeed ;
}
}
if(e.getKeyCode() == KeyEvent.VK_LEFT)
{
color ++ ;
direction = 4 ;
x = x - tankspeed ;
bulletx = bulletx - tankspeed ;
if(x <= 0)
{
x = x + tankspeed ;
bulletx = bulletx + tankspeed ;
}
}
if(e.getKeyCode() == KeyEvent.VK_SPACE)
{
if(bulletstatus%2==0)
{
currenttime1=System.currentTimeMillis();
if(direction == 1)
{
bulletx1 = bulletx ;
bullety1 = bullety ;
bulletstatus++;
}
if(direction == 2)
{
bulletx2 = bulletx ;
bullety2 = bullety ;
bulletstatus++;
}
if(direction == 3)
{
bulletx3 = bulletx ;
bullety3 = bullety ;
bulletstatus++;
}
if(direction == 4)
{
bulletx4 = bulletx ;
bullety4 = bullety ;
bulletstatus++;
}
}
else
{currenttime2=System.currentTimeMillis();
long T=currenttime2-currenttime1;
if(T>=1000*bulletdelay)
{bulletstatus++;
if(bulletstatus%2==0)
{
currenttime1=System.currentTimeMillis();
if(direction == 1)
{
bulletx1 = bulletx ;
bullety1 = bullety ;
bulletstatus++;
}
if(direction == 2)
{
bulletx2 = bulletx ;
bullety2 = bullety ;
bulletstatus++;
}
if(direction == 3)
{
bulletx3 = bulletx ;
bullety3 = bullety ;
bulletstatus++;
}
if(direction == 4)
{
bulletx4 = bulletx ;
bullety4 = bullety ;
bulletstatus++;
}
}
}
}
}
this.repaint() ;
}
public void keyReleased(KeyEvent e)
{
}
public void run()
{
for (int a = 0; a<60000; a++)
{
bullety1 = bullety1 - tankbullet ;
bulletx2 = bulletx2 + tankbullet ;
bullety3 = bullety3 + tankbullet ;
bulletx4 = bulletx4 - tankbullet ;
for (int i = 0; i<num; i++)
{
bulletyf1[i] = bulletyf1[i] - tankfbullet ;
bulletxf2[i] = bulletxf2[i] + tankfbullet ;
bulletyf3[i] = bulletyf3[i] + tankfbullet ;
bulletxf4[i] = bulletxf4[i] - tankfbullet ;
}
//判断是否被击中
for (int i = 0; i<num; i++)
{
if(bulletyf1[i]<y + 38 &&bulletyf1[i]>y +8 && bulletxf1[i]-x>-10 && bulletxf1[i]-x<40)
{
life = life - difficult ;
System.out.println ("被下方敌军击中") ;
bulletxf1[i] = -20 ;
bulletyf1[i] = -20 ;
}
if(bulletxf2[i]>x+2 &&bulletxf2[i]<x+32 &&bulletyf2[i] - y >-10 && bulletyf2[i] - y <40 )
{
life = life - difficult ;
System.out.println ("被左方敌军击中") ;
bulletxf2[i] = -20 ;
bulletyf2[i] = -20 ;
}
if(bulletyf3[i]>y+2 && bulletyf3[i]< y+32 && bulletxf3[i]-x >-10&& bulletxf3[i]-x<40)
{
life = life - difficult ;
System.out.println ("被上方敌军击中") ;
bulletxf3[i] = -20 ;
bulletyf3[i] = -20 ;
}
if(bulletxf4[i]>x+8 &&bulletxf4[i]<x+38 &&bulletyf4[i] - y >-10 && bulletyf4[i] - y <40 )
{
life = life - difficult ;
System.out.println ("被右方敌军击中") ;
bulletxf4[i] = -20 ;
bulletyf4[i] = -20 ;
}
}
//判断是否击中敌军
for (int i = 0; i<num; i++)
{ if(bullety1<bulletyf1[i]+10&&bullety1>bulletyf1[i]-10&&bulletx1>bulletxf1[i]-10&&bulletx1<bulletxf1[i]+10)
{
bulletx1=-20;
bullety1=-20;
bulletxf1[i]=-20;
bulletyf1[i]=-20;
}
if(bullety1<bulletyf2[i]+10&&bullety1>bulletyf2[i]-10&&bulletx1>bulletxf2[i]-10&&bulletx1<bulletxf2[i]+10)
{
bulletx1=-20;
bullety1=-20;
bulletxf2[i]=-20;
bulletyf2[i]=-20;
}
if(bullety1<bulletyf3[i]+10&&bullety1>bulletyf3[i]-10&&bulletx1>bulletxf3[i]-10&&bulletx1<bulletxf3[i]+10)
{
bulletx1=-20;
bullety1=-20;
bulletxf3[i]=-20;
bulletyf3[i]=-20;
}
if(bullety1<bulletyf4[i]+10&&bullety1>bulletyf4[i]-10&&bulletx1>bulletxf4[i]-10&&bulletx1<bulletxf4[i]+10)
{
bulletx1=-20;
bullety1=-20;
bulletxf4[i]=-20;
bulletyf4[i]=-20;
}
if(bullety1<yf[i] + 38 &&bullety1>yf[i] +8 && bulletx1-xf[i]>-10 && bulletx1-xf[i]<40)
{
System.out.println ("击中上方敌军") ;
bulletx1=-20;
bullety1=-20;
score = score + 100 ;
difficult = score/1000+1 ;
if(tankspeed>2)
tankspeed = 10-difficult+1;
if(tankbullet<10)
tankbullet = 4+difficult-1;
if(tankfbullet<10)
tankfbullet = 4+difficult-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -