java 坦克大战画坦克_Java坦克大战部分:画出界面,敌人坦克,我的坦克,不出界,键盘事件【诗书画唱】...

这篇博客介绍了如何使用Java实现坦克大战游戏,包括画出游戏界面、我方和敌方坦克,以及坦克的移动控制。通过创建`caoZuoPaintFangFaDiaoYong`类,实现了键盘监听,使得玩家可以通过WASD键控制坦克上下左右移动。同时,博客中还讲解了坦克的绘制方法,包括不同方向的坦克图形绘制。此外,还展示了如何初始化敌方坦克的位置并确保它们在游戏区域内不会出界。
摘要由CSDN通过智能技术生成

含很多自己写的个理解和注释,想出的解决,建议,提示,注意事项等方法:51ef5da4ebcf7f2f09e2722f5aa7be5f.png

fdf714539e53430f9391ffff20417ab2.png

package tankeGame;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.*;

import java.util.*;

//这个来做绘制内容,发射子弹一类的操作

//让这个类实现键盘点击的接口

public class caoZuoPaintFangFaDiaoYong extends

JPanel implements KeyListener {

//在构造法方法里实例化我方坦克

//arraylist:存储任意类型,内容长度任意,有下标

Vector diRentankeJiHe=new Vector();

mytankeYiDongFangFa mytankeYiDongFangFa=null;

public caoZuoPaintFangFaDiaoYong(){

//个人理解:mytankeYiDongFangFa类的这个构造方法

//mytankeYiDongFangFa(int x, int y,

//int fangxiang)中用了super(x, y, fangxiang);(因为子类

//继承了父类的mytankeYiDongFangFa(int x, int y,

//int fangxiang)方法,所以子类中用

//super(x, y, fangxiang)代替

//父类中这个构造方法中的具体方法内容

//,就可以这里用了。

mytankeYiDongFangFa=new mytankeYiDongFangFa(150,440,0);

for(int i=0;i<5;i++){

//diRentanke类中也有public diRentanke(int x, int y, int fangXiang)

//用来传值的方法

//Random Random=new Random();

//int num=10+Random.nextInt (100);

//,那么10<=num<10+100

diRentanke diRentanke=new diRentanke(100*i+90, 0, 2);

//因为敌人坦克本身有宽高所以在100*i上要+90来调整

//x轴方向位置,不然就会第一量有部分看不见,超出范围。

diRentankeJiHe.add(diRentanke);

}

}

//绘制的方法

int fangXiang2=0;

//个人理解:“fangXiang2”为“leiXing”

//,其实也可以统一把int类型改成String的类型,

//然后再在swich判断中传入"left"之类的,这样代码更明确

//,容易懂等。放在paint方法前是为了,使用键盘事件后,

//fangXiang2改变,进而用repaint来重新执行一遍paint方法中内容时

//huiZhitanke(g,mytankeYiDongFangFa.x,

//mytankeYiDongFangFa.y,0,fangXiang2)

//中fangXiang2会改变,进而用huiZhitanke方法,

//在页面显示对应方向的坦克图形

//来实现

//“坦克方向会变”的效果。这里的坦克是自己绘制的,

//如果用图片

//,就是换加载的对应方向的坦克图片,

//huiZhitanke方法中的内容进行改变即可。

public void paint(Graphics g){

g.setColor(Color.black);

g.fillRect(0,0,600,600);

g.setColor(Color.green);

//开始默认用huiZhitanke方法在界面绘制向上的坦克:

huiZhitanke(g,mytankeYiDongFangFa.x,

mytankeYiDongFangFa.y,0,fangXiang2);

//遍历刚才存入的5个敌方坦克

for(int i=0;i

diRentanke diRentanke=diRentankeJiHe.get(i);

huiZhitanke(g,diRentanke.x,diRentanke.y,

1,diRentanke.fangxiang);

}

}

//封装坦克的方法:

//1.画笔   2.x  3.y  4.坦克的类型  5.坦克的方向

public void huiZhitanke(Graphics g,int x,int y,

int leiXing,int fangXiang){

//在这个方法里既可以绘制我方坦克,也可以绘制

//敌方tank,tank的类型就是判断是绘制什么颜色的坦克

switch(leiXing){

case 0:

//画我方坦克:

g.setColor(Color.green);break;

case 1:

g.setColor(Color.yellow);break;

}

switch(fangXiang){

//根据fangXiang值(的不同),

//画出对应的fangXiang值(的不同方向)的坦克

case 0://向上坦克图形:

g.fillRect(x, y, 10,30);

g.fillRect(x+10, y-10, 10,30);

g.fillRect(x+20, y, 10,30);

break;

case 1://向右坦克图形:

g.fillRect(x, y, 30,10);

g.fillRect(x+10, y+10, 30,10);

g.fillRect(x, y+20, 30,10);

break;

case 2://向下坦克图形:

g.fillRect(x, y, 10,30);

g.fillRect(x-10, y+10, 10,30);

g.fillRect(x-20, y, 10,30);

break;

case 3://向左坦克图形:

g.fillRect(x, y, 30,10);

g.fillRect(x-10, y+10, 30,10);

g.fillRect(x, y+20, 30,10);

break;

}

}

@Override

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

}

