JAVA实现坦克大战1.0版本

  1 package tankGame;
  2 import java.awt.*;
  3 import javax.swing.*;
  4 import java.awt.event.*;
  5 import java.util.*;
  6 /**
  7  * 功能:我方坦克可以发子弹
  8  * 
  9  * */
 10 public class MyTankGame1 extends JFrame  {
 11 
 12     public static void main(String[] args) {
 13         // TODO Auto-generated method stub
 14         MyTankGame1 mtg =new MyTankGame1();
 15     }
 16     //构造函数
 17     public MyTankGame1(){
 18         MyPanel mp=new MyPanel();
 19         
 20         //线程启动
 21         Thread t=new Thread(mp);
 22         t.start();
 23         
 24         this.add(mp);
 25         this.addKeyListener(mp);//注册监听
 26         this.setSize(400,300);
 27         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 28         this.setVisible(true);
 29     }
 30 
 31 }
 32 
 33 //我的面板
 34 class MyPanel extends JPanel implements KeyListener,Runnable{
 35     Hero hero=null;//定义我的坦克
 36     Vector<Enermy> enermy=new Vector<Enermy>() ;//定义敌人的坦克组
 37     int enSize=3;
 38     //构造函数
 39     public MyPanel(){
 40         hero=new Hero(100,100);
 41     
 42         for(int i=0;i<enSize;i++){
 43             //创建一辆敌人的坦克对象
 44             Enermy en=new Enermy((i+1)*50, 0);
 45             en.setColor(0);
 46             en.setDerect(3);
 47             //加入
 48             enermy.add(en);
 49         }
 50         
 51     }
 52     public void paint(Graphics g){//重新paint
 53         super.paint(g);
 54         g.fillRect(0, 0, 400, 300);
 55         //画出我的坦克
 56         this.drawTank(hero.getX(), hero.getY(), g,this.hero.derect, 1);
 57         //画出子弹
 58         if(hero.s!=null&&hero.s.isLive==true){
 59             g.fillOval(hero.s.x ,hero.s.y, 2, 2);
 60         }
 61         
 62         //画出敌人的坦克
 63         for(int i=0;i<enermy.size();i++){
 64             this.drawTank(enermy.get(i).getX(), enermy.get(i).getY(), g, enermy.get(i).derect, 0);
 65             //System.out.println(enermy.get(i).derect);//默认值为0
 66         }
 67     }
 68     public void drawTank(int x,int y,Graphics g,int direct,int type){
 69         //判断是什么类型的坦克,敌人的还是我方的
 70         switch(type){
 71         case 0:
 72             g.setColor(Color.CYAN);
 73             break;
 74         case 1:
 75             g.setColor(Color.yellow);
 76             break;
 77         }
 78         //判断方向
 79         switch(direct){
 80         //坦克头向上
 81         case 0:
 82             //画出我的坦克,到时再封装为一个函数
 83             //画出左边的矩形
 84             g.fill3DRect(x, y, 5, 30,false);
 85             //画出有右边的矩形
 86             g.fill3DRect(x+15, y, 5, 30,false);
 87             //画出中间的矩形
 88             g.fill3DRect(x+5, y+5, 10, 20,false);
 89             //画出圆形
 90             g.fillOval(x+5, y+10, 10, 10);
 91             //画炮头
 92             g.drawLine(x+10, y-5, x+10, y+15);
 93             break;
 94             
 95         //坦克头向右
 96         case 1:
 97             
 98             //画出上边的矩形
 99             g.fill3DRect(x, y, 30, 5,false);
100             //画出下边的矩形
101             g.fill3DRect(x, y+15, 30, 5,false);
102             //画出中间的矩形
103             g.fill3DRect(x+5, y+5, 20, 10,false);
104             //画出圆形
105             g.fillOval(x+10, y+5, 10, 10);
106             //画炮头
107             g.drawLine(x+15, y+10, x+35, y+10);
108             break;
109             
110         //坦克头向下    
111         case 2:
112             
113             g.fill3DRect(x, y, 5, 30,false);
114             //画出有右边的矩形
115             g.fill3DRect(x+15, y, 5, 30,false);
116             //画出中间的矩形
117             g.fill3DRect(x+5, y+5, 10, 20,false);
118             //画出圆形
119             g.fillOval(x+5, y+10, 10, 10);
120             //画炮头
121             g.drawLine(x+10, y+15,x+10, y+35);
122             break;
123             
124         //坦克头向左    
125         case 3:
126             
127             //画出上边的矩形
128             g.fill3DRect(x, y, 30, 5,false);
129             //画出下边的矩形
130             g.fill3DRect(x, y+15, 30, 5,false);
131             //画出中间的矩形
132             g.fill3DRect(x+5, y+5, 20, 10,false);
133             //画出圆形
134             g.fillOval(x+10, y+5, 10, 10);
135             //画炮头
136             g.drawLine( x-5, y+10,x+15, y+10);
137             break;
138         }
139         
140         
141     }
142     @Override
143     public void keyPressed(KeyEvent e) {
144         // TODO Auto-generated method stub
145         if(e.getKeyCode()==KeyEvent.VK_W){
146             //设置我的坦克方向
147             this.hero.setDerect(0);
148             this.hero.moveUp();
149         }else if (e.getKeyCode()==KeyEvent.VK_D){
150             this.hero.setDerect(1);
151             this.hero.moveRight();
152         }else if (e.getKeyCode()==KeyEvent.VK_S){
153             this.hero.setDerect(2);
154             this.hero.moveDown();
155         }else if (e.getKeyCode()==KeyEvent.VK_A){
156             this.hero.setDerect(3);
157             this.hero.moveLeft();
158         }
159         this.repaint();
160         //判断玩家是否按下j
161         if(e.getKeyCode()==KeyEvent.VK_J){
162             //开火,调用shotEnermy
163             this.hero.shotEnermy();
164         }
165         
166     }
167     @Override
168     public void keyReleased(KeyEvent e) {
169         // TODO Auto-generated method stub
170         
171     }
172     @Override
173     public void keyTyped(KeyEvent e) {
174         // TODO Auto-generated method stub
175         
176     }
177     @Override
178     public void run() {//实现每隔100ms去重绘
179         // TODO Auto-generated method stub
180         while(true){
181         try {
182             Thread.sleep(100);
183         } catch (InterruptedException e) {
184             // TODO Auto-generated catch block
185             e.printStackTrace();
186         }
187         this.repaint();
188         }
189     }
190 }

