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