📄 game.java
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
import java.io.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.rms.*;
public class Game
extends GameCanvas implements Runnable, CommandListener {
private static Displayable instance;
private Command pauseCommand = new Command("暂停", Command.SCREEN, 2);
private Command backCommand = new Command("返回", Command.EXIT, 1);
private Command saveCommand = new Command("保存", Command.SCREEN, 3);
private Command playCommand = new Command("继续", Command.SCREEN, 4);
private Command musicOnCommand = new Command("打开音乐", Command.SCREEN, 5);
private Command musicOffCommand = new Command("关闭音乐", Command.SCREEN, 6);
private int[] hiScores = new int[5]; //存储分数的数组
private int SCREEN_WIDTH = getWidth();
private int SCREEN_HEIGHT = getHeight(); //获得屏幕大小,便于调用
private int score, positionX = SCREEN_WIDTH, positionY = 15; //得分及跑动的文字的位置
private int N = 10; //存档变量大小
private int ring, ring1; //绝对防御
private int playerX, playerY;
private Random rand; //随机数
private int frameDelay, time; //帧速及游戏限制时间
private int pass = 0; //设置关卡
private LayerManager layers;
private int xView, yView;
private TiledLayer floorLayer;
private TiledLayer landLayer;
private Image infoBar;
private Image death; //死亡图片
private Image over; //gameover图片
private Image win; //过关图片
private Image sucess; //通关图片
private Sprite playerSprite; //玩家
private Sprite GoodsSprite; //宝箱
private Sprite BreadSprite; //面包
private Sprite explosionSprite; //爆炸效果图
private Sprite ringSprite; //无敌
private int explosionCnt = 0;
private Sprite[] mineSprite;
private MonsterSprite[] monster2Sprite;
private MonsterSprite[] monster1Sprite;
private MonsterSprite bossSprite;
private Player musicPlayer;
private Player rescuePlayer;
private Player minePlayer;
private Player gameoverPlayer;
private Player winPlayer;
private int randX;
private int randY;
int[] saveMessage = new int[N]; //存档数组
private boolean gameOver, pause, rightforward = true, volume, sleeping;
private int energy, goodsSaved, dif, amount;
synchronized public static Displayable getInstance() {
instance = new Game();
return instance;
}
public Game() {
super(true);
volume = Settings.volume1;
addCommand(backCommand);
addCommand(saveCommand);
addCommand(pauseCommand);
if (volume) {
addCommand(musicOffCommand);
}
else {
addCommand(musicOnCommand);
}
setCommandListener(this);
rand = new Random(); // 初始化随机数
//新游戏等级
if (! (Navigator.resume)) {
dif = Settings.difficulty;
}
//获取上次游戏等级
else {
int[] D = new int[N];
readRecord(D);
dif = D[5];
}
amount = 2 + dif; //按难度级别怪物数量计算
mineSprite = new Sprite[amount];
monster2Sprite = new MonsterSprite[amount];
monster1Sprite = new MonsterSprite[amount];
frameDelay = 50; // 设置帧速
start();
}
public void start() {
// 创建信息栏图像及背景层,精灵动画加载图片
try {
infoBar = Image.createImage("/InfoBar.png");
death = Image.createImage("/Death.png");
over = Image.createImage("/over.png");
win = Image.createImage("/win.png");
sucess = Image.createImage("/sucess.png");
floorLayer = new TiledLayer(28, 28, Image.createImage("/f.png"), 20, 20);
landLayer = new TiledLayer(28, 28, Image.createImage("/tu.png"), 20, 20);
}
catch (IOException e) {
System.err.println("Failed loading images!");
}
int[] floorMap = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0, 0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0, 0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0, 0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0, 0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0,
0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0,
0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0,
0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0,
0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0,
0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0,
0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0,
0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0,
0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0,
0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0,
0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0,
0, 0, 0,
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
0,
0, 0, 0,
0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4,
0,
0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,
0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,
0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,
0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,
0, 0, 0
};
for (int i = 0; i < floorMap.length; i++) {
int column = i % 28;
int row = (i - column) / 28;
floorLayer.setCell(column, row, floorMap[i]);
}
// 初始化游戏音乐播放
try {
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
musicPlayer.setLoopCount( -1);
is = getClass().getResourceAsStream("Rescue.mid");
rescuePlayer = Manager.createPlayer(is, "audio/midi");
rescuePlayer.prefetch();
is = getClass().getResourceAsStream("Mine.wav");
minePlayer = Manager.createPlayer(is, "audio/X-wav");
minePlayer.prefetch();
is = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
gameoverPlayer.prefetch();
is = getClass().getResourceAsStream("Win.wav");
winPlayer = Manager.createPlayer(is, "audio/X-wav");
winPlayer.prefetch();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}
readHiScores(); //读取存储器玩家分数,以便于更新
newGame(); //开始新游戏
sleeping = false; // 启动线程
pause = false; //暂停开关
Thread t = new Thread(this);
t.start();
}
private void newGame() {
if (pass == 5) {
pass = 0;
}
if (Navigator.resume) {
int[] loadGame = new int[N];
readRecord(loadGame);
pass = loadGame[7];
}
// 初始化地图
System.gc();
try {
Thread.sleep(500);
}
catch (Exception e) {}
switch (pass) {
case 0: //图一
int[] landMap0 = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1, 1, 1, 1,
1, 1, 1, 1, 3, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3,
4,
1,
1, 1, 1,
1, 1, 1, 1, 5, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5,
38,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6,
1,
1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 49, 50, 49, 50,
0,
0,
6, 1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 16, 17, 7, 7, 7, 0, 0, 0, 51, 52, 51, 52, 51,
52,
0,
0, 6, 1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50,
0,
0, 6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 0,
0,
6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 12, 0, 0, 36, 36, 36, 49, 50, 6, 0, 0, 0, 49,
50,
0,
0, 6, 1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 11, 0, 0, 0, 0, 0, 51, 52, 49, 50, 0, 0, 51,
52,
0, 0,
6, 1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 16, 17, 0, 0, 0, 0, 0, 0, 51, 52, 6, 0, 0, 0,
0,
0, 6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 18, 19, 7, 7, 7, 0, 0, 0, 0, 49, 50, 0, 0, 0,
0,
0, 6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 0, 0, 0,
0,
6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0,
0,
6, 1,
1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 0, 39, 39, 49, 50, 0, 0, 0, 0, 0, 36, 0, 0, 0,
0,
0,
6, 1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 0, 0, 0, 51, 52, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0,
0,
6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 14, 15, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,
6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 34, 35, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,
6,
1, 1, 1, 1,
1, 1, 1, 1, 6, 0, 0, 0, 0, 16, 17, 40, 0, 0, 0, 49, 50, 49, 50, 49,
50,
49,
50, 6, 1, 1, 1, 1,
1, 1, 1, 1, 3, 4, 0, 0, 0, 18, 19, 40, 0, 0, 0, 51, 52, 51, 52, 51,
52,
51,
52, 6, 1, 1, 1, 1,
1, 1, 1, 1, 5, 38, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7,
36,
1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1,
1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1,
1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1,
1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1,
1, 1, 1
};
for (int i = 0; i < landMap0.length; i++) {
int column = i % 28;
int row = (i - column) / 28;
landLayer.setCell(column, row, landMap0[i]);
}
break;
case 1: //图二
int[] landMap1 = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
1,
1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -