📄 cardgamecanvas.java
字号:
/**
*
* 主游戏界面
*
*
*/
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 + -