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

Đi lệch quỹ đạo

một lập trình viên thường không thể nào kiểm soát hết mọi trường hợp có thể xảy ra trong thực tế, dù rằng đó là ứng dụng do chính họ tạo ra. một thế giới nhỏ bé cũng có những sự cố của chính nó, tôi cũng gặp nhiều những sự cố như vậy, tôi cố gắng sửa chữa chúng nhưng dường như cứ để như vậy thì lại hay hơn. mình có thề sửa cái này vì nó ngay trước mặt mình nhưng còn những thứ không bao giờ hiện ra ngay trước mắt. tôi không biết mình có đi lệch quỹ đạo hay không và thật sự đâu là quĩ đạo của chính tôi. dù sao thì tôi cũng sống cho chính bản thân mình và không chịu sự điều khiển của ai cả, nếu như tôi không còn là tôi của những ngày ban đầu thì tôi vẫn đi trong chính con đường của mình chứ không ai khác. trong những gì mà ta đầu tư cũng có thể bỏ đi hết, nếu tự nhiên có thứ gì đó thu hút ta hơn. tôi thường xem việc lập trình hoặc là viết bài hướng dẫn như là một sự giải thoát khỏi sự chán nản của cuộc sống nhưng thỉnh thoảng cái cô độc vẫn ám ảnh tôi nhiều hơn. và bây giờ tôi muốn nói gì đó cho nó khuây khỏa, muốn quên đi những thứ mà tôi chưa kịp hoàn thành. bế tắc trong bất cứ chuyện gì cũng không có nghĩa lí gì hết nếu như có một cái gì đó cho ta nhìn ra ngoài. hãy thử tưởng tượng khi bạn đang cố gắng suy nghĩ về cuộc đời mình rồi sẽ ra sao và có một người đến nói với bạn rằng hãy đi chơi với họ thì bạn sẽ nghĩ sao. tự nhiên ta sẽ quên hết mọi thứ đang dang dở và hào hứng đến với họ hơn là việc ta đang làm. tôi không biết, thường thì tôi sẽ làm vậy, và ngay cả trong việc viết hướng dẫn như thế này tôi cũng không muốn bó buộc vào điều gì hết, đừng phiền lòng nếu như bài biết này làm phí thời gian của bạn, vì nó là những gì mà tôi thấy là có ý nghĩa với một vài người và ít nhất là đối với tôi. nhiều khi nằm trên giường và nhìn ra ngoài cửa sổ tôi lại thấy nó như hấp dẫn tôi rất nhiều, tôi thích nhìn chỉ một góc như vậy và suy nghĩ xem những phần còn lại của thế giới đang diễn ra như thế nào. hay chuyện vào một thời gian nào đó bạn nghĩ về một người bạn của mình hiện giờ đang làm gì và như thế nào, có những chuyện gì làm cho họ buồn hay vui và họ có nhớ tới bạn không. thật sự là ta có thể nghĩ đến hàng vô số những chuyện xảy ra trên thế giới này và mọi thứ điều tuyệt diệu.
"hãy thử nhìn xung quanh và nghĩ xem điều gì đang diễn ra ở đó"

điều khiển nhân vật thông qua lệnh

Bài trước đã hướng dẫn cách viết một class textfield hiển thị và nhập trên Canvas, bài này sẽ sử dụng đến textfield đó để làm vài thứ: Đầu tiên chúng ta sẽ tạo một class nhận giá trị là một chuổi và sau đó là phân tích chuỗi đó để thực hiện những lệnh mà ta muốn, lệnh ở đây bao gồm (chuỗi,tọa độ x, tọa độ y) và sau khi nhận chuỗi này nó sẽ tự cập nhật thông tin vào trong các biến của nó, ta viết như sau:
C:\Users\WIN7\Documents\NetBeansProjects\textfield\src\NewClass.java
import javax.microedition.lcdui.*;
import java.util.*;

class canvas extends Canvas{
textfield tf;
//robot là một đối tượng nhận lệnh và điều khiển bởi lệnh
robot rb;
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);
rb=new robot(w/2,h/2);
}
public void paint(Graphics g){
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
//vẽ hộp nhập văn bản lên canvas
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
//vẽ chuỗi lệnh ra màn hình
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
//vẽ đối tượng nhận lệnh ra màn hình
rb.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
//nếu nhấn mã -5 (phím ok) thì cho command nhận giá trị của textfield (tf), 
if(k==-5){
command=tf.getString();
//sau đó truyền tham số vào trong đối tượng hoạt động robot(rb), trước đó ta cho nó tách thành từng phần qua method tach trước, cách nhau bởi dấu phẩy (có dạng: say,x,y)
rb.getcommand(tach(command,","));}}
public void keyReleased(int k){this.k=0;}
//chức năng tách chuỗi ra thành từng phần
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;}
}


Lớp robot là một dạng như sau, nó sẽ nhận các giá trị lệnh và xử lí để hoạt động theo lệnh đó:
C:\Users\WIN7\Documents\NetBeansProjects\textfield\src\NewClass.java
class robot{
int x,y,nx,ny;
String say;
long lm=0;
//hàm khởi tạo robot nhận 2 giá trị x, y là tọa độ đầu tiên của nó
public robot(int x,int y){
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
//hàm getcommand này nhận một mảng chuỗi bao gồm các giá trị truyền vào say, nx, ny 
public void getcommand(String[] s){
say=s[0];
nx=Integer.parseInt(s[1]);
ny=Integer.parseInt(s[2]);
}
//hàm paint sẽ vẽ đối tượng này lên Graphics của canvas, đồng thời cũng di chuyển nó thông qua hàm move
public void paint(Graphics g){
    //cũng cần phải cho nghỉ một khoảng thời gian để nó không di chuyển quá nhanh mà ta không kịp theo dõi
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
}
//hàm move này so sánh giá trị tọa độ x,y với nx,ny để từ đó tính toán và thay đổi giá trị của x,y cho đến khi bằng nx,ny
void move(){
    //so sánh x và nx nếu như x lớn hơn nx thì cho x trừ đi 1, nếu x bằng nx thì không thay đổi x, ngược lại thì cho x tăng lên 1 khi x nhỏ hơn nx
x+=x>nx?-1:(x==nx?0:1);
//tương tự với y và ny
y+=y>ny?-1:(y==ny?0:1);}
}


Xong như vậy là chúng ta đã hoàn thành rồi, chỉ cần ghép nó vào MIDlet nữa là thấy:http://holyeyed.99k.org/function/up/mog-25113.zip http://holyeyed.99k.org/function/up/mog-97485.jar