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

📄 cardgamecanvas.java

📁 用J2ME开发的卡片游戏
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/**
 * 
 * 主游戏界面
 * 
 * 
 */

package card;

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.Image;
import javax.microedition.rms.*;
import javax.microedition.media.Manager;

import java.io.*;

import card.stringtable.ImageStringTable;
import card.stringtable.TextString;

import java.io.IOException;
import java.util.*;

public class CardGameCanvas extends GameCanvas implements CommandListener{
	Display display = null;
	Thread thread = null;
	Random rdCard = null;	
	RecordStore rsInfo = null;
	Image  imgFigureMap, imgCardSmall, imgCardLarge = null;
	Graphics grMain = null;
	Timer tmMain = null;
	TiledLayer tlFigure[] = null;
	TiledLayer tlCardBack[] = null;
	TiledLayer tlCardOut = null;
	TiledLayer tlPlayerSmallCard, tlPlayerLargeCard = null;
	LayerManager lmFigure = null;
	LayerManager lmCard = null;
	Command cmdExit, cmdBack= null;
	MainTimerTask cMainTT = null;
	KeyPressTimerTask cKeyPressTT = null;
	Rule cMainRule = null;
	
	final int CARDNUM = 50; //卡片总数
	final int CARDSUMNUM = 14; //总的卡片数
	final int CARDEACHNUM = 4; //每种卡片的数量
	final int CARDKINDNUM = 4; //卡片种类数量
	final int CARDPRONUM = 3; //卡片等级数量
	
	final int CARDFENG = 0; //卡片风
	final int CARDDI = 1; //卡片地
	final int CARDSHUI = 2; //卡片水
	final int CARDHUO = 3; //卡片火
	final int CARDGUANG = 4; //卡片光
	final int CARDAN = 5; //卡片暗
	
	final int SCREEN_WIDTH = 176; //屏幕的实际可用宽度
	final int SCREEN_HEIGHT = 208; //屏幕的实际可用高度
	final int POS_FIRSTSMALLCARDX = 40; //左上角第一张小卡片的x坐标
	final int POS_FIRSTSMALLCARDY = 137; //左上角第一张小卡片的y坐标
	final int POS_LARGECARDX = 3; //左边大卡片的x坐标
	final int POS_LARGECARDY = 140; //左边大卡片的y坐标
	final int POS_CARDOUTX = 72; //出的大卡片的x坐标
	final int POS_CARDOUTY = 58; //出的大卡片的y坐标
	final int POS_FIRSTMULX = 42; //左上角第一张小卡片底下的"×n"字符的x坐标
	final int POS_FIRSTMULY = 156; //左上角第一张小卡片底下的"×n"字符的y坐标
	final int SPACE_BETWEENX = 14; //两张小卡片之间的x距离
	final int SPACE_BETWEENY = 35; //两张小卡片之间的y距离
	final int SPACE_POPUPY = 4; //小卡片弹出的高度
	final int CARD_SMALLWIDTH = 12; //小卡片的宽度
	final int CARD_SMALLHEIGHT = 18; //小卡片的高度
	final int CARD_LARGEWIDTH = 32; //大卡片的宽度
	final int CARD_LARGEHEIGHT = 48; //大卡片的高度
	final int FIGURE_WIDTH = 32; //头像的宽度
	final int FIGURE_HEIGHT = 32; //头像的高度
	final int NUM_RANKROW = 7; //一排放置的小卡片个数
	
	final int COLOR_SCREEN = 0x3A6EA5; //背景色
	final int COLOR_BLACK = 0x000000; //黑色
	final int COLOR_WHITE = 0xFFFFFF; //白色
	final int COLOR_RED = 0xFF0000; //红色
	
	int iCard[][] = new int[CARDSUMNUM][2]; //第1维:0~13剩余代表卡片的种类
											 //第2维:0代表剩余该种卡片的种类标号, 1代表剩余该种卡片的数量
	
	int iPlayerFigure[] = new int[4]; //人物头像的序号
	
	int iPlayer[][][] = new int[4][CARDSUMNUM][2]; //第1维:0~3代表4个玩家
													//第2维:0~13代表卡片的种类
													//第3维:0代表该玩家拥有的卡片的种类,1代表该玩家拥有该种卡片的数量
	
	int iPlayerCardInfo[][] = new int[4][2]; //玩家总的卡片数和种类数
											  //第1维:0~3代表4个玩家		
											  //第2维:0代表玩家手上卡片总数,1玩家卡片的种类数
	int iPlayerCardOut[] = new int[CARDNUM]; //打出去的卡片
	
