亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2ME-MIDP1.0小游戲入門-五子棋1.0

2019-11-17 06:27:28
字體:
來源:轉載
供稿:網友


作者:yinowl
2005年1月

介紹
這是我學習j2me入門后的第一個作品,當然這也是一個極其簡單的作品(沒有電腦AI,只能是兩個人對戰),現在我把當時的設計思路寫成這篇文檔,希望對想入門j2me的朋友在j2me的流程,按鍵響應,繪圖等方面有所幫助,同時也希望大家指出錯誤和改進程序。

注重
代碼列出解釋的形式仿照《J2ME Game PRogramming》一書,按照程序功能思路給出相關代碼,一個文件的代碼會根據功能在不同的小節給出,文章結束了,代碼也就完整了。這不同于通常書中的代碼以文件為單位一次全部給出,我認為這樣更有助于讓大家了解一個程序從設計到最后完成的思路。

設計
數據結構:由于五子棋是一個二維棋類游戲,所有首先想到的是定義一個Chesses類來表示棋子,Chesses有一個boolean型的變量isPlayer1來區分該棋子是哪玩家下的,然后用一個Chess類型的二維數組來包含棋盤上的所有棋子??紤]到移動設備的資源有限,盡可能減少系統資源占用,我考慮不在數組建立后直接生成數組的每一個對象,而是把每一個棋子對象(Chesses)放在游戲的進行中生成,也就是說在游戲進行時,玩家每下一步棋,在數組相應位置生成該棋子的對象,這樣可以避免還沒有下的棋子在一開始就占用了系統內存
流程:游戲按照棋子的二維數組進行繪制棋子,玩家下棋后,程序修改數組相應位置,設置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);
    }


接著是按照棋子二維數組繪制已經下了的棋子。玩家每下一次棋,就修改數組,在重新繪圖的時候就能繪出,源代碼如下:

    protected void paintChesses(Graphics g){
        for(int i=0;i<=chessMapGrid;i++){
            for(int j=0;j<=chessMapGrid;j++){
                if(chesses[i][j]!=null){
                    if(chesses[i][j].isPlayer1)
                        g.setColor(255,255,255);
                    else
                        g.setColor(255,0,0);
                    g.fillArc(chessMapX+j*chessGridLength-chessLength/2,
                            chessMapY+i*chessGridLength-chessLength/2,
                            chessLength,chessLength,0,360);
                }
            }
        }
    }


最后是繪制玩家提示框,并且把所有部件的繪制匯總在paint()方法中,注重繪制的順序,顯而易見,應該先繪制提示框-棋盤-選擇框-棋子:

    protected void paintPlayer(Graphics g,boolean isPlayer1){
        if(isPlayer1)
            g.setColor(255,255,255);
        else
            g.setColor(255,0,0);
        g.drawRect(1,1,getWidth()-2,getHeight()-2);
        g.drawRect(2,2,getWidth()-4,getHeight()-4);
        g.drawRect(3,3,getWidth()-6,getHeight()-6);
    }
    protected void paint(Graphics g) {
        g.setColor(0x00000000);
        g.fillRect(0, 0, getWidth(), getHeight());
        paintPlayer(g,isPlayer1);
        paintMap(g);
        paintSelected(g);
        paintChesses(g);
    }


