📄 gamecanvas.java~172~
字号:
import javax.microedition.lcdui.*;
import java.util.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class GameCanvas extends Canvas implements CommandListener, Runnable {
Vector v = new Vector(); //存储x,y座标,避免重复选择
Random rnd = new Random();
int width, height; //屏幕
int gamestate;
final int LOGO = 0; //状态量
final int PLAY = 1;
final int OVER = 2;
final int ROW = 8;
final int COL = 6;
final int WIDTH = 20, HEIGHT = 20; //方格尺寸
final int MAX_SET = 4; //加法最大步骤
int time = 10; //10 秒倒记时
int score = 0;
int number = 0;
int[][] map;
int x = 0, y = 0; //选框坐标
int count = 0; //记录加法步骤
int sum = 0; //用户+和
Thread t = null;
Image src; //选框背景
boolean isOver = false;
public GameCanvas() {
try {
src = Image.createImage("/pic/1.png");
} catch (Exception e) {
System.out.println("error");
}
map = new int[ROW][COL];
initMap();
setFullScreenMode(true);
width = getWidth();
height = getHeight();
number = Math.abs(rnd.nextInt()) % 20 + 1; //随机结果,必须大于1
gamestate = LOGO;
}
public void initMap() {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
int temp = Math.abs(rnd.nextInt()) % 10;
if (temp <= 0) {
temp = temp + 1;
}
map[i][j] = temp;
}
}
}
/**
*
* 功能:按照透明度画出图片
*/
public void drawAph(Graphics g, int x, int y) {
int w, h;
w = src.getWidth();
h = src.getHeight();
int size = w * h;
int[] rgb = new int[size];
// int[] des=new int[size];
src.getRGB(rgb, 0, w, 0, 0, w, h);
int aph = 100; //透明度
for (int i = 0; i < size; i++) {
rgb[i] = (aph << 24) | (rgb[i] & 0x00ffffff);
}
g.drawRGB(rgb, 0, w, x, y, w, h, true);
}
public void drawMap(Graphics g) {
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_SMALL));
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
g.setColor(0xff0000);
g.drawRect(j * WIDTH + 8,
i * HEIGHT + 8, WIDTH,
HEIGHT);
g.setColor(0x000000);
String s = null;
if (map[i][j] == 0) {
s = "";
} else {
s = String.valueOf(map[i][j]);
}
g.drawString("" + s, (j * WIDTH + 8) + (WIDTH / 2),
(i * HEIGHT + 8) + (HEIGHT / 2),
g.TOP | g.LEFT);
}
}
g.setFont(Font.getDefaultFont());
}
public void commandAction(Command command, Displayable displayable) {
/** @todo Add command handling code */
if (command.getCommandType() == Command.EXIT) {
// stop the MIDlet
MainMIDP.quitApp();
}
}
public void newGame() {
t = null;
time = 10;
score = 0;
sum = 0;
gamestate = PLAY;
isOver = false;
t = new Thread(this);
t.start();
}
public void update() {
if (time <= 0) {
t = null;
isOver = true;
}
}
public void keyPressed(int keycode) {
switch (gamestate) {
case LOGO:
switch (getGameAction(keycode)) {
default:
newGame();
break;
}
break;
case PLAY:
switch (getGameAction(keycode)) {
case FIRE:
if (!isOver) { //没有GAME OVER的情况
int _num = map[y % ROW][x % COL];
if (!isExist(x, y) && v.size() <= 4) {
v.addElement(new String(x + "|" + y + "|"));
if ((count++) >= MAX_SET) {//同一答案只能进行4次相加
v.removeAllElements();
}
sum += _num;
}
if (sum == number) {
for (int i = 0; i < v.size(); i++) { //清除所选的框内的数字
String temp = (String) v.elementAt(i);
int _x, _y; //临时存储V内的x,y变量
int start = 0;
int end = temp.indexOf("|");
_x = Integer.parseInt(temp.substring(start, end));
start = end + 1;
end = temp.indexOf("|", start);
_y = Integer.parseInt(temp.substring(start, end));
map[_y % ROW][_x % COL] = 0;
}
map[y % ROW][x % COL] = 0;
time = 10;
sum = 0;
score += 100;
number = Math.abs(rnd.nextInt()) % 20 + 1;
v.removeAllElements(); //清空V内所有元素
}
}
break;
case UP:
if (y > 0) {
y--;
}
break;
case DOWN:
if (y < ROW - 1) {
y++;
}
break;
case LEFT:
if (x > 0) {
x--;
}
break;
case RIGHT:
if (x < COL - 1) {
x++;
}
break;
}
break;
case OVER:
break;
}
repaint();
}
public void run() {
while (!isOver) {
try {
Thread.sleep(1000);
} catch (Exception e) {}
time--;
update();
repaint();
}
}
/**
*
* 功能:重复检测选择是否重复
*/
public boolean isExist(int x, int y) {
//存储方式 x|y| 字符串方式
for (int i = 0; i < v.size(); i++) {
String temp = (String) v.elementAt(i);
int _x, _y; //临时存储V内的x,y变量
int start = 0;
int end = temp.indexOf("|");
_x = Integer.parseInt(temp.substring(start, end));
start = end + 1;
end = temp.indexOf("|", start);
_y = Integer.parseInt(temp.substring(start, end));
if (x == _x && y == _y) {
return true;
}
}
return false;
}
protected void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, width, height);
switch (gamestate) {
case LOGO:
g.setColor(0xff0000);
g.drawString("JIA JIA KAN (S60) ", 30, height / 2, g.TOP | g.LEFT);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_SMALL));
g.drawString("Please any key to continue", 10, height - 20,
g.TOP | g.LEFT);
break;
case PLAY:
g.setColor(0xffffff);
g.fillRect(0, 0, width, height);
g.setColor(0xff0000);
g.drawRect(5, 5, width - 50, height - 40);
g.fillRect(5, height - 30, 10 * time, 15);
g.setColor(0x0000ff);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_LARGE));
g.drawString("" + number, width - 30, 50, g.TOP | g.LEFT);
g.setColor(0xff0000);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_SMALL));
g.drawString("Score", width - 40, 120, g.TOP | g.LEFT);
g.drawString("" + score, width - 40, 140, g.TOP | g.LEFT);
drawMap(g); //map
g.setColor(0x00ffff);
g.drawRect(x * WIDTH + 8, y * HEIGHT + 8, WIDTH, HEIGHT);
drawSelect(g);
break;
case OVER:
break;
}
}
public void drawSelect(Graphics g) { //画出被选中的数字
g.setColor(0x000000);
for (int i = 0; i < v.size(); i++) {
String temp = (String) v.elementAt(i);
int _x, _y; //临时存储V内的x,y变量
int start = 0;
int end = temp.indexOf("|");
_x = Integer.parseInt(temp.substring(start, end));
start = end + 1;
end = temp.indexOf("|", start);
_y = Integer.parseInt(temp.substring(start, end));
drawAph(g, (_x * WIDTH + 8), (_y * HEIGHT + 8));
// g.drawRect(_x * WIDTH + 8, _y * HEIGHT + 8, WIDTH, HEIGHT);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -