?? gamecanvas.java
字號:
if(drawSt2 != null) {
g.drawString(drawSt2, drawX, drawY +stHeight, Graphics.TOP|Graphics.LEFT);
}
//蠃得賭金
drawSt = "蠃得賭金:";
g.drawString(drawSt, drawX, drawY+stHeight*2, Graphics.TOP|Graphics.LEFT);
drawSt = String.valueOf(cashPrize);
tmpDrawX = screenWidth -drawX -defFont.stringWidth(drawSt) -2;
tmpDrawY = drawY + stHeight*2;
g.drawString(drawSt, tmpDrawX, tmpDrawY, Graphics.TOP|Graphics.LEFT);
switch(gameState) {
case GAME_OVER://游戲結束狀態
drawSt = "Game over";
break;
case BE_PLAYED_OUT://停止賭注狀態
drawSt = "停止賭注!";
break;
default:
return;
}
//設定粗體文本
stWidth = defFont.stringWidth(drawSt);
drawX = (screenWidth-stWidth) / 2;
drawY = (screenHeight - (stHeight)) / 2;
//描繪文本框
g.setColor(0x00BBBBBB);
g.fillRoundRect(drawX-2, drawY+2, stWidth+9, stHeight+2, 7, 7);
g.setColor(0x00000000);
g.fillRoundRect(drawX-6, drawY-2, stWidth+11, stHeight+4, 7, 7);
g.setColor(0x00FFFFFF);
g.fillRoundRect(drawX-4, drawY, stWidth+7, stHeight, 7, 7);
//文本框消息
g.setColor(0x00000000);
g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
break;
}
}
/**
* 描繪撲克牌的方法
* @param g Graphics對象
*/
private void drawCards(Graphics g) {
//將背景以綠色清除
g.setColor(0x00009900);
g.fillRect(0, 0, screenWidth, screenHeight);
//描繪撲克牌
int cardsLeng = cards.length;
for(int i=0; i < cardsLeng; i++) {
cards[i].doDraw(g);
}
}
/** 指定的事件發生時被調用出來的方法 */
public void commandAction(Command c, Displayable s) {
if(c == startCmd) {//Start指令
//初始化游戲以開始游戲
doGameInit();
doTurnInit();
gameState = BET;
//先將標題的指令刪除
removeCommand(startCmd);
removeCommand(exitCmd);
//新增指令
addCommand(quitCmd);
addCommand(okCmd);
repaint();
}else if(c == exitCmd) {//Exit指令
//調用出PokerMachine類的doExit方法,將MIDlet本身結束
pokerMachine.doExit();
}else if(c == okCmd) {//OK指令
doOK();
}else if(c == quitCmd) {//Quit指令
//刪除指令
removeCommand(okCmd);
removeCommand(quitCmd);
//顯示標題
doTitle();
}
}
/** 按下按鍵事件發生時所被調用的方法 */
protected synchronized void keyPressed(int keyCode) {
switch(gameState) {
case BET: //顯示下注畫面時
if(getGameAction(keyCode) == LEFT) {
//按下左按鍵時
doLeft4Bet();
}else {
switch(keyCode) {
//對下注的方法傳送被按下的數字按鍵的值
case KEY_NUM0:
doAddBet("0");
break;
case KEY_NUM1:
doAddBet("1");
break;
case KEY_NUM2:
doAddBet("2");
break;
case KEY_NUM3:
doAddBet("3");
break;
case KEY_NUM4:
doAddBet("4");
break;
case KEY_NUM5:
doAddBet("5");
break;
case KEY_NUM6:
doAddBet("6");
break;
case KEY_NUM7:
doAddBet("7");
break;
case KEY_NUM8:
doAddBet("8");
break;
case KEY_NUM9:
doAddBet("9");
break;
}
}
break;
case SELECT: //顯示撲克牌選擇畫面時
switch(keyCode) {
//按下1~5的數字按鍵時,
//調用選擇/解除選擇的方法
case KEY_NUM1:
doCardSelect(1);
break;
case KEY_NUM2:
doCardSelect(2);
break;
case KEY_NUM3:
doCardSelect(3);
break;
case KEY_NUM4:
doCardSelect(4);
break;
case KEY_NUM5:
doCardSelect(5);
break;
}
break;
}
}
/** OK按鈕被按下時所被調用的方法 */
private void doOK() {
//根據游戲狀態來改變處理
switch(gameState) {
case BET: //顯示下注畫面時
if(betCash > 0) {
//被下注時顯示撲克牌分配畫面
cash = cash4Bet;
gameState = DEAL;
doThreadStart();
}
break;
case SELECT: //顯示撲克牌選擇畫面時
if(selectCardCount > 0) {
//當撲克牌被選擇時就進行撲克牌的交換顯示
gameState = RE_DEAL;
doThreadStart();
}else {
//當沒有撲克牌被選擇時就進行結果顯示
gameState = RESULT;
doThreadStart();
}
break;
case RESULT: //顯示結果時
//進行下注畫面顯示
gameState = BET;
doTurnInit();
repaint();
break;
}
}
/** 在下注畫面中當左按鍵被按下時所調用的方法 */
private void doLeft4Bet() {
if(betCashSt.length() > 1) {
//下注2位數以上的金額時
//刪除第1位數
betCashSt = betCashSt.substring(0, betCashSt.length() -1);
try {
betCash = Integer.parseInt(betCashSt);
cash4Bet = cash - betCash;
}catch(Exception e) {}
}else {
//下注1位數以下的金額時
//將下注金額設為0
betCashSt = "0";
betCash = 0;
cash4Bet = cash;
}
repaint();
}
/**
* 在下注畫面中當數字按鍵被按下時所調用的方法
* @param numSt 對應數字按鍵的數字的字符串
*/
private void doAddBet(String numSt) {
//在現在的下注金額中新增引數的字符串
String tmpBetSt = betCashSt + numSt;
try {
//將下注金額變為數值
int tmpBetCash = Integer.parseInt(tmpBetSt);
if(cash >= tmpBetCash) {
//下注金額比所持金額少時
//承認該下注
betCash = tmpBetCash;
betCashSt = String.valueOf(betCash);
cash4Bet = cash - betCash;
repaint();
}
}catch(Exception e) {}
}
/**
* 在撲克牌選擇畫面中當數字按鍵被按下時所調用的方法
* @param num 對應了數字按鍵的數值(1~5)
*/
private void doCardSelect(int num) {
if(cards[num -1].getCardState() == Card.COVER_STATE) {
//當以引數所指定的撲克牌為正面(一般)狀態的時候
//設為選擇狀態
cards[num -1].setCardState(Card.SELECT_STATE);
selectCardCount++;
}else {
//選擇狀態的時候
//設為正面(一般)狀態
cards[num -1].setCardState(Card.COVER_STATE);
selectCardCount--;
}
repaint();
}
/** 線程的運作部分 */
public void run() {
int cardsLeng = cards.length;;
try {
switch(gameState) {
case DEAL: //顯示撲克牌分配畫面
for(int i=0; i < cardsLeng; i++) {
cards[i].setCardState(Card.COVER_STATE);
repaint();
Thread.sleep(150);
}
//顯示選擇畫面
gameState = SELECT;
repaint();
break;
case RE_DEAL: //顯示撲克牌的交換
for(int i=0; i < cardsLeng; i++) {
if(cards[i].getCardState() == Card.SELECT_STATE) {
cards[i].setCardState(Card.BACK_STATE);
}
}
repaint();
Thread.sleep(100);
//將翻面的撲克牌換成新的撲克牌
setNewCards4Change(selectCardCount);
//利用時差來顯示交換過的撲克牌
for(int i=0; i < cardsLeng; i++) {
if(cards[i].getCardState() == Card.BACK_STATE) {
cards[i].setCardState(Card.COVER_STATE);
repaint();
Thread.sleep(150);
}
}
//顯示結果
gameState = RESULT;
doThreadStart();
break;
case RESULT: //顯示結果
//檢查結果
winning = doResultCheck();
cashPrize = betCash * winning;
if(winning > 0) { //符合牌面時
cash = cash + cashPrize;
}
repaint();
if(cash < 1) { //沒有所持金額時
//先將指令刪除
removeCommand(okCmd);
removeCommand(quitCmd);
Thread.sleep(1000);
gameState = GAME_OVER;//游戲結束
doThreadStart();
}else if(cash >= MAX_CASH) {//所持金額為最高值以上時
//將指令刪除
removeCommand(okCmd);
removeCommand(quitCmd);
Thread.sleep(1000);
gameState = BE_PLAYED_OUT;//停止賭注狀態
doThreadStart();
}
break;
case GAME_OVER: //游戲結束
case BE_PLAYED_OUT: //停止賭注
repaint();
Thread.sleep(5000);
//回到標題畫面
doTitle();
break;
}
}catch(Exception e) {
}
}
/** 進行撲克牌分配時所調用的方法 */
private void setNewCards() {
int cardsLeng = cards.length;
int[] tmpCardNos = new int[cardsLeng];
for(int i=0; i < cardsLeng; i++) {
//使用亂數來決定撲克牌
tmpCardNos[i] = random.nextInt() % Card.CARD_TOTAL;//52枃亄僕儑乕僇乕2枃
if(tmpCardNos[i] < 0) {
//復數的時候
tmpCardNos[i] = tmpCardNos[i] * (-1);
}
//檢查是否重復
for(int j=0; j < i; j++) {
if(tmpCardNos[i] == tmpCardNos[j]) {
//若有相同的撲克牌存在時
//再次抽牌
i--;
break;
}
}
}
//以int為基礎在Card數組cards中設定值
for(int i=0; i < cardsLeng; i++) {
cards[i].setUniqueNo(tmpCardNos[i]);
}
}
/**
* 進行撲克牌交換時調用的方法
* @param size 要交換的張數
*/
private void setNewCards4Change(int size) {
int tmpCardNos[] = new int[size];
boolean isOverlap = false;//重復標志
int cardsLeng = cards.length;
for(int i=0; i < size; i++) {
//使用亂數來決定撲克牌
tmpCardNos[i] = random.nextInt() % Card.CARD_TOTAL;//52張+2張鬼牌
isOverlap = false;
if(tmpCardNos[i] < 0) {
//負數的時候
tmpCardNos[i] = tmpCardNos[i] * (-1);
}
//與已經分配的撲克牌進行重復檢查
for(int j=0; j < cardsLeng; j++) {
if(tmpCardNos[i] == cards[j].getUniqueNo()) {
//有相同撲克牌時
//再次抽取新牌
i--;
isOverlap = true;
break ;
}
}
//與要交換的撲克牌進行重復檢查
if(! isOverlap) {
for(int j=0; j < i; j++) {
if(tmpCardNos[i] == tmpCardNos[j]) {
//有相同的撲克牌時
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -