⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fivelinkboard.java

📁 一款J2ME作得手机游戏
💻 JAVA
字号:
package org.javagarden.j2me.fivelink.client;

import java.io.IOException;
import java.util.Vector;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;


/**
 * 五子棋棋盘。
 * 
 * @author Turbo Chen
 * @created 2005-3-4
 */
public class FiveLinkBoard
                extends Canvas
{
    static Image BLACK_LOGO = null;
    static Image WHITE_LOGO = null;
    
    public final static int NAV_UP 		= -1;
    public final static int NAV_DOWN 	= -2;
    public final static int NAV_LEFT 	= -3;
    public final static int NAV_RIGHT 	= -4;
    
    static Image BLACK 	= null;
    static Image WHITE 	= null;
    
    
    int imageSize = 32;
    
    int cursorX = 7;
    int cursorY = 7;
    
    int boardX;
    int boardY;
    
    int boardSize;
    int gridSize = 5;
    
    boolean blinkCursor = false;
    
    FiveLinkModel model = null;
    
    boolean paintlock = false;
    
    boolean showPrize = false;
    
    private Graphics gx;
    
    /**
     * 
     */
    public FiveLinkBoard()
    {
        super();
        this.model = new FiveLinkModel();
        try
        {
            BLACK_LOGO = Image.createImage("/org/javagarden/j2me/fivelink/client/h.jpg");
            WHITE_LOGO = Image.createImage("/org/javagarden/j2me/fivelink/client/m.jpg");
            BLACK = Image.createImage("/org/javagarden/j2me/fivelink/client/b.gif");
            WHITE = Image.createImage("/org/javagarden/j2me/fivelink/client/w.gif");
        }catch (IOException e)
        {
        }
        int width = getWidth();
        int height = getHeight();
        boardSize = (FiveLinkModel.BOARD_SIZE-1)*gridSize;
        boardX = 3;
        boardY = (height - boardSize)/2;
        
    }

    public void clear()
    {
        this.cursorX = 7;
        this.cursorY = 7;
        this.showPrize = false;
    }
    
    protected void paint(Graphics g)
    {
        gx = g;
        if ( ! paintlock )
        {
            paintlock = true;
            
            drawBackground();
            
            if ( !this.showPrize )
            {
                gx.setColor(105,105,105);
                drawMask( 0,0,getWidth(),getHeight(),false);
                
		        drawBlankBoard();
		        
		        drawPlayer();
		        
		        drawChessLayout();
		        
		        drawHint();
            }
            
	        if ( this.model.getMessages()!=null && this.model.getMessages().size()>0 )
	        {
	            drawMessage(this.model.getMessages());
	        }
	        
	        paintlock = false;
        }

    }
    
    private void drawBackground()
    {
        gx.drawImage(this.model.getLevelBackground(),0,0,0);
    }

    private void drawMask(int mx,int my,int mw,int mh, boolean dark )
    {
        for ( int i=0;i<mh;i+=2 )
        {
            gx.drawLine(mx,my+i,mx+mw,my+i);
        }
        if ( dark )
        {
            for ( int i=0;i<mw;i+=2 )
            {
                gx.drawLine(mx+i,my,mx+i,my+mh);
            }
        }
    }
    
    protected void drawHint()
    {
        if ( ! blinkCursor && ! this.model.isGameOver() )
        {
            drawCursor();

            int imgFrameW = 34;
            int imgFrameH = 34;
            int imgFrameX = getWidth()-imgFrameW-4;
            int imgFrameGap = (getHeight()-imgFrameH*2)/3;
            
            if ( this.model.currentPlayer.getChessType()==Player.BLACK )
            {
                gx.setColor(231,197,107);
                gx.fillRect(imgFrameX-10-1, imgFrameGap+2,10,10);
                gx.setColor(128,128,128);
                gx.drawRect(imgFrameX-10-1, imgFrameGap+2,10,10);
                gx.drawImage(BLACK,imgFrameX-2-gridSize-gridSize/2,imgFrameGap+2+gridSize/2,0);

            }else
            {
                gx.setColor(231,197,107);
                gx.fillRect(imgFrameX-10-1, imgFrameGap+2,10,10);
                gx.setColor(128,128,128);
                gx.drawRect(imgFrameX-10-1, imgFrameGap+2,10,10);
                gx.drawImage(WHITE,imgFrameX-2-gridSize-gridSize/2,imgFrameGap+2+gridSize/2,0);
                
            }
            
        }
            
    }
    
    protected void drawMessage(Vector msg)
    {
       
        int rowW = 0;
        int w=0;
        for ( int i=0;i<msg.size();i++ )
        {
            w = gx.getFont().stringWidth(""+msg.elementAt(i));
            if ( w>rowW ) rowW = w;
        }
        
        int rowH = gx.getFont().getHeight();
        
        int gap = 5;
        int boxX = (getWidth()-rowW-gap*2)/2;
        int boxH = rowH*msg.size()+gap*2;
        int boxY = (getHeight()-boxH)/2;
        int boxW = rowW+gap*2;
        
        gx.setColor(0,0,0);
        drawMask(boxX,boxY,boxW,boxH,true);
        
        gx.setColor(0,255,0);
        gx.drawRect(boxX,boxY,boxW,boxH);
        gx.setColor(255,255,0);
        for ( int i=0;i<msg.size();i++ )
        {
            int msgW = gx.getFont().stringWidth(""+msg.elementAt(i));
            gx.drawString(""+msg.elementAt(i),boxX+gap,boxY+gap+i*rowH,0);
        }
        
    }
    
    protected void drawCursor()
    {
        // 光标颜色为红色
        gx.setColor(255,0,0);
        gx.drawArc(boardX+cursorX*gridSize-gridSize/2,
                        boardY+cursorY*gridSize-gridSize/2,gridSize,gridSize,0,360);

    }
    
    protected void drawBlankBoard()
    {
        
        // 棋盘背景为土黄色
        gx.setColor(231,197,107);
        gx.fillRect(boardX-boardX,boardY-boardX,boardSize+boardX*2,boardSize+boardX*2);
        
        // 棋盘格线为黑色
        gx.setColor(128,128,128);
        for (int i=0;i<FiveLinkModel.BOARD_SIZE;i++ )
        {
            gx.drawLine(boardX,i*gridSize+boardY,boardSize+boardX,i*gridSize+boardY);
            gx.drawLine(i*gridSize+boardX,boardY,i*gridSize+boardX,boardSize+boardY);
        }
        // 棋盘外框
        gx.setColor(0,0,0);
        gx.drawRect(boardX-boardX,boardY-boardX,boardSize+boardX*2,boardSize+boardX*2);
        
    }
    
    protected void drawPlayer()
    {
        int imgFrameW = 32;
        int imgFrameH = 32;
        int imgFrameX = getWidth()-imgFrameW-4;
        int imgFrameGap = (getHeight()-imgFrameH*2)/3;
        
        // 画黑方图像
        gx.drawImage(BLACK_LOGO,imgFrameX,imgFrameGap,0);
        gx.setColor(0,0,0);
        gx.drawRect(imgFrameX,imgFrameGap,imgFrameW,imgFrameH);
        
        // 画白方图像
        gx.drawImage(WHITE_LOGO,imgFrameX,getHeight()-imgFrameH-imgFrameGap,0);
        gx.setColor(0,0,0);
        gx.drawRect(imgFrameX,getHeight()-imgFrameH-imgFrameGap,imgFrameW,imgFrameH);

    }
    
    // 处理键盘事件
    protected void keyPressed(int keyCode)
    {
        if( keyCode==Canvas.KEY_NUM4 ||
                    	keyCode==Canvas.KEY_NUM5 ||
                    	keyCode==Canvas.KEY_NUM6 ||
                    	keyCode==Canvas.KEY_NUM2 ||
                    	keyCode==Canvas.KEY_NUM8 ||
                    	keyCode==Canvas.KEY_NUM1 ||
                    	keyCode==Canvas.KEY_NUM3 ||
                    	keyCode==Canvas.KEY_NUM7 ||
                    	keyCode==Canvas.KEY_NUM9 ||
                    	keyCode==NAV_LEFT ||
                    	keyCode==NAV_RIGHT ||
                    	keyCode==NAV_UP ||
                    	keyCode==NAV_DOWN )
        {
	        if ( this.model.getMessages().size()>0 )
	        {
	            this.model.clearMessage();
	            if ( this.model.currentPlayer.getId()==Player.HUMAN )
	                this.showPrize = true;
	            repaint();
	        }else if ( this.showPrize )
	        {
	            this.showPrize = false;
	            repaint();
	        }
	        
        }

        if ( this.model.currentPlayer.getId()==Player.MACHINE )
            return;

        if ( !this.model.isGameOver() )
        {
            moveCursor(keyCode);
            this.repaint();
            if ( keyCode==KEY_NUM5 )
            {
                if ( putChess(cursorX,cursorY) )
                {
                    this.repaint();
                    this.machinePutChess();
                }
            }
        }
    }
    
    protected boolean putChess(int x, int y)
    {
        if (this.model.putChess(x,y) )
        {
            cursorX = x;
            cursorY = y;

            beep(70,50,100);
            
            if ( this.model.checkWin((short)x,(short)y,this.model.currentPlayer) )
            {
                this.model.setGameOver(true);
                this.model.addHistoryRecord(this.model.currentPlayer);
                repaint();
                return false;
            }else if ( this.model.checkTie() )
            {
                this.model.setGameOver(true);
                repaint();
                return false;
            }else
            {
                this.model.exchangePlayer();
                repaint();
                return true;
            }
            
        }else return false;
    }

    /*
     * 画所有棋子。
     */
    protected void drawChessLayout()
    {
        
        if ( this.model!=null )
        {
            for ( int r=0;r<FiveLinkModel.BOARD_SIZE;r++ )
                for ( int c=0;c<FiveLinkModel.BOARD_SIZE;c++ )
                {
                    int type = this.model.getChess()[c][r];
                    if ( type!=FiveLinkModel.BLACK_CHESS&&
                         type!=FiveLinkModel.WHITE_CHESS )
                        continue;
                    else
                        drawChess(c, r, type);
                }
            
        }
    }
    
    // 在(x,y)位置画棋子.
    protected void drawChess(int x, int y, int type)
    {
        if ( type==FiveLinkModel.BLACK_CHESS )
        {
            gx.drawImage(BLACK,boardX+x*gridSize-gridSize/2,
                        boardY+y*gridSize-gridSize/2,0);
        }
        else if ( type==FiveLinkModel.WHITE_CHESS )
        {
            gx.drawImage(WHITE,boardX+x*gridSize-gridSize/2,
                            boardY+y*gridSize-gridSize/2,0);
        }
        

    }
    
    // 移动光标
    private void moveCursor(int keyCode)
    {
        
        if( keyCode==Canvas.KEY_NUM4 || keyCode==NAV_LEFT )
        {
            cursorX -=1;
        }else if ( keyCode==Canvas.KEY_NUM6 || keyCode==NAV_RIGHT )
        {
            cursorX +=1;
        }else if ( keyCode==Canvas.KEY_NUM2 || keyCode==NAV_UP )
        {
            cursorY -=1;
        }else if ( keyCode==Canvas.KEY_NUM8 || keyCode==NAV_DOWN )
        {
            cursorY +=1;
        }else if (keyCode==Canvas.KEY_NUM1 )
        {
            cursorX -=1;
            cursorY -=1;
        }else if (keyCode==Canvas.KEY_NUM3 )
        {
            cursorX +=1;
            cursorY -=1;
        }else if (keyCode==Canvas.KEY_NUM7 )
        {
            cursorX -=1;
            cursorY +=1;
        }else if (keyCode==Canvas.KEY_NUM9 )
        {
            cursorX +=1;
            cursorY +=1;
        }

        if ( cursorX>14 )
        {
            cursorX=14;
            return;
        }
        if ( cursorX<0 )
        {
            cursorX=0;
            return;
        }
        if ( cursorY>14 )
        {
            cursorY=14;
            return;
        }
        if ( cursorY<0 )
        {
            cursorY=0;
            return;
        }

        if( keyCode==Canvas.KEY_NUM4 ||
        	keyCode==Canvas.KEY_NUM6 ||
        	keyCode==Canvas.KEY_NUM2 ||
        	keyCode==Canvas.KEY_NUM8 ||
        	keyCode==Canvas.KEY_NUM1 ||
        	keyCode==Canvas.KEY_NUM3 ||
        	keyCode==Canvas.KEY_NUM7 ||
        	keyCode==Canvas.KEY_NUM9 ||
        	keyCode==Canvas.LEFT ||
        	keyCode==Canvas.RIGHT ||
        	keyCode==Canvas.UP ||
        	keyCode==Canvas.DOWN )
        {
            repaint( );
            beep(50,50,100);
        }
    }
    
    // 由机器方下棋.
    public void machinePutChess()
    {
        Location loc = AI.findBestChessLocation(this.model.currentPlayer,this.model);
        this.putChess(loc.x,loc.y);
    }

    // 开启新游戏
    public void newGame()
    {
        model.reset();
        this.clear();
        
        if ( this.model.currentPlayer.getId()==Player.MACHINE
             && this.model.currentPlayer.getChessType()==Player.BLACK )
            this.machinePutChess();
        
    }

    // 每下一子, beep一声. (在nokia上好像不支持)
    private void beep(int tone, int delay, int volume)
    {
//        try
//        {
//            Manager.playTone(tone, delay, volume);
//        }catch (MediaException e)
//        {
//        }
    }
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -