Chủ Nhật, 10 tháng 2, 2013

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: tree.java
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\tree.java

10 
11 public class tree {
12     //vị trí hiện tại của quân cờ và màu của quân cờ
13     int position,color;
14     //hàm khởi tạo nhận giá trị vị trí và màu quân cờ
15     public tree(int pos,int color){
16     this.position=pos;
17     this.color=color;}
18 }
19 
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…. banco.java
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\banco.java

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ờ
    boolean[] free=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
    tree[] quan;
    //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=true; win=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][0], dy+moc[1][1],dx+moc[2][0], dy+moc[2][1]);
   //vẽ khung vuông bàn cờ
   g.drawRect(dx, dy, 128, 128);
   //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]-9, dy+moc[pos][1]-9, 18, 18, 0, 360);}
       g.setColor(quan[i].color);
   g.fillArc(dx+moc[pos][0]-8, dy+moc[pos][1]-8, 16, 16, 0, 360);
   }
   }
   
   //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;}
}

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. Midlet.java
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\Midlet.java

public class Midlet extends MIDlet {

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

source file jar

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