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

📄 maincanvas.java

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

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 MainCanvas extends GameCanvas implements Runnable{
	public static final int GAME_UI				= 0;	//进入用户界面
	public static final int GAME_GAMING			= 1;	//进行游戏
	public static final int GAME_END				= 2;	//游戏结束
	public static final int GAME_STATE_NUM 		= 3;	//状态总数
	private int m_nState	= GAME_UI;						//存储当前的游戏状态
	
	private boolean		m_bRunning;			    		//控制线程运行
	private MyUI			m_UI;							//界面对象
	private MyBack			m_Back;							//背景对象
	private CardSprite		m_aCard[];						//纸牌对象	
	private int			m_nCardNum;						//玩家手中牌的数目
	private int			m_nComValue;					//电脑的分数
	private Sprite			m_TextSp;						//图形文字对象
	private Random			m_Random;						//随机数对象
	public MainCanvas( ){
		super(true);			
		try{
			//创建用户界面,并设置界面中的按钮
			MyButton button = new MyButton();
			m_UI = new MyUI(button);
			//创建背景
			m_Back = new MyBack();
			//创建图形文字对象
			Image img = Image.createImage("/demo/text.png");
    		m_TextSp = new Sprite(img, 82, 25);
    		int x = getWidth()/2;
    		int y = getHeight()/2 - 10;
    		m_TextSp.setRefPixelPosition(x, y);
        }
        catch(Exception exception){}
        setState(GAME_UI);
		Start();
	}
	//重新开牌
	private void Reset(){		
        if( m_aCard == null ){
        	//创建纸牌对象
        	try{
        		m_aCard = new CardSprite[52];
        		Image img = Image.createImage("/demo/card.png");
        		for( int n = 0; n < m_aCard.length; n ++ )
        		{//创建纸牌,并给支派赋予初始的类型和面值
        			m_aCard[n] = new CardSprite(img, 13, 24);
        			int type = n / 13;
        			int value = n % 13 + 1;
        			m_aCard[n].setCard(type, value);
        		}
        	}
        	catch(Exception exception){}
        }
		//洗牌操作
		int times = 25;			//洗牌的次数
		//创建随机数对象
		if( m_Random == null )
			m_Random = new Random();
		int index1, index2;
		CardSprite temp;
		for( int n = 0; n < times; n ++ )
		{//随机交换两个位置上的牌
			index1 	= Math.abs(m_Random.nextInt() % 52);
			index2 	= Math.abs(m_Random.nextInt() % 52);
			temp 	= m_aCard[index1];
			m_aCard[index1] = m_aCard[index2];
			m_aCard[index2] = temp;
		}	
		//玩家手中牌的数目清0
		m_nCardNum = 0;
		//电脑分数范围是:10~21
		m_nComValue = Math.abs(  m_Random.nextInt() % 12 ) + 10;
	}
	private void setState( int state ){					//设置游戏状态
		if( state < 0 || state >= GAME_STATE_NUM )
			return;
		m_nState = state;
		switch( m_nState ){
		case GAME_UI:										//进入用户界面
			m_UI.setState(MyUI.UI_TITLE);					//显示标题界面
			break;
		case GAME_GAMING:									//正在游戏
			m_UI.setState(MyUI.UI_HIDE);
			break;
		}
	}
	public void Start(){
		m_bRunning = true;
		Thread thread = new Thread(this);	//分配新线程
		thread.start();						//线程启动
	}
	public void run() {
		//得到系统当前时间,并将时间换算成毫秒
		long T1 = System.currentTimeMillis();
		long T2 = T1;
		while(m_bRunning){
			T2 = System.currentTimeMillis();
			if( T2 - T1 > 200 ){			//间隔150毫秒
				T1 = T2;
				Input();
				Logic();
				Paint();
			}
		}
	}
	public void Stop(){ 
		m_bRunning = false;
	}
	public void Input(){
		int keyStates = getKeyStates();
		switch( m_nState ){	
		case GAME_UI:
		{
			switch( m_UI.Input( keyStates ) ){
			case MyButton.BUTTON_START:					//按下开始键
				Reset();
				setState(GAME_GAMING);
				break;
			case MyButton.BUTTON_EXIT:					//按下退出键
				CardMidlet.midlet.notifyDestroyed();
				break;
			}
		}
		break;	
		case GAME_GAMING:									//游戏中
			if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 )
			{//按下中心键,继续发牌
				m_nCardNum ++;
				if( getTotalScore() > 21 )
				{//如果总分值大于21,则本次游戏结束,玩家失败
					m_TextSp.setFrame(1);
					setState(GAME_END);
				}
			}
			else if( ( keyStates & GameCanvas.UP_PRESSED ) != 0 )
			{//按下方向键的上键,不再继续发牌,直接比较牌面值
				if( getTotalScore() >= m_nComValue )
					m_TextSp.setFrame(0);					//玩家胜利
				else
					m_TextSp.setFrame(1);					//电脑胜利
				setState(GAME_END);
			}
			break;
		case GAME_END:
			if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 ){
				Reset();
				setState(GAME_GAMING);
			}
			break;
		}
	}
	public void Logic(){		
	}
	public void Paint(){
		Graphics g = getGraphics();
		//用黑色清屏
		g.setColor(0);
		g.fillRect( 0, 0, getWidth(), getHeight() );
		
		g.setColor(0xFFFFFFFF);
		switch( m_nState ){
		case GAME_UI:								//显示界面
			m_UI.Paint(g, getWidth(), getHeight());
			break;			
		case GAME_GAMING:							//显示游戏画面
			m_Back.Paint(g, getWidth(), getHeight());
			int x = getWidth() / 2 - m_nCardNum * m_aCard[0].getWidth() / 2;
			int y = getWidth() / 2 + 20;
			//显示玩家的纸牌
			for( int n = 0; n < m_nCardNum; n ++ ){
				m_aCard[n].setPosition(x, y);
				m_aCard[n].paint(g);
				x += m_aCard[n].getWidth();
			}
			break;
		case GAME_END:								//显示结束画面
			m_Back.Paint(g, getWidth(), getHeight());
			StringBuffer buffer = new StringBuffer();
			buffer.append("Computer value:");
			buffer.append(m_nComValue);
			g.drawString(buffer.toString(), 10, 10, 0 );
			//显示胜负文字图像
			m_TextSp.paint(g);
			break;									
		}
		flushGraphics();
	}
	//获取玩家手中纸牌的总分数
	private int getTotalScore(){
		int score = 0;
		for( int n = 0; n < m_nCardNum; n ++ ){
			score += m_aCard[n].getScore();
		}
		return score;
	}
}

⌨️ 快捷键说明

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