WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术程序开发MIDP1.0小游戏入门-五子棋1.1

MIDP1.0小游戏入门-五子棋1.1
作者:yinowl  来源:J2MEDV  发布时间:2005-9-7 12:57:48
步棋,在数组相应位置生成该棋子的对象,这样可以避免还没有下的棋子在一开始就占用了系统内存
流程:游戏按照棋子的二维数组进行绘制棋子,玩家下棋后,程序修改数组相应位置,设置isPlayer1值,然后重新绘制(repaint),就更新了棋盘界面。由于游戏的功能简单,也为了使游戏的操作尽可能的简便,我不在游戏进入时设计菜单,而是直接开始对战,在对战界面,设置了重新开始和退出的按钮。即运行即玩,一键开始,一键重来,一键退出。
玩家切换:棋类游戏有一个问题需要注意,就是提示当前由哪方下棋,为了节省界面空间,简化游戏界面,我在棋盘外围加了一个3个像素宽的框,框的颜色就是当前下棋方的颜色,如图:

应用程序类:Gobang.java
接下来就开始完成游戏中的每一个类,首先就是一个MIDlet类。Gobang类继承自MIDlet类,用于连接设备的应用程序管理器(Application Manager),通过方法startApp,pauseApp,destroyApp来通知游戏的开始,暂停和销毁结束。源代码如下:

package com.occo.j2me.game.gobang;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class Gobang extends MIDlet {
    GobangCanvas gobang;//定义游戏界面的Canvas类GobangCanvas的对象gobang
    public Gobang() {
        super();
        gobang=new GobangCanvas(this);//生成GobangCanvas类的对象gobang
    }
    protected void startApp(){
        Display.getDisplay(this).setCurrent(gobang);
          //在屏幕上绘出游戏见面gobang
    }
    protected void pauseApp(){
    }
    protected void destroyApp(boolean arg0){
    }
}

游戏界面类:GobangCanvas.java
GobangCanvas类是游戏的核心类,继承自Canvas,此类将完成游戏的逻辑、绘图、控制、互动等所有功能,此类的框架代码如下:

package com.occo.j2me.game.gobang;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
public class GobangCanvas extends Canvas implements CommandListener{
    protected Gobang gobang;
    public GobangCanvas(){
    }
    public GobangCanvas(Gobang gobang){
        this.gobang=gobang;
    }
    protected void paint(Graphics g) {
    }
}

棋子类:Chesses.java
此类定义了一个棋子,棋盘上的每一个棋子都对应着一个Chesses的对象,整个棋盘是一个Chesses类型的二维数组,源代码如下:

package com.occo.j2me.game.gobang;
    public class Chesses {
    boolean isPlayer1;
    public Chesses() {
    }
    public Chesses(boolean isPlayer1) {
        this.isPlayer1=isPlayer1;
    }
}

添加图形图像
到现在,我们已经完成了游戏的一个基本框架,接下来,我们就可以来绘制游戏的每一个部件了
首先是五子棋的一些初始设置,添加如下代码到GobangCanvas.java

    ...
    int empty;//游戏界面到屏幕边缘的留空
    int canvasW,canvasH;//画布的长和宽
    int chessLength;//棋子的直径
    int chessMapLength,chessMapGrid,chessGridLength;
        //棋盘的边长,棋盘一边格子数,每格宽度
    int chessMapX,chessMapY;//棋盘左上角x,y坐标
    int selectedX,selectedY;//选择框在棋盘格局上的x,y位置
    boolean isPlayer1;//是否是玩家1
    Chesses[][] chesses;//棋子数组
    boolean newGame;//是否是新的游戏
    public GobangCanvas(Gobang gobang){
        newGame=true;
        empty=10;
        canvasW=getWidth()-empty;canvasH=getHeight()-empty;
        chessMapGrid=15;
        chesses=new Chesses[chessMapGrid+1][chessMapGrid+1];
        if(canvasW>canvasH){
            chessMapLength=canvasH-canvasH%chessMapGrid;
            chessMapX=(canvasW-chessMapLength)/2+empty/2;
            chessMapY=(canvasH%chessMapGrid)/2+empty/2;
        }
        else{
            chessMapLength=canvasW-canvasW%chessMapGrid;
            chessMapX=(canvasW%chessMapGrid)/2+empty/2;
            chessMapY=(canvasH-chessMapLength)/2+empty/2;
        }
        chessGridLength=chessMapLength/chessMapGrid;
        chessLength=chessGridLength-1;
        selectedX=selectedY=chessMapGrid/2;
        isPlayer1=true;
    }

最先要绘制的是棋盘,棋盘是正方形,但屏幕有矩形的,所以棋盘边长要按短边计,但短边未必是棋盘格子数的整数倍,因此
棋盘边长 = 短边 - 短边 % 格子数
因为棋盘要居中,所以在算左上角坐标时,记得也要把留空(empty)除以2,以下是画棋盘的代码:

    protected void paintMap(Graphics g){
        for(int i=0;i<chessMapGrid;i++){
            for(int j=0;j<chessMapGrid;j++){
                g.setColor(128,128,128);
                g.drawRect(chessMapX+j*chessGridLength,
                              chessMapY+i*chessGridLength,
                              chessGridLength,chessGridLength);
            }
        }
    }

然后是绘制选择框,注意:选择框的selectedX,selectedY并不是在画布上的x,y坐标,而是在棋子数组(chesses)中的位置,源代码如下:

    protected void paintSelected(Graphics g){
        g.setColor(0,0,255);
        g.drawRect(chessMapX+selectedX*chessGridLength-chessGridLength/2,
                  chessMapY+selectedY*chessGridLength-chessGridLength/2,
                  chessGridLength,chessGridLength);
    }

上一页  [1] [2] [3]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码