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

📄 mahjong.java

📁 移动平台游戏开发
💻 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 + -