響應玩家操作
接下來應該添加命令按鈕和游戲操作控制。我們在游戲中需要有兩個按鈕,重新開始和退出,此外還必須接收玩家控制選擇框的操作上下左右和著棋,添加代碼到GobangCanvas.java:

    Command exitCmd;
    Command restartCmd;
    public GobangCanvas(Gobang gobang){
        ...
        restartCmd = new Command("重新開始", Command.SCREEN, 0);
        exitCmd = new Command("退出", Command.EXIT, 0);
        addCommand(restartCmd);
        addCommand(exitCmd);
        setCommandListener(this);
    }
    private void init(){
        if(newGame){
            chesses=new Chesses[chessMapGrid+1][chessMapGrid+1];
            isPlayer1=true;
            selectedX=selectedY=chessMapGrid/2;
        }
    }
    public void commandAction(Command c, Displayable d) {
        if (c == exitCmd) {
            gobang.destroyApp(false);
            gobang.notifyDestroyed();
        }else if(c==restartCmd){
            init();//初始化棋盤,把棋盤清空,重新開始游戲
            repaint();
        }
    }
    protected synchronized void keyPressed(int keyCode) {
        int action = getGameAction(keyCode);
        if (action == Canvas.LEFT ) {
            selectedX=(--selectedX+chessMapGrid+1)%(chessMapGrid+1);     
        }
        else if (action == Canvas.RIGHT) {
            selectedX=(++selectedX)%(chessMapGrid+1);
        }
        else if (action == Canvas.UP) {
            selectedY=(--selectedY+chessMapGrid+1)%(chessMapGrid+1);
        }
        else if (action == Canvas.DOWN) {
            selectedY=(++selectedY)%(chessMapGrid+1);
        }
        else if (action == Canvas.FIRE) {
            if(chesses[selectedY][selectedX]==null){
                chesses[selectedY][selectedX]=new Chesses(this.isPlayer1);
                //checkWin();
                this.isPlayer1=!this.isPlayer1;//切換下棋方
            }
        }
        repaint();
    }
    private void checkWin(){
    }


至此,游戲的所有繪圖部分全都給出,有一點需要指出,雙緩沖顯示技術,由于現在有的手機已直接內置了雙緩沖,這里我們就不在具體說明,有愛好可以查閱相關文檔。

游戲輸贏
最后要說的是判定游戲的輸贏,在游戲的響應玩家操作部分,我留有一個方法checkWin(),大家可以自己思考設計算法來判定游戲的輸贏,其實不要也無所謂,因為既然是兩個人類在下棋,輸贏一眼就看出來了。

