今天突然间看到了扫雷游戏,想着自己实现一个,网上找了很多,大多数的用的是二维数组,今天我给大家用一维数组也就是集合来实现二维数组的功能,这篇主要写的是扫雷核心算法篇,寻找周围类的数量,不是一个完整的哦。
package com.xz.sl;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestPanel {
JFrame jFrame = new JFrame();
public TestPanel() {
MyPanel jPanel = new MyPanel();
jFrame.setName("我是一个JFrame");
jFrame.setVisible(true);
jFrame.setSize(600, 600);
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setResizable(false);
jFrame.add(jPanel);
jFrame.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
ArrayList<Img> imgs = MyPanel.imgs;
for (Img img : imgs) {
int sx = img.getX();
int ex = img.getX()+80;
int sy = img.getY();
int ey = img.getY()+110;
if(e.getX() > sx && e.getX() < ex && e.getY() > sy && e.getY() < ey) {
if(img.isL()) {
System.out.println("X");
}else {
System.out.println(img.getNum());
}
return;
}
}
}
});
}
public static void main(String[] args) {
new TestPanel();
}
}
class MyPanel extends JPanel {
public static ArrayList<Img> imgs = new ArrayList<>();
Image img1;
int LEICOUNT = 3;
public MyPanel() {
try {
img1 = ImageIO.read(new FileInputStream("img/0.png"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
Img img = new Img();
img.setClick(false);
img.setL(false);
img.setX(j * img1.getWidth(null) + (j * 3) + 80);
img.setY(i * img1.getHeight(null) + (i * 3) + 80);
img.setNum(i+j);
imgs.add(img);
}
}
g.setFont(new Font("微软雅黑", 0, 30));
g.setColor(Color.WHITE);
for(int i=0;i<LEICOUNT;i++) {
int wz = new Random().nextInt(imgs.size());
if(!imgs.get(wz).isL()) {
imgs.get(wz).setL(true);
}else {
i--;
}
}
TongjiLei();
for(int i=0;i<5;i++) { //行
for(int j=0; j<5;j++) { // 列
Img img = imgs.get(i*5+j);
g.drawImage(img1, img.getX(), img.getY(),null);
if(img.isL()) {
g.setColor(Color.RED);
g.drawString("X", img.getX()+30, img.getY()+50);
}else {
g.setColor(Color.WHITE);
g.drawString(img.getNum()+"", img.getX()+30, img.getY()+50);
}
}
}
}
private void TongjiLei() {
for(int i=0;i<5;i++) {
for(int j=0;j<5;j++) {
int count = 0;
int c = i*5+j;
if(imgs.get(c).isL()) {
continue;
}
//左上 (i-1)*5(j-1)
if(i > 0 && j > 0 && imgs.get((i-1)*5+(j-1)).isL()) {
count++;
}
//上中 (i-1)*5(j-1)
if(i > 0 && imgs.get((i-1)*5+(j)).isL()) {
count++;
}
//右上 (i-1)*5(j-1)
if(i > 0 && j+1 < 5 && imgs.get((i-1)*5+(j+1)).isL()) {
count++;
}
//左 (i-1)*5(j-1)
if(i > 0 && j > 0 && imgs.get((i)*5+(j-1)).isL()) {
count++;
}
//左上 (i-1)*5(j-1)
if(i<5 && j+1 < 5 && imgs.get((i)*5+(j+1)).isL()) {
count++;
}
//左上 (i-1)*5(j-1)
if(i+1 < 5 && j > 0 && imgs.get((i+1)*5+(j-1)).isL()) {
count++;
}
//左上 (i-1)*5(j-1)
if(i+1 < 5 && imgs.get((i+1)*5+(j)).isL()) {
count++;
}
//左上 (i-1)*5(j-1)
if(i+1 < 5 && j+1 < 5 && imgs.get((i+1)*5+(j+1)).isL()) {
count++;
}
imgs.get(c).setNum(count);
}
}
}
}
class Img {
private int x;
private int y;
private boolean isL;
private boolean isClick;
private int num;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean isL() {
return isL;
}
public void setL(boolean isL) {
this.isL = isL;
}
public boolean isClick() {
return isClick;
}
public void setClick(boolean isClick) {
this.isClick = isClick;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
我们可以看到以上就是全部扫雷的代码,运行后的效果如下:
而计算雷的代码如下:
private void TongjiLei() {
for(int i=0;i<5;i++) {
for(int j=0;j<5;j++) {
int count = 0;
int c = i*5+j;
if(imgs.get(c).isL()) {
continue;
}
//左上 (i-1)*5(j-1)
if(i > 0 && j > 0 && imgs.get((i-1)*5+(j-1)).isL()) {
count++;
}
//上中 (i-1)*5(j-1)
if(i > 0 && imgs.get((i-1)*5+(j)).isL()) {
count++;
}
//右上 (i-1)*5(j-1)
if(i > 0 && j+1 < 5 && imgs.get((i-1)*5+(j+1)).isL()) {
count++;
}
//左 (i-1)*5(j-1)
if(i > 0 && j > 0 && imgs.get((i)*5+(j-1)).isL()) {
count++;
}
//右 (i-1)*5(j-1)
if(i<5 && j+1 < 5 && imgs.get((i)*5+(j+1)).isL()) {
count++;
}
//左下 (i-1)*5(j-1)
if(i+1 < 5 && j > 0 && imgs.get((i+1)*5+(j-1)).isL()) {
count++;
}
//中下 (i-1)*5(j-1)
if(i+1 < 5 && imgs.get((i+1)*5+(j)).isL()) {
count++;
}
//右下 (i-1)*5(j-1)
if(i+1 < 5 && j+1 < 5 && imgs.get((i+1)*5+(j+1)).isL()) {
count++;
}
imgs.get(c).setNum(count);
}
}
}
}
大家看到这里应该就明白了。
有问题可以在评论区评论,技术问题可以私聊我。