📄 minecanvas.java
字号:
package mineMIDlet;
import java.util.Random;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
/**
* 手机扫雷小游戏
* @author AnthonyWei 20090306
*
*/
public class mineCanvas extends Canvas implements Runnable{
private final int ISMINE = -1;
private final int ISEMPTY = 0;
private final int ISOPEN = 0;
private final int NOTOPEN = 1;
private int width; //屏幕的宽
private int height; //屏幕的高
private int line = 2; //线宽,线高
private int mineNum = 10; //雷的个数
private int totalNum = 10; //雷区总数 比如 10 * 10
private long startTime; //计时开始时间
private long endTime; //计时结束时间
private int startX; //开始画图的X坐标
private int startY; //开始画图的Y坐标
private int margin = 2; //内框的间隔
private int length = 15; //每个方框的宽和高
private mineEntity[] mine;
private boolean b = true; //闪耀
private int c_x = 0; //当前序号
private int c_y = 0; //当前序号
private boolean isGameStart = false;
private boolean isGameOver = false; //判断游戏失败结束
private boolean isSuccessed = false; //判断游戏成功结束
public mineCanvas() {
this.init();
new Thread(this).start();
}
public void run() {
while(true)
{
repaint();
if(this.isGameSuccessed()) {
this.isSuccessed = true;
}
if(this.isGameOver) {
this.openAll();
}
//闪耀
b = !b;
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
protected void paint(Graphics g) {
/**
*
* 清屏
*
*/
g.setColor(0xffffff);
g.fillRect(0, 0, width, height);
if(!this.isSuccessed) {
/**
*
* 画边框
*
*/
g.setColor(0);
g.fillRect(startX, startY, line, (totalNum * (line + margin + length)) + margin);
g.fillRect(startX, startY, (totalNum * (line + margin + length)) + margin, line);
g.fillRect(startX + (totalNum * (line + margin + length)) + margin , startY, line, (totalNum * (line + margin + length)) + margin);
g.fillRect(startX, startY + (totalNum * (line + margin + length)) + margin, (totalNum * (line + margin + length)) + 2 * margin, line);
/**
*
* 画雷区
*
*/
g.setColor(0);
for(int i = 0; i < totalNum; i++)
{
for(int j = 0; j < totalNum; j++)
{
if(mine[i * totalNum + j].status == NOTOPEN) {
if(c_x == j && c_y == i)
{
if(b) {
g.fillRect(mine[i * totalNum + j].x,
mine[i * totalNum + j].y,
length,
length);
}
}
else
{
g.fillRect(mine[i * totalNum + j].x,
mine[i * totalNum + j].y,
length,
length);
}
}
else
{
if(mine[i * totalNum + j].value != ISMINE){
if(mine[i * totalNum + j].value != ISEMPTY)
{
if(c_x == j && c_y == i)
{
if(b) {
g.drawString(String.valueOf(mine[i * totalNum + j].value),
mine[i * totalNum + j].x,
mine[i * totalNum + j].y,
Graphics.TOP | Graphics.LEFT);
}
}
else
{
g.drawString(String.valueOf(mine[i * totalNum + j].value),
mine[i * totalNum + j].x,
mine[i * totalNum + j].y,
Graphics.TOP | Graphics.LEFT);
}
}
else
{
if(c_x == j && c_y == i)
{
if(b) {
g.drawString(String.valueOf(mine[i * totalNum + j].value),
mine[i * totalNum + j].x,
mine[i * totalNum + j].y,
Graphics.TOP | Graphics.LEFT);
}
}
else
{
g.drawString(String.valueOf(mine[i * totalNum + j].value),
mine[i * totalNum + j].x,
mine[i * totalNum + j].y,
Graphics.TOP | Graphics.LEFT);
}
}
}
else
{
g.drawString("*",
mine[i * totalNum + j].x,
mine[i * totalNum + j].y,
Graphics.TOP | Graphics.LEFT);
}
}
}
}
}
else
{
g.setColor(0);
long time = (endTime - startTime) / 1000;
String text = "太棒了,时间" + String.valueOf(time);
g.drawString(text,
startX,
startY,
Graphics.TOP | Graphics.LEFT);
}
}
private void init() {
width = this.getWidth();
height = this.getHeight();
startX = (width - totalNum * length - (totalNum + 1) * (line + margin)) / 2;
startY = (height - totalNum * length - (totalNum + 1) * (line + margin)) / 2;
c_x = totalNum / 2 - 1;
c_y = totalNum / 2 - 1;
/**
*
* 生成地雷
*
*/
Random r = new Random();
int index = 0;
mine = new mineEntity[totalNum * totalNum];
for(int t = 0; t < totalNum * totalNum; t ++)
{
mine[t] = new mineEntity();
}
while(index < mineNum)
{
int x = r.nextInt(totalNum) ;
int y = r.nextInt(totalNum) ;
if(mine[x * totalNum + y].value != ISMINE)
{
mine[x * totalNum + y].value = ISMINE;
index ++;
}
}
/**
*
*
* 生成雷区
*
*
*/
for(int i = 0; i < totalNum; i++) //y坐标
{
for(int j = 0; j < totalNum; j++) //x坐标
{
mine[i * totalNum + j].x = startX + j * (line + length + margin) + margin + line;
mine[i * totalNum + j].y = startY + i * (line + length + margin) + margin + line;
if(mine[i * totalNum + j].value != ISMINE)
mine[i * totalNum + j].value = this.getValue(j, i); //传入坐标
mine[i * totalNum + j].status = NOTOPEN;
}
}
}
private int getValue(int x, int y) { //获得自己的Value
int num = 0;
int i;
int j;
int k;
int s;
i = x - 1 <= 0 ? 0 : x - 1;
j = y - 1 <= 0 ? 0 : y - 1;
k = x + 1 >= totalNum ? totalNum - 1 : x + 1;
s = y + 1 >= totalNum ? totalNum - 1: y + 1;
for(int x1 = i; x1 <= k; x1 ++ )
{
for(int y1 = j; y1 <= s; y1 ++)
{
if(mine[x1 + totalNum * y1].value == ISMINE){
num ++;
}
}
}
return num;
}
public void keyPressed(int keyCode){
int action = this.getGameAction(keyCode);
switch(action){
case UP:
c_y = c_y - 1 <= 0 ? totalNum : c_y - 1;
break;
case DOWN:
c_y = c_y + 1 >= totalNum ? 0 : c_y + 1;
break;
case LEFT:
c_x = c_x - 1 <= 0 ? totalNum : c_x - 1;
break;
case RIGHT:
c_x = c_x + 1 >= totalNum ? 0 : c_x + 1;
break;
case FIRE:
if(!this.isGameStart) {
startTime = System.currentTimeMillis();
this.isGameStart = true;
}
this.open(c_x, c_y);
break;
}
}
private void open(int x, int y) {
if(mine[y * totalNum + x].value == ISMINE){
mine[y * totalNum + x].status = ISOPEN;
isGameOver = true;
}
else if(mine[y * totalNum + x].value != ISEMPTY) {
mine[y * totalNum + x].status = ISOPEN;
}else {
mine[y * totalNum + x].status = ISOPEN;
int i;
int j;
int k;
int s;
i = x - 1 <= 0 ? 0 : x - 1;
j = y - 1 <= 0 ? 0 : y - 1;
k = x + 1 >= totalNum ? totalNum - 1 : x + 1;
s = y + 1 >= totalNum ? totalNum - 1: y + 1;
for(int x1 = i; x1 <= k; x1 ++ )
{
for(int y1 = j; y1 <= s; y1 ++)
{
mine[x1 + totalNum * y1].status = ISOPEN;
}
}
}
}
private boolean isGameSuccessed() {
int num = 0;
for(int i = 0; i < totalNum * totalNum; i++) {
if(mine[i].status == ISOPEN) {
num ++;
}
}
if(num + mineNum == totalNum * totalNum) {
if(!this.isSuccessed)
endTime = System.currentTimeMillis();
return true;
}
else
{
return false;
}
}
private void openAll() {
for(int i = 0; i < totalNum * totalNum; i++) {
mine[i].status = ISOPEN ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -