Java扫雷游戏寻找类的数量核心算法篇

今天突然间看到了扫雷游戏,想着自己实现一个,网上找了很多,大多数的用的是二维数组,今天我给大家用一维数组也就是集合来实现二维数组的功能,这篇主要写的是扫雷核心算法篇,寻找周围类的数量,不是一个完整的哦。

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);
				
			}
		}
	}
}

大家看到这里应该就明白了。

有问题可以在评论区评论,技术问题可以私聊我。

发布了106 篇原创文章 · 获赞 101 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/qq_24434671/article/details/97239118