	int iFigureChoice; //选择的人物
	int iCardNum; //剩余的卡片总数
	int iCardLeftProNum; //剩余的卡片种数
	int iCardLevel; //卡片的等级
	int iCardProperty; //卡片的属性
	int iCardSelected; //选择的要出的卡片
	int iPlayerTurn; //轮到的玩家
	int iCardOutNum; //一轮总共打出的卡片数
	int iScore; //玩家得分
	int iHighScore; //最高分
	int iGameNum; //当前局数
	boolean bExitMenu; //是否选择退出
	boolean bWin; //玩家是否赢了
	boolean bFinish; //是否结束一局
	boolean bReady; //是否可以出卡片
	boolean bCardOut; //本轮玩家是否已出过卡片
	boolean bGameOver; //是否已游戏结束
	
	
	public CardGameCanvas(Display display, int iFigureChoice) { //构造方法
		super(true);
		
		//初始化类属性
		this.setFullScreenMode(true);
		this.display = display;
		this.iFigureChoice = iFigureChoice;	
	}	
	
	public void init() {		
		boolean bSuccess = true; //判断载入成功与否的变量
		
		//	载入游戏资源和记录集
		try { 
			//载入游戏图片
			imgFigureMap = Image.createImage(ImageStringTable.getImgFigureMapSmallString());
			imgCardSmall = Image.createImage(ImageStringTable.getImgCardSmallString());
			imgCardLarge = Image.createImage(ImageStringTable.getImgCardLargeString());
			
			//读取记录集最高分信息
			rsInfo = RecordStore.openRecordStore(TextString.getTxtRecordSetNameString(), true);
			if (rsInfo.getNumRecords() == 0) {
				iHighScore = 0;
			}else {
				byte[] btHighScore = rsInfo.getRecord(1);
				DataInputStream disInfo = new DataInputStream(new ByteArrayInputStream(btHighScore));
				iHighScore = disInfo.readInt();
			}
		}catch (IOException e) { //图片载入异常处理
			ErrorHandling ehIOException = new ErrorHandling(display, ErrorHandling.IMGNOTFOUND);
			bSuccess = false; //载入失败,标志位为false
		}catch (Exception e) { //记录集读取异常处理
			ErrorHandling ehRecordSetException = new ErrorHandling(display, ErrorHandling.RECORDSETERROR);
			bSuccess = false; //载入失败,标志位为false
		}
	
		if (bSuccess) { //载入成功
			//初始化各控件
		    cmdExit = new Command(TextString.getTxtCmdExitString(), Command.EXIT, 0);
		    cmdBack = new Command(TextString.getTxtCmdBackString(), Command.OK, 0);
			rdCard = new Random();	
			tmMain = new Timer();
			cMainTT = new MainTimerTask();
			cKeyPressTT = new KeyPressTimerTask();
			cMainRule = new Rule();
			
			tlPlayerSmallCard = new TiledLayer(1, 1, imgCardSmall, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
			tlPlayerLargeCard = new TiledLayer(1, 1, imgCardLarge, CARD_LARGEWIDTH, CARD_LARGEHEIGHT);
			tlCardOut  =  new TiledLayer(1, 1, imgCardLarge, CARD_LARGEWIDTH, CARD_LARGEHEIGHT);
			lmCard = new LayerManager();
			lmFigure = new LayerManager();
			tlCardBack = new TiledLayer[4];
			tlFigure = new TiledLayer[4];
	
			iScore = 0;
			iGameNum = 0;
			iPlayerTurn = 0;
			
			//人物头像层初始化
			for (int i = 0; i < 4; i++) {
				tlFigure[i] = new TiledLayer(1, 1, imgFigureMap, FIGURE_WIDTH, FIGURE_HEIGHT);
			}
			
			//卡片背面层初始化
			for (int i = 1; i < 4; i++) {
				tlCardBack[i] = new TiledLayer(1, 1, imgCardSmall, CARD_SMALLWIDTH, CARD_SMALLHEIGHT);
			}		
			
			//人物头像确定	
			for (int i = 0; i < 4; i++) {			
				iPlayerFigure[i] = iFigureChoice;
				iFigureChoice =  (iFigureChoice + 1) % 4;
			}
			
			//人物头像位置确定
			tlFigure[0].setPosition(141, 150);
			tlFigure[1].setPosition(141, 68);
			tlFigure[2].setPosition(72, 3);
			tlFigure[3].setPosition(3, 68);		
	
			//卡片的背面
			tlCardBack[1].setPosition(140, 105);
			tlCardBack[2].setPosition(110, 17);
			tlCardBack[3].setPosition(3, 105);
			
			//开启线程及其他初始化操作
			grMain = getGraphics();			
		    addCommand(cmdExit);	   
		    setCommandListener(this);	
			tmMain.schedule(cKeyPressTT, 500, 200);
			tmMain.schedule(cMainTT, 500, 500);
	
			flushGraphics();
			
			//开始游戏
			startGame(); 
		}
	}
	
	public void startGame() { //开始游戏
		
		//游戏状态初始化
		bExitMenu = false;
		bWin = false;
		bFinish = false;
		bReady = false;
		bCardOut = false;
		bGameOver = false;
		iGameNum++;	
		
		//开片参数初始化
		iCardNum = CARDNUM;
		iCardLeftProNum = CARDSUMNUM;		
		iCardLevel = 0;
		iCardProperty = 0;
		iCardSelected = 0;
		iCardOutNum = 0;
		
		for (int i = 0; i < CARDSUMNUM; i++) {
			iCard[i][0] = CARDEACHNUM;
			iCard[i][1] = i + 1;
		}
		iCard[12][0] = 1;
		iCard[13][0] = 1;
		
		//初始化玩家卡片数组
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < CARDSUMNUM; j++) {
				for (int k = 0; k < 2; k++) {
					iPlayer[i][j][k] = 0;					
				}				
			}
		}
		
