📄 gamecanvas.java
字号:
/*
* GameCanvas.java
*
* Copyright 2001 SkyArts. All Rights Reserved.
*/
import javax.microedition.lcdui.*;
import java.util.*;
/**
* PokerMachine的游戏内容描绘与操作所用的类
*
* @author Hideki Yonekawa
* @version 1.0
*/
class GameCanvas extends Canvas implements Runnable, CommandListener {
/** 用来储存横向长度的变量 */
private int screenWidth;
/** 用来储存纵向长度的变量 */
private int screenHeight;
/** 储存了PokerMachine对象的变量 */
private PokerMachine pokerMachine;
/** Start指令变量 */
private Command startCmd = new Command("Start", Command.SCREEN, 1);
/** Exit指令变量 */
private Command exitCmd = new Command("Exit", Command.SCREEN, 1);
/** OK指令变量 */
private Command okCmd = new Command("OK", Command.SCREEN, 1);
/** Quit指令变量 */
private Command quitCmd = new Command("Quit", Command.SCREEN, 1);
/** 储存了默认字体的变量 */
private Font defFont = Font.getDefaultFont();
/** 代表标题显示状态的常量 */
private static final short TITLE = 0;
/** 代表下注画面显示状态的常量 */
private static final short BET = 1;
/** 代表扑克牌分配画面显示状态的常量 */
private static final short DEAL = 2;
/** 代表扑克牌选择显示状态的常量 */
private static final short SELECT = 3;
/** 代表扑克牌的交换画面显示状态的常量 */
private static final short RE_DEAL = 4;
/** 代表结果显示画面之显示状态的常量 */
private static final short RESULT = 5;
/** 代表游戏结束状态的常量 */
private static final short GAME_OVER = 9;
/** 代表停止赌注状态的常量 */
private static final short BE_PLAYED_OUT = 99;
/** 代表储存现在显示状态的变量 */
private short gameState;
/** Royal Straight Flush的赔率常量 */
private static final short Royal_Flush_Rate = 400;
/** Five Card的赔率常量 */
private static final short Five_of_a_Kind_Rate = 100;
/** Straight Flash的赔率常量 */
private static final short Straight_Flush_Rate = 50;
/** Four Card的赔率常量 */
private static final short Four_of_a_Kind_Rate = 25;
/** Full House的赔率常量 */
private static final short Full_House_Rate = 8;
/** Flush的赔率常量 */
private static final short Flush_Rate = 5;
/** Straight的赔率常量 */
private static final short Straight_Rate = 4;
/** Three Card的赔率常量 */
private static final short Three_of_a_Kind_Rate = 3;
/** Two Pair的赔率常量 */
private static final short Two_Pair_Rate = 2;
/** One Pair的赔率常量 */
private static final short Jacks_or_Better_Rate = 1;
/** 扑克牌没有符合任何牌面时的赔率常量 */
private static final short NOTHING = -1;
/** 用来在准备扑克牌时使用的Random对象 */
private Random random = new Random();
/** 储存了默认所持金额的常量 */
private static final int DEFAULT_CASH = 100;
/** 储存了停止赌注金额的常量 */
private static final int MAX_CASH = 9999999;
/** 储存有现在所持金额的变量 */
private int cash;
/** 在下注的时候暂时储存所持金额的变量 */
private int cash4Bet;
/** 储存下注的变量 */
private int betCash;
/** 储存下注的字符串的变量,使用在改变下注的时候 */
private String betCashSt;
/** 储存赌金的变量 */
private int cashPrize;
/** 储存了默认所持金额的常量 */
private short winning;
/** 将游戏中所使用的值初始化的方法 */
private Card[] cards;
/** 储存选取牌张数的变量 */
private int selectCardCount;
/** 用来储存使用在标题画面中的图像的变量 */
private Image titleImg;
/**
* 构造函数
* @param pokerMachine PokerMachine对象
*/
GameCanvas(PokerMachine pokerMachine) {
this.pokerMachine = pokerMachine;
//取得画面的可描绘范围
screenWidth = getWidth();
screenHeight = getHeight();
//登录指令监听
setCommandListener(this);
//取得标题图像
try {
titleImg = Image.createImage("/title.png");
}catch(Exception e) {}
//制作扑克牌
cards = new Card[5];
//先传递要描绘的X,Y坐标
int tmpDrawX = (screenWidth - Card.WIDTH * cards.length) /2;
int tmpDrawY = screenHeight - Card.HEIGHT -5;
for(int i=0; i < cards.length; i++) {
cards[i] = new Card();
cards[i].setDrawX(tmpDrawX);
cards[i].setDrawY(tmpDrawY);
tmpDrawX = tmpDrawX + Card.WIDTH;
}
//将游戏的状态显示在标题
doTitle();
}
/** 将游戏中所使用的值初始化的方法 */
private void doGameInit() {
//将所持金额变为默认值
cash = DEFAULT_CASH;
}
/** 在每一回合结束后进行值的初始化的方法 */
private void doTurnInit() {
//将牌盖起来
for(int i=0; i < cards.length; i++) {
cards[i].setCardState(Card.BACK_STATE);
}
//抽取新的牌
setNewCards();
betCash = 0;
cashPrize = 0;
selectCardCount = 0;
betCashSt = "0";
cash4Bet = cash;
}
/** 进行标题显示的方法 */
private void doTitle() {
//将游戏状态变为显示标题
gameState = TITLE;
//以防万一先将游戏中的指令删除
removeCommand(okCmd);
removeCommand(quitCmd);
//显示标题画面
repaint();
//新增指令
addCommand(exitCmd);
addCommand(startCmd);
}
/** 启动描绘线程的方法 */
private void doThreadStart() {
new Thread(this).start();
}
/**
* 进行描绘的方法,通常不会从类本身调用
* @param g Graphics对象
*/
protected void paint(Graphics g) {
//设定字体
g.setFont(defFont);
String drawSt;
String drawSt2 = null;
int drawX, drawY, stWidth, drawHeight, tmpDrawX, tmpDrawY;
int stHeight = defFont.getHeight();
//根据游戏的状态来改变描绘内容
switch(gameState) {
case TITLE: //显示标题
//以绿色清除背景
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, screenWidth, screenHeight);
//描绘标题图像
drawX = (screenWidth - titleImg.getWidth()) /2;
g.drawImage(titleImg, drawX, 0, Graphics.TOP|Graphics.LEFT);
//显示着作权
g.setColor(0x00000000);
drawSt = "Copyright 2001";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = getHeight() - stHeight *2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "SkyArts.com";
drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
drawY = drawY + stHeight;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
break;
case BET: //显示下注画面
//以绿色清除背景
g.setColor(0x00009900);
g.fillRect(0, 0, screenWidth, screenHeight);
drawHeight = stHeight * 4 +8;
drawX = 0;
drawY = 0;
//底色
g.setColor(0x00000000);
g.fillRoundRect(drawX, drawY, screenWidth, drawHeight, 7, 7);
g.setColor(0x00FFFFFF);
g.fillRoundRect(drawX+2, drawY+2, screenWidth-4, drawHeight-4, 7, 7);
//第1列
drawX = 4;
drawY = 3;
drawSt = "请选择";
g.setColor(0x00000000);
//第2列
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "下注";
g.drawString(drawSt, drawX, drawY +stHeight, Graphics.TOP|Graphics.LEFT);
//Cash
drawSt = "所持金额:";
g.drawString(drawSt, drawX, drawY+stHeight*2, Graphics.TOP|Graphics.LEFT);
drawSt = String.valueOf(cash4Bet);
tmpDrawX = screenWidth -drawX -defFont.stringWidth(drawSt) -2;
tmpDrawY = drawY + stHeight*2;
g.drawString(drawSt, tmpDrawX, tmpDrawY, Graphics.TOP|Graphics.LEFT);
//Bet
drawSt = "下注金额:";
g.drawString(drawSt, drawX, drawY+defFont.getHeight()*3, Graphics.TOP|Graphics.LEFT);
drawSt = betCashSt;
tmpDrawX = screenWidth -drawX -defFont.stringWidth(drawSt) -2;
tmpDrawY = drawY + stHeight*3;
g.drawString(drawSt, tmpDrawX, tmpDrawY, Graphics.TOP|Graphics.LEFT);
g.setStrokeStyle(Graphics.DOTTED);
tmpDrawY = tmpDrawY + defFont.getBaselinePosition() +1;
g.drawLine(tmpDrawX, tmpDrawY, tmpDrawX + defFont.stringWidth(drawSt),tmpDrawY);
g.setStrokeStyle(Graphics.SOLID);
break;
case DEAL: //显示扑克牌分配画面
case RE_DEAL: //显示扑克牌的交换
drawCards(g);
break;
case SELECT: //显示扑克牌选择画面
drawCards(g);
drawHeight = stHeight * 2 +6;
drawX = 0;
drawY = 0;
//底色
g.setColor(0x00000000);
g.fillRoundRect(drawX, drawY, screenWidth, drawHeight, 7, 7);
g.setColor(0x00FFFFFF);
g.fillRoundRect(drawX+2, drawY+2, screenWidth-4, drawHeight-4, 7, 7);
//第1列
drawX = 4;
drawY = 3;
drawSt = "请选择";
g.setColor(0x00000000);
//第2列
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
drawSt = "要交换的扑克牌";
g.drawString(drawSt, drawX, drawY +stHeight, Graphics.TOP|Graphics.LEFT);
//在扑克牌上
g.setColor(0x00FFFFFF);
drawY = screenHeight - Card.HEIGHT -7 -stHeight;
tmpDrawX = (screenWidth - Card.WIDTH * cards.length) /2;
int cardsLeng = cards.length;
for(int i=0; i < cardsLeng; i++) {
drawSt = String.valueOf(i +1);
drawX = tmpDrawX + (Card.WIDTH - defFont.stringWidth(drawSt)) / 2;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
tmpDrawX = tmpDrawX + Card.WIDTH;
}
break;
case RESULT: //显示结果
case GAME_OVER: //游戏结束状态
case BE_PLAYED_OUT: //停止赌注状态
drawCards(g);
drawHeight = stHeight * 3 +6;
drawX = 0;
drawY = 0;
//底色
g.setColor(0x00000000);
g.fillRoundRect(drawX, drawY, screenWidth, drawHeight, 7, 7);
g.setColor(0x00FFFFFF);
g.fillRoundRect(drawX+2, drawY+2, screenWidth-4, drawHeight-4, 7, 7);
switch(winning) { //根据牌面来改变消息
case Royal_Flush_Rate:
drawSt = "Royal Straight";
drawSt2 = "Flush!!!!!!!!";
break;
case Five_of_a_Kind_Rate:
drawSt = "Five Card!";
drawSt2 = "Excellent!!";
break;
case Straight_Flush_Rate:
drawSt = "Straight Flush!";
drawSt2 = "Great!!";
break;
case Four_of_a_Kind_Rate:
drawSt = "Four Card!";
drawSt2 = "Great job!!";
break;
case Full_House_Rate:
drawSt = "Full House!";
drawSt2 = "Nice hand!!";
break;
case Flush_Rate:
drawSt = "Flush!";
drawSt2 = "Wow!!";
break;
case Straight_Rate:
drawSt = "Straight!";
drawSt2 = "Wonderful!!";
break;
case Three_of_a_Kind_Rate:
drawSt = "Three Card!";
drawSt2 = "Oh happy day!!";
break;
case Two_Pair_Rate:
drawSt = "Two Pair!";
drawSt2 = "Lucky you!!";
break;
case Jacks_or_Better_Rate:
drawSt = "One Pair!";
drawSt2 = "You are good!!";
break;
default:
drawSt = "Nothing!";
break;
}
g.setColor(0x00000000);
//第1列
drawX = 4;
drawY = 3;
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
//第2列
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -