?? 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 + -