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

📄 gamemaincanvas.java

📁 有关手机游戏网络对战方面的源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -