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