扫地雷(1)

来源:互联网 发布:网络共享加密 编辑:程序博客网 时间:2024/04/27 02:54

public class AnalogMatrix {// analogMatrix模拟矩阵int[][] mineField;// mineField地雷阵public int row, column, minesNumber;public static int whoMarked;// whoMarked卫标记,出错时可以看卫标记数值,就知道哪里错了static {whoMarked = 0;}public AnalogMatrix() {this(11, 11, 30);}public AnalogMatrix(int row, int column, int minesNumber) {this.row = row > 0 ? row : 1;this.column = column > 0 ? column : 1;this.minesNumber = minesNumber;refresh();}public void print(int[][] mat) {if (mat == null || mat.length == 0) {// 卫条件,不满足就结束,目的拦阻非法数据whoMarked = 1;// 卫标记为1return;}for (int i = 0; i < mat.length; i++) {for (int j = 0; j < mat[i].length; j++) {System.out.print(String.format("%5d", mat[i][j]));}System.out.println();}}public void print(int[] mat) {if (mat == null || mat.length == 0) {// 卫条件,不满足就结束,目的拦阻非法数据whoMarked = 4;// 卫标记为1return;}for (int i = 0; i < mat.length; i++) {System.out.print(mat[i] + " ");if (i % 5 == 0 && i != 0) {System.out.println();}}System.out.println("mat.length" + mat.length);System.out.println(whoMarked);}public void refresh() {mineField = new int[row][column];// mineField地雷阵//初始化layMines();// 将雷布好}public void layMines() {int[] temp = layMines(0, row * column, minesNumber);// 布置个数for (int i = 0; i < temp.length; i++) {int test_i = temp[i] / column;int test_j = temp[i] % column;mineField[test_i][test_j] = -1;}}public int[] layMines(int start, int end, int number) {// 左包含,右不包含,在start到end之间选出number个随机数,end<1000// 布置累的数量if ((end - start) < 1 || (end - start) < number) {whoMarked = 2;// 卫标记为2return null;}int[] temp = new int[number];for (int i = 0; i < temp.length; i++) {temp[i] = getADifferentRandomNumber(start, end, temp);}mySort(temp);return temp;}private int getADifferentRandomNumber(int start, int end, int[] temp) {// 专为layMines而设计int tempary = start + (int) (Math.random() * 1000) % (end - start);boolean flag = true;if (tempary < end && tempary >= start) {for (int i = 0; i < temp.length; i++) {if (tempary == temp[i]) {// 如果随机数不与数组中任意数相同,那么flag = trueflag = false;break;}}} else {flag = false;}if (flag) {// 如果随机数不与数组中任意数相同,那么flag = truereturn tempary;} else {return getADifferentRandomNumber(start, end, temp);}}public void mySort(int[] mat) {// 升序if (mat == null) {whoMarked = 3;// 卫条件为3return;}for (int i = 0; i < mat.length - 1; i++) {for (int j = i + 1; j < mat.length; j++) {if (mat[i] > mat[j]) {mat[i] = mat[i] ^ mat[j];mat[j] = mat[i] ^ mat[j];mat[i] = mat[i] ^ mat[j];}}}}}

import java.awt.Dimension;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JSeparator;import javax.swing.Timer;public class CleanMines extends JFrame implements ActionListener {private static final long serialVersionUID = 1L;MinesJPanel minesjpanel;AnalogMatrix analogMatrix;Timer timer;public CleanMines() {Dimension dms = getToolkit().getScreenSize();setBounds((int) dms.getWidth() / 4, (int) dms.getHeight() / 4, 200, 300);setDefaultCloseOperation(EXIT_ON_CLOSE);pulsMenuBar();setResizable(false);timer = new Timer(10, new Victory(analogMatrix, this, minesjpanel));setVisible(true);}private void pulsMenuBar() {JMenuBar menubar = new JMenuBar();setJMenuBar(menubar);String[] menu_str = { "Start", "Help" };String[][] menuitem_str = {{ "New", "Primary", "Middle_rank", "High_rank", "Ranking", "|","exit" }, { "Copyright", "^_^CheatingPrograms^_^" } };for (int i = 0; i < menu_str.length; i++) {JMenu menu = new JMenu(menu_str[i]);menubar.add(menu);for (int j = 0; j < menuitem_str[i].length; j++) {if (menuitem_str[i][j].equals("|")) {menu.add(new JSeparator());continue;}JMenuItem menuitem = new JMenuItem(menuitem_str[i][j]);menuitem.addActionListener(this);menu.add(menuitem);}}}public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equalsIgnoreCase("new")) {if(minesjpanel==null){return;}minesjpanel.btn.setText("Start");minesjpanel.run();}if (e.getActionCommand().equalsIgnoreCase("Primary")) {setRanking(analogMatrix = new AnalogMatrix(9, 9, 20));}if (e.getActionCommand().equalsIgnoreCase("Middle_rank")) {setRanking(analogMatrix = new AnalogMatrix(15, 15, 50));this.setLocation(200, 0);}if (e.getActionCommand().equalsIgnoreCase("High_rank")) {setRanking(analogMatrix = new AnalogMatrix(20, 20, 100));setLocation(0, 0);}if (e.getActionCommand().equalsIgnoreCase("Ranking")) {}if (e.getActionCommand().equalsIgnoreCase("exit")) {if (JOptionPane.showConfirmDialog(this, "亲~你真的要退出吗?") == 0) {System.exit(0);}}if (e.getActionCommand().equalsIgnoreCase("Copyright")) {JOptionPane.showMessageDialog(this,"所有版权信息归 \"刘强\"所有,如有违权者,后果自负!!!");}if (e.getActionCommand().equalsIgnoreCase("^_^CheatingPrograms^_^")) {if (JOptionPane.showConfirmDialog(this, "亲~你确定要开外挂吗?") == 0) {if (minesjpanel == null) {JOptionPane.showMessageDialog(this, "请选择等级!!!");return;}minesjpanel.cheatingProgram(analogMatrix);}}}private void setRanking(AnalogMatrix analogMatrix) {if (minesjpanel != null) {this.remove(minesjpanel);}minesjpanel = new MinesJPanel(analogMatrix, this);minesjpanel.setMinesNumber(analogMatrix);this.setSize(analogMatrix.row * 30, analogMatrix.column * 30);getContentPane().add(minesjpanel);}public static void main(String[] args) {new CleanMines();}}

import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.Insets;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JPanel;import javax.swing.Timer;import javax.swing.border.TitledBorder;public class MinesJPanel extends JPanel implements ActionListener, Runnable {private static final long serialVersionUID = 1L;public AnalogMatrix analogMatrix;// 核心函数********CleanMines cleanMines;public JButton[] btns;private JPanel northpanel, centerpanel;public JButton btn;public Color color;public MinesJPanel(AnalogMatrix analogMatrix, CleanMines cleanMines) {this.analogMatrix = analogMatrix;this.cleanMines = cleanMines;setBorder(new TitledBorder("扫雷啦!"));setLayout(new BorderLayout());setNorthpanel();}public void setMinesNumber(AnalogMatrix analogMatrix) {this.analogMatrix = analogMatrix;centerpanel = new JPanel();add(centerpanel);centerpanel.setLayout(new GridLayout(analogMatrix.row,analogMatrix.column));btns = new JButton[analogMatrix.row * analogMatrix.column];for (int i = 0; i < btns.length; i++) {btns[i] = new JButton("");btns[i].setMargin(new Insets(0, 0, 0, 0));centerpanel.add(btns[i]);}color = btns[0].getBackground();}private void setNorthpanel() {northpanel = new JPanel();add(northpanel, BorderLayout.NORTH);btn = new JButton("Start");northpanel.add(btn);btn.addActionListener(this);}public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equalsIgnoreCase("Start")) {// 每当游戏开始时将所有的按钮清空new Thread(this).start();return;}if (e.getActionCommand().equalsIgnoreCase("End")) {// 显示地雷new Thread(this).start();return;}for (int i = 0; i < btns.length; i++) {if (e.getSource() == btns[i]) {new SearchMines(this.analogMatrix, this, i);return;}}}public void cheatingProgram(AnalogMatrix analogMatrix) {int count = 0;for (int i = 0; i < analogMatrix.row; i++) {for (int j = 0; j < analogMatrix.column; j++) {if (analogMatrix.mineField[i][j] == -1) {btns[count++].setText("@");} else {btns[count++].setText(" ");}}}}public void run() {if (btn.getText().equalsIgnoreCase("Start")) {cleanMines.timer = new Timer(10, new Victory(analogMatrix,cleanMines, this));cleanMines.timer.start();for (int i = 0; i < btns.length; i++) {btns[i].addActionListener(this);btns[i].setText("");btns[i].setBackground(color);}this.analogMatrix.refresh();this.btn.setText("End");} else {for (int i = 0; i < btns.length; i++) {btns[i].removeActionListener(this);}cheatingProgram(analogMatrix);this.btn.setText("Start");}}}

import java.awt.Color;public class SearchMines implements Runnable {AnalogMatrix analogMatrix;MinesJPanel minesJPanel;int buttonNumber, text_i, text_j;static int number = 0;public SearchMines(AnalogMatrix analogMatrix, MinesJPanel minesJPanel,int text_i, int text_j) {this.analogMatrix = analogMatrix;this.minesJPanel = minesJPanel;this.text_i = text_i;this.text_j = text_j;buttonNumber = text_i * analogMatrix.row + text_j;new Thread(this).start();}public SearchMines(AnalogMatrix analogMatrix, MinesJPanel minesJPanel,int buttonNumber) {this.analogMatrix = analogMatrix;this.minesJPanel = minesJPanel;this.buttonNumber = buttonNumber;text_i = buttonNumber / analogMatrix.column;text_j = buttonNumber % analogMatrix.column;new Thread(this).start();}public boolean searchYourSelf() {if (analogMatrix.mineField[text_i][text_j] == -1) {minesJPanel.btns[text_i * analogMatrix.row + text_j].setBackground(Color.red);minesJPanel.btns[buttonNumber].setText("@");return true;} else {minesJPanel.btns[text_i * analogMatrix.row + text_j].setBackground(Color.blue);return false;}}public int[] rectangle(int x, int y) {text_i = x;text_j = y;return rectangle();}public int[] rectangle() {// 获得当前点的搜索范围,与起始坐标int[] rect = new int[4];int[] surround = { -1, 1 };int left_x = text_i - 1;// 初始化在左上角int up_y = text_j - 1;int length_x = 3;// 初始化长度为3int length_y = 3;for (int i = 0; i < surround.length; i++) {int temp = text_i + surround[i];if (temp < 0) {left_x = text_i;length_x -= 1;continue;}if (temp == analogMatrix.row) {length_x -= 1;}}for (int i = 0; i < surround.length; i++) {int temp = text_j + surround[i];if (temp < 0) {up_y = text_j;length_y -= 1;continue;}if (temp == analogMatrix.column) {length_y -= 1;}}rect[0] = left_x;rect[1] = up_y;rect[2] = length_x;rect[3] = length_y;return rect;}public int searchSurroundAllMines(int x, int y) {text_i = x;text_j = y;return searchSurroundAllMines();}public int searchSurroundAllMines() {// 周围有几个地雷int count = 0;int[] temp1 = rectangle();for (int i = temp1[0]; i < temp1[0] + temp1[2]; i++) {for (int j = temp1[1]; j < temp1[1] + temp1[3]; j++) {if (analogMatrix.mineField[i][j] == -1) {count++;}}}return count;}public void hightRearch(int text_i, int text_j) {this.text_i = text_i;this.text_j = text_j;int[] temp1 = rectangle();for (int i = temp1[0]; i < temp1[0] + temp1[2]; i++) {for (int j = temp1[1]; j < temp1[1] + temp1[3]; j++) {if (analogMatrix.mineField[i][j] == 0) {searchSurroundAll();}}}}public void searchSurroundAll() {int[] temp1 = rectangle();for (int i = temp1[0]; i < temp1[0] + temp1[2]; i++) {for (int j = temp1[1]; j < temp1[1] + temp1[3]; j++) {if (analogMatrix.mineField[i][j] == 0) {minesJPanel.btns[i * analogMatrix.row + j].setText(searchSurroundAllMines(i, j) == 0 ? "": "" + searchSurroundAllMines(i, j));minesJPanel.btns[i * analogMatrix.row + j].setBackground(Color.blue);}}}}public void run() {if (searchYourSelf()) {// 是地雷就结束minesJPanel.btn.setText("end");minesJPanel.run();} else {// 不是地雷就搜索周边的按钮minesJPanel.btns[buttonNumber].setText(+searchSurroundAllMines() == 0 ? "" : ""+ searchSurroundAllMines());hightRearch(text_i, text_j);}}}

import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JOptionPane;public class Victory implements ActionListener {AnalogMatrix analogMatrix;CleanMines cleanMines;MinesJPanel minesJPanel;public Victory(AnalogMatrix analogMatrix, CleanMines cleanMines,MinesJPanel minesJPanel) {this.analogMatrix = analogMatrix;this.cleanMines = cleanMines;this.minesJPanel = minesJPanel;}public void actionPerformed(ActionEvent e) {if (minesJPanel.btn.getText().equalsIgnoreCase("End")) {int count = 0;for (int i = 0; i < minesJPanel.btns.length; i++) {if (minesJPanel.btns[i].getBackground() == Color.blue) {count++;}}if ((analogMatrix.row * analogMatrix.column - count) == analogMatrix.minesNumber) {JOptionPane.showConfirmDialog(null, "%恭喜你胜利了%");minesJPanel.btn.setText("End");minesJPanel.run();}}}}






















1 1
原创粉丝点击