java小项目——MySnake_MyBlould_MyTank

来源:互联网 发布:优越留学知乎 编辑:程序博客网 时间:2024/06/05 19:32

Yard.java

package  com.jigntian.object;import java.awt.Color;import java.awt.Component;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.List;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.ArrayList;import java.util.Random;import javax.swing.JOptionPane;public class Yard extends Frame{public static int x=5;public static int y=1;//方块起始坐标/SiZE//public ArrayList<Bloud> blouds=new ArrayList<Bloud>();//<4>本来想通过容器来存方块,没成功。当前方块只有一个,new的覆盖原来的。public static Bloud bloud=null;private Image offScreenImage = null;public static Bloud newbloud=null;private Random random=new Random();public static int score=0;static class Map{public static final int ROW=18;//18public static final int COL=14;//14public static final int SIZE=30;//30public static final int GAME_WIDTH=5+COL*Map.SIZE+5,GAME_HIGHT=30+ROW*Map.SIZE+5;public static  int  map[][]=new int [ROW][COL]; public static void design() { for(int i=0;i<ROW;i++) { map[i][0]=-1; map[i][COL-1]=-1; } for(int j=0;j<COL;j++) { map[0][j]=-1; map[ROW-1][j]=-1; } }}public static void setX(int x) {Yard.x = x;}public static void setY(int y) {Yard.y = y;}public Yard(){super();Map.design();bloud=new Bloud(random.nextInt(7), random.nextInt(4), this, true);setBounds(300,10,Map.GAME_WIDTH,Map.GAME_HIGHT);setVisible(true);setResizable(false);setTitle("晓志之疯狂俄罗斯");setBackground(Color.LIGHT_GRAY);this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});this.addKeyListener(new KeyAdapter() {public  void keyPressed(KeyEvent e) {synchronized (this) {super.keyPressed(e);if(bloud.getLife()){bloud.keyPressed(e);repaint();}}}});new Thread(new BloudRunningThread()).start();}public void paint(Graphics g) {super.paint(g);Color c=g.getColor();if(bloud.life){bloud.moveChangeValue();}else{if(Yard.y!=1)//<5>结束的标准这样不好,但是懒得弄了{bloud.deathChangeValue();Yard.bloud=new Bloud(random.nextInt(7), random.nextInt(4), this, true);x=5;y=1;}}for(int i=0;i<Map.ROW;i++){for(int j=0;j<Map.COL;j++){if(Map.map[i][j]==-1){//(5,30)是坐标原点g.setColor(Color.BLACK);g.drawRect(5+Map.SIZE*j, 30+Map.SIZE*i, Map.SIZE, Map.SIZE);g.setColor(Color.BLUE);g.fillRect(5+Map.SIZE*j+1, 30+Map.SIZE*i+1, Map.SIZE-2, Map.SIZE-2);}else if(Map.map[i][j]==1){g.setColor(Color.BLACK);g.drawRect(5+Map.SIZE*j, 30+Map.SIZE*i, Map.SIZE, Map.SIZE);g.setColor(Color.RED);g.fillRect(5+Map.SIZE*j+1, 30+Map.SIZE*i+1, Map.SIZE, Map.SIZE);}else{g.setColor(Color.BLACK);g.drawRect(5+Map.SIZE*j, 30+Map.SIZE*i, Map.SIZE, Map.SIZE);g.setColor(Color.GREEN);g.fillRect(5+Map.SIZE*j+1, 30+Map.SIZE*i+1, Map.SIZE, Map.SIZE);}}}g.setColor(c);}public void update(Graphics g) {if (offScreenImage == null) {offScreenImage = this.createImage(Map.GAME_WIDTH, Map.GAME_HIGHT);}Graphics gofferScreen = offScreenImage.getGraphics();Color c = gofferScreen.getColor();gofferScreen.setColor(Color.LIGHT_GRAY);gofferScreen.fillRect(0, 0, Map.GAME_WIDTH, Map.GAME_HIGHT);paint(gofferScreen);g.drawImage(offScreenImage, 0, 0, null);}private  class BloudRunningThread implements Runnable{public  void run() {while(true){synchronized (this) {try {if(bloud.getLife()){bloud.move();repaint();}Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}}public static void main(String[] args) {new Yard();}}

Bloud.java

package com.jigntian.object;import java.awt.event.KeyEvent;import java.util.Random;import com.jigntian.object.Yard.Map;public class Bloud {public static int oldX,oldY;private Yard yard;public Boolean life;public Random random=new Random();private int  bloud_Shape;private int shape_Direct;private int oldshape_Direct;private int jishuqi=0;//消行计数器private int shape[][][][]={{{{0, 1, 0, 0}, {1, 1, 1, 0 }, {0, 0, 0, 0}, {0, 0, 0, 0} },{{0, 1, 0, 0}, {1, 1, 0, 0 }, {0, 1, 0, 0}, {0, 0, 0, 0} },{{1, 1, 1, 0}, {0, 1, 0, 0 }, {0, 0, 0, 0}, {0, 0, 0, 0} },{{0, 1, 0, 0}, {0, 1, 1, 0 }, {0, 1, 0, 0}, {0, 0, 0, 0} } },{{{1, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{0, 1, 0, 0}, {1, 1, 0, 0}, {1, 0, 0, 0}, {0, 0, 0, 0} },{{1, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{0, 1, 0, 0}, {1, 1, 0, 0}, {1, 0, 0, 0}, {0, 0, 0, 0} } },{{{0, 0, 0, 0}, {1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0} },{{0, 0, 0, 0}, {1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0} } },{{{0, 1, 1, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{1, 0, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 0, 0, 0} },{{0, 1, 1, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{1, 0, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 0, 0, 0} } },{{{0, 1, 0, 0}, {0, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0} },{{1, 0, 0, 0}, {1, 1, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{1, 1, 0, 0}, {1, 0, 0, 0}, {1, 0, 0, 0}, {0, 0, 0, 0} },{{1, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} } },{{{1, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{1, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{1, 1, 0, 0}, {1, 1, 0, 0},{ 0, 0, 0, 0}, {0, 0, 0, 0} },{{1, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} } },{{{1, 0, 0, 0}, {1, 0, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0} },{{1, 1, 1, 0}, {1, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} },{{1, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 0, 0, 0} },{{0, 0, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} } }};//TZISJOLpublic Bloud( int bloud_Shape, int shape_Direct, Yard yard,Boolean life) {super();this.bloud_Shape = bloud_Shape;this.shape_Direct = shape_Direct;this.yard = yard;this.life = life;}public Boolean getLife() {return life;}public void setLife(Boolean life) {this.life = life;}public  void moveChangeValue(){//清屏,但是只把原来是1的清除//先把原来是1的赋为0,再给数组重新赋值for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1){Yard.Map.map[oldY+i][oldX+j]=0;}}}for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1){Yard.Map.map[Yard.y+i][Yard.x+j]=1;}}}}public void deathChangeValue(){for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1){Yard.Map.map[Yard.y+i][Yard.x+j]=-1;}}}}public   void  keyPressed(KeyEvent e){int key=e.getKeyCode();switch(key){case KeyEvent.VK_UP:oldX=Yard.x;oldY=Yard.y;//<1>两个线程都对Yard.x和Yard.y修改所以要找一个旧的替身revolve();break;case KeyEvent.VK_DOWN:move();break;case KeyEvent.VK_LEFT:if(judgeLR(key)){oldX=Yard.x;oldY=Yard.y;Yard.setX(Yard.x-1);}break;case KeyEvent.VK_RIGHT:if(judgeLR(key)){oldX=Yard.x;oldY=Yard.y;Yard.setX(Yard.x+1);}break;}}public boolean judgeLR(int key){switch(key){case KeyEvent.VK_LEFT:for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1&&Yard.Map.map[Yard.y+i][Yard.x+j-1]==-1){return false;}}}break;//<2>这个地方不break容易造成粘黏在右墙壁上的现象//一直在循环里头????????case KeyEvent.VK_RIGHT:for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1&&Yard.Map.map[Yard.y+i][Yard.x+j+1]==-1){return false;}}}break;}return true;}public   void move(){if(judgeMove()){oldX=Yard.x;oldY=Yard.y;Yard.setY(Yard.y+1);}judgeRow();}public Boolean judgeMove(){for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1){if(Yard.Map.map[Yard.y+i+1][Yard.x+j]==-1){this.life=false;//Yard.x=5;//Yard.y=1;//yard.x=5;//yard.y=1;//<3>Yard和yard改变静态常量结果不一,奇怪//Yard.bloud=new Bloud(2, 0, yard, true);//为什么这里不行return false;}}}}return true;}public  void revolve(){oldshape_Direct=shape_Direct;shape_Direct++;if(shape_Direct==4){shape_Direct=0;}if(!judgeRevolve()){shape_Direct=oldshape_Direct;}else{for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][oldshape_Direct][i][j]==1){Yard.Map.map[oldY+i][oldX+j]=0;}}}for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1){Yard.Map.map[Yard.y+i][Yard.x+j]=1;}}}}}public boolean judgeRevolve(){for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(shape[bloud_Shape][shape_Direct][i][j]==1){if(Yard.Map.map[Yard.y+i][Yard.x+j]==-1){return false;}}}}return true;}public void judgeRow(){for(int i=1;i<Yard.Map.ROW-1;i++){for(int j=1;j<Yard.Map.COL-1;j++){if(Yard.Map.map[i][j]==-1){jishuqi++;}if(jishuqi==Yard.Map.COL-2){xiaoHang(i);System.out.println(++Yard.score);}}jishuqi=0;}}public void xiaoHang(int row){for(int i=row;i>=2;i--){for(int j=1;j<=Yard.Map.COL-1;j++){Yard.Map.map[i][j]=Yard.Map.map[i-1][j];}}}}

Yard.java

package com.jingtian.object;import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.HeadlessException;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class Yard extends Frame {/* * 当时把一个方块移动变成一条蛇移动,思考了好长时间,还有就是蛇的和边界的判断 */private int row=1, col=4;private int d=2;private Snake snake=null;Egg egg=null;Thread t=null;Image offScreenImage = null;/** * @param args */ public static class Map{public  static  int ROW=18;//通过改鬓行和列调整游戏边界的大小public static  int COL=14;public static  int SIZE=30;//通过改变size来改变方块的大小public static  int GAME_WIDTH=5+COL*SIZE+5,GAME_HIGHT=30+ROW*SIZE+5;public static  int  map[][]=new int [ROW][COL]; public static void design() { for(int i=0;i<ROW;i++) { map[i][0]=-1; map[i][COL-1]=-1; } for(int j=0;j<COL;j++) { map[0][j]=-1; map[ROW-1][j]=-1; } }}Yard(){Map.design();snake=new Snake(row,col,d,this);egg=new Egg(6, 6,true);setBounds(300,10,Map.GAME_WIDTH,Map.GAME_HIGHT);setVisible(true);setResizable(false);setTitle("晓志之疯狂贪吃蛇");setBackground(Color.LIGHT_GRAY);this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {super.keyPressed(e);//snake.tail.keyPressed(e);snake.keyPressed(e);repaint();}});t=new Thread(new snakeThread());t.start();}@Overridepublic void paint(Graphics g) {super.paint(g);Color c=g.getColor();//因为窗口有边界问题,所以坐标原点设为(5,30)for(int i=0;i<Map.ROW;i++){for(int j=0;j<Map.COL;j++){if(Map.map[i][j]==-1){g.setColor(Color.BLACK);g.drawRect(5+Map.SIZE*j, 30+Map.SIZE*i, Map.SIZE, Map.SIZE);g.setColor(Color.BLUE);g.fillRect(5+Map.SIZE*j+1, 30+Map.SIZE*i+1, Map.SIZE-2, Map.SIZE-2);}else{g.setColor(Color.BLACK);g.drawRect(5+Map.SIZE*j, 30+Map.SIZE*i, Map.SIZE, Map.SIZE);g.setColor(Color.GREEN);g.fillRect(5+Yard.Map.SIZE*j+1, 30+Map.SIZE*i+1, Map.SIZE, Map.SIZE);}}}g.setColor(Color.RED);snake.drawNodes(g);snake.eatEgg(egg);if(egg.isLife())egg.draw(g);g.setColor(c);}@Overridepublic void update(Graphics g) {if (offScreenImage == null) {offScreenImage = this.createImage(Map.GAME_WIDTH, Map.GAME_HIGHT);}Graphics gofferScreen = offScreenImage.getGraphics();Color c = gofferScreen.getColor();gofferScreen.setColor(Color.LIGHT_GRAY);gofferScreen.fillRect(0, 0, Map.GAME_WIDTH, Map.GAME_HIGHT);paint(gofferScreen);g.drawImage(offScreenImage, 0, 0, null);}private class snakeThread implements Runnable{@Overridepublic void run() {while(true){try {//snake.tail.move();snake.move();Thread.sleep(100);repaint();} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {new Yard();}}


Snake.java

package com.jingtian.object;import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.util.Random;public class Snake {Node head=null;Node tail=null;private int row, col;private int d;public Node node=null;private Yard yard=null;private Random random=new Random();public Snake(int row, int col, int d,Yard yard) {super();this.row = row;this.col = col;this.d = d;this.yard=yard;node=new Node(row, col, d);head=node;tail=node;addToTail();addToTail();}public Boolean addToHead(){if(!judge()){return false;}Node node=null;switch(head.d){case 1://if((head.row-1)<0)//return false;node=new Node(head.row-1,head.col,1);break;case 2://if(head.col+1>13)//return false;node=new Node(head.row,head.col+1,2);break;case 3://if(head.row+1>17)//return false;node=new Node(head.row+1,head.col,3);break;case 4://if(head.col-1<0)//return false;node=new Node(head.row,head.col-1,4);break;}head.prive=node;node.next=head;head=node;return true;}public void addToTail(){Node node=null;switch(tail.d){case 1:node=new Node(tail.row+1,tail.col,1);break;case 2:node=new Node(tail.row,tail.col-1,2);break;case 3:node=new Node(tail.row-1,tail.col,1);case 4:node=new Node(tail.row,tail.col+1,1);}tail.next=node;node.prive=tail;tail=node;}public void drawNodes(Graphics g){for(Node n=head;n!=null;n=n.next){n.draw(g);}}//移动运用的是头插法public void move(){if(addToHead()){tail=tail.prive;tail.next=null;}}//方向变成判断头结点的方向public void keyPressed(KeyEvent e){int key=e.getKeyCode();switch(key){case KeyEvent.VK_UP:head.d=1;break;case KeyEvent.VK_DOWN:head.d=3;break;case KeyEvent.VK_LEFT:head.d=4;break;case KeyEvent.VK_RIGHT:head.d=2;break;}}private Rectangle getRectangle(){return new Rectangle(head.col*Yard.Map.SIZE+5, head.row*Yard.Map.SIZE+30, Yard.Map.SIZE, Yard.Map.SIZE);}public void eatEgg(Egg egg){if(this.getRectangle().intersects(egg.getRectangle())){egg.setLife(false);addToHead();if(!egg.isLife()){yard.egg=new Egg(random.nextInt(16)+1,random.nextInt(12)+1,true);}}}public Boolean judge(){switch(head.d){case 1:if((head.row-1)<1)return false;break;case 2:if(head.col+1>Yard.Map.COL-2)return false;break;case 3:if(head.row+1>Yard.Map.ROW-2)return false;break;case 4:if(head.col-1<1)return false;break;}return true;}class Node {private int row, col;private int d;Node prive=null;Node next=null;public Node(int row, int col, int d) {super();this.row = row;this.col = col;this.d = d;}void draw(Graphics g) {Color c = g.getColor();g.setColor(Color.RED);g.fillRect(col * Yard.Map.SIZE+5, row * Yard.Map.SIZE+30, Yard.Map.SIZE, Yard.Map.SIZE);g.setColor(Color.BLACK);g.drawRect(col * Yard.Map.SIZE+5, row * Yard.Map.SIZE+30, Yard.Map.SIZE, Yard.Map.SIZE);g.setColor(c);}public void move(){switch(d){case 1:row--;break;case 2:col++;break;case 3:row++;break;case 4:col--;break;}}public void keyPressed(KeyEvent e){int key=e.getKeyCode();switch(key){case KeyEvent.VK_UP:d=1;break;case KeyEvent.VK_DOWN:d=3;break;case KeyEvent.VK_LEFT:d=4;break;case KeyEvent.VK_RIGHT:d=2;break;}}}}


Egg.java

package com.jingtian.object;import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;public class Egg {private int row, col;private boolean life;public Egg(int row, int col) {super();this.row = row;this.col = col;}public Egg(int row, int col, boolean life) {super();this.row = row;this.col = col;this.life = life;}public boolean isLife() {return life;}public void setLife(boolean life) {this.life = life;}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}public void draw(Graphics g){Color c=g.getColor();g.setColor(Color.YELLOW);g.fillRect(col*Yard.Map.SIZE+5, row*Yard.Map.SIZE+30, Yard.Map.SIZE, Yard.Map.SIZE);g.setColor(c);}public Rectangle getRectangle(){return new Rectangle(col*Yard.Map.SIZE+5, row*Yard.Map.SIZE+30, Yard.Map.SIZE, Yard.Map.SIZE);}}


TankClient.java

package com.jingtian.tank;import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.HeadlessException;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.ArrayList;import java.util.List;import java.util.Random;class MyFrame extends Frame {/* * 集合的迭代异常,再就是把可以调整的常量弄到主类中更好,敌人坦克继承谢了一个自己的方法,没成功,弄在主类中 */public static  int GAME_WIDTH=800,GAME_HIGHT=600;//通过改变高度宽度改变游戏边框的大小public Tank tank;private EnemyTank enemyTank1,enemyTank2,enemyTank3;private int x1 = 50, y1 = 50,z1=2;private int x2=300,y2=100,x3=400,y3=200,z2=3,z3=4,x4=500,y4=350,z4=2;Image offscreenImage = null;MyFrame()  {tank=new Tank(x1,y1,z1,this);enemyTank1=new EnemyTank(x2, y2, z2,this,true);enemyTank2=new EnemyTank(x3, y3, z3,this,true);enemyTank3=new EnemyTank(x4, y4, z4,this,true);setBounds(10, 10, GAME_WIDTH, GAME_HIGHT);setVisible(true);setTitle("晓志之疯狂坦克");setResizable(false);setBackground(Color.GREEN);this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {super.keyPressed(e);tank.keyPressed(e);repaint();}});//<小知识>好久没用了,事件监听器有点忘new Thread(new enemyThread()).start();new Thread(new missionThread()).start();}@Overridepublic void paint(Graphics g) {Color c = g.getColor();tank.draw(g);if(enemyTank1.isLife()==true)enemyTank1.draw(g);if(enemyTank2.isLife()==true)enemyTank2.draw(g);if(enemyTank3.isLife()==true)enemyTank3.draw(g);for(Mission mission:tank.list){if(mission.isLife()==true){mission.draw(g);mission.hitEnemyTank(enemyTank1);mission.hitEnemyTank(enemyTank2);mission.hitEnemyTank(enemyTank3);}}g.setColor(c);}@Overridepublic void update(Graphics g) {if (offscreenImage == null) {offscreenImage = this.createImage(GAME_WIDTH, GAME_HIGHT);}Graphics gofferScreen = offscreenImage.getGraphics();Color c = gofferScreen.getColor();gofferScreen.setColor(Color.GREEN);gofferScreen.fillRect(0, 0, GAME_WIDTH, GAME_HIGHT);paint(gofferScreen);g.drawImage(offscreenImage, 0, 0, null);}private class enemyThread implements Runnable {@Overridepublic void run() {while (true) {try {enemyTank1.move();enemyTank2.move();enemyTank3.move();repaint();Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}} private class missionThread implements Runnable{@Overridepublic void run() {while(true){try {for(Mission mission:tank.list)mission.move();repaint();Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}}public class TankClient {public static void main(String[] args) {MyFrame frame = new MyFrame();}}


Tank.java

package com.jingtian.tank;import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.util.ArrayList;import java.util.List;import java.util.Random;public class Tank { private int x,y,z;private MyFrame frame=null;public List<Mission> list=new ArrayList<Mission>();private int step=0;Random random=new Random();private static final int Tank_Speed=20;//调整速度private static final int EnemyTank_Speed=20;//调整速度public  static final int SIZE=40;public Tank() {super();}public Tank(int x, int y,int z) {super();this.x = x;this.y = y;this.z=z;}public Tank(int x, int y, int z, MyFrame frame) {super();this.x = x;this.y = y;this.z = z;this.frame = frame;}public void draw(Graphics g){g.setColor(setColor());g.fillOval(x, y, SIZE, SIZE);g.setColor(Color.BLACK);switch(z){case 1:g.drawLine(x+SIZE/2,y+SIZE/2,x+SIZE/2,y);break;case 2:g.drawLine(x+SIZE/2,y+SIZE/2,x+SIZE,y+SIZE/2);break;case 3:g.drawLine(x+SIZE/2,y+SIZE/2,x+SIZE/2,y+SIZE);break;case 4:g.drawLine(x+SIZE/2,y+SIZE/2,x,y+SIZE/2);break;}}public Color setColor(){return Color.BLUE;}//抽取tank的类:抽取所有的变量和方法。当时没有抽取KeyPressed方法导致,//KeyPressed方法改变了TankClient里面的给tank的坐标赋值的x,y的值,但是没有改变真正tank的坐标值public void keyPressed(KeyEvent e){int key=e.getKeyCode();switch(key){case KeyEvent.VK_UP:y-=Tank_Speed;z=1;judge();break;case KeyEvent.VK_DOWN:y+=Tank_Speed;z=3;judge();break;case KeyEvent.VK_LEFT:x-=Tank_Speed;z=4;judge();break;case KeyEvent.VK_RIGHT:x+=Tank_Speed;z=2;judge();break;case KeyEvent.VK_SPACE://画出炮弹,炮弹移动//开启一个线程让一枚炮弹直线运动会//新建一个类的方法:新建一个炮弹类fire();}}public void fire(){list.add(new Mission(x,y,z,frame,true));}public void judge(){if(x<=0)x=0;if(x>=MyFrame.GAME_WIDTH-SIZE)x=MyFrame.GAME_WIDTH-SIZE;if(y<=25)y=25;if(y>=MyFrame.GAME_HIGHT-SIZE)y=MyFrame.GAME_HIGHT-SIZE;}public Rectangle getRect(){return new  Rectangle(x, y, 30, 30);}//专门为敌人坦克写的方法public void move(){switch(z){case 1:y-=EnemyTank_Speed;judge();break;case 2:x+=EnemyTank_Speed;judge();break;case 3:y+=EnemyTank_Speed;judge();break;case 4:x-=EnemyTank_Speed;judge();break;}if(step==15){z=random.nextInt(4);step=random.nextInt(12)+3;}step++;}}


EnemyTank.java

package com.jingtian.tank;import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import java.util.Random;public class EnemyTank extends Tank{private int x,y,z;private MyFrame frame=null;private boolean life;private int step=0;Random random=new Random();public EnemyTank(int x, int y, int z, MyFrame frame, boolean life) {super(x, y, z, frame);this.x=x;this.y=y;this.z=z;this.frame=frame;this.life = life;}public boolean isLife() {return life;}public void setLife(boolean life) {this.life = life;}@Overridepublic void draw(Graphics g) {// TODO Auto-generated method stubsuper.draw(g);}@Overridepublic Color setColor() {// TODO Auto-generated method stubreturn Color.RED;}@Overridepublic void judge() {// TODO Auto-generated method stubsuper.judge();}@Overridepublic Rectangle getRect() {// TODO Auto-generated method stubreturn super.getRect();}@Overridepublic void move() {// TODO Auto-generated method stubsuper.move();}public void move2() {// TODO Auto-generated method stubswitch(z){case 1:y-=5;judge();break;case 2:x+=5;judge();break;case 3:y+=5;judge();break;case 4:x-=5;judge();break;}if(step==15){z=random.nextInt(4);step=random.nextInt(12)+3;}step++;}}


Mission.java

package com.jingtian.tank;import java.awt.Graphics;import java.awt.Rectangle;public class Mission {int x,y,z;private MyFrame frame=null;private boolean life;private static int speed=30;private static int SIZE=20;public Mission(int x, int y, int z) {super();this.x = x;this.y = y;this.z = z;}public Mission(int x, int y, int z, MyFrame frame) {super();this.x = x;this.y = y;this.z = z;this.frame = frame;}public Mission(int x, int y, int z, MyFrame frame, boolean life) {super();this.x = x;this.y = y;this.z = z;this.frame = frame;this.life = life;}public boolean isLife() {return life;}public void setLife(boolean life) {this.life = life;}public void draw(Graphics g){switch(z){case 1:g.fillOval(x+(Tank.SIZE-SIZE)/2, y-SIZE, SIZE, SIZE);break;case 2:g.fillOval(x+Tank.SIZE, y+(Tank.SIZE-SIZE)/2, SIZE, SIZE);break;case 3:g.fillOval(x+(Tank.SIZE-SIZE)/2, y+Tank.SIZE, SIZE, SIZE);break;case 4:g.fillOval(x-Tank.SIZE, y+(Tank.SIZE-SIZE)/2, SIZE, SIZE);break;}}public void move(){switch(z){case 1:y-=speed;break;case 2:x+=speed;break;case 3:y+=speed;break;case 4:x-=speed;break;}}public Rectangle getRect(){return new  Rectangle(x, y, 10, 10);}public void hitEnemyTank(EnemyTank enemyTank){if(this.getRect().intersects(enemyTank.getRect())){this.life=false;enemyTank.setLife(false);frame.tank.list.remove(this);}}}



原创粉丝点击