Thứ Tư, 14 tháng 8, 2013

Chúng ta không chỉ có một mình

Hôm trước đã nói tới chuyện thông qua command mà điểu khiển một biến robot rồi, hôm nay cũng với command và robot này nhưng chúng ta không chỉ điều khiển một mà là nhiều. tức là khi viết lệnh chúng ta viết cho nhiều robot và với phân cách là dấu chấm (.) có bao nhiêu lệnh thì có bấy nhiêu biến robot được vẽ trên màn hình. Hãy xét một lệnh tổng hợp ví dụ như sau: 1 robot: string,x,y Nhiều robot: string1,x1,y1.srting,x2,y2.string3,x3,y3.(string_n,x_n,y_n) Giả sử ta có lệnh tổng hợp sau: Abc,10,50.bcd,30,100.def,120,5 vậy là ta có 3 biến robot được tạo ra và màn hình sẽ thực hiện việc vẽ 3 biến này lên màn hình. Để làm như vậy, bây giờ ta sẽ sử dụng biến rb là một Vector của lớp robot Ta đặt: Vector rb; Chưa vội gán giá trị cho nó bao nhiêu đối tượng mà ta sẽ phân tích từ lệnh. Lớp canvas.java sẽ như thế này:
C:\Users\WIN7\Documents\NetBeansProjects\mog\src\mog.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class mog extends MIDlet {
public void startApp(){
Display.getDisplay(this).setCurrent(new canvas());}
public void destroyApp(boolean t){}
public void pauseApp(){}}

class canvas extends Canvas{
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
if(k==-5){
command=tf.getString();
String[] acommand=tach(command,".");
for(int i=0;i<acommand.length;i++){
    robot nrb=new robot(w/2,h/2);
    nrb.getcommand(tach(acommand[i],","));
rb.addElement((robot)nrb);}}}
public void keyReleased(int k){this.k=0;}

public String[] tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[] rt=new String[v.size()];
v.copyInto((String[])rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i]+rt[i].length());}
return rt;}
}

class robot{
int x,y,nx,ny;
String say;
long lm=0;
public robot(int x,int y){
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public void getcommand(String[] s){
say=s[0];
nx=Integer.parseInt(s[1]);
ny=Integer.parseInt(s[2]);
}
public void paint(Graphics g){
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
}

void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}
}
• Như chúng ta thấy đó, sau khi ta nhấn phím 5, lệnh sẽ được lấy ra từ textfield (tf) và phân tích thành mảng của các lệnh con qua String[] acommand=tach(command,"."); • Và sau đó lại được phân tích và gán vào biến robot bình thường. for(int i=0;i
C:\Users\WIN7\Documents\NetBeansProjects\mog\src\mog.java
public void keyPressed(int k){
this.k=k;
if(k==-5){
command=tf.getString();
String[] acommand=tach(command,".");
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
    String[] info=tach(acommand[i],",");
    robot nrb=new robot(w/2,h/2);
    for(int j=0;j<rb.size();j++){
   if(info[0].equals(((robot)rb.elementAt(j)).say)){nrb=(robot)rb.elementAt(j);
    System.out.println("dectect");}}
    nrb.getcommand(info);
trb.addElement((robot)nrb);}
rb=trb;}}
}
• Lúc này ta cần tạo thêm một biến trb dùng để tạo một vùng thêm các biến robot vào và so sánh với biến rb cũ, nếu không làm như vậy mà thêm trực tiếp vào biến cũ ta sẽ không thể nào kiểm soát được các đối tượng mà ta đã ra lệnh trước đó. • Bài này vậy là xong, nếu đến đây các bạn vẫn chưa hiểu được là ta đang làm cái gì thì bài sau các bạn sẽ rõ. Đây không phải chỉ là chuyện rèn kỹ năng giải thuật mà nó phải có sử dụng thực tế. Tải zip

Không có nhận xét nào:

Đăng nhận xét