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

📄 cards.java

📁 J2ME编程的50个例子,适合掌上系统的编程
💻 JAVA
字号:
package demo;
import java.util.Random;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;


public class Cards {
	public static final int CARD_A	= 0;		//黑桃A
	public static final int CARD_K	= 1;		//红桃K
	public static final int CARD_TYPE_NUM	 = 2;	
	
	public static final int STATE_NONE	= 0;	//无动作
	public static final int STATE_SHOW	= 1;	//显示纸牌
	public static final int STATE_LEFT	= 2;	//向左交换纸牌
	public static final int STATE_RIGHT	= 3;	//向右交换纸牌
	public static final int STATE_STOP	= 4;	//等待玩家猜牌
	public static final int STATE_NUM		= 5;	
	private int	m_nState = STATE_NONE;			//当前的状态
	
	private Sprite m_aCard[];						//纸牌对象
	private Image	m_CardBackImg;					//纸牌背面
	private int	m_nStep;						//运动步骤
	private int	m_nTotalSwaps;					//总共需要交换的次数
	private int	m_nSwaps;						//当前还剩下的交换次数
	private int	m_nCenterX;						//中心参考点的X坐标
	private int	m_nCenterY;						//中心参考点的Y坐标
	private int	m_nTime;						//每次交换所需的时间
	private Random m_Random;						//随机数对象
	private int	m_nSelIndex;					//当前选择的纸牌编号
	
	public Cards(int scrWidth, int scrHeght){
		try{
			//创建背面的纸牌图像
			m_CardBackImg = Image.createImage("/demo/cardback.png");
			
			//创建正面的纸牌
			Image img = Image.createImage("/demo/card.png");
			m_aCard = new Sprite[3];
			for( int n = 0; n < m_aCard.length; n ++ ){
				m_aCard[n] = new Sprite(img, 13, 24);
				m_aCard[n].defineReferencePixel(6, 11);
			}
			//创建随机数
			m_Random = new Random();
			//设置中心位置
			m_nCenterX = scrWidth / 2;
			m_nCenterY = scrHeght / 2;
		}
		catch(Exception exception){}
	}
	//重新开局
	public void Reset(){
		m_nTime = 100;				//每次动作的间隔时间
		m_nTotalSwaps = 5;			//总的交换次数
		m_nSelIndex = 0;			//当前选择的牌编号
		//随机设置三张纸牌的类别,并设置纸牌的位置
		//只有一张纸牌是K,其余是A
		int frame = Math.abs(( m_Random.nextInt() % 3 ));
		int w = 40;
		int x = m_nCenterX - w;
		int y = m_nCenterY;
		for( int n = 0; n < m_aCard.length; n ++ ){
			if( n == frame )
				m_aCard[n].setFrame(CARD_K);
			else
				m_aCard[n].setFrame(CARD_A);
			m_aCard[n].setRefPixelPosition(x, y);
			x = x + w;
		}
		//设置当前状态
		setState(STATE_NONE);
		//设置换牌的动作步骤
		m_nStep = 0;
	}
	//设置当前状态
	private void setState(int state){
		if( state < 0 || state >= STATE_NUM )
			return;
		m_nState = state;
		switch( m_nState ){
		case STATE_RIGHT:
		case STATE_LEFT:
			m_nStep = 3;
			break;
		case STATE_NONE:
			//每次重新再来时都要增加难度
			m_nTime -= 5;
			if( m_nTime <= 0 )
				m_nTime = 1;
			m_nTotalSwaps = m_nTotalSwaps + 2;
			m_nSwaps = m_nTotalSwaps;
			break;
		}
	}
	//处理按键的输入,参数keyStates为按键状态
	//返回true表示游戏失败
	public boolean Input(int keyStates){
		//如果当前不可以猜牌,则直接退出
		if( m_nState != STATE_STOP )
			return false;
		//移动当前的选择
		if( ( keyStates & GameCanvas.LEFT_PRESSED ) != 0 )
			m_nSelIndex --;
		if( ( keyStates & GameCanvas.RIGHT_PRESSED ) != 0 )
			m_nSelIndex ++;
		if( m_nSelIndex < 0 )
			m_nSelIndex = 0;
		if( m_nSelIndex >= m_aCard.length )
			m_nSelIndex = m_aCard.length - 1;
		
		if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 )
		{
			//如果选择的纸牌是K,正确,继续猜牌
			if( m_aCard[m_nSelIndex].getFrame() == CARD_K ){
				setState(STATE_NONE);
			}
			else	//否则游戏结束
				return true;
		}
		return false;
	}
	//逻辑操作,产生换牌动画
	public void Logic(){
		int sleep = m_nTime;		//停顿的时间
		switch( m_nState ){
		case STATE_NONE:
			sleep = 1;
			m_nState = STATE_SHOW;
			break;
		case STATE_SHOW:			//显示纸牌内容
			sleep = 2000;
			m_nState = STATE_LEFT;
			break;
		case STATE_LEFT:			//向左换牌
			RotLeft();				//向左换牌操作
			m_nStep --;
			if( m_nStep <= 0 ){		//换牌操作结束
				if( !canSwap() )	//如果不能换牌,则等玩家猜牌	
					setState(STATE_STOP);
			}
			break;
		case STATE_RIGHT:			//向右换牌
			RotRight();				//向左换牌操作
			m_nStep --;
			if( m_nStep <= 0 ){		//换牌操作结束
				if( !canSwap() )	//如果不能换牌,则等玩家猜牌
					setState(STATE_STOP);
			}
			break;
		case STATE_STOP:			//玩家猜牌
			sleep = 1;
			break;
		}
		try{						//停顿一段时间
			Thread.sleep(sleep);
		}
		catch(InterruptedException ie){
			ie.printStackTrace();
		}
	}
	//显示图像,参数g对应手机屏幕
	public void Paint(Graphics g){
		for( int n = 0; n < m_aCard.length; n ++ ){
			//如果正在显示牌的内容,则显示正面
			if( m_nState == STATE_SHOW )
				m_aCard[n].paint(g);
			//否则显示牌的背面
			else
				g.drawImage(m_CardBackImg, m_aCard[n].getX(), m_aCard[n].getY(), 0 );
		}
		if( m_nState == STATE_STOP )
		{//如果要玩家猜牌,则显示当前选择的位置
			g.drawRect( m_aCard[m_nSelIndex].getX() - 1,
					m_aCard[m_nSelIndex].getY() - 1,
					m_aCard[m_nSelIndex].getWidth() + 2,
					m_aCard[m_nSelIndex].getHeight() + 2 );
		}
	}
	//判断是否可以继续交换纸牌
	//返回true表示可以,false表示不可以
	private boolean canSwap(){
		if( m_nSwaps <= 0 )
			return false;
		//可以换牌,则随机设置向左换牌或向右换牌的状态
		m_nTime -= 5;
		if( m_nTime <= 0 )
			m_nTime = 1;
		int rand = m_Random.nextInt();
		if( rand > 0 )
			setState(STATE_RIGHT);
		else
			setState(STATE_LEFT);
		m_nSwaps -- ;
		return true;
	}
	//向左换牌的操作
	private void RotLeft(){
		int x = m_nCenterX;
		int y = m_nCenterY;
		switch( m_nStep ){
		case 3:						//第一步操作
			m_aCard[1].setRefPixelPosition(x-15, y+20);
			m_aCard[0].setRefPixelPosition(x-25, y-20);
			break;
		case 2:						//第二步操作
			m_aCard[1].setRefPixelPosition(x-25, y+35);
			m_aCard[0].setRefPixelPosition(x-15, y-35);
			break;
		case 1:						//第三步换牌结束
			m_aCard[1].setRefPixelPosition(x-40, y);
			m_aCard[0].setRefPixelPosition(x, y);
			//交换两张纸牌
			Sprite sp = m_aCard[1];
			m_aCard[1] = m_aCard[0];
			m_aCard[0] = sp;
			break;
		}
	}
	//向右换牌的操作
	private void RotRight(){
		int x = m_nCenterX;
		int y = m_nCenterY;
		switch( m_nStep ){
		case 3:						//第一步操作
			m_aCard[1].setRefPixelPosition(x+15, y+20);
			m_aCard[2].setRefPixelPosition(x+25, y-20);
			break;
		case 2:						//第二步操作
			m_aCard[1].setRefPixelPosition(x+25, y+35);
			m_aCard[2].setRefPixelPosition(x+15, y-35);
			break;
		case 1:						//第三步换牌结束
			m_aCard[1].setRefPixelPosition(x+40, y);
			m_aCard[2].setRefPixelPosition(x, y);
			//交换两张纸牌
			Sprite sp = m_aCard[1];
			m_aCard[1] = m_aCard[2];
			m_aCard[2] = sp;
			break;
		}
	}
	
}

⌨️ 快捷键说明

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