⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamecanvas.java

📁 几个不错的手机程序例子
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
				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 + -