@Override

//键盘按下的事件

public void keyPressed(KeyEvent e) {

//点击W键

if(e.getKeyCode()==KeyEvent.VK_W){

//Graphics g = null;

//huiZhitanke(g,mytankeYiDongFangFa.x,

//mytankeYiDongFangFa.y,0,0);

//switch(0);

fangXiang2=0;

mytankeYiDongFangFa.yiDongFangFa(0);

}

if(e.getKeyCode()==KeyEvent.VK_S){

//Graphics g = null;

//huiZhitanke(g,mytankeYiDongFangFa.x,

//mytankeYiDongFangFa.y,0,1);

fangXiang2=2;

mytankeYiDongFangFa.yiDongFangFa(2);

}

if(e.getKeyCode()==KeyEvent.VK_A){

fangXiang2=3;

mytankeYiDongFangFa.yiDongFangFa(3);

}

if(e.getKeyCode()==KeyEvent.VK_D){

fangXiang2=1;

mytankeYiDongFangFa.yiDongFangFa(1);

}

this.repaint();

}

@Override

public void keyReleased(KeyEvent e) {

// TODO Auto-generated method stub

}

}

526b493ab7484316c7a77f34a0f2d342.png

16daa41b43387f81ac5d5e579cea0ba0.png

package tankeGame;

public class diRentanke extends tankeFuLei{

//敌方坦克类也是继承坦克父类

public diRentanke(int x, int y, int fangXiang) {

super(x, y, fangXiang);

}

}e3b609e844199bcda4b0d852189f037a.png

cf35e8cc759616cacbcdce5d3cd6092a.png

package tankeGame;

import javax.swing.*;

public class mains extends JFrame{

public static void main(String[] args) {

new mains();

}

public  mains(){

this.setLayout(null);

this.setSize(600,600);

this.setLocationRelativeTo(null);

caoZuoPaintFangFaDiaoYong caoZuo=new caoZuoPaintFangFaDiaoYong();

caoZuo.setBounds(0,0,600,600);

this.addKeyListener(caoZuo);

this.add(caoZuo);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

}b7f08e26a13ad6b34309924a13989fa5.png

3ce15c3dcb48ffe1920e74c3ae6a34be.png

package tankeGame;

public class mytankeYiDongFangFa extends tankeFuLei{

//我方坦克类继承坦克父类

public mytankeYiDongFangFa(int x, int y, int fangXiang) {

super(x, y, fangXiang);

}

//点击移动的方法

public void yiDongFangFa(int fangxiang){

//if(x<=600&&y<=600){

switch(fangxiang){

//判断这个方向,方向是谁就移动谁

case 0:

if(y>=10){

this.y-=this.suDu;}break;

//个人理解:

//如果“}”把break包住,y>=10时

//,就会执行case 1的情况,会向右移动

//x<=550等也类似

//550等数值是在页面宽600,长600或

//最初始位置(0,0)数值上调整得来的(加或减坦克的宽或长),因为

//坦克存在宽和长,所以要调整数值等,别的地方也是依次类推。

case 1:

if(x<=550){

this.x+=this.suDu;}break;

case 2:

if(y<=520){

this.y+=this.suDu;}break;

case 3:if(x>=10){

this.x-=this.suDu;}break;

}

//}

}

}

86901f12a5f8ae54b6db57357de249d1.png

2eb4c1149eb481ffe45c4d52d5b83d76.png

package tankeGame;

//x,y

public class tankeFuLei {//父类

//x轴,y轴,方向,速度,生命

int x,y,fangxiang;

int suDu=15;//坦克默认移动的速度为15px

boolean shengMing=true;//每个坦克默认都是存在的

public tankeFuLei(int x,int y,int fangXiang){

this.x=x;

this.y=y;

this.fangxiang=fangXiang;

}

}

85b5c9bb25f54a92805d1bfbc3311142.png

7a117c9995afd660d07210d29598a70a.png

dffb8ebfa48400b8f2a0c2af87d3288c.png

1f88693515a08bff38b6f5cbc7bb73cf.png

ddb23d4b9ba750884ed854e93a6f5feb.png

aa8a21a317d076ddfad29ce3257483b9.png

494fa3dde67f6871f7314638f8283ca4.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值