📄 cardgamecanvas.java
字号:
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 + -