總結
整個游戲已經全部完成,大家一定會覺得很簡單吧,這個游戲其實只使用了j2me-midp1.0種很少的內容,但已經是一個完整的游戲了,希望對一些朋友有所幫助。當然我們完全可以進行一些擴展,比如加上片頭動畫,加上聲音,加上電腦AI,加上藍牙對戰功能(已經完成,下次專門寫一篇文檔),這樣游戲就慢慢的完善,并且具有商業價值,愿大家學J順利,多多交流(MSN:yinowl@163.com QQ:47599318 E-mail:yinowl@163.com)。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91香蕉嫩草影院入口| 欧美精品在线观看| 午夜欧美不卡精品aaaaa| 亚洲国产精品va在线看黑人| 国产高清视频一区三区| 在线观看国产精品淫| 国产人妖伪娘一区91| 欧美成年人网站| 久久久久久久一区二区三区| 91久久国产婷婷一区二区| 国产一区二区在线免费| 精品福利樱桃av导航| 国产精品日日做人人爱| 自拍亚洲一区欧美另类| zzjj国产精品一区二区| 欧美一级在线播放| 欧美色视频日本版| www日韩中文字幕在线看| 成人欧美在线视频| 亚洲精品一二区| 97免费视频在线| 日韩大陆欧美高清视频区| 成人做爰www免费看视频网站| 色综合伊人色综合网站| 日韩一区二区精品视频| 亚洲精品资源美女情侣酒店| 日韩欧美在线视频免费观看| 亚洲综合国产精品| 一道本无吗dⅴd在线播放一区| 91麻豆桃色免费看| 久久在线免费观看视频| 亚洲伊人第一页| 久久精品久久久久久国产 免费| 国产欧美在线播放| 亚洲人线精品午夜| 欧美多人乱p欧美4p久久| 日韩在线观看免费av| 亚洲欧美在线一区| 夜夜躁日日躁狠狠久久88av| 亚洲欧美精品一区| 亚洲片国产一区一级在线观看| 欧美激情手机在线视频| 日韩av色在线| 91沈先生在线观看| 日本久久久久久久久久久| 日韩欧美一区二区三区久久| 精品偷拍一区二区三区在线看| 国产精品av在线播放| 中文字幕精品在线| 日韩av最新在线观看| 色悠悠久久88| 日韩av在线一区| 久久久女女女女999久久| 日本高清+成人网在线观看| 国产精品自拍偷拍视频| 中文字幕欧美日韩在线| 亚洲欧美在线播放| 日韩中文字幕在线看| 在线午夜精品自拍| 国产精品高潮呻吟久久av无限| 色妞色视频一区二区三区四区| 欧美性xxxx极品高清hd直播| 成人网在线免费观看| 中文欧美日本在线资源| 中文字幕日本精品| 国内揄拍国内精品| 91在线精品播放| 亚洲一区999| 清纯唯美日韩制服另类| 97av在线视频| 欧美怡红院视频一区二区三区| 久久久精品美女| 国产精品免费一区二区三区都可以| 日韩中文字幕在线| 91久久嫩草影院一区二区| 日韩一级黄色av| 亚洲电影免费观看高清完整版在线| 久久伊人精品一区二区三区| 日韩免费观看网站| 国产视频综合在线| 日韩精品视频免费专区在线播放| 国产在线久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美中文字幕第一页| 欧美精品免费在线观看| 国产精品色婷婷视频| 欧美精品久久久久a| 欧美成年人视频网站欧美| 国产亚洲精品久久久| 国产色婷婷国产综合在线理论片a| 在线精品高清中文字幕| 91爱视频在线| 国产69精品久久久久9999| 亚洲欧美日本另类| 欧美高清无遮挡| 欧美夜福利tv在线| 亚洲国产精品免费| 久久免费高清视频| 在线视频精品一| 色无极影院亚洲| 国产福利精品视频| 最近日韩中文字幕中文| 国产成人精品综合久久久| 国产精品稀缺呦系列在线| 亚洲国产精品va在线| 日韩少妇与小伙激情| 欧美在线视频导航| 日韩欧美中文字幕在线观看| 日韩欧美综合在线视频| 亚洲精品456在线播放狼人| 国产精品视频26uuu| 久久久免费高清电视剧观看| 欧美成人中文字幕| 中文字幕精品一区二区精品| 欧美床上激情在线观看| 国产亚洲精品久久久优势| 精品国内亚洲在观看18黄| 日韩在线观看免费网站| 中文字幕日韩av电影| 91精品在线观| 国产精品欧美风情| 亚洲欧美色婷婷| 久久久久久久久国产精品| 欧美综合在线第二页| 欧美在线一区二区视频| 久久人人爽人人爽人人片亚洲| 另类少妇人与禽zozz0性伦| 亚洲激情在线观看视频免费| 亚洲18私人小影院| 4438全国成人免费| 国产精品99久久久久久久久| 国产亚洲欧洲在线| 国产日韩欧美综合| 亚洲字幕在线观看| 亚洲一区久久久| 久久久久国产精品一区| 久久久999国产精品| 欧美成人激情在线| 98精品国产高清在线xxxx天堂| 欧美激情a∨在线视频播放| 国产日韩专区在线| 欧美不卡视频一区发布| 国产成人一区二区三区| 91夜夜揉人人捏人人添红杏| 色偷偷88888欧美精品久久久| 亚洲精品乱码久久久久久按摩观| 茄子视频成人在线| 欧美日韩999| 日本成人黄色片| 中文字幕日韩精品有码视频| 欧美理论电影在线观看| 亚洲男人天堂网站| 国产欧美亚洲视频| 国产精品青青在线观看爽香蕉| 久久精品电影网站| 欧美激情国产高清| 亚洲自拍小视频免费观看| 国产精品日韩精品| 国产香蕉精品视频一区二区三区| 成人激情免费在线| 亚洲精品v欧美精品v日韩精品| 欧美成人国产va精品日本一级| 久久久久久尹人网香蕉| 国产精品久久久久久久久久尿|