📄 gamecanvas.java
字号:
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 FINSH = 3;
final int ROW = 8;
final int COL = 6;
final int WIDTH = 20, HEIGHT = 20; //方格尺寸
final int MAX_SET = 4; //加法最大步骤
final int ADD_SCORE = 250; //计算正确一步+
final int DEFAULT_TIME = 10;
int time; //10 秒倒记时
int score = 0;
int number = 0;
int total_time = 0; //总用时
int[][] map;
int x = 0, y = 0; //选框坐标
int count = 0; //记录加法步骤
int sum = 0; //用户+和
Thread t = null;
Image src; //选框背景
int total = 0; //总算题目数
boolean isOver = false;
boolean error = false; //出错标记
public GameCanvas() {
try {
src = Image.createImage("/pic/1.png");
} catch (Exception e) {
System.out.println("error");
}
map = new int[ROW][COL];
setFullScreenMode(true);
width = getWidth();
height = getHeight();
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) {
if (command.getCommandType() == Command.EXIT) {
MainMIDP.quitApp();
}
}
/**
* 新开一局
*/
public void newGame() {
total_time = 0;
total = 0;
number = Math.abs(rnd.nextInt()) % 20;
if (number <= 0) {
number += 1;
}
initMap();
t = null;
time = DEFAULT_TIME;
score = 0;
sum = 0;
gamestate = PLAY;
isOver = false;
t = new Thread(this);
t.start();
v.removeAllElements();
count = 0;
}
/**
* 一些检测
*/
public void update() {
total_time++;
if (isFinsh()) {
gamestate = FINSH;
repaint();
} else if (time <= 0 && !isFinsh()) { //尝试失败的滋味 :)0
gamestate = OVER;
repaint();
}
if (time <= 0) {
t = null;
isOver = true;
}
}
/**
*KEY FIRE后是否等于结果
*/
public void fire() {
if (!isOver) { //没有GAME OVER的情况
int _num = map[y % ROW][x % COL];
if (!isExist(x, y) && v.size() <= 4 && _num != 0) {
v.addElement(new String(x + "|" + y + "|"));
if (count > MAX_SET) { //同一答案只能进行4次相加
v.removeAllElements();
count = 0;
sum = 0;
return;
}
count++; //运算次数++
sum += _num;
if (sum > number) {
sum = 0;
count = 0;
v.removeAllElements();
error = true;
return;
}
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;
}
score += ADD_SCORE;
number = Math.abs(rnd.nextInt()) % 20;
if (number <= 0) {
number += 1;
}
total++;
count = 0;
time = DEFAULT_TIME;
sum = 0;
v.removeAllElements(); //清空V内所有元素
}
}
} else { //如果game over
newGame();
}
}
public void keyPressed(int keycode) {
switch (gamestate) {
case LOGO:
switch (getGameAction(keycode)) {
default:
newGame();
break;
}
break;
case PLAY:
switch (getGameAction(keycode)) {
case FIRE:
fire();
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:
switch (getGameAction(keycode)) {
default:
newGame();
break;
}
break;
case FINSH:
switch (getGameAction(keycode)) {
default:
newGame();
break;
}
break;
}
repaint();
}
/**
* 是否全部消除
*/
boolean isFinsh() {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
if (map[i][j] != 0) {
return false;
}
}
}
return true;
}
public void run() {
while (!isOver) {
try {
Thread.sleep(1000);
} catch (Exception e) {}
error = false;
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);
drawAph(g, x * WIDTH + 8, y * HEIGHT + 8);
drawSelect(g);
if (error) {
g.setColor(0xff0000);
g.drawString("Error!", width - 40, 20, g.TOP | g.LEFT);
}
break;
case OVER:
int old = g.getColor();
g.setColor(0xff0000);
g.drawString("YOU LOSE!", width / 3, height / 2, g.TOP | g.LEFT);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_MEDIUM));
g.drawString("Score: " + score, width / 2 - 10, height / 2 + 40,
g.TOP | g.LEFT);
g.drawString("Count: " + total, width / 2 - 10, height / 2 + 60,
g.TOP | g.LEFT);
g.drawString("Time: " + total_time, width / 2 - 10, height / 2 + 80,
g.TOP | g.LEFT);
g.setColor(old);
break;
case FINSH:
int oldcolor = g.getColor();
g.setColor(0xff0000);
g.drawString("very Good!!", width / 3, height / 2,
g.TOP | g.LEFT);
g.drawString("Are you super man ??!", 10, height / 2 + 20,
g.TOP | g.LEFT);
g.setColor(oldcolor);
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 + -