		//初始化玩家卡片信息数组
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j< 2; j++) {
				iPlayerCardInfo[i][j] = 0;
			}
		}

		//初始化打出的卡片
		for (int i = 0; i < CARDNUM; i++) {
			iPlayerCardOut[i] = 0;
		}
		
		
		graphicInit();	//初始化图形   
		
		//开始每人5张卡片
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 4; j++) {
				fetchCard(); //取卡片
				iPlayerTurn = (iPlayerTurn + 1) % 4;
			}
		}
		
		//如有4张相同属性,相同等级的卡片则扔掉继续摸牌
		for (int i = 0; i < 4; i++) {
			cMainRule.throwCard(); //扔卡片
			while ((iPlayerCardInfo[iPlayerTurn][0] < 5) && (iCardNum > 0)) {
				fetchCard(); //取卡片
				if (iPlayerCardInfo[iPlayerTurn][0] >= 4) {
					cMainRule.throwCard();
				}
			}
			
			//画出电脑卡片数和玩家自己的卡片
			for (int j = 0; j < iPlayerCardInfo[iPlayerTurn][1]; j++) {
				paintSmallCard(iPlayer[iPlayerTurn][j][1]);
			}
			iPlayerTurn = (iPlayerTurn + 1) % 4; //下一个玩家
		}
		
		bReady = true; //可以开始游戏
		cardPopUp(iCardSelected); //设置第一张玩家的卡片为选中状态
		paintLargeCard(iCardSelected); //画出大卡片
	}
	
	public void endGame() { //一局游戏结束
		bCardOut = true; //出牌完毕
		grMain.setColor(COLOR_WHITE);
		grMain.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
		if (bWin) { //玩家赢了计算本局得分
			grMain.drawString(TextString.getTxtWinString(), SCREEN_WIDTH / 2 - 30, SCREEN_HEIGHT / 2 + 5, Graphics.TOP | Graphics.LEFT);
			for (int i = 1; i < 4; i++) {
				for (int j = 0; j < iPlayerCardInfo[i][1]; j++) {
					if (iPlayer[i][j][1] >= 13) {
						iScore += 40;
					}else {
						iScore += ((iPlayer[i][j][1] - 1) % CARDPRONUM + 1) * 10;
					}
				}
			}
			paintScore();
		}else {
			grMain.drawString(TextString.getTxtLoseString(), SCREEN_WIDTH / 2 - 30, SCREEN_HEIGHT / 2 + 5, Graphics.TOP | Graphics.LEFT);
		}
		grMain.setColor(COLOR_BLACK);			
		
		//画出其它三家的表情头像
		for (int i = 0; i < 4; i++) {
			if (i != iPlayerTurn) {
				paintFigure(i, 3);
			}
		}		
		
		tlPlayerSmallCard.setCell(0, 0, 0); //清掉玩家卡片图像		
		tlCardOut.setCell(0, 0, 0); //清掉玩家出的卡片图像
		flushGraphics();
		bFinish = true; //一局结束标示符
		if (iGameNum == 8) { //打完两轮,每轮四局, 游戏结束
			clearRect(SCREEN_WIDTH / 2 - 40, SCREEN_HEIGHT / 2 + 5, 80, 20);
			grMain.setColor(COLOR_WHITE);
			grMain.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
			grMain.drawString(TextString.getTxtGameOverString(), SCREEN_WIDTH / 2 - 40, SCREEN_HEIGHT / 2 + 5, Graphics.TOP | Graphics.LEFT);
			grMain.setColor(COLOR_BLACK);
			bGameOver = true; //游戏结束标志
		}
		
	}
	
	public void commandAction(Command c, Displayable d) { //软按键响应处理
		if (c == cmdExit) { //按退出键处理
			if (iPlayerTurn == 0) { //轮到玩家才响应
				if (!bExitMenu) { //显示退出框
					grMain.setColor(COLOR_WHITE);
					grMain.fillRoundRect(40, 40, 95, 70, 5, 5);
					grMain.setColor(COLOR_BLACK);

⌨️ 快捷键说明

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