成员类

  1 package tankGame;
  2 //子弹类
  3 class Shot implements Runnable{
  4     int x,y,direct;
  5     int speed=1;
  6      boolean isLive=true;
  7     public Shot(int x,int y,int direct){
  8         this.x=x;
  9         this.y=y;
 10         this.direct=direct;
 11     }
 12     @Override
 13     public void run() {
 14         // TODO Auto-generated method stub
 15         while(true){
 16             try {
 17                 Thread.sleep(50);
 18             } catch (InterruptedException e) {
 19                 // TODO Auto-generated catch block
 20                 e.printStackTrace();
 21             }
 22             switch(direct){
 23             case 0:
 24                 y-=speed;
 25                 break;
 26             case 1:
 27                 x+=speed;
 28                 break;
 29             case 2:
 30                 y+=speed;
 31                 break;
 32             case 3:
 33                 x-=speed;
 34                 break;
 35             }
 36             System.out.println("X"+x+"Y"+y);
 37             if (x<0||x>400||y<0||y>300){
 38                 this.isLive=false;
 39                 break;
 40             }
 41         }
 42     }
 43 }
 44 //坦克类
 45 class Tank
 46 {
 47     int x=0;//坦克的横坐标
 48     int y=0;//坦克的纵坐标
 49     int derect;//0上 1右 2下 3左
 50     int speed=1;//设置坦克的速度
 51     int color;//设置坦克颜色
 52     public int getColor() {
 53         return color;
 54     }
 55     public void setColor(int color) {
 56         this.color = color;
 57     }
 58     public int getDerect() {
 59         return derect;
 60     }
 61     public void setDerect(int derect) {
 62         this.derect = derect;
 63     }
 64     public int getX() {
 65         return x;
 66     }
 67     public void setX(int x) {
 68         this.x = x;
 69     }
 70     public int getY() {
 71         return y;
 72     }
 73     public void setY(int y) {
 74         this.y = y;
 75     }
 76     
 77     public Tank(int x,int y){
 78         this.x=x;
 79         this.y=y;
 80     }
 81 }
 82 class Hero extends Tank{
 83     Shot s=null;//子弹是和坦克关联的
 84     public Hero (int x,int y){
 85         super(x,y);
 86     }
 87     public void shotEnermy(){//子弹和坦克方向相关
 88         
 89         switch(this.derect){
 90         case 0:
 91             s=new Shot(x+10,y-9,0);
 92             break;
 93         case 1:
 94             s=new Shot(x+38,y+9,1);
 95             break;
 96         case 2:
 97             s=new Shot(x+10,y+37,2);
 98             break;
 99         
100         case 3:
101             s=new Shot(x-9,y+9,3);
102             break;
103 }
104         Thread t=new Thread(s);
105         t.start();
106     }
107     //坦克向上移动
108     public void moveUp(){
109         y-=speed;
110     }
111     //坦克向右移动
112     public void moveRight(){
113         x+=speed;
114     }//坦克向下移动
115     public void moveDown(){
116         y+=speed;
117     }
118     //坦克向左移动
119     public void moveLeft(){
120         x-=speed;
121     }
122     
123     
124 }
125 class Enermy extends Tank{
126     public Enermy (int x,int y){
127         super(x,y);
128     }
129 }

 效果如下:

 

posted @ 2016-06-14 19:59  roy.tan  阅读(1451)  评论(0编辑  收藏  举报