Java学習小記(十)戦車大戦学習ノート(二)


私が戦車大戦のノートを書くのは主に重要なバージョンを選んで今日書くのは非常に重要なバージョンが0.7と0.8バージョンで、このバージョンでは主に対象向けの考え方を実現するために、馬兵士先生が例を挙げて重要です.例えば、新疆に行くには、元のプロセス向けのプログラミング方式が第一歩、第二ステップ、第三ステップなど、一歩一歩どうすればいいかを教えなければならないが、対象向けの考え方は、いくつかの方法を一つのクラスにカプセル化して直接呼び出すことだ.これにより、多くの重複作業を省くことができます.私たちが一つの例を持って言えば、例えば軍区司令官、彼の任務ははっきりしているのは兵士の命令を下すことだが、彼は兵士にどのように戦車砲弾をどの角度に置いて射撃するかではなく、それらの問題については、私がその時に直接運行すればOKになるという分業がはっきりしている.
 
Tankclient:
import java.awt.*;
import java.awt.event.*;
import java.awt.event.*;
public class TankClient extends Frame{
private static final Color c = null;
public static final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;
  //  TankClient      
  Tank myTank= new Tank(50,50);
  
  Image offScreenImage=null;//     update  



	public void paint(Graphics g) {
		myTank.draw(g);
	}
	public void update(Graphics g) {//          g      
		if(offScreenImage==null){
			offScreenImage=this.createImage(GAME_WIDTH,GAME_HEIGHT);
		}
	Graphics gOffScreen=offScreenImage.getGraphics();//    
	Color color=gOffScreen.getColor();
	gOffScreen.setColor(color.GREEN);
	gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
    gOffScreen.setColor(c);
	paint(gOffScreen);//gOffScreen       
	g.drawImage(offScreenImage,0,0,null);}//       ,         ,
	//             ,          ,    null
	
	public  void lauchFrame(){
		this.setLocation(400,300);
		this.setSize(GAME_WIDTH,GAME_HEIGHT);
		this.setTitle("TankWar");//         
		this.addWindowListener(new WindowAdapter(){
		  public void windowClosing(WindowEvent e){
			  System.exit(0);//    
		  }
			
		});
		this.setResizable(false);
		this.setBackground(Color.green);//     
		this.addKeyListener(new  KeyMonitor());// KeyMonitor     frame  
		setVisible(true);
		new Thread(new PaintThread()).start();//    
	}

 public static void main(String[] args){
	 TankClient tc=new TankClient();
	 tc.lauchFrame();
 }
 
 private class PaintThread implements Runnable {
	//      ,       ,          

		public void run() {
			while(true) {
				repaint();
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	private class KeyMonitor extends KeyAdapter {

		public void keyPressed(KeyEvent e) {
			myTank.keyPressed(e);
			}
		}
		
	}















 Tank.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;


public class Tank {
	public static final  int XSPEED=5;
	public static final  int YSPEED=5;
	private int x,y;
	
	private boolean bL=false,bU=false,bR=false,bD=false;
	enum Direction {L,LU,U,RU,R,RD,D,LD,STOP};
	private Direction dir=Direction.STOP;
	public Tank(int x, int y) {
	
		this.x = x;
		this.y = y;
	}
    public void draw(Graphics g){
    	Color c=g.getColor();
		g.setColor(Color.RED);
	    g.fillOval(x,y, 30, 30);//      
	    g.setColor(c);//           
    	  move();
    }
    void move(){
    	switch(dir){
    	case L:
    	    x-=XSPEED;
    	    break;
    	case LU:
    		x-=XSPEED;
    		y-=YSPEED;
       	    break;
    	case U:
    
    		y-=YSPEED;
       	    break;
    	case RU:
       	    x+=XSPEED;
 		    y-=YSPEED;
       	    break;
    	case R:
       	    x+=XSPEED;
 		    
       	    break;
    	case RD:
       	    x+=XSPEED;
 		    y+=YSPEED;
       	    break;
    	case D:
    		 y+=YSPEED;
       	    break;
    	case LD:
       	    x-=XSPEED;
 		    y+=YSPEED;
       	    break;
    	case STOP:
    		break;
    	}
    	
    }
    //               ,           
    public void keyPressed(KeyEvent e){
		int key = e.getKeyCode();
		switch(key) {
		case KeyEvent.VK_LEFT :
			bL=true;
			break;
		case KeyEvent.VK_UP :
		    bU=true;
			break;
		case KeyEvent.VK_RIGHT :
            bR=true;
			break;
		case KeyEvent.VK_DOWN :
		    bD=true;
			break;
		}
		locataDirection();//             
	}
    void locataDirection(){
    	if(bL && !bU && !bR && !bD) dir = Direction.L;//       
		else if(bL && bU && !bR && !bD) dir = Direction.LU;
		else if(!bL && bU && !bR && !bD) dir = Direction.U;
		else if(!bL && bU && bR && !bD) dir = Direction.RU;
		else if(!bL && !bU && bR && !bD) dir = Direction.R;
		else if(!bL && !bU && bR && bD) dir = Direction.RD;
		else if(!bL && !bU && !bR && bD) dir = Direction.D;
		else if(bL && !bU && !bR && bD) dir = Direction.LD;
		else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
    	
    	
    }
}

Tankこのプログラムではdrawのいくつかの属性をこのクラスにカプセル化しました.このTankがどのように描くか、砲弾などの位置画はどこにしても構いません.私はdrawにこのペンを伝えて自分で説明すればいいです.心配しないでください.これはあなたが管理するべきではありません.その時、clinentでdrawを呼び出せばいいです.しかし、ブラシを渡すにはパッケージimportを導入しなければなりません.java.awt.*;これはその中の1つの応用で、もう1つの地方は私がコントロールしなければならないのは戦車自身の移動で、それでは私たちは戦車自身の移動の各方向が戦車自身のことだと思っています.私たちが関心を持っているのは戦車が運動すればいいということです.彼がどのように運動して、その方向に沿って運動するかは戦車自身のことです.この方法を1つのクラスにカプセル化し、直接呼び出すと、多くの重複コードを減らすことができます.
【説明】1プログラムを書くときに方向をコントロールするときは、右と下をプラスにするのが一般的ですが、これは画面によって決められた画面の左上を原点にしているので、下も右もプラスになるので注意しましょう.
2このプログラムの実行の結果はまだ少し奇妙なところがある.例えば、私は彼を左か右に行かせることができますが、私は彼を下に行かせると問題が発生します.彼は斜めに歩いて、この問題は後でバージョンで解決します.