📄 mahjong.java
字号:
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
public class Mahjong {
public static final int STATE_PLA_GIVE = 0; //给玩家发牌
public static final int STATE_PLA_HOLD = 1; //玩家摸到一张牌
public static final int STATE_PLA_SEL = 2; //玩家在选择所打的牌
public static final int STATE_PLA_OUT = 3; //玩家打了一张牌
public static final int STATE_PLA_ACT = 4; //玩家在选择操作(吃、碰、胡)
public static final int STATE_PLA_CHI = 5; //玩家在选择手中组成“吃”的牌
public static final int STATE_PLA_HU = 6; //玩家胡了
public static final int STATE_COM_GIVE = 7; //给电脑发牌
public static final int STATE_COM_HOLD = 8; //电脑摸到一张牌
public static final int STATE_COM_SEL = 9; //电脑在选择所打的牌
public static final int STATE_COM_OUT = 10; //电脑打了一张牌
public static final int STATE_COM_HU = 11; //电脑胡了
public static final int STATE_NOBONE = 12; //牌全摸光了
public static final int STATE_NUM = 13; //状态总数
private int m_nState = STATE_PLA_GIVE;
private HandBone m_PlaBone; //玩家手中的牌
private HandBone m_ComBone; //电脑手中的牌
private Action m_Action; //动作按钮对象
private TableBones m_TableBones; //桌面上的牌
//构造方法,参数scrWidth、scrHeight分别是屏幕的高与宽
public Mahjong(int scrWidth, int scrHeight){
try{
m_TableBones = new TableBones();
Image img = Image.createImage("/demo/arrow.png");
m_Action = new Action(img, scrWidth, scrHeight);
int x = 5;
int y = scrHeight - 19;
m_PlaBone = new HandBone( img, x, y, true );
x = scrWidth - 5;
y = 19;
m_ComBone = new HandBone( img, x, y, false );
}
catch(Exception exception){}
}
//设置当前状态
public void setState(int state){
if( state < 0 || state >= STATE_NUM )
return;
m_nState = state;
switch( m_nState ){
case STATE_NOBONE:
case STATE_COM_HU:
case STATE_PLA_HU:
int a = 0;
a ++;
break;
}
}
//获取当前状态
public int getState(){
return m_nState;
}
//重新开局
public void Reset(){
m_TableBones.Reset();
//发牌
m_PlaBone.Reset();
m_ComBone.Reset();
for( int n = 0; n < 13; n ++ ){
m_PlaBone.AddHandBone(m_TableBones.getBone());
m_ComBone.AddHandBone(m_TableBones.getBone());
}
m_PlaBone.OrderHand();
m_ComBone.OrderHand();
setState(STATE_PLA_GIVE);
}
//发牌,参数bPlayer为true表示给玩家发牌,否则给电脑发牌
private boolean GiveOut( boolean bPlayer ){
if( m_nState == STATE_NOBONE )
return false;
Bone bone = m_TableBones.getBone();
if( bone == null )
return false;
if( bPlayer )
m_PlaBone.SetHold(bone);
else
m_ComBone.SetHold(bone);
return true;
}
//处理按键输入
public void Input(int keyStates){
switch( m_nState ){
case STATE_PLA_HOLD: //玩家摸到一张牌
if( m_PlaBone.getHoldBone() != null ){
//判断是否可以胡
boolean bHu = m_PlaBone.canHu(m_PlaBone.getHoldBone());
//判断是否可以暗杠
boolean bAnGang = m_PlaBone.canAnGang(m_PlaBone.getHoldBone());
//判断是否可以明杠
boolean bGang = m_PlaBone.canGang(m_PlaBone.getHoldBone());
if( bHu || bAnGang ){
m_Action.setSelect(bHu, bGang, false, false, bAnGang);
setState(STATE_PLA_ACT);
}
else
setState(STATE_PLA_SEL);
}
else //没摸牌则发牌
setState(STATE_PLA_GIVE);
break;
case STATE_PLA_SEL: //玩家在选择所打的牌
if( m_PlaBone.getHoldBone() != null ){ //已经摸牌了
//移动选择位置
if( ( keyStates & GameCanvas.LEFT_PRESSED ) != 0 )
m_PlaBone.MoveSelect(true);
if( ( keyStates & GameCanvas.RIGHT_PRESSED ) != 0 )
m_PlaBone.MoveSelect(false);
if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 ){
m_TableBones.AddTableBone(m_PlaBone.OutBone());
setState(STATE_PLA_OUT);
}
}
else //没摸牌则发牌
setState(STATE_PLA_GIVE);
break;
case STATE_PLA_ACT: //玩家在选择操作(吃、碰、胡)
int action = m_Action.Input(keyStates);
if( action == Action.ACTION_PASS )
{//选择了Pass
if( m_PlaBone.getHoldBone() == null )
setState(STATE_PLA_GIVE);
else
setState(STATE_PLA_SEL);
m_Action.setHide();
}
if( action == Action.ACTION_HU )
{//选择了胡
setState(STATE_PLA_HU);
m_Action.setHide();
}
else if( action == Action.ACTION_CHI )
{//选择了吃
setState(STATE_PLA_CHI);
m_Action.setHide();
}
else if( action == Action.ACTION_GANG )
{//选择了杠
if( m_Action.isAnGang() )
m_PlaBone.AnGang(m_TableBones.getLastTableBone());
else
m_PlaBone.Gang(m_TableBones.getLastTableBone());
setState(STATE_PLA_GIVE);
m_Action.setHide();
}
else if( action == Action.ACTION_PENG )
{
m_PlaBone.Peng(m_TableBones.getLastTableBone());
setState(STATE_PLA_HOLD);
m_Action.setHide();
}
break;
case STATE_PLA_CHI: //玩家在选择手中组成“吃”的牌
if( ( keyStates & GameCanvas.LEFT_PRESSED ) != 0 )
m_PlaBone.MoveChiIndex(true);
if( ( keyStates & GameCanvas.RIGHT_PRESSED ) != 0 )
m_PlaBone.MoveChiIndex(false);
if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 ){
m_PlaBone.Chi(m_TableBones.getLastTableBone());
setState(STATE_PLA_HOLD);
}
break;
}
}
public void Logic(){
int sleep = 200;
switch( m_nState ){
case STATE_PLA_GIVE: //给玩家发牌
if( !GiveOut(true) )
setState(STATE_NOBONE);
else
setState(STATE_PLA_HOLD);
break;
case STATE_PLA_HOLD: //玩家摸到一张牌
case STATE_PLA_SEL: //玩家选择出牌
case STATE_PLA_ACT: //玩家在选择操作(吃、碰、胡)
case STATE_PLA_CHI: //玩家在选择手中组成“吃”的牌
case STATE_PLA_HU: //玩家胡了
case STATE_COM_HU: //电脑胡了
case STATE_NOBONE: //牌全摸光了
sleep = 1;
break;
case STATE_PLA_OUT: //玩家打了一张牌
if( m_TableBones.getLastTableBone() != null ){
Bone bone = m_TableBones.getLastTableBone();
if( m_ComBone.canHu(bone) )
{
setState(STATE_COM_HU);
}
else if( m_ComBone.canGang(bone) )
{
m_ComBone.Gang(bone);
setState(STATE_COM_GIVE);
}
else if( m_ComBone.canChi(bone) )
{
m_ComBone.Chi(bone);
setState(STATE_COM_SEL);
}
else if( m_ComBone.canPeng(bone) )
{
m_ComBone.Peng(bone);
setState(STATE_COM_SEL);
}
else
setState(STATE_COM_GIVE);
}
else
setState(STATE_COM_GIVE);
break;
case STATE_COM_GIVE: //给电脑发牌
if( !GiveOut(false) )
setState(STATE_NOBONE);
else
setState(STATE_COM_HOLD);
break;
case STATE_COM_HOLD: //电脑摸到一张牌
if( m_ComBone.getHoldBone() != null ){
if( m_ComBone.canHu(m_ComBone.getHoldBone()) )
setState(STATE_COM_HU);
else if( m_ComBone.canAnGang(m_ComBone.getHoldBone() ) ){
m_ComBone.AnGang(m_ComBone.getHoldBone());
setState(STATE_COM_GIVE);
}
else
setState(STATE_COM_SEL);
}
else
setState(STATE_COM_GIVE);
break;
case STATE_COM_SEL: //电脑在选择所打的牌
if( m_ComBone.getHoldBone() != null ){
m_TableBones.AddTableBone( m_ComBone.ComOutBone() );
setState(STATE_COM_OUT);
}
else
setState(STATE_COM_GIVE);
break;
case STATE_COM_OUT: //电脑打了一张牌
if( m_TableBones.getLastTableBone() != null ){
Bone bone = m_TableBones.getLastTableBone();
boolean bHu = m_PlaBone.canHu(bone);
boolean bGang = m_PlaBone.canGang(bone);
boolean bPeng = m_PlaBone.canPeng(bone);
boolean bChi = m_PlaBone.canChi(bone);
if( bHu || bChi || bGang || bPeng ){
m_Action.setSelect(bHu, bGang, bPeng, bChi, false);
setState(STATE_PLA_ACT);
}
else
setState(STATE_PLA_GIVE);
}
else
setState(STATE_PLA_GIVE);
break;
}
try{ //停顿一段时间
Thread.sleep(sleep);
}
catch(InterruptedException ie){
ie.printStackTrace();
}
}
//显示所有的牌
public void Paint(Graphics g, int scrWidth, int scrHeight){
//显示桌面上的牌
m_TableBones.Paint(g, scrWidth, scrHeight);
boolean bChi = false;
boolean bSelect = false;
boolean bHu = false;
if( m_nState == STATE_PLA_CHI )
bChi = true;
if( m_nState == STATE_PLA_SEL )
bSelect = true;
if( m_nState == STATE_PLA_HU ||
m_nState == STATE_COM_HU ||
m_nState == STATE_NOBONE )
bHu = true;
//显示玩家手中的牌
m_PlaBone.Paint(g, bChi, bSelect, bHu, scrWidth);
//显示电脑手中的牌
m_ComBone.Paint(g, false, false, bHu, scrWidth);
//显示动作按钮
m_Action.Paint(g);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -