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

📄 cardgamecanvas.java

📁 用J2ME开发的卡片游戏
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
					grMain.drawRoundRect(40,40,95,70, 5, 5);
					grMain.drawString(TextString.getTxtQuitString(), 70, 60, Graphics.BASELINE | Graphics.LEFT);
					grMain.drawString(TextString.getTxtYesString(), 60, 90, Graphics.BASELINE | Graphics.LEFT);
					grMain.drawString(TextString.getTxtNoString(), 100, 90, Graphics.BASELINE | Graphics.LEFT);
					flushGraphics();
					addCommand(cmdBack);
					bExitMenu = true;
					bReady = false;
					return;
				} else { //清除退出框
					removeCommand(cmdBack);
					bExitMenu = false;
					grMain.setColor(COLOR_SCREEN);
					grMain.fillRect(40, 40, 96, 71);
					grMain.setColor(COLOR_BLACK);
					grMain.drawRect(POS_CARDOUTX, POS_CARDOUTY, CARD_LARGEWIDTH, CARD_LARGEHEIGHT);
					if (iCardOutNum != 0) {
						lmCard.paint(grMain, 0, 0);
					}
					flushGraphics();
					bReady = true;
					return;
				} 
			}
		}else if (c == cmdBack) { //返回主选择界面
			tmMain.cancel();
			MainMenuCanvas cvsMainMenu = new MainMenuCanvas(display);
			display.setCurrent(cvsMainMenu);
			cvsMainMenu.init();
		}
	}
	
	public void graphicInit(){ //开始游戏初始化
		//画电脑的卡片(背面)
		for (int i=1; i< 4; i++) {
			tlCardBack[i].setCell(0, 0, 15);
			lmCard.append(tlCardBack[i]);
		}
		
		//初始化人物头像		
		for (int i = 0; i < 4; i++) {
			tlFigure[i].setCell(0, 0, iPlayerFigure[i] * 3 + 1);
			lmFigure.append(tlFigure[i]);
		}
		
		//添加到卡片层管理器中
		lmCard.append(tlPlayerSmallCard);
		lmCard.append(tlPlayerLargeCard);
		lmCard.append(tlCardOut);
		
	    grMain.setColor(COLOR_SCREEN);
	    grMain.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	    grMain.setColor(COLOR_BLACK);
	    grMain.drawRect(POS_LARGECARDX, POS_LARGECARDY, CARD_LARGEWIDTH, CARD_LARGEHEIGHT);
	    grMain.drawRect(POS_CARDOUTX, POS_CARDOUTY, CARD_LARGEWIDTH, CARD_LARGEHEIGHT);
	    for (int i = 0; i < 14; i++){
	    	grMain.drawRect(POS_FIRSTSMALLCARDX + (i % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (i / NUM_RANKROW)*SPACE_BETWEENY, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
	    }
	    grMain.drawLine(0, 130, SCREEN_WIDTH, 130);
		lmFigure.paint(grMain, 0, 0);
		paintScore();
	    flushGraphics();		
	}
	
	public int randomCard(int iScope){ //产生随机数
		return (rdCard.nextInt() & 0x7FFFFFFF) % iScope;
	}
	
	public int pickCard() { //从剩余的卡片中随机取一张,并对剩余的卡片排序
		int iCardRandomNum = randomCard(iCardLeftProNum);
		int iRandomCard = iCard[iCardRandomNum][1];		
		
		iCard[iCardRandomNum][0]--;
		iCardNum--;
		
		for (int i = 0; i < iCardLeftProNum; i++) { //卡片数组排序,去除抽完卡片的数组
			if (iCard[i][0] == 0) {
				for (int j = i; j< iCardLeftProNum -1; j++) {					
					iCard[j][0] = iCard[j+1][0];
					iCard[j][1] = iCard[j+1][1];					
				}
				iCardLeftProNum--;
				break;
			}			
		}		
		
		return iRandomCard;
	}
	
	public void fetchCard() { //玩家取得随机的卡片,并修改玩家手中的卡片
		int iCard = pickCard();
		int iSearch;
		boolean bFindCard = false;
		
		iPlayerCardInfo[iPlayerTurn][0]++; //玩家总的卡片数加1		
		for (iSearch = 0; iSearch < iPlayerCardInfo[iPlayerTurn][1]; iSearch++) {
			if (iPlayer[iPlayerTurn][iSearch][1] == iCard) { //搜索取得的卡片属性玩家是否已经拥有
				bFindCard = true;
				break;				
			}
		}		
		
		if (bFindCard) { //已有,则对应属性的卡片数量加1
			iPlayer[iPlayerTurn][iSearch][0]++;
		}else { //还没有, 则使玩家的卡片数和种类加1
			iPlayer[iPlayerTurn][iSearch][0] = 1;
			iPlayer[iPlayerTurn][iSearch][1] = iCard;
			iPlayerCardInfo[iPlayerTurn][1]++; //玩家卡片的种类加1
		}
		
	}
	
	public void paintScore() { //画出玩家当前的得分
		clearRect(3, 5, 60, 20);		
		clearRect(3, 25, 60, 20);
		grMain.setColor(COLOR_WHITE);
		grMain.setFont(Font.getFont(Font.FONT_STATIC_TEXT, Font.STYLE_PLAIN, Font.SIZE_SMALL));
		if (((iGameNum - 1) / 4) == 0) {
			switch ((iGameNum - 1) % 4) { //画出当前的轮数和局数
				case 0:
					grMain.drawString("光轮 " + "风局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
				case 1:
					grMain.drawString("光轮 " + "火局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
				case 2:
					grMain.drawString("光轮 " + "水局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
				case 3:
					grMain.drawString("光轮 " + "地局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
			}			
		}else {
			switch ((iGameNum - 1) % 4) {
				case 0:
					grMain.drawString("暗轮 " + "风局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
				case 1:
					grMain.drawString("暗轮 " + "火局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
				case 2:
					grMain.drawString("暗轮 " + "水局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
				case 3:
					grMain.drawString("暗轮 " + "地局", 3, 5, Graphics.TOP | Graphics.LEFT);
					break;
			}
		}
		grMain.drawString(TextString.getTxtScoreLabelString()+ String.valueOf(iScore), 3, 25, Graphics.TOP | Graphics.LEFT);
		grMain.setColor(COLOR_BLACK);
	}
	
	public void paintFigure(int iFigureTurn, int iFace) { //画人物头像及其表情
		tlFigure[iFigureTurn].setCell(0, 0, iPlayerFigure[iFigureTurn] * 3 + iFace);
		switch (iFigureTurn) { //玩家的头像为iPlayerFigure[0], 电脑头像依次逆时针加1
			case 0:	
				clearRect(141, 150, FIGURE_WIDTH + 1, FIGURE_HEIGHT + 1);
				tlFigure[iFigureTurn].setPosition(141, 150);	
				break;
			case 1:
				clearRect(141, 68, FIGURE_WIDTH + 1, FIGURE_HEIGHT + 1);
				tlFigure[iFigureTurn].setPosition(141, 68);
				break;
			case 2:
				clearRect(72, 3, FIGURE_WIDTH + 1, FIGURE_HEIGHT + 1);
				tlFigure[iFigureTurn].setPosition(72, 3);
				break;
			case 3:
				clearRect(3, 68, FIGURE_WIDTH + 1, FIGURE_HEIGHT + 1);
				tlFigure[iFigureTurn].setPosition(3, 68);
				break;
		}
		lmFigure.paint(grMain, 0, 0);
	}
	
	public void paintSmallCard(int iCard) { //绘制玩家手中的卡片		
		
		switch (iPlayerTurn) {
			case 0: //画玩家的卡片
				if (iCard == 0) { //清空最后一张卡片
					clearRect(POS_FIRSTSMALLCARDX + (iPlayerCardInfo[0][1] % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iPlayerCardInfo[0][1] / NUM_RANKROW)*SPACE_BETWEENY - SPACE_POPUPY, CARD_SMALLWIDTH + 2, CARD_SMALLHEIGHT + 18);
					grMain.drawRect(POS_FIRSTSMALLCARDX + (iPlayerCardInfo[0][1] % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iPlayerCardInfo[0][1] / NUM_RANKROW)*SPACE_BETWEENY, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
				}
				
				for (int i = 0; i< iPlayerCardInfo[0][1]; i++) { //查找现有的卡片中是否与拿到的卡片相同
					if (iPlayer[0][i][1] == iCard) { //由于新的卡片已添加到末尾,所以肯定有匹配的卡片
						//在已有卡片底下画字符"×n"				
						grMain.setFont(Font.getFont(Font.FONT_STATIC_TEXT, Font.STYLE_PLAIN, Font.SIZE_SMALL));
						clearRect(POS_FIRSTMULX + (i % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTMULY + (i / NUM_RANKROW)*SPACE_BETWEENY, 12, 14);
						grMain.setColor(COLOR_WHITE);
						grMain.drawString("×" + String.valueOf(iPlayer[0][i][0]), POS_FIRSTMULX + (i % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTMULY + (i / NUM_RANKROW)*SPACE_BETWEENY, Graphics.LEFT |  Graphics.TOP);
						grMain.setColor(COLOR_BLACK);				
						
						
						//往右上角偏移1格画
						tlPlayerSmallCard.setCell(0, 0, iCard);
						tlPlayerSmallCard.setPosition(POS_FIRSTSMALLCARDX + (i % NUM_RANKROW)*SPACE_BETWEENX + 1, POS_FIRSTSMALLCARDY + (i / NUM_RANKROW)*SPACE_BETWEENY - 1);			
						lmCard.paint(grMain, 0, 0);
						grMain.drawRect(POS_FIRSTSMALLCARDX + (i % NUM_RANKROW)*SPACE_BETWEENX + 1, POS_FIRSTSMALLCARDY + (i / NUM_RANKROW)*SPACE_BETWEENY - 1, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
						flushGraphics();			
						break;
					}
				}	
				break;
			case 1: //画电脑的卡片
				if (iPlayerCardInfo[iPlayerTurn][0] != 0) {
					clearRect(155, 108, 21, 20);
					if (iPlayerCardInfo[iPlayerTurn][0] == 1) { //只剩一张,则卡片数标为红色
						grMain.setColor(COLOR_RED);
					}else {
						grMain.setColor(COLOR_WHITE);
					}
					grMain.setFont(Font.getFont(Font.FONT_STATIC_TEXT, Font.STYLE_BOLD, Font.SIZE_SMALL));
					grMain.drawString("×" + String.valueOf(iPlayerCardInfo[iPlayerTurn][0]), 155, 108, Graphics.LEFT |  Graphics.TOP);
					grMain.setColor(COLOR_BLACK);
				}else {
					clearRect(140, 105, 36, 23);
				}
				break;
			case 2: //画电脑的卡片				
				if (iPlayerCardInfo[iPlayerTurn][0] != 0) {
					clearRect(125, 20, 21, 20);	
					if (iPlayerCardInfo[iPlayerTurn][0] == 1) { //只剩一张,则卡片数标为红色
						grMain.setColor(COLOR_RED);
					}else {
						grMain.setColor(COLOR_WHITE);
					}
					grMain.setFont(Font.getFont(Font.FONT_STATIC_TEXT, Font.STYLE_BOLD, Font.SIZE_SMALL));
					grMain.drawString("×" + String.valueOf(iPlayerCardInfo[iPlayerTurn][0]), 125, 20, Graphics.LEFT |  Graphics.TOP);
					grMain.setColor(COLOR_BLACK);
				}else {
					clearRect(110, 17, 36, 23);
				}
				break;
			case 3:	 //画电脑的卡片			
				if (iPlayerCardInfo[iPlayerTurn][0] != 0) {
					clearRect(18, 108, 21, 20);	
					if (iPlayerCardInfo[iPlayerTurn][0] == 1) { //只剩一张,则卡片数标为红色
						grMain.setColor(COLOR_RED);
					}else {
						grMain.setColor(COLOR_WHITE);
					}
					grMain.setFont(Font.getFont(Font.FONT_STATIC_TEXT, Font.STYLE_BOLD, Font.SIZE_SMALL));
					grMain.drawString("×" + String.valueOf(iPlayerCardInfo[iPlayerTurn][0]), 18, 108, Graphics.LEFT |  Graphics.TOP);
					grMain.setColor(COLOR_BLACK);
				}else {
					clearRect(3, 105, 36, 23);
				}
				break;
		}
	}
	
	public void paintLargeCard(int iLargeCard) {	 //绘制玩家手中的大卡片
		clearRect(POS_LARGECARDX, POS_LARGECARDY, CARD_LARGEWIDTH, CARD_LARGEHEIGHT);
		tlPlayerLargeCard.setCell(0, 0, iPlayer[0][iLargeCard][1]);
		tlPlayerLargeCard.setPosition(POS_LARGECARDX, POS_LARGECARDY);
		lmCard.paint(grMain, 0, 0);
		grMain.drawRect(POS_LARGECARDX, POS_LARGECARDY, CARD_LARGEWIDTH, CARD_LARGEHEIGHT);
		flushGraphics();	
	}
	
	public void cardPopUp(int iCardPop) { //弹出玩家选择的卡片		
		if (iPlayerCardInfo[0][1] != 0) { //玩家手中还有卡片
			tlPlayerSmallCard.setCell(0, 0, iPlayer[0][iCardPop][1]);
			if (iPlayer[0][iCardPop][0] == 1) {
				clearRect(POS_FIRSTSMALLCARDX + (iCardPop % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iCardPop / NUM_RANKROW)*SPACE_BETWEENY, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
				grMain.drawRect(POS_FIRSTSMALLCARDX + (iCardPop % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iCardPop / NUM_RANKROW)*SPACE_BETWEENY, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);	
			}else {
				tlPlayerSmallCard.setPosition(POS_FIRSTSMALLCARDX + (iCardPop % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iCardPop / NUM_RANKROW)*SPACE_BETWEENY);
				grMain.drawRect(POS_FIRSTSMALLCARDX + (iCardPop % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iCardPop / NUM_RANKROW)*SPACE_BETWEENY, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
			}		
			tlPlayerSmallCard.setPosition(POS_FIRSTSMALLCARDX + (iCardPop % NUM_RANKROW)*SPACE_BETWEENX + 1, POS_FIRSTSMALLCARDY + (iCardPop / NUM_RANKROW)*SPACE_BETWEENY - SPACE_POPUPY);
			lmCard.paint(grMain, 0, 0);
			grMain.drawRect(POS_FIRSTSMALLCARDX + (iCardPop % NUM_RANKROW)*SPACE_BETWEENX + 1, POS_FIRSTSMALLCARDY + (iCardPop / NUM_RANKROW)*SPACE_BETWEENY - SPACE_POPUPY, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
			flushGraphics();
		}			
	}
	
	public void cardPushBack(int iCardBack) {	//放回玩家不选择的卡片
		tlPlayerSmallCard.setCell(0, 0, iPlayer[0][iCardBack][1]);			
		clearRect(POS_FIRSTSMALLCARDX + (iCardBack % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iCardBack / NUM_RANKROW)*SPACE_BETWEENY - SPACE_POPUPY, CARD_SMALLWIDTH + 2, CARD_SMALLHEIGHT + 4);
		grMain.drawRect(POS_FIRSTSMALLCARDX + (iCardBack % NUM_RANKROW)*SPACE_BETWEENX, POS_FIRSTSMALLCARDY + (iCardBack / NUM_RANKROW)*SPACE_BETWEENY, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);	
		tlPlayerSmallCard.setPosition(POS_FIRSTSMALLCARDX + (iCardBack % NUM_RANKROW)*SPACE_BETWEENX + 1, POS_FIRSTSMALLCARDY + (iCardBack / NUM_RANKROW)*SPACE_BETWEENY - 1);
		lmCard.paint(grMain, 0, 0);
		grMain.drawRect(POS_FIRSTSMALLCARDX + (iCardBack % NUM_RANKROW)*SPACE_BETWEENX + 1, POS_FIRSTSMALLCARDY + (iCardBack / NUM_RANKROW)*SPACE_BETWEENY - 1, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
		flushGraphics();		
	}
	
	public void cardPutOut(int iCardOut) {	//玩家和电脑出卡片
		tlCardOut.setCell(0, 0, iPlayer[iPlayerTurn][iCardOut][1]);
		tlCardOut.setPosition(POS_CARDOUTX, POS_CARDOUTY);	
		lmCard.paint(grMain, 0, 0);
		grMain.setColor(COLOR_WHITE);
		paintFigure(iPlayerTurn, 1);
		grMain.setColor(COLOR_BLACK);		
		flushGraphics();
		
		if (iPlayer[iPlayerTurn][iCardOut][0] == 1) { //该种卡片玩家或电脑手中只剩一张
			for (int i = iCardOut; i < iPlayerCardInfo[iPlayerTurn][1] - 1; i++) {
				//对手中的卡片重新排序
				iPlayer[iPlayerTurn][i][0] = iPlayer[iPlayerTurn][i + 1][0];
				iPlayer[iPlayerTurn][i][1] = iPlayer[iPlayerTurn][i + 1][1];
			}
			iPlayerCardInfo[iPlayerTurn][1]--; //卡片种类减1
			iPlayer[iPlayerTurn][iPlayerCardInfo[iPlayerTurn][1]][0] = 0;
			iPlayer[iPlayerTurn][iPlayerCardInfo[iPlayerTurn][1]][1] = 0;
			iPlayerCardInfo[iPlayerTurn][0]--; //卡片数量减1
				
			if (iPlayerTurn == 0) { //轮到玩家, 则画出玩家剩余的卡片
				for (int i = iCardOut; i <= iPlayerCardInfo[iPlayerTurn][1]; i++) {
					paintSmallCard(iPlayer[iPlayerTurn][i][1]);
				}
			}
		}else { //该种卡片玩家或电脑手中还有大于1张
			iPlayer[iPlayerTurn][iCardOut][0]--; //该种卡片数量减1
			iPlayerCardInfo[iPlayerTurn][0]--; //手中卡片总数减1
			if (iPlayerTurn == 0) { //轮到玩家, 则画出玩家剩余的卡片
				paintSmallCard(iPlayer[iPlayerTurn][iCardOut][1]);
			}
		}	
		
		if (iPlayerTurn > 0) { //轮到电脑, 则画出电脑剩余的卡片
			paintSmallCard(0);
		}
		
		//根据设置播放声音
		if (SettingsForm.getSoundOption() == 0) {
		    try { 	   
			    Manager.playTone(40,100,100);
		 	}catch (Exception e) {
		 		ErrorHandling erMedia = new ErrorHandling(display, ErrorHandling.MEDIAERROR);
	        }
		}
		
		//判断出牌后,玩家和电脑手中是否还有牌
		if (iPlayerCardInfo[iPlayerTurn][0] == 0) {					
			if (iPlayerTurn == 0) { //玩家手中没有卡片,则玩家赢了
				bWin = true;
			}else { //电脑手中没有卡片,则玩家输了
				bWin = false;
			}
			endGame(); //本局游戏结束
		}else {		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -