📄 gamemaincanvas.java
字号:
package unicoco;
import java.io.EOFException;
import java.io.IOException;
import java.io.InterruptedIOException;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotFoundException;
import javax.microedition.rms.RecordStoreNotOpenException;
public class GameMainCanvas extends Canvas implements Runnable, CommandListener {
// 屏幕的大小
int width;
int height;
// 棋子的直径
int cDiameter;
ChessGame chessGame;
// 棋盘的左上角的坐标
int startX;
int startY;
static GameMainCanvas instance;
static GameMainCanvas instance1;
Alert altReceiveMessage = new Alert("Receive Message", null, null,
AlertType.INFO);
Image screen;
TextBox tbSendMessage = new TextBox("Short Message", null, 100,
TextField.ANY);
public GameMainCanvas(boolean isServer) {
tbSendMessage.addCommand(new Command("Send", Command.OK, 1));
tbSendMessage.addCommand(new Command("Back", Command.BACK, 1));
tbSendMessage.setCommandListener(this);
// setFullScreenMode(true);
width = getWidth();
height = getHeight();
screen = Image.createImage(width, height);
// 一般都是width<height
cDiameter = width / (ChessGame.DIMENSION + 1) + 1;
startX = (width - cDiameter * (ChessGame.DIMENSION - 1)) / 2;
startY = (height - cDiameter * (ChessGame.DIMENSION - 1)) / 2;
chessGame = new ChessGame(isServer);
iniScreen();
new Thread(this).start();
addCommand(new Command("Exit", Command.EXIT, 2));
addCommand(new Command("Score", Command.HELP, 1));
addCommand(new Command("Message", Command.SCREEN, 1));
addCommand(new Command("Object", Command.SCREEN, 1));
setCommandListener(this);
altReceiveMessage.setTimeout(Alert.FOREVER);
}
// for single player
public GameMainCanvas() {
width = getWidth();
height = getHeight();
screen = Image.createImage(width, height);
// 一般都是width<height
cDiameter = width / (ChessGame.DIMENSION + 1) + 1;
startX = (width - cDiameter * (ChessGame.DIMENSION - 1)) / 2;
startY = (height - cDiameter * (ChessGame.DIMENSION - 1)) / 2;
chessGame = new ChessGame(true, true);
iniScreen();
addCommand(new Command("Return", Command.EXIT, 2));
setCommandListener(this);
}
// 队战
public static GameMainCanvas getInstance(boolean isServer) {
if (instance == null) {
instance = new GameMainCanvas(isServer);
}
return instance;
}
// 单机
public static GameMainCanvas getInstance() {
if (instance1 == null) {
instance1 = new GameMainCanvas();
}
return instance1;
}
void rePaintObject() {
chessGame.chesses[chessGame.lLastY * ChessGame.DIMENSION
+ chessGame.lLastX] = 0;
chessGame.chesses[chessGame.rLastY * ChessGame.DIMENSION
+ chessGame.rLastX] = 0;
Graphics ig = screen.getGraphics();
ig.setColor(0, 0, 0);
ig.fillRect(startX + chessGame.lLastX * cDiameter - cDiameter / 2, startY
+ chessGame.lLastY * cDiameter - cDiameter / 2, cDiameter,
cDiameter);
ig.fillRect(startX + chessGame.rLastX * cDiameter - cDiameter / 2, startY
+ chessGame.rLastY * cDiameter - cDiameter / 2, cDiameter,
cDiameter);
ig.setColor(255, 255, 255);
ig.drawLine(startX + chessGame.lLastX * cDiameter, startY
+ chessGame.lLastY * cDiameter - cDiameter / 2, startX
+ chessGame.lLastX * cDiameter, startY + chessGame.lLastY
* cDiameter + cDiameter / 2);
ig.drawLine(startX + chessGame.lLastX * cDiameter - cDiameter / 2, startY
+ chessGame.lLastY * cDiameter, startX + chessGame.lLastX
* cDiameter + cDiameter / 2, startY + chessGame.lLastY * cDiameter);
ig.drawLine(startX + chessGame.rLastX * cDiameter, startY
+ chessGame.rLastY * cDiameter - cDiameter / 2, startX
+ chessGame.rLastX * cDiameter, startY + chessGame.rLastY
* cDiameter + cDiameter / 2);
ig.drawLine(startX + chessGame.rLastX * cDiameter - cDiameter / 2, startY
+ chessGame.rLastY * cDiameter, startX + chessGame.rLastX
* cDiameter + cDiameter / 2, startY + chessGame.rLastY * cDiameter);
repaint(startX + chessGame.lLastX * cDiameter - cDiameter / 2, startY
+ chessGame.lLastY * cDiameter - cDiameter / 2, cDiameter,
cDiameter);
repaint(startX + chessGame.rLastX * cDiameter - cDiameter / 2, startY
+ chessGame.rLastY * cDiameter - cDiameter / 2, cDiameter,
cDiameter);
serviceRepaints();
}
void iniScreen() {
Graphics ig = screen.getGraphics();
ig.setColor(0, 0, 0);
ig.fillRect(0, 0, width, height);
ig.setColor(255, 255, 255);
for (int i = 0; i < ChessGame.DIMENSION; i++) {
// 棋盘的起始坐标
ig.drawLine(startX, startY + i * cDiameter, startX
+ (ChessGame.DIMENSION - 1) * cDiameter, startY + i * cDiameter);
ig.drawLine(startX + i * cDiameter, startY, startX + i * cDiameter,
startY + (ChessGame.DIMENSION - 1) * cDiameter);
}
for (int i = 0; i < ChessGame.DIMENSION; i++) {
for (int j = 0; j < ChessGame.DIMENSION; j++) {
if (chessGame.chesses[i * ChessGame.DIMENSION + j] != 0) {
if (chessGame.chesses[i * ChessGame.DIMENSION + j] == 1) {
ig.setColor(0, 255, 0);
ig.fillArc((cDiameter - cDiameter / 2) + j * cDiameter,
(2 * cDiameter - cDiameter / 2) + i * cDiameter,
cDiameter, cDiameter, 0, 360);
} else {
ig.setColor(0, 0, 255);
ig.fillArc((cDiameter - cDiameter / 2) + j * cDiameter,
(2 * cDiameter - cDiameter / 2) + i * cDiameter,
cDiameter, cDiameter, 0, 360);
}
}
}
}
}
protected void paint(Graphics g) {
g.drawImage(screen, 0, 0, Graphics.LEFT | Graphics.TOP);
g.setColor(255, 255, 0);
g.drawRect(startX + chessGame.selectX * cDiameter - cDiameter / 2, startY
+ chessGame.selectY * cDiameter - cDiameter / 2, cDiameter,
cDiameter);
/*
* g.setColor(255, 0, 0); g.drawString(chessGame.Rname, width / 8, 5,
* Graphics.TOP | Graphics.LEFT); g.drawString(chessGame.Lname, width / 8,
* height - 5 - Font.getDefaultFont().getHeight(), Graphics.TOP |
* Graphics.LEFT); g.setColor(255, 255, 255); StringBuffer sbWinAndFail =
* new StringBuffer(10);
* sbWinAndFail.append("win:").append(chessGame.RwinAndFail[0]);
* g.drawString(sbWinAndFail.toString(), width / 3, 5, Graphics.TOP |
* Graphics.LEFT); sbWinAndFail.delete(0, sbWinAndFail.length());
* sbWinAndFail.append("fail:").append(chessGame.RwinAndFail[1]);
* g.drawString(sbWinAndFail.toString(), width / 2, 5, Graphics.TOP |
* Graphics.LEFT); sbWinAndFail.delete(0, sbWinAndFail.length());
* sbWinAndFail.append("win:").append(chessGame.LwinAndFail[0]);
* g.drawString(sbWinAndFail.toString(), width / 3, height - 5 -
* Font.getDefaultFont().getHeight(), Graphics.TOP | Graphics.LEFT);
* sbWinAndFail.delete(0, sbWinAndFail.length());
* sbWinAndFail.append("fail:").append(chessGame.LwinAndFail[1]);
* g.drawString(sbWinAndFail.toString(), width / 2, height - 5 -
* Font.getDefaultFont().getHeight(), Graphics.TOP | Graphics.LEFT);
*/
}
protected void keyPressed(int keyCode) {
if (chessGame.myTurn) {
switch (getGameAction(keyCode)) {
case Canvas.UP:
chessGame.selectY = (byte) ((chessGame.selectY - 1 + ChessGame.DIMENSION) % ChessGame.DIMENSION);
repaint();
serviceRepaints();
break;
case Canvas.RIGHT:
chessGame.selectX = (byte) ((chessGame.selectX + 1) % ChessGame.DIMENSION);
repaint();
serviceRepaints();
break;
case Canvas.DOWN:
chessGame.selectY = (byte) ((chessGame.selectY + 1) % ChessGame.DIMENSION);
repaint();
serviceRepaints();
break;
case Canvas.LEFT:
chessGame.selectX = (byte) ((chessGame.selectX - 1 + ChessGame.DIMENSION) % ChessGame.DIMENSION);
repaint();
serviceRepaints();
break;
case Canvas.FIRE:
// first=red or white
if (instance != null) {
if (chessGame.chesses[chessGame.selectY * ChessGame.DIMENSION
+ chessGame.selectX] == 0) {
chessGame.steps++;
Graphics ig = screen.getGraphics();
if (chessGame.isFirst) {
ig.setColor(255, 0, 0);
chessGame.chesses[chessGame.selectY * ChessGame.DIMENSION
+ chessGame.selectX] = 1;
} else {
ig.setColor(255, 255, 255);
chessGame.chesses[chessGame.selectY * ChessGame.DIMENSION
+ chessGame.selectX] = 2;
}
ig.fillArc(startX + chessGame.selectX * cDiameter - cDiameter
/ 2, startY + chessGame.selectY * cDiameter - cDiameter
/ 2, cDiameter, cDiameter, 0, 360);
repaint(startX + chessGame.selectX * cDiameter - cDiameter
/ 2, startY + chessGame.selectY * cDiameter - cDiameter
/ 2, cDiameter, cDiameter);
chessGame.myTurn = false;
chessGame.lLastX = chessGame.selectX;
chessGame.lLastY = chessGame.selectY;
ConnectionControler.sendChess(chessGame.selectX,
chessGame.selectY);
if (chessGame.checkWin(chessGame.chesses[chessGame.lLastY
* ChessGame.DIMENSION + chessGame.lLastX],
chessGame.lLastX, chessGame.lLastY)) {
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore("UserInf", false);
OptionsForm.writeWFData(rs, 2, false);
} catch (RecordStoreFullException e) {
// e.printStackTrace();
} catch (RecordStoreNotFoundException e) {
// e.printStackTrace();
} catch (RecordStoreException e) {
// e.printStackTrace();
}
try {
rs.closeRecordStore();
} catch (RecordStoreNotOpenException e) {
// e.printStackTrace();
} catch (RecordStoreException e) {
// e.printStackTrace();
}
chessGame.LwinAndFail[0]++;
chessGame.RwinAndFail[1]++;
Alert altWin = new Alert("You Win", null, null,
AlertType.CONFIRMATION);
altWin.setString(" You Win!!\n Play again ?");
altWin.setTimeout(Alert.FOREVER);
altWin.addCommand(new Command("Yes", Command.OK, 1));
altWin.addCommand(new Command("No", Command.CANCEL, 1));
altWin.setCommandListener(this);
MIDGame.display.setCurrent(altWin,this);
return;
}
if (chessGame.steps == ChessGame.DIMENSION
* ChessGame.DIMENSION) {
// 平局
Alert alt = new Alert("Draw game", null, null,
AlertType.CONFIRMATION);
alt.setString(" Draw game!!\n Play again ?");
alt.setTimeout(Alert.FOREVER);
alt.addCommand(new Command("Yes", Command.OK, 1));
alt.addCommand(new Command("No", Command.CANCEL, 1));
alt.setCommandListener(this);
MIDGame.display.setCurrent(alt,this);
return;
}
break;
}
// 单机版
} else if (instance1 != null) {
if (chessGame.chesses[chessGame.selectY * ChessGame.DIMENSION
+ chessGame.selectX] == 0) {
chessGame.steps++;
Graphics ig = screen.getGraphics();
if (chessGame.isFirst) {
ig.setColor(255, 0, 0);
chessGame.chesses[chessGame.selectY * ChessGame.DIMENSION
+ chessGame.selectX] = 1;
} else {
ig.setColor(255, 255, 255);
chessGame.chesses[chessGame.selectY * ChessGame.DIMENSION
+ chessGame.selectX] = 2;
}
ig.fillArc(startX + chessGame.selectX * cDiameter - cDiameter
/ 2, startY + chessGame.selectY * cDiameter - cDiameter
/ 2, cDiameter, cDiameter, 0, 360);
repaint(startX + chessGame.selectX * cDiameter - cDiameter
/ 2, startY + chessGame.selectY * cDiameter - cDiameter
/ 2, cDiameter, cDiameter);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -