import java.awt.Color;
import java.util.Random;
public class Game {
static int width = 30;
// 0 : 没有雷
// 1 : 有雷
// 2 : 已经被翻开
static int[][] mine = new int[20][20];
static boolean[][] flag = new boolean[20][20];
static Color colors[] = new Color[]{Color.blue, Color.green, Color.red, Color.magenta, Color.CYAN, Color.yellow, Color.pink};
public static void main(String[] args) {
CAE.显示绘图窗体();
//画进度条
for (double i = 0; i <6.26; i+=0.3) {
CAE.贴图("boom.png", 300 + (int)(100* Math.sin(i)), 300 + (int)(100*Math.cos(i)));
CAE.休眠(100);
}
CAE.换颜色("black");
CAE.画实心矩形(0,0,600,600);
CAE.换字体(23);
//画地图
CAE.换颜色(180,180,180);
CAE.画实心矩形(0, 0,600 , 600);
for (int i = 0; i <= 20; i++) {
CAE.换颜色(150,150,150);
CAE.画线(0, i * width,600 , i * width);
CAE.画线(i * width, 0, i * width, 600);
}
//初始化雷,数量30个
Random r = new Random();
for (int i = 0; i < 30; i++) {
int x = r.nextInt(20);
int y = r.nextInt(20);
if (mine[x][y]!=0) {
i--;
continue;
}
mine[x][y] = 1;
}
CAE.监听鼠标点击事件(Game.class);
CAE.监听鼠标右键点击事件(Game.class);
}
public static void 右键点击(int x, int y) {
//事件处理代码
if (x>=600 || y>=600) return;
int px = x / width;
int py = y / width;
if (mine[px][py]==2) {
//被翻开
return;
}
flag[px][py]=!flag[px][py];
if (flag[px][py]) {
CAE.贴图("flag.png", px * width + 3, py * width + 3);
} else {
CAE.换颜色(180,180,180);
CAE.画实心矩形(px*width+1, py*width+1, width-1, width-1);
}
}
public static void 点击(int x, int y) {
if (x>=600 || y>=600) return;
int px = x / width;
int py = y / width;
if (flag[px][py]) {
//被标记
return;
}
if (mine[px][py]==0) {
//没有雷
递归翻开(px, py);
判断是否胜利();
} else if (mine[px][py]==1) {
//有雷
gameOver();
}else if (mine[px][py]==2) {
//被翻开
return;
}
}
private static void 判断是否胜利() {
int count = 0;
for (int y = 0; y < 20; y++) {
for (int x = 0; x < 20; x++) {
if (mine[x][y]==2) {
count++;
}
}
}
if (count==20*20-30) {
CAE.弹出消息("你胜利了!!!");
System.exit(0);
}
}
private static void 递归翻开(int x, int y) {
//防止递归死循环
if (mine[x][y]==2) return;
int count = 计算周围雷的数量(x, y);
mine[x][y] = 2;
if (count==0) {
if (x>0 && !flag[x-1][y]) {
if (计算周围雷的数量(x-1, y)==0) 递归翻开(x-1, y); else 翻开(x-1, y); //左边
}
if (x<19 && !flag[x+1][y]) {
if ( 计算周围雷的数量(x+1, y)==0) 递归翻开(x+1, y);else 翻开(x+1, y); //左边
}
if (y>0 && !flag[x][y-1]) {
if ( 计算周围雷的数量(x, y-1)==0) 递归翻开(x, y-1);else 翻开(x, y-1); //左边
}
if (y<19 && !flag[x][y+1]) {
if ( 计算周围雷的数量(x, y+1)==0) 递归翻开(x, y+1); else 翻开(x, y+1); //左边
}
}
翻开(x,y );
}
private static void 翻开(int x, int y) {
mine[x][y] = 2;
int count = 计算周围雷的数量(x, y);
CAE.换颜色(100,100,100);
CAE.画实心矩形(x*width+1, y*width+1, width-1, width-1);
if (count==0) return;
CAE.换颜色(colors[count-1]);
CAE.输出文本(count+"", x*width+10, y*width+10);
}
private static int 计算周围雷的数量(int x, int y) {
int count = 0;
if (x>0) count+=(mine[x-1][y]==1)?1:0; //左边
if (x<19) count+=(mine[x+1][y]==1)?1:0; //右边
if (y>0) count+=(mine[x][y-1]==1)?1:0; //上边
if (y<19) count+=(mine[x][y+1]==1)?1:0; //下边
if (x>0 && y>0) count+=(mine[x-1][y-1]==1)?1:0; //左上
if (x>0 && y<19) count+=(mine[x-1][y+1]==1)?1:0; //左下
if (x<19 && y>0) count+=(mine[x+1][y-1]==1)?1:0; //右上
if (x<19 && y<19) count+=(mine[x+1][y+1]==1)?1:0; //右下
return count;
}
private static void gameOver() {
for (int y = 0; y < 20; y++) {
for (int x = 0; x < 20; x++) {
if (mine[x][y]==1) {
CAE.贴图("boom.png", x * width + 3, y * width + 3);
}
}
}
CAE.弹出消息("你失败了!!!");
System.exit(0);
}
}