Teya Salat
logo

Chatbox|Admin nhận làm wap/web, giá cả thương lượng... Thông tin admin tại mỗi bài viết.
Home · Bang hội ·
* Đăng Nhập hoặc Đăng Kí
để sử dụng hết chức năng của diễn đàn.
Hi, Khách!
HomeBang hội » Thủ thuật » Nokia s40 » Lập trình game j2me by holyeyed
Xuống dưới » Lập trình game j2me by holyeyed
avatar by Pham_loi Pham_loi
Chức vụ:
16:47:10, 01-06-2016

một nhân vật phụ họa trong trò chơi
Một nhân vật chạy tới chạy lui, cũng khá là hay và vui mắt, điều này còn làm cho trò chơi trở nên sinh động hơn. Chúng ta sẽ thêm một lớp other.java như sau.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\other.java

<?php
import javax
.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;

public class 
other {
    
//bao gồm tọa độ của other (x,y), khung hình hiện tại f, phía di chuyển k, step
  
int x,y,f=0,k=1;
  
//dùng Sprite để tạo hình ảnh nhân vật phụ
  
Sprite other;
  
//mốc thời gian lần di chuyển cuối và lần đổi hướng cuối.
  
long lm,lc;
  
//hình ảnh dùng tạo Sprite
  
Image im;
  
//biến ngẫu nhiên dùng để tạo hướng ngẫu nhiên.
  
Random rd=new Random();
  
//hàm khởi tạo nhân các tham số hình ảnh và tọa độ ban đầu của other.
  
public other(Image im,int x,int y){
  
this.x=x;
  
this.y=y;
  
this.im=im;
  
other=new Sprite(im,16,16);
  
other.setFrame(f);
  }
  
//hàm paint dùng vẽ nhân vật other lên Graphics g.
  
void paint(Graphics g,map m){
  
move(m);
  
other.paint(g);
  }
  
//hàm move nhân giá trị là biến map m, sử dụng để điều hướng nhân vật phụ.
  
void move(map m){
      
//so sánh mốc chuyển hướng cuối cùng để cho cứ 1.5s thì chuyển hướng.
  
if(lc<m.curr()-1500){
      
//với phép chia dư này, k chỉ nhận giá trị từ 1-4.
  
k=Math.abs(rd.nextInt()%4)+1;
  
lc=m.curr();}
  
//so sánh với lần di chuyển cuối cùng, nếu cách 0.5s thì cho di chuyển.
  
if(lm<m.curr()-200){
      
f=f%2==0?(k-1)*2+1:(k-1)*2;
      
other.setFrame(f);
      switch(
k){
          case 
1:
              
y-=4;
      break;
          case 
2:
              
y+=4;
      break;
          case 
3:
              
x-=4;
      break;
          case 
4:
              
x+=4;
      break;}
      
lm=m.curr();
  }
  
//tọa độ của nhân vật phụ được hình thành từ tọa độ của bản đồ và tọa độ của nhân vật phụ.
  
other.setPosition(x+m.x,y+m.y);
  }
}
?>

Copy code

Và ta sẽ sử dụng hình ảnh này để tạo nhân vật phụ :
img
Ta sẽ thêm vào trong map.java để sử dụng nhân vật phụ này :
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\map.java
<?php
import java
.io.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;

public class 
map {
    
//các thông số gồm có số cột, số hàng trong map, kích thước mỗi tile tw, th.
    //tọa độ map (x,y), phím bấm k, số lần di chuyển nhỏ.
    
int mw,mh,tw,th,x,y,k,step=0;
    
//chứa dữ liệu các tile trong map.
    
bytemap;
    
//hình ảnh dùng làm tile
    
Image tiles,other;
    
//dùng class TiledLayer có sẵn trong GameCanvas để tạo map.
    
TiledLayer tl;
    
//mốc thời gian di chuyển lần cuối
    
long lm=0;
    
//thêm một biến other ot dùng làm nhân vật phụ.
        
other ot;
    
//hàm khởi tạo sẽ tải hình ảnh làm tile vào class map.
    
public map(String im){
    try{
    
this.tiles=Image.createImage("/"+im);
    }catch(
Exception e){}}
    
//hàm load dùng tải file nguồn và phân tích các thông số trong đó vào map.
    //bây giờ ta có thông số xác định tọa độ ban đầu nhân vật, tại cột c, dòng r và so sánh với độ dài rộng màn hình.
public void load(String fn,int c,int r,int w,int h){
    
//file nguồn là dữ liệu với cấu trúc: [số cột-[số hàng-[tile width-[tile height-[dữ liệu map (số cột * số hàng)
try{
InputStream is=getClass().getResourceAsStream("/"+fn);
mw=is.read();
mh=is.read();
tw=is.read();
th=is.read();
map=new byte[is.available();
is.read(map);
//tạo TiledLayer tl từ những gì đã nhận được.
tl=new TiledLayer(mw,mh,tiles,tw,th);
//lát gạch vào TiledLayer tl.
for(int i=0;i<mh;i++){
for(
int j=0;j<mw;j++){
tl.setCell(jimap[i*mw+j);
}}
x=w/2-c*tw;
y=h/2-r*th;
//tạo file ảnh cho nhân vật phụ và khởi tạo ot ở vị trí cột 4 và hàng 6 trên map.
other=Image.createImage("/other.png");
    
ot=new other(other,w/2-4*16,h/2-6*16);
}catch(
Exception e){}} 
//hàm paint dùng vẽ tl lên Graphics g, và nhận giá trị phím bấm vào hàm move.
void paint(Graphics g,int k){
    
move(k);
tl.paint(g);
//vẽ nhân vật phụ lên map.
ot.paint(g,this);}
//hàm move nhận giá trị phím bấm k và kiểm tra điều kiện để thay đổi tọa độ của map.
void move(int k){
    
//do mỗi lần di chuyển ta cho chuyển 16 pixel, nên ta cần chia ra 4 lần di chuyễn nhỏ để hình ảnh mượt hơn.
    //nếu thấy không cần bước di chuyển nhỏ nào nữa thì cho di gán di chuyển tiếp
if(step==0){
this.k=k;
step=4;
}else{
    
//nếu còn lượt di chuyển nhỏ step!=0, thì xét đến thời gian di chuyển lần cuối.
    
if(lm<=curr()-30){
    
step--;
    switch(
this.k){
        case -
1:
            
y+=th/4;
    break;
        case -
2:
            
y-=th/4;
    break;
        case -
3:
            
x+=tw/4;
    break;
        case -
4:
            
x-=tw/4;
    break;}
    
lm=curr();}
}
//gán vị trí cho tl.
tl.setPosition(xy);
}
  
long curr(){return System.currentTimeMillis();}
}
?>

Copy code

Rồi vậy là xong, kết quả đây :
img


Source: RPG-82799.zip
Jar: RPG-49690.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:44:47, 01-06-2016

di chuyển bản đồ mà tưởng nhân vật đang di chuyển vậy
Thay vì di chuyển nhân vật, nhân vật ta luôn làm trung tâm và chúng ta chỉ cho bản đồ di chuyển. mọi thứ sẽ thay đổi nhiều so với lần trước, nhưng cũng không đến nổi khó hiểu cho lắm.
Mỗi lần bản đồ di chuyển một khoảng là một ô gạch, như vậy thì ta sẽ thấy nó rất giật, cho nên mỗi lần bấm phím di chuyển ta cho bản đồ di chuyển thành nhiều bước nhỏ, mỗi bước nhỏ là một ước số của kích thước ô gạch. Làm như vậy, nhân vật và bản đồ luôn khớp với nhau tại từng ô, chứ nhân vật không bao giờ nằm lưng chừng giữa 2 ô gạch, điều này sẽ giúp ta xác định điểm chạm ở bài sau.
File map.java trở thành thế này :
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\map.java

<?php
import java
.io.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;

public class 
map {
    
//các thông số gồm có số cột, số hàng trong map, kích thước mỗi tile tw, th.
    //tọa độ map (x,y), phím bấm k, số lần di chuyển nhỏ.
    
int mw,mh,tw,th,x,y,k,step=0;
    
//chứa dữ liệu các tile trong map.
    
bytemap;
    
//hình ảnh dùng làm tile
    
Image tiles;
    
//dùng class TiledLayer có sẵn trong GameCanvas để tạo map.
    
TiledLayer tl;
    
//mốc thời gian di chuyển lần cuối
    
long lm=0;
    
//hàm khởi tạo sẽ tải hình ảnh làm tile vào class map.
    
public map(String im){
    try{
    
this.tiles=Image.createImage("/"+im);}catch(Exception e){}}
    
//hàm load dùng tải file nguồn và phân tích các thông số trong đó vào map.
    //bây giờ ta có thông số xác định tọa độ ban đầu nhân vật, tại cột c, dòng r và so sánh với độ dài rộng màn hình.
public void load(String fn,int c,int r,int w,int h){
    
//file nguồn là dữ liệu với cấu trúc: [số cột-[số hàng-[tile width-[tile height-[dữ liệu map (số cột * số hàng)
try{
InputStream is=getClass().getResourceAsStream("/"+fn);
mw=is.read();
mh=is.read();
tw=is.read();
th=is.read();
map=new byte[is.available();
is.read(map);
//tạo TiledLayer tl từ những gì đã nhận được.
tl=new TiledLayer(mw,mh,tiles,tw,th);
//lát gạch vào TiledLayer tl.
for(int i=0;i<mh;i++){
for(
int j=0;j<mw;j++){
tl.setCell(jimap[i*mw+j);
}}
x=w/2-c*tw;
y=h/2-r*th;
System.out.println("finish");
}catch(
Exception e){}} 
//hàm paint dùng vẽ tl lên Graphics g, và nhận giá trị phím bấm vào hàm move.
void paint(Graphics g,int k){
    
move(k);
tl.paint(g);}
//hàm move nhận giá trị phím bấm k và kiểm tra điều kiện để thay đổi tọa độ của map.
void move(int k){
    
//do mỗi lần di chuyển ta cho chuyển 16 pixel, nên ta cần chia ra 4 lần di chuyễn nhỏ để hình ảnh mượt hơn.
    //nếu thấy không cần bước di chuyển nhỏ nào nữa thì cho di gán di chuyển tiếp
if(step==0){
this.k=k;
step=4;
}else{
    
//nếu còn lượt di chuyển nhỏ step!=0, thì xét đến thời gian di chuyển lần cuối.
    
if(lm<=curr()-30){
    
step--;
    switch(
this.k){
        case -
1:
            
y+=th/4;
    break;
        case -
2:
            
y-=th/4;
    break;
        case -
3:
            
x+=tw/4;
    break;
        case -
4:
            
x-=tw/4;
    break;}
    
lm=curr();}
}
//gán vị trí cho tl.
tl.setPosition(xy);
}
  
long curr(){return System.currentTimeMillis();}
}
?>

Copy code

Và vì vậy trong RPG.java ta cũng thay đổi cách sử dụng các hàm trong map.java, nhân vật chúng ta sẽ di chuyển, nhưng thật chất là thay đổi vị trí bản đồ trên màn hình.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\RPG.java
<?php
import javax
.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class 
RPG extends Canvas{
    
//các biến này bao gồm kích thước màn hình w,h, khung hiện tại hiện thị f, phím nhấn k
    
int w,h,f=2,k;
    
//biến thời gian ghi lại mốc thời gian di chuyển cuối cùng
    
long lm=0;
    
//nhân vật được tạo qua lớp Sprite là có sẵn trong GameCanvas
    
Sprite nv;
    
//hình ảnh sử dụng
    
Image im;
    
//tạo biến load map m, với hình ảnh là tiles.png .
    
map m=new map("tiles.png");
  public 
RPG(){
  
setFullScreenMode(true);
  
w=getWidth();
  
h=getHeight();
  try{
      
//tạo hình ảnh trước
  
im=Image.createImage("/nv.png");
  
//tạo Sprite sau khi đã có hình ảnh, mỗi khung nhỏ là 16x16
  
nv=new Sprite(im,16,16);}catch(Exception e){}
  
//load map m0.mbd vào biến map m, nhân vật ở vị trí cột 3, dòng 4 trên map.
  
m.load("m0.mbd",3,4,w,h);}
  public 
void paint(Graphics g){
      
//lệnh tô màn hình
  
g.setColor(0x6060a0);
  
g.fillRect(0,0,w,h);
  
//hàm xử lí di chuyển theo phím bấm
  
move();
  
//vẽ map ở vị trí (0,0).
  
m.paint(g,k);
  
//vẽ nhân vật ra màn hình thông qua hàm paint có sẵn của lớp Sprite
  
nv.paint(g);
  
//cho vẽ lại
  
repaint();}
  public 
void keyPressed(int k){this.k=k;}
  public 
void keyReleased(int k){this.k=0;}
  
//hàm di chuyển sẽ xữ lí phím bấm k để xác định khung của nhân vật
  
void move(){
      
//ở đây cho kiểm tra nếu lần di chuyển cuối cùng cách thời gian hiện tại 20 milli giây thì cho di chuyển tiếp.
  
if(lm<curr()-20&&k!=0){
      
//công thức xử lí phím và khung hiện tại để cho ra khung ảnh phù hợp, bạn tự thế vào và xem nó có đúng không nhé.
      
f=f%2==0?(-k-1)*2+1:(-k-1)*2;
      
//sau khi di chuyển thì cho mốc thời gian lần cuối thay đổi.
      
lm=curr();
  }
  
//đặt giá trị khung ảnh và vị trí nhân vật trên màn hình.
  
nv.setFrame(f);
  
nv.setPosition(w/2,h/2);
  }
  
//hàm trả về thời gian hiện tại, do sử dụng nhiều lần nên làm riêng một hàm cho khõi phải mất công viết lại.
  
long curr(){return System.currentTimeMillis();}
}
?>

Copy code

Kết quả là đây :
img


Source: RPG-07641.zip
Jar: RPG-17847.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:42:13, 01-06-2016

Load map từ file nguồn
do bản đồ trong game RPG là rất rộng lớn cho nên ta sẽ không đặt map thông qua mảng trực tiếp mà sẽ tải dữ liệu từ file map, đó là file được tạo ra từ phần mềm http://www.mapeditor.org/ và được xử lí qua phần chuyển đổi http://holyeyed.99k.org/function/tombd.php để dễ sử dụng hơn. Và đây là file dùng để load map.mbd và sử dụng trong trò chơi. trước khi lưu file map trong phần mềm tiled map editor, bạn vào edit -> reference và thiết lặp như sau (store tile layer data as CSV):
img
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\map.java
<?php
import java
.io.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;

public class 
map {
    
//các thông số gồm có số cột, số hàng trong map, kích thước mỗi tile tw, th.
    
int mw,mh,tw,th;
    
//chứa dữ liệu các tile trong map.
    
bytemap;
    
//hình ảnh dùng làm tile
    
Image tiles;
    
//dùng class TiledLayer có sẵn trong GameCanvas để tạo map.
    
TiledLayer tl;
    
//hàm khởi tạo sẽ tải hình ảnh làm tile vào class map.
    
public map(String im){
    try{
    
this.tiles=Image.createImage("/"+im);}catch(Exception e){}}
    
//hàm load dùng tải file nguồn và phân tích các thông số trong đó vào map.
public void load(String fn){
    
//file nguồn là dữ liệu với cấu trúc: [số cột-[số hàng-[tile width-[tile height-[dữ liệu map (số cột * số hàng)
try{
InputStream is=getClass().getResourceAsStream("/"+fn);
mw=is.read();
mh=is.read();
tw=is.read();
th=is.read();
map=new byte[is.available();
is.read(map);
//tạo TiledLayer tl từ những gì đã nhận được.
tl=new TiledLayer(mw,mh,tiles,tw,th);
//lát gạch vào TiledLayer tl.
for(int i=0;i<mh;i++){
for(
int j=0;j<mw;j++){
tl.setCell(jimap[i*mw+j);
}}
}catch(
Exception e){}} 
//hàm paint dùng vẽ tl lên Graphics g, tại vị trí (x,y).
void paint(Graphics g,int x,int y){
    
tl.setPosition(xy);
tl.paint(g);}
}
?>

Copy code

ở đây ta dùng file tiles.png này làm gạch lát:
img
Chúng ta sẽ sử dụng nó trong RPG.java như sau.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\RPG.java
<?php
import javax
.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class 
RPG extends Canvas{
    
//các biến này bao gồm kích thước màn hình w,h, khung hiện tại hiện thị f, phím nhấn k
    
int w,h,f=2,k;
    
//biến thời gian ghi lại mốc thời gian di chuyển cuối cùng
    
long lm=0;
    
//nhân vật được tạo qua lớp Sprite là có sẵn trong GameCanvas
    
Sprite nv;
    
//hình ảnh sử dụng
    
Image im;
    
//tạo biến load map m, với hình ảnh là tiles.png .
    
map m=new map("tiles.png");
  public 
RPG(){
  
setFullScreenMode(true);
  
w=getWidth();
  
h=getHeight();
  try{
      
//tạo hình ảnh trước
  
im=Image.createImage("/nv.png");
  
//tạo Sprite sau khi đã có hình ảnh, mỗi khung nhỏ là 16x16
  
nv=new Sprite(im,16,16);}catch(Exception e){}
  
//load map m0.mbd vào biến map m.
  
m.load("m0.mbd");}
  public 
void paint(Graphics g){
      
//lệnh tô màn hình
  
g.setColor(0x6060a0);
  
g.fillRect(0,0,w,h);
  
//hàm xử lí di chuyển theo phím bấm
  
move();
  
//vẽ map ở vị trí (0,0).
  
m.paint(g,0,0);
  
//vẽ nhân vật ra màn hình thông qua hàm paint có sẵn của lớp Sprite
  
nv.paint(g);
  
//cho vẽ lại
  
repaint();}
  public 
void keyPressed(int k){this.k=k;}
  public 
void keyReleased(int k){this.k=0;}
  
//hàm di chuyển sẽ xữ lí phím bấm k để xác định khung của nhân vật
  
void move(){
      
//ở đây cho kiểm tra nếu lần di chuyển cuối cùng cách thời gian hiện tại 20 milli giây thì cho di chuyển tiếp.
  
if(lm<curr()-20&&k!=0){
      
//công thức xử lí phím và khung hiện tại để cho ra khung ảnh phù hợp, bạn tự thế vào và xem nó có đúng không nhé.
      
f=f%2==0?(-k-1)*2+1:(-k-1)*2;
      
//sau khi di chuyển thì cho mốc thời gian lần cuối thay đổi.
      
lm=curr();
  }
  
//đặt giá trị khung ảnh và vị trí nhân vật trên màn hình.
  
nv.setFrame(f);
  
nv.setPosition(w/2,h/2);
  }
  
//hàm trả về thời gian hiện tại, do sử dụng nhiều lần nên làm riêng một hàm cho khõi phải mất công viết lại.
  
long curr(){return System.currentTimeMillis();}
}
?>

Copy code

Và kết quả như sau :
img


Source: RPG-20156.zip
Jar: RPG-00207.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:37:06, 01-06-2016

một nhân vật trên nền không
đây là bài đơn giản nhất mà ai cũng có thể làm được, và nó là bắt đầu cho những gì đó thật phức tạp sau này. Chúng ta sẽ cho hiện thị ra một hình ảnh của nhân vật và điều hướng nó cũng như hình ảnh mà nó sẽ xuất hiện trên màn hình. Hình ảnh mà ta sử dụng ở đây là một hình ảnh gồm 8 hình ảnh nhỏ, mỗi ảnh nhỏ sẽ gọi là khung ảnh và được tính từ 0, ứng với mỗi khung là một hướng mà nhân vật chúng ta sẽ hiện thị. Mỗi khung là 16x16, vậy 8 khung là 128x16
img
Và đây là file RPG.java của chúng ta
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\RPG.java

<?php
import javax
.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class 
RPG extends Canvas{
    
//các biến này bao gồm kích thước màn hình w,h, khung hiện tại hiện thị f, phím nhấn k
    
int w,h,f=2,k;
    
//biến thời gian ghi lại mốc thời gian di chuyển cuối cùng
    
long lm=0;
    
//nhân vật được tạo qua lớp Sprite là có sẵn trong GameCanvas
    
Sprite nv;
    
//hình ảnh sử dụng
    
Image im;
  public 
RPG(){
  
setFullScreenMode(true);
  
w=getWidth();
  
h=getHeight();
  try{
      
//tạo hình ảnh trước
  
im=Image.createImage("/nv.png");
  
//tạo Sprite sau khi đã có hình ảnh, mỗi khung nhỏ là 16x16
  
nv=new Sprite(im,16,16);}catch(Exception e){}}
  public 
void paint(Graphics g){
      
//lệnh tô màn hình
  
g.setColor(0);
  
g.fillRect(0,0,w,h);
  
//hàm xử lí di chuyển theo phím bấm
  
move();
  
//vẽ nhân vật ra màn hình thông qua hàm paint có sẵn của lớp Sprite
  
nv.paint(g);
  
//cho vẽ lại
  
repaint();}
  public 
void keyPressed(int k){this.k=k;}
  public 
void keyReleased(int k){this.k=0;}
  
//hàm di chuyển sẽ xữ lí phím bấm k để xác định khung của nhân vật
  
void move(){
      
//ở đây cho kiểm tra nếu lần di chuyển cuối cùng cách thời gian hiện tại 20 milli giây thì cho di chuyển tiếp.
  
if(lm<curr()-20&&k!=0){
      
//công thức xử lí phím và khung hiện tại để cho ra khung ảnh phù hợp, bạn tự thế vào và xem nó có đúng không nhé.
      
f=f%2==0?(-k-1)*2+1:(-k-1)*2;
      
//sau khi di chuyển thì cho mốc thời gian lần cuối thay đổi.
      
lm=curr();
  }
  
//đặt giá trị khung ảnh và vị trí nhân vật trên màn hình.
  
nv.setFrame(f);
  
nv.setPosition(w/2,h/2);
  }
  
//hàm trả về thời gian hiện tại, do sử dụng nhiều lần nên làm riêng một hàm cho khõi phải mất công viết lại.
  
long curr(){return System.currentTimeMillis();}
}
?>

Copy code

Chúng ta cũng cần một Midlet.java để ứng dụng hoạt động được.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\Midlet.java
<?php
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;
public class 
Midlet extends MIDlet {

    public 
void startApp() {
   
Display.getDisplay(this).setCurrent(new RPG()); }
    
    public 
void pauseApp() {
    }
    
    public 
void destroyApp(boolean unconditional) {
    }
}
?>

Copy code

Kết quả đây :

img


Source: RPG-49912.zip
Jar: RPG-44072.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:34:34, 01-06-2016

Trò chơi trúc xanh
hôm nay tôi sẽ giới thiệu với các bạn một trò chơi khác nữa, đó là trò chơi lật các ô hình để tìm ra những cặp hình giống nhau. Trò chơi này chắc cũng quen thuộc với các bạn qua chương trình trúc xanh phát trên htv7 nhỉ. Chúng ta có file trucxanh.java ban đầu như sau:
C:\Users\thanhliem\Documents\NetBeansProjects\trucxanh\src\trucxanh.java

<?php
import javax
.microedition.lcdui.*;
import java.util.*;

public class 
trucxanh extends Canvas{
    
//mảng chứa các mảnh hình
byte[[ board;
//các biến bao gồm: tọa độ khung chọn(x,y), vị trí đã chọn(sx,sy), giá trị chọn(ff)
int x,y,sx,sy,w,h,ff=-1;
Midlet m;
    public 
trucxanh(Midlet m) {
        try {
setFullScreenMode(true);
w=getWidth();
h=getHeight();
this.m=m;
//hàm general, tạo ra một mảng mới với các cặp giá trị.
general(4,3);
        } catch (
Exception e) {
        }
    }


    public 
void paint(Graphics g) {
g.setColor(0);
g.fillRect(00wh);
g.setColor(0x00ff00);
//nếu như mảng không rỗng thì vẽ bảng
if(board!=null)
    
//lần lượt cho hàng i
for(int i=0;i<board.length;i++){
    
//lần lượt cho cột j
for(int j=0;j<board[0.length;j++){
    
//nếu giá trị tìm được trong bảng khác -1 thì vẽ ra
    
if(board[i[j!=-1)
g.drawString(""+board[i[j,10+j*16,10+i*16,0);}}
//nếu giá trị đã chọn khác -1 thì vẽ khung đã chọn vị trí sx,sy
if(ff!=-1){
g.setColor(0xff0000);
g.drawRect(10+sx*1610+sy*161616);
}
//vẽ khung lựa chọn tại vị trí x,y
g.setColor(0x0000ff);
g.drawRect(10+x*1610+y*161616);
repaint();
    }
//hàm nhấn phím
    
protected void keyPressed(int k) {
    switch(
k){
        case -
1:
            
y--;
    break;
    case -
2:
        
y++;
    break;
    case -
3:
        
x--;
    break;
    case -
4:
        
x++;
    break;
    case -
5:
        
//nếu chưa chọn (ff==-1) thì cho giá trị vào ff, sx, sy
        
if(ff==-1)
        {if(
board[y[x!=-1){sx=xsy=yff=board[y[x;}}
        
//ngược lại thì cho so sánh giá trị đã chọn và giá trị vừa chọn
        
else
        {if(
board[y[x==ff){board[y[x=board[sy[sx=-1ff=-1;}else{ff=-1;}}
    break;}
    
//các công thức này đảm bảo khung lựa chọn không đi ra ngoài bảng
    
if(x==board[0.length)x=0;
    if(
x<0)x=board[0.length-1;
    if(
y==board.length)y=0;
    if(
y<0)y=board.length-1;
    
    }


//hàm general sử dụng 2 tham số cột c và hàng r
    
void general(int c,int r){
        
Random rd=new Random();
        
//nếu như một trong 2 số chia hết cho 2 tức là bảng có thể chia cặp
    
if(c%2==0||r%2==0){
        
board=new byte[r[c;
        
//tạo vector chứa các vị trí còn trống
    
Vector v=new Vector();
    
//cho các giá trị vị trí còn trống vào vector
    
for(int i=0;i<c*r;i++){
    
v.addElement(""+i);}
    
//do bảng là một bảng cặp số nên ta chỉ cần tính nửa số bảng. mỗi lần ta tìm ra giá trị của cặp số, đồng thời cũng tìm giá trị vị trí cho cặp số.
    
for(int i=0;i<c*r/2;i++){
        
//tìm số ngẫu nhiên.
        
int rand=Math.abs(rd.nextInt());
        
//giá trị mà cặp số sẽ mang.
        
int tile=rand%4;
        
//vị trí số thứ nhất.
        
int fp=rand%v.size();
        
//hàm insertboard tự động điền vào bảng giá trị tại vị trí nhất định.
        
insertboard(Integer.parseInt((String)v.elementAt(fp)),tile);
        
//sau đó vị trí đó không tồn tại nữa, ta bỏ nó ra khỏi vector chỗ trống.
        
v.removeElementAt(fp);
        
//tương tự ta có vị trí của số thứ 2.
        
int sp=rand%v.size();
        
insertboard(Integer.parseInt((String)v.elementAt(sp)),tile);
        
v.removeElementAt(sp);
    }
    }}
    
//hàm insert board, đây sẽ chèn vào bảng một giá trị tại một vị trí nhất định.
    
void insertboard(int xy,int v){
    
//bảng có bao nhiêu đối tượng ta sẽ có thể tính ra hàng và cột mà một vị trí số đang ở.
    
int c=xy%board[0.length;
    
int r=(xy-c)/board[0.length;
    
board[r[c=(byte)v;}
}
?>

Copy code

Và chúng ta cũng có một file Midlet.java để hiện thị nó ra màn hình như sau:
C:\Users\thanhliem\Documents\NetBeansProjects\trucxanh\src\Midlet.java
<?php
import javax
.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class 
Midlet extends MIDlet {

    public 
void startApp() {
    
Display.getDisplay(this).setCurrent(new trucxanh(this));}
    
    public 
void pauseApp() {
    }
    
    public 
void destroyApp(boolean unconditional) {
    }
}
?>

Copy code

Và kết quả ta được như thế này:
img

Source: src-29988.zip
Jar: trucxanh-60143.jar
nhưng như thế thì chỉ dành cho trẻ con chơi thôi và cũng chưa giống gì với trúc xanh nhỉ, vì nó rõ như ban ngày vậy. thế nên ta cần có hình ảnh vào cho nó đẹp đẽ một chút và cũng làm sao để người chơi phải đoán xem đâu mới là cặp hình đúng. Ta cần thêm một file hình ảnh tile.png
img
và trucxanh.java trở thành thế này, rất đơn giản thôi.
C:\Users\thanhliem\Documents\NetBeansProjects\trucxanh\src\trucxanh.java
<?php
import javax
.microedition.lcdui.*;
import java.util.*;

public class 
trucxanh extends Canvas{
    
//mảng chứa các mảnh hình
byte[[ board;
//các biến bao gồm: tọa độ khung chọn(x,y), vị trí đã chọn(sx,sy), giá trị chọn(ff)
//cũng thêm biến số lượt sai có thể lost và số lần chọn đúng right.
int x,y,sx,sy,w,h,ff=-1,lost=2,right=0;
Midlet m;
//hình ảnh dùng để vẽ các mảnh ảnh khác nhau
Image im;
    public 
trucxanh(Midlet m) {
        try {
setFullScreenMode(true);
w=getWidth();
h=getHeight();
this.m=m;
//hàm general, tạo ra một mảng mới với các cặp giá trị.
general(4,3);
//tạo hình ảnh từ file nguồn
im=Image.createImage("/tile.png");
        } catch (
Exception e) {
        }
    }


    public 
void paint(Graphics g) {
g.setColor(0);
g.fillRect(00wh);
g.setColor(0x00ff00);
//nếu như mảng không rỗng thì vẽ bảng
if(board!=null)
    
//lần lượt cho hàng i
for(int i=0;i<board.length;i++){
    
//lần lượt cho cột j
for(int j=0;j<board[0.length;j++){
    
//nếu giá trị tìm được trong bảng khác -1 thì vẽ ra
    
if(board[i[j!=-1){
        
//thay vì vẽ số của ảnh ta tô màu cho nó thành màu đỏ
g.fillRect(10+j*3210+i*323131);}}}
//nếu giá trị đã chọn khác -1 thì vẽ khung đã chọn vị trí sx,sy
if(ff!=-1){
g.setColor(0xff0000);
g.drawRect(10+sx*3210+sy*323232);
//tìm ra vị trí mảnh ảnh trong ảnh gốc, mỗi mảnh là 32x32
int c=ff%(im.getWidth()/32);
int r=(ff-c)/(im.getWidth()/32);
//sau đó dùng cách vẽ 1 phần ảnh gốc theo vị trí tìm được
g.drawRegion(imc*32r*323232010+sx*3210+sy*320);
}
//vẽ khung lựa chọn tại vị trí x,y
g.setColor(0x0000ff);
g.drawRect(10+x*3210+y*323232);
//vẽ số lượt sai có thể chọn
g.drawString("rest:"+lost,0,h,Graphics.BOTTOM|Graphics.LEFT);
repaint();
//tính toán và hiển thị kết quả
if(lost<=0){g.drawString("you lost!",w/2,h/2,0);}
if(
right==board[0.length*board.length/2){g.drawString("you win!",w/2,h/2,0);}
    }
//hàm nhấn phím
    
protected void keyPressed(int k) {
    switch(
k){
        case -
1:
            
y--;
    break;
    case -
2:
        
y++;
    break;
    case -
3:
        
x--;
    break;
    case -
4:
        
x++;
    break;
    case -
5:
        
//nếu chưa chọn (ff==-1) thì cho giá trị vào ff, sx, sy
        
if(ff==-1)
        {if(
board[y[x!=-1){sx=xsy=yff=board[y[x;}}
        
//ngược lại thì cho so sánh giá trị đã chọn và giá trị vừa chọn
        
else
        {if(
board[y[x==ff){board[y[x=board[sy[sx=-1ff=-1right++;}else{ff=-1lost--;}}
    break;}
    
//các công thức này đảm bảo khung lựa chọn không đi ra ngoài bảng
    
if(x==board[0.length)x=0;
    if(
x<0)x=board[0.length-1;
    if(
y==board.length)y=0;
    if(
y<0)y=board.length-1;
    
    }


//hàm general sử dụng 2 tham số cột c và hàng r
    
void general(int c,int r){
        
Random rd=new Random();
        
//nếu như một trong 2 số chia hết cho 2 tức là bảng có thể chia cặp
    
if(c%2==0||r%2==0){
        
board=new byte[r[c;
        
//tạo vector chứa các vị trí còn trống
    
Vector v=new Vector();
    
//cho các giá trị vị trí còn trống vào vector
    
for(int i=0;i<c*r;i++){
    
v.addElement(""+i);}
    
//do bảng là một bảng cặp số nên ta chỉ cần tính nửa số bảng. mỗi lần ta tìm ra giá trị của cặp số, đồng thời cũng tìm giá trị vị trí cho cặp số.
    
for(int i=0;i<c*r/2;i++){
        
//tìm số ngẫu nhiên.
        
int rand=Math.abs(rd.nextInt());
        
//giá trị mà cặp số sẽ mang.
        
int tile=rand%4;
        
//vị trí số thứ nhất.
        
int fp=rand%v.size();
        
//hàm insertboard tự động điền vào bảng giá trị tại vị trí nhất định.
        
insertboard(Integer.parseInt((String)v.elementAt(fp)),tile);
        
//sau đó vị trí đó không tồn tại nữa, ta bỏ nó ra khỏi vector chỗ trống.
        
v.removeElementAt(fp);
        
//tương tự ta có vị trí của số thứ 2.
        
int sp=rand%v.size();
        
insertboard(Integer.parseInt((String)v.elementAt(sp)),tile);
        
v.removeElementAt(sp);
    }
    }}
    
//hàm insert board, đây sẽ chèn vào bảng một giá trị tại một vị trí nhất định.
    
void insertboard(int xy,int v){
    
//bảng có bao nhiêu đối tượng ta sẽ có thể tính ra hàng và cột mà một vị trí số đang ở.
    
int c=xy%board[0.length;
    
int r=(xy-c)/board[0.length;
    
board[r[c=(byte)v;}
}
?>

Copy code


img


Source: src-83170.zip
Jar: trucxanh-43462.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:30:09, 01-06-2016

the Sky Fall
Không phải là phim đâu, mà là một trò chơi đơn giản: nhân vật của chúng ta sẽ rơi xuống vào một rừng mũi tên đang bắn lên, chúng ta sẽ điều khiển để nhân vật đừng chạm vào mũi tên nào hết. các bạn cần có 3 file sau, tôi đã chú thích trong từng file hết rồi, chắc các bạn cũng hiểu thôi. Đầu tiên là file muiten.java
C:\Users\thanhliem\Documents\NetBeansProjects\SkyFall\src\muiten.java


<?php
import javax
.microedition.lcdui.*;
import java.util.*;

public class 
muiten {
//các biến: độ rộng màn hình, cao màn hình, vị trí x, vị trí y, chiều dài mũi tên, tốc độ mũi tên
    
int whxylenspeed;
    
//biến chỉ mốc thời gian di chuyển lần cuối
    
long lm 0;
//    biến số ngẫu nhiên
    
Random rd = new Random();
    
//biến đầu mũi tên, và biến đuôi mũi tên dùng vẽ hình mũi tên
    
byte[[ mim = {
        {
010},
        {
111}},
            
dim = {{101}};
//hàm khởi tạo nhận các giá trị rộng,cao màn hình và một số nguyên ngẩu nhiên
    
public muiten(int wint hint rd) {
        
this.w;
        
this.h;
        
this.rd = new Random(rd);
        
//dùng hàm general để khởi tạo
        
general();
    }
//hàm general xác định tọa độ x, y chiều dài và tốc độ ngẫu nhiên cho mũi tên
    
public void general() {
        
//hàm Math.abs(số nguyên) chỉ sang trị tuyệt đối, nextInt là lấy số nguyên ngẫu nhiên, dấu % là phép chia lấy dư.
        
Math.abs(rd.nextInt()) % w;
        
3;
        
len Math.abs(rd.nextInt()) % (10);
        
speed Math.abs(rd.nextInt()) % 2;
    }

    public 
void draw(Graphics g) {
        
//lấy màu hiện tại lưu lại vào ocl
        
int ocl g.getColor();
        
//dặt màu mới
        
g.setColor(ocl 0xff);
        
//cho vẽ mũi tên qua hàm drawmuiten
        
drawmuiten(g);
        
//đặt lại màu cũ
        
g.setColor(ocl);
        
//kiểm tra nếu như cách khoảng 20 mili giây từ lần cuối di chuyển lm thì cho mũi tên di chuyển tiếp
        
if (lm System.currentTimeMillis() - 20) {
            
-= speed;
            
lm System.currentTimeMillis();
        }
        
//nếu như tọa độ y bé hơn -h/10 thì cho tạo lại mũi tên.
        
if (< -10) {
            
general();
        }
    }
//hàm check dùng để kiểm tra xem nhân vật và mũi tên có chạm nhâu không, gồm tọa độ x,y của nhân vật và độ cao rộng của nhân vật
    
boolean check(int xint yint wint h) {
        
int sx = (this.x);
        
int sy = (this.y);
        if (
sx && sy && sx <= && sy <= h) {
            return 
true;
        }
        return 
false;
    }
//hàm vẽ mũi tên sẽ vẽ mũi tên theo tọa độ của nó
    
public void drawmuiten(Graphics g) {
        
//vẽ đầu mũi tên
        
for (int i 0mim.lengthi++) {
            for (
int j 0mim[0.lengthj++) {
                if (
mim[i[j != 0) {
                    
g.fillRect(ji11);
                }
            }
        }
        
//vẽ thân mũi tên
        
g.drawLine(1y1len);
        
//vẽ đuôi mũi tên
        
for (int i 0dim.lengthi++) {
            for (
int j 0dim[0.lengthj++) {
                if (
dim[i[j != 0) {
                    
g.fillRect(jlen i11);
                }
            }
        }
    }
}
?>

Copy code

Tiếp theo đó là file skyfall.java:
C:\Users\thanhliem\Documents\NetBeansProjects\SkyFall\src\skyfall.java

<?php
import javax
.microedition.lcdui.*;
import java.util.*;

public class 
skyfall extends Canvas {
//biến mt chứa các mũi tên sẽ bay lên từ dưới màn hình
    
muitenmt = new muiten[10;
    
Midlet m;
    
//biến ngẩu nhiên rd
    
Random rd = new Random();
    
//các biến: rộng cao màn hình, tọa độ x, y của nhân vật, biến t số ngẩu nhiên, phím bấm k
    
int whxy0k;
    
//hình ảnh nhân vật dùng để vẽ
    
Image man;
    
//các biến đúng sai: di chuyển, chẳn lẻ, kết thúc
    
boolean move falsechan trueover false;
    
//biến mốc di chuyển lần cuối để tính khoảng thời gian di chuyển
    
long lm;

    public 
skyfall(Midlet m) {
        try {
            
this.m;
            
setFullScreenMode(true);
            
//tạo ra các phân tử mũi tên cho mảng mt
            
for (int i 0mt.lengthi++) {
                
//gồm chiều rộng cao màn hình và một số nguyên ngẫu nhiên
                
mt[i = new muiten(getWidth(), getHeight(), t);
                
rd.nextInt();
            }
            
//ban đầu cho tọa độ nhân vật ở giữa màn hình
            
getHeight() / 2;
            
getWidth() / 2;
            
//tạo ra hình ảnh nhân vật là ảnh 32x32
            
man Image.createImage("/man.png");
        } catch (
Exception e) {
        }
    }

    public 
void paint(Graphics g) {
        
//kiểm tra xem đã bị trúng tên chưa
        
over over();
        
//xét xem lần di chuyển cuối cùng và có di chuyển tiếp không, hàm System.currentTimeMillis() dùng lấy thời gian hiện tại ở dạng mili giây.
        
if (move && lm System.currentTimeMillis() - 10) {
            if (
== -|| == KEY_NUM4) {
                
x--;
            }
            if (
== -|| == KEY_NUM6) {
                
x++;
            }
            
//sau đó gán giá trị thời gian hiện tại cho biến lm
            
lm System.currentTimeMillis();
        }
        
//đặt màu mới và tô màn hình
        
g.setColor(0x90b5ff);
        
g.fillRect(00getWidth(), getHeight());
        
//hàm vẽ này vẽ ra một phần của hình ảnh, bao gồm: hình ảnh, tọa độ x trên ảnh, tọa độ y trên ảnh, chiều rộng cần vẽ, chiểu cao cần vẽ, quay góc, tọa độ vẽ x, tọa độ vẽ y, điểm neo.
        
g.drawRegion(manchan 16016320xyGraphics.TOP Graphics.LEFT);
        
//sau đó cho biến chẳn lẻ thay đổi, nếu chẳn thì thành lẻ và ngược lại
        
chan = !chan;
        
//đặt màu mới, vẽ các phần tử muiten trong mảng mt
        
g.setColor(0xff);
        for (
int i 0mt.lengthi++) {
            
mt[i.draw(g);
        }
        
//nếu kết thúc over=true thì cho dừng lại, không thì vẽ tiếp.
        
if (over) {
        } else {
            
repaint();
        }
    }
//hàm over kiểm tra xem có chạm nhân vật và muiten không
    
boolean over() {
        for (
int i 0mt.lengthi++) {
            if (
mt[i.check(xy1632)) {
                return 
true;
            }
        }
        return 
false;
    }
//hàm xử lí phím, bấm phím nào thì cho k= mã phím đó
    
public void keyPressed(int k) {
        
move true;
        
this.k;
        if (
== -7) {
            
//hàm notifyDestroyed của MIDlet dùng để đóng ứng dụng.
            
m.notifyDestroyed();
        }
    }
//nếu buông nút bấm thì không cho di chuyển nữa.
    
public void keyReleased(int k) {
        
move false;
    }
}
?>

Copy code

Và cuối cùng là cho hiển thị thông qua một Midlet.java như ta vẫn thường hay dùng:
C:\Users\thanhliem\Documents\NetBeansProjects\SkyFall\src\Midlet.java
<?php
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 * @author thanhliem
 */
public class Midlet extends MIDlet {

    public 
void startApp() {
        
Display.getDisplay(this).setCurrent(new skyfall(this));
    }

    public 
void pauseApp() {
    }

    public 
void destroyApp(boolean unconditional) {
    }
?>

Copy code

Các bạn thấy đó, rất là đơn giản phải không nào, để trò chơi thêm phần hấp dẫn bạn có thể thêm biến điểm tính theo lượt những mũi tên được tạo lại sau mỗi lần general mới, trong muiten.java hay là thêm thắt những thứ khác nữa như mạng, vật phẩm chẳng hạn.
img


Source: SkyFall-27614.zip
Jar: SkyFall-63031.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:26:10, 01-06-2016

trò chơi chó cắn
Cờ chó cắn chắc là cờ đơn giản nhất mà tôi từng chơi khi còn nhỏ và ở bất cứ đâu cũng có thể chơi được. nó còn đơn giản hơn là tic tac toe nữa đấy, và hôm nay tôi sẽ hướng dẫn viết một bàn cờ chó cắn đơn giản. đầu tiên là quân cờ chó cắn, gồm có các thông tin sau:
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\tree.java

<?php
public class tree {
    
//vị trí hiện tại của quân cờ và màu của quân cờ
     
int position,color;
     
//hàm khởi tạo nhận giá trị vị trí và màu quân cờ
     
public tree(int pos,int color){
     
this.position=pos;
     
this.color=color;}
 }
?>

Copy code

Còn đây là file banco.java dùng để tiến hành các lệnh vẽ theo game, điều kiện trò chơi, cách chơi….
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\banco.java
<?php
import javax
.microedition.lcdui.*;
import java.util.*;

public class 
banco extends Canvas {
    
Midlet m;
    
//biến các điểm tọa độ của bàn cờ
    
int[[ moc;
    
//biến các điểm có thể di chuyển trên bàn cờ
    
booleanfree=new boolean[5;
    
int w,h,dx,dy,k;
    
boolean mot=true,finish=false,win=false;
    
//biến các quân cờ, vị trí của ta là 0, 2 của máy là 1, 3
    
treequan;
    
//biến rd này dùng để chọn ngẫu nhiên nhân vật tự động
    
Random rd=new Random();
    public 
banco(Midlet m){
    
setFullScreenMode(true);
    
w=getWidth(); h=getHeight();
    
//điểm vẽ bàn cờ
    
dx=(w-128)/2;
    
dy=(h-128)/2;
    
//tạo các tọa độ vẽ bàn cờ, 128x128
    
moc=new int[5[2;
    for(
int i=0;i<2;i++){
    for(
int j=0;j<2;j++){
    
moc[i*2+j[0=i*128;
    
moc[i*2+j[1=j*128;}}
    
moc[4[0=64;
    
moc[4[1=64;
    
//tạo các quân cờ ban đầu, của ta là số chẵn 0, 2
    
quan=new tree[4;
    for(
int i=0;i<quan.length;i++){
        
//các điểm đặt quân không còn trống, không thể di chuyển vào
        
free[i=false;
        
//đặt màu cho các quân cờ, quân ta màu xanh lá 0, 2 chia hết cho 2
        
quan[i=new tree(i,i%2==0?0x00f000:0x0000f0);}
    
//điểm còn lại chưa đặt quân cờ trống là ở giữa bàn cờ vị trí 4
    
free[4=true;
    
this.m=m;}
    public 
void paint(Graphics g){
    
g.setColor(0);
    
g.fillRect(0,0,w,h);
    
//vẽ bàn cờ
    
vebanco(g);
    
//vẽ quân cờ
    
vequanco(g);
    
g.setColor(0xf000f0);
    
//nếu kết thúc thì vẽ kết quả
    
if(finish)
    
g.drawString(win?"you win!":"you lose!",w/2,h,Graphics.BOTTOM|Graphics.HCENTER);
    
//vẽ hướng dẫn chơi game
    
g.drawString("nhấn 5 để di chuyển.",w/2,0,Graphics.TOP|Graphics.HCENTER); 
    
g.drawString("nhấn * để thay đổi đối tượng",w/2,0+g.getFont().getHeight(),Graphics.TOP|Graphics.HCENTER);
    
repaint();
    }
    protected 
void keyPressed(int k){
        
//nếu mot==true thì ta điều khiển quân 0, sai ta điều khiển quân 2
        //tìm ra vị trí trống có thể đi tiếp
        
int focus=mot?0:2,move=free();
        
//nếu chưa xong game thì cho di chuyển
        
if(!finish)
            
//nếu như bấm phím 5 thì cho di chuyển
    
if(k==KEY_NUM5||k==-5)
        
//nếu di chuyển được thì cho auto di chuyển
    
if(move(focus,move)){
    
auto();}
    
//nếu không thì chuyển qua quân còn lại di chuyển, nếu được thì auto di chuyển
    
else if(move(focus==0?2:0,move)){
    
auto();
    }
    
//ngược lại thì thua và kết thúc trò chơi
    
else{finish=truewin=false;}
        
//nhấn phím * để thay đổi đối tượng điều khiển
   
if(k==KEY_STAR)mot=!mot;}
    
    
//di chuyển nhân vật tự động
    
void auto(){
        
//tìm ra vị trí còn trống
    
int move=free();
    
//chọn ngẫu nhiên nhân vật tự động giữa 1 và 3
    
int focus=rd.nextInt()%2==0?1:3;
    
//cho di chuyển, nếu 1 không di chuyển thì chuyển qua 3 và ngược lại
    
if(move(focus,move)){}else{
        
//nếu cả 1 và 3 đều không còn di chuyển được nữa thì kết thúc trò chơi, người chơi thắng
        
if(!move(focus==1?3:1,move)){
        
finish=true;
        
win=true;}}}
    
    
//vẽ bàn cờ
   
void vebanco(Graphics g){
   
g.setColor(0xf0f000);
   
//vẽ 2 gạch chéo bàn cờ
   
g.drawLine(dx+moc[0[0,dy+moc[0[1,dx+moc[3[0,dy+moc[3[1);
   
g.drawLine(dx+moc[1[0dy+moc[1[1,dx+moc[2[0dy+moc[2[1);
   
//vẽ khung vuông bàn cờ
   
g.drawRect(dxdy128128);
   
//vẽ nơi dành cho con chó, chữ "chó"
   
g.drawString("chó",dx+64,dy,Graphics.BASELINE|Graphics.HCENTER);
    }
   
   
//vẽ các quân cờ
   
void vequanco(Graphics g){
       
//xác định đối tượng đang chọn, 0 hay là 2
       
int focus=mot?0:2;
   for(
int i=0;i<4;i++){
       
//tìm ra vị trí hiện tại của quân được chọn
       
int pos=quan[i.position;
       
//vẽ con trỏ chọn đối tượng
       
if(i==focus){
       
g.setColor(0xf00000);
       
g.fillArc(dx+moc[pos[0-9dy+moc[pos[1-918180360);}
       
g.setColor(quan[i.color);
   
g.fillArc(dx+moc[pos[0-8dy+moc[pos[1-816160360);
   }
   }
   
   
//kiểm tra xem có thể chuyển từ vị trí này tới vị trí trống được ko
   
boolean cango(int pos,int npos){
   if(
pos==1&&npos==2)return false;
   if(
pos==2&&npos==1)return false;
   if(
pos==0&&npos==3)return false;
   if(
pos==3&&npos==0)return false;
   if(
pos==0&&npos==2)return false;
   if(
pos==2&&npos==0)return false;
   return 
true;}
   
   
//tìm ra vị trí còn trống
   
int free(){
       
//kiểm tra trong mảng free xem có vị trí nào trống thì trả lại
       
for(int i=0;i<5;i++){
   if(
free[i)return i;}
   return 
0;}
   
   
//cho di chuyển và nếu di chuyển được thì trả lại giá trị đúng sai
   
boolean move(int pos,int npos){
       if(
cango(quan[pos.position,npos)){
           
//đặt vị trí đang đứng thành trống
       
free[quan[pos.position=true;
       
//cho chuyển sang vị trí mới
       
quan[pos.position=npos;
       
//đặt vị trí mới không còn trống nữa
       
free[quan[pos.position=false;
       return 
true;}
   return 
false;}
}
?>

Copy code

Và cũng cần có file Midlet.java để ứng dụng có thể hiện thị được. Cái này thì cũng đơn giản và quen quá rồi.
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\Midlet.java
<?php
public class Midlet extends MIDlet {

    public 
void startApp() {
        
Display.getDisplay(this).setCurrent(new banco(this));
    }
    
    public 
void pauseApp() {
    }
    
    public 
void destroyApp(boolean unconditional) {
    }
}
?>

Copy code


Source: Tree-99352.zip
Jar: Tree-17566.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:22:01, 01-06-2016

nhận thông tin từ những người chơi khác
Bài này sẽ là kết thúc của hướng dẫn về sự kết hợp giữa php và j2me, những ứng dụng trực tuyến ngày càng cho thấy hiệu quả của nó trong thời đại công nghệ thông tin. Bạn không thể nào thiếu internet trong một ngày và chiếc di động là thứ hỗ trợ đắc lực nhất, ứng dụng web luôn không làm cho người sử dụng phải nhàm chán vì tính mới mỗi ngày của nó. Tôi cũng kì vọng vào sức mạnh của di động như về j2me thì không còn nhiều nữa, ngày nay android và ios ngày càng chiếm lĩnh trên thị trường di động nhất là android. Có thể một ngày nào đó những bài viết này chỉ là vô ích, nhưng ít nhất là tôi đã viết nó, bằng những kiến thức của mình và hy vọng điều gì đó. Do form get.html và server.php mà tôi đã viết có sự lựa chọn để chỉ hiện thị thông tin về những người chơi khác chứ không cho phép lấy về thông tin của nhân vật của ta. Do đó, ít nhất bạn phải có thêm một ai đó nữa cùng đăng nhập vào một id khác thì các bạn mới nhìn thấy kết quả của việc nhận dữ liệu. Ta thêm một biến dt (String) nữa và sẽ nhận dữ liệu vào đây, đồng thời vẽ ra màn hình. Class canvas sẽ thành thế này:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java

<?php
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
    
String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,0);
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);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(
rb!=null)
for(
int i=0;i<rb.size();i++)
((
robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public 
void keyPressed(int k){
this.k=k;
if(
k==-5){
command=tf.getString();
Stringacommand=tach(command,".");
Vector trb=new Vector();
for(
int i=0;i<acommand.length;i++){
    
Stringinfo=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;}
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(
k==-3){me.nx=me.x-5;}
if(
k==-2){me.ny=me.y+5;}
if(
k==-1){me.ny=me.y-5;}
}
public 
void keyReleased(int k){this.k=0;}

public 
Stringtach(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);}
Stringrt=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(Strings){
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);}
}
?>

Copy code

Đồng thời mog.java cũng thay đổi như sau đây:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
public class mog extends MIDlet implements Runnable{
    
//tạo biến nhận giá trị của user và pass
    
String user,pass;
    
    
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
    
int id,mode=0;
    
canvas cv=new canvas();
public 
void startApp(){
    
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public 
void destroyApp(boolean t){}
public 
void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok 
public void cv(String user,String pass){
    
this.user=user;
    
this.pass=pass;
    
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
   
String stsend("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
   
//nếu như trả về dữ liệu khác null thì cho hiện canvas.
   
id=Integer.parseInt(st.substring(3));
   if(
id>0){
Display.getDisplay(this).setCurrent(cv);
//chuyển mode sang 3, và cho khởi động thread
mode=3;
   new 
Thread(this).start();}}
//khi thread khởi động nó sẽ không dừng lại
public void run(){
    while(
true){
        try{
            
//cho ngừng một khoảng thời gian (500millis) sau mỗi lần gửi thông tin lên server
            
Thread.sleep(500);
switch(
mode){
    case 
1:
break;
    case 
2:
break;
    case 
3:
        
//thông qua hàm send gửi các thông tin gồm: id, mess, x, y lên server.
        
send("http://holyeyed.99k.org/game/server.php","submit=3&id="+id+"&mess=holyeyed&x="+cv.me.x+"&y="+cv.me.y);
//cùng lúc gửi thông tin lên server, ta cho nhận dữ liệu về luôn một thể, submit=4 cùng với id
        
cv.dt=send("http://holyeyed.99k.org/game/server.php","submit=4&id="+id);
        break;}}catch(
Exception e){}}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type"
           
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((
c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return 
sb.toString();
}catch(
Exception e){}
return 
null;}}
?>

Copy code

Kết quả ta được như sau:
img
Bây giờ ta sẽ chuyển dt (String) trong cv (canvas) thì mã lệnh dùng cho điều khiển các biến robot như ta đã làm lúc trước, dữ liệu nhận về như bạn thấy trên hình trên bao gồm: Mã BOM | id | user name | chuỗi | x | y # id | username | chuỗi | x |y #.... Class robot.java của ta sẽ thay đổi để nhận thêm nhiều giá trị hơn như sau:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
class robot{
int x,y,nx,ny,id;
String say,user;
long lm=0;
//class robot bây giờ có 4 tham số khởi tạo: id, user, x ,y
public robot(int id,String user,int x,int y){
    
this.id=id;
    
this.user=user;
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public 
void getcommand(Strings){
say=s[2;
nx=Integer.parseInt(s[3);
ny=Integer.parseInt(s[4);
}
public 
void paint(Graphics g){
if(
System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
//vẽ thêm username cho dễ phân biệt
g.drawString(user,x,y-16,Graphics.TOP|Graphics.LEFT);
}

void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}

}
?>

Copy code

Trong canvas.java cũng có những thay đổi, cụ thể là ta tách việc [phân tích dữ liệu gửi về vào hàm khac(), và cho vào trong vòng lặp paint(g), như vậy sẽ làm cho mọi thứ trở nên liên tục hơn. Ta cũng cần chú ý, bây giờ khởi tạo biến robot phải cần tới 4 tham số, cho nhân vật của ta có id=0, user=”me”, x=0, y=0:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
    
String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,"me",0,0);
public 
canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public 
void paint(Graphics g){
    
//sử dụng hàm khác để phân tích thông tin gửi về.
    
khac();
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);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(
rb!=null)
for(
int i=0;i<rb.size();i++)
((
robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public 
void keyPressed(int k){
this.k=k;

//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(
k==-3){me.nx=me.x-5;}
if(
k==-2){me.ny=me.y+5;}
if(
k==-1){me.ny=me.y-5;}
}
public 
void keyReleased(int k){this.k=0;}

public 
Stringtach(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);}
Stringrt=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;}
//hàm này dùng chuyển nhanh chuỗi thành số nguyên.
int toint(String s){return Integer.parseInt(s);}
//ta thêm một hàm khac với việc phân tích dữ liệu nhận về và vẽ những thông tin đó ra
void khac(){
    
//nếu như thông tin nhận về khác null, và dài hơn 3
    
if(dt!=null&&dt.length()>3){
 
//bỏ mã BOM, lấy từ kí tự thứ 3
command=dt.substring(3);
//tách ra thành những nhân vật khác nhau, cách nhau bằng dấu #
Stringacommand=tach(command,"#");
//tạo một Vector mới để nhận giá trị
Vector trb=new Vector();
for(
int i=0;i<acommand.length;i++){
    
//tách thông tin cho mỗi nhân vật, cách nhau bằng dấu |
    
Stringinfo=tach(acommand[i,"|");
    if(
info!=null){
        
//biến robot bây giờ có tới 4 tham số khởi tạo: id, user , x, y
    
robot nrb=new robot(toint(info[0),info[1,toint(info[3),toint(info[4));
    
//kiểm tra nếu như mà có id nào trong Vector cũ thì dùng lại thông tin đó.
    
for(int j=0;j<rb.size();j++){
        
//ta so sánh id để chắc là duy nhất id đó đại diện cho người chơi đó
    
if(Integer.parseInt(info[0)==(((robot)rb.elementAt(j)).id)){nrb=(robot)rb.elementAt(j);
    
System.out.println("dectect");}}
    
nrb.getcommand(info);
    
//thêm vào Vector mới
trb.addElement((robot)nrb);}}
//cho Vector mới bằng Vector rb
rb=trb;}}
?>

Copy code


Jar: mog-96778.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:19:03, 01-06-2016

Gửi thông tin đến server theo từng đợt
Bài trước chúng ta đã có thể đăng nhập vào một hệ thống thành viên đơn giản, code trước tôi cũng đã post hết mã source của server. Chúng ta ở bài này sẽ sử dụng form send.html và gửi thông tin đến server thông qua form này. Nhưng đầu tiên chúng ta cần tạo ra một nhân vật của mình, tôi cũng sử dụng class robot để tạo nhân vật, nhưng chúng ta sẽ trực tiếp điều khiển nó thông qua phím chứ không phải là mã lệnh nữa. class canvas của chúng ta sẽ thành như thế này:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java

<?php
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="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,0);
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);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public 
void keyPressed(int k){
this.k=k;
if(
k==-5){
command=tf.getString();
Stringacommand=tach(command,".");
Vector trb=new Vector();
for(
int i=0;i<acommand.length;i++){
    
Stringinfo=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;}
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(
k==-3){me.nx=me.x-5;}
if(
k==-2){me.ny=me.y+5;}
if(
k==-1){me.ny=me.y-5;}
}
public 
void keyReleased(int k){this.k=0;}

public 
Stringtach(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);}
Stringrt=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;}
}
?>

Copy code

Xong bây giờ thì chỉnh sửa một chút ở file mog.java để gửi thông tin lên server thông qua hàm send mà ta đã biết. địa chỉ vẫn là địa chỉ cũ, còn thông số thì có thay khác theo form send.html chúng ta đã biết (nghiên cứu html nhé).
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
public class mog extends MIDlet implements Runnable{
    
//tạo biến nhận giá trị của user và pass
    
String user,pass;
    
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
    
int id,mode=0;
    
canvas cv=new canvas();
public 
void startApp(){
    
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public 
void destroyApp(boolean t){}
public 
void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok 
public void cv(String user,String pass){
    
this.user=user;
    
this.pass=pass;
    
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
   
String stsend("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
   
//nếu như trả về dữ liệu khác null thì cho hiện canvas.
   
id=Integer.parseInt(st.substring(3));
   if(
id>0){
Display.getDisplay(this).setCurrent(cv);
//chuyển mode sang 3, và cho khởi động thread
mode=3;
   new 
Thread(this).start();}}
//khi thread khởi động nó sẽ không dừng lại
public void run(){
    while(
true){
        try{
            
//cho ngừng một khoảng thời gian (500millis) sau mỗi lần gửi thông tin lên server
            
Thread.sleep(500);
switch(
mode){
    case 
1:
break;
    case 
2:
break;
    case 
3:
        
//thông qua hàm send gửi các thông tin gồm: id, mess, x, y lên server.
        
send("http://holyeyed.99k.org/game/server.php","submit=3&id="+id+"&mess=holyeyed&x="+cv.me.x+"&y="+cv.me.y);
break;}}catch(
Exception e){}}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type"
           
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((
c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return 
sb.toString();
}catch(
Exception e){}
return 
null;}}
?>

Copy code

Vậy thôi, dù bạn có chạy chương trình thì chỉ có thể thấy là điều khiển được nhân vật hình vuông thôi, chứ không biết nó có gửi thông tin đúng lên server hay không. Nhưng đừng lo, theo lý thuyết là vậy và bạn sẽ biết được là nó có thật sự gửi được hay không thì chờ bài sau nhé.


Source: mog-84566.zip
Jar: mog-57614.jar

Like: 0
avatar by Pham_loi Pham_loi
Chức vụ:
16:16:29, 01-06-2016

một form login đơn giản
có vẻ như bài này không có liên quan gì đến bài trước cả, và cũng đừng có nghĩ là tôi đang chuyển qua nói về lập trình web. Chỉ là có những thứ cần thiết cho quá trình lập trình mà chúng ta cần biết. Chúng ta sẽ có một trang như thế này, code của nó tôi sẽ post cuối bài:
http://holyeyed.99k.org/game/reg.html
http://holyeyed.99k.org/game/get.html
http://holyeyed.99k.org/game/login.html
http://holyeyed.99k.org/game/send.html
trong một lúc chúng ta sẽ phải gửi dữ liệu từ ứng dụng lên server đồng thời cũng nhận từ server về thông tin về những người chơi khác. Chúng ta sẽ tạo một form đăng nhập đơn giản, còn phần đăng kí các bạn tự viết nhé. bây giờ chúng ta hãy chú ý tới midlet của chúng ta. trong một lúc chúng ta sẽ phải gửi dữ liệu từ ứng dụng lên server đồng thời cũng nhận từ server về thông tin về những người chơi khác. Chúng ta sẽ tạo một form đăng nhập đơn giản, còn phần đăng kí các bạn tự viết nhé. File mog.java của chúng ta sẽ như thế này:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
import javax
.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
import java.io.*;
import javax.microedition.io.*;

public class 
mog extends MIDlet implements Runnable{
    
//tạo biến nhận giá trị của user và pass
    
String user,pass;
    
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
    
int id,mode=0;
public 
void startApp(){
    
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public 
void destroyApp(boolean t){}
public 
void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok 
public void cv(String user,String pass){
    
this.user=user;
    
this.pass=pass;
    
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
   
String stsend("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
   if(
st!=null)
Display.getDisplay(this).setCurrent(new canvas());}
public 
void run(){
switch(
mode){
    case 
1:
break;
    case 
2:
break;}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type"
           
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((
c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return 
sb.toString();
}catch(
Exception e){}
return 
null;}}
?>

Copy code

Đó là trong mog.java, còn một file nữa đó là login.java, đây là class mở rộng từ Form và được tạo dựng sẵn có các field và command theo ý mình, khi sử dụng chỉ cần cho khởi tạo và hiện thị, như các bạn thấy ở trong class mog ở trên:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\login.java
<?php
import javax
.microedition.lcdui.*;
//class login là một Form được tạo dựng sẵn
public class login extends Form implements CommandListener {
    
//nó chứa 2 textfield và một command
    
TextField user=new TextField("use","",15,0);
    
TextField pass=new TextField("pass","",15,TextField.PASSWORD);
    
Command ok=new Command("ok",Command.OK,2);
    
mog m;
public 
login(mog m){
    
//do mở rộng từ Form nên khi khởi tạo phải cho nó tiêu đề qua hàm super
    
super("đăng nhập");
this.m=m;
//thêm và các field và command
append(user);
append(pass);
addCommand(ok);
setCommandListener(this);}    
public 
void commandAction(Command c,Displayable d){
    
//khi nhấn phím ok thì nó sẽ chạy hàm cv trong class mog.java và nhận các giá trị từ các field
if(c==ok){m.cv(user.getString(),pass.getString());}}
}
?>

Copy code

• Do càng về sau bài càng phức tạp nên tôi sẽ nói ít thôi, hãy đọc là chính và rồi sẽ hiểu. • Như trên là chúng ta đã tạo ra một ứng dụng login đơn giản với việc đăng kí trên server rồi.
Source: mog-74430.zip
Jar: mog-38525.jar
Html: game-99233.zip

Like: 0
Lên trên  Tổng số: 42
« 1 2 3 4 5 »







Trực Tuyến: Khách: 1
Diễn đàn teen Việt Nam
CopyRight 2014