📄 fivelinkboard.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 + -