java扫雷代码_java扫雷源码

import java.util.*;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.border.LineBorder;import java.math.*;import java.awt.*;import java.awt.event.*;public classMinesweeper {public static voidmain(String arg[]) {newwin_Start().frameLaunch();

}

}classwin_Start {

Frame installWin= null;

TextField tf_lage= null;

TextField tf_number= null;public voidframeLaunch() {

installWin= newFrame();

installWin.setBounds(300, 300, 300, 500);

installWin.setTitle("设置");

installWin.setVisible(true);

installWin.setLayout(null);

installWin.setBackground(new Color(235, 235, 235));

installWin.addWindowListener(newWindowAdapter() {public voidwindowClosing(WindowEvent e) {

installWin.setVisible(false);

System.exit(0);

}

});

Label l1= new Label(" 输入棋盘大小(8-16):");

l1.setFont(new Font("宋体", Font.BOLD, 18));

Label l2= new Label(" 输入地雷数(大于等于8):");

l2.setFont(new Font("宋体", Font.BOLD, 16));

Button sure= new Button("启动");

l1.setBounds(50, 50, 200, 50);

l2.setBounds(50, 200, 200, 50);

sure.setBounds(50, 350, 200, 100);

sure.addActionListener(newsureLaunch());

l1.setBackground(new Color(245, 245, 245));

l2.setBackground(new Color(245, 245, 245));

tf_lage= newTextField();

tf_number= newTextField();

tf_lage.setBounds(100, 100, 100, 50);

tf_number.setBounds(100, 250, 100, 50);

tf_lage.setFont(new Font("宋体", Font.BOLD, 38));

tf_number.setFont(new Font("宋体", Font.BOLD, 38));

installWin.add(l1);

installWin.add(l2);

installWin.add(tf_lage);

installWin.add(tf_number);

installWin.add(sure);

}class sureLaunch implementsActionListener {public voidactionPerformed(ActionEvent e) {int number = 0;int lage = 0;try{

lage=Integer.parseInt(tf_lage.getText());

number=Integer.parseInt(tf_number.getText());

}catch(Exception ae) {

JOptionPane.showMessageDialog(null, "错误! 请输入数字!", "出现错误!", JOptionPane.ERROR_MESSAGE);return;

}if (lage > 7 && lage < 17 && number <= lage *lage) {if (number >= 8) {//启动下一步Frame.

installWin.setVisible(false);newmainFrame(lage, number).mainFrameLaunch();

}elseJOptionPane.showMessageDialog(null, "错误! 输入范围应大于等于8!", "出现错误!", JOptionPane.ERROR_MESSAGE);

}elseJOptionPane.showMessageDialog(null, "错误! 输入范围有误!", "出现错误!", JOptionPane.ERROR_MESSAGE);

}

}classmainFrame {boolean timeStop = true;private int lage = 0;private int number = 0;private int[][] around = { { -1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 }, { 1, 0 }, { 1, -1 }, { 0, -1},

{-1, -1} };

JPanel p_mine= null;

Panel p_main= null;

TextField tf_time= null;

JButton[][] Mine= null;

timeStart timeStartLaunch= newtimeStart();

mainFrame(int lage, intnumber) {this.lage =lage;this.number =number;

Mine= newJButton[lage][lage];

}public voidmainFrameLaunch() {

Frame mainFrame= newFrame();

mainFrame.setBackground(new Color(230, 230, 250));

mainFrame.setTitle("扫雷");

mainFrame.setBounds(200, 200, 150 + (35 * lage), 350 + (35 *lage));

mainFrame.setVisible(true);

mainFrame.setLayout(null);

Panel p_time= newPanel();

p_time.setLayout(null);

p_time.setBounds((150 + (35 * lage)) / 2 - 100, 50, 200, 50);

p_time.setBackground(new Color(245, 245, 245));

Button b_reStart= new Button("重新开始");

b_reStart.setFont(new Font("宋体", Font.BOLD, 36));

b_reStart.setBounds((150 + (35 * lage)) / 2 - 100, 200 + (35 * lage), 200, 100);

b_reStart.addActionListener(newActionListener() {public voidactionPerformed(ActionEvent e) {for (int a = 0; a < lage; a++) {for (int b = 0; b < lage; b++) {

Mine[a][b].setIcon(null);

Mine[a][b].setText("");

String thisName=Mine[a][b].getName();

thisName= thisName.replace("@", "");

Mine[a][b].setName(thisName);

Mine[a][b].setBackground(new Color(176, 196, 222));

timeStop= true;new Thread(newtimeStart()).start();

}

}

}

});

p_main= newPanel();

p_main.setBackground(new Color(245, 245, 245));

p_main.setBounds(75, 150, 35 * lage, 35 *lage);

p_main.setLayout(null);

Panel p_background= newPanel();

p_background.setBounds(73, 147, (35 * lage) + 4, (35 * lage) + 4);

p_background.setBackground(new Color(176, 196, 222));//计算时间.

{

Label l_time= new Label(" 时间:");

l_time.setBounds(0, 0, 80, 50);

l_time.setFont(new Font("宋体", Font.BOLD, 28));

tf_time= newTextField();

tf_time.setEditable(false);

tf_time.setFont(new Font("宋体", Font.BOLD, 40));

tf_time.setBackground(Color.WHITE);

tf_time.setBounds(90, 0, 110, 50);newThread(timeStartLaunch).start();

p_time.add(l_time);

p_time.add(tf_time);

}

mainFrame.add(p_time);

mainFrame.add(b_reStart);

mainFrame.add(p_main);

mainFrame.add(p_background);

addMineButton();//可以addMineButton.

mainFrame.addWindowListener(newWindowAdapter() {public voidwindowClosing(WindowEvent e) {

mainFrame.setVisible(false);

System.exit(0);

}

});

}public voidaddMineButton() {for (int a = 0; a < lage; a++) {for (int b = 0; b < lage; b++) {//可以运行

Mine[a][b] = newJButton();

Mine[a][b].setName("0_" + a + "" + b + "");

Mine[a][b].setBackground(new Color(176, 196, 222));

Mine[a][b].setBorder(new LineBorder(new Color(112, 128, 144)));

Mine[a][b].addMouseListener(newmouseTry());

Mine[a][b].setBounds(a* 35, b * 35, 35, 35);

p_main.add(Mine[a][b]);//可以add

}

}

addMine();

}public voidaddMine() {//埋雷方法

Random r = newRandom();int i = 0;while (i

String nameList=Mine[x][y].getName();char[] nameCharList =nameList.toCharArray();if (nameCharList[0] == 48) {

nameList= nameList.replaceFirst("0", "1");

Mine[x][y].setName(nameList);

}else

continue;//可以随机

i++;//0为有累 1没雷

}

}public voidshowMine() {

ImageIcon mine= new ImageIcon("image/mine.gif");

timeStop= false;for (int a = 0; a < lage; a++) {for (int b = 0; b < lage; b++) {

String name=Mine[a][b].getName();char[] nameList =name.toCharArray();int isHave = (int) nameList[0];if (isHave == 49) {

Mine[a][b].setIcon(mine);

}

}

}

}class mouseTry implementsMouseListener {

JButton jb= null;

ImageIcon flag= new ImageIcon("image/flag.jpg");

ImageIcon bloom= new ImageIcon("image/blood.gif");public voidmouseClicked(MouseEvent e) {

jb=(JButton) e.getSource();if (e.getButton() == 3) {if (jb.getName().contains("@") == false) {if (jb.getName().contains("^")) {

jb.setIcon(null);

String afterName=jb.getName();

afterName= afterName.replace("^", "");

jb.setName(afterName);

}else{

String jbName=jb.getName();

jbName= jbName + "^";

jb.setName(jbName);

jb.setIcon(flag);

}

}

}else if (e.getButton() == 1) {

String name=jb.getName();

String mineHave= name.substring(0, 1);//System.out.print(name);//System.out.println(mineHave);

int have =Integer.parseInt(mineHave);if (name.contentEquals("^") == false) {if (have == 1) {

jb.setBackground(Color.RED);

jb.setIcon(bloom);

showMine();

JOptionPane.showMessageDialog(null, "失败!", "提示", JOptionPane.ERROR_MESSAGE);

}else if (have == 0) {//检查四周有没有雷

{

String mineName=jb.getName();

mineName= mineName.substring(1, mineName.length());

mineName= mineName.replace("_", "");int jbY = 0, jbX = 0;//截取字符设定坐标.

String regexX = "(.*)";

Pattern patternX=Pattern.compile(regexX);

Matcher matcherX= patternX.matcher(mineName);//匹配类

while(matcherX.find()) {

jbX= Integer.parseInt(matcherX.group(1));

}

String regexY= "(.*)";

Pattern patternY=Pattern.compile(regexY);

Matcher matcherY= patternY.matcher(mineName);//匹配类

while(matcherY.find()) {

jbY= Integer.parseInt(matcherY.group(1));//打印中间字符

}//检查四周是否有雷.

{

cheakMine(jbX, jbY);

cheakWin();

}

}

}

}

}

}public voidcheakWin() {int cheakNumber = 0;for (int a = 0; a < lage; a++) {for (int b = 0; b < lage; b++) {

String mineName=Mine[a][b].getName();if (mineName.contains("@")) {

cheakNumber++;

}if (cheakNumber == lage * lage -number) {

String timeWin=tf_time.getText();

tf_time.setText(timeWin);

timeStop= false;

JOptionPane.showMessageDialog(null, "成功! 用时:" + timeWin, "提示", JOptionPane.ERROR_MESSAGE);

}

}

}

}public void cheakMine(int jbX, intjbY) {

Mine[jbX][jbY].setName(Mine[jbX][jbY].getName()+ "@");int MineNumber = 0;for (int i = 0; i < 8; i++) {int jb_X = jbX + around[i][0];int jb_Y = jbY + around[i][1];if (jb_X >= 0 && jb_X < lage && jb_Y >= 0 && jb_Y

try{

String jbName1=Mine[jb_X][jb_Y].getName();//System.out.println(jbName1);

String jbMine = jbName1.substring(0, 1);int Mine1 =Integer.parseInt(jbMine);if (Mine1 == 1) {

MineNumber++;

}

}catch(Exception ae1) {//DoNothing

}

}

}if (MineNumber != 0) {

Mine[jbX][jbY].setFont(new Font("宋体", Font.BOLD, 32));

Mine[jbX][jbY].setBackground(Color.WHITE);

Mine[jbX][jbY].setText("" +MineNumber);

}else if (MineNumber == 0) {

Mine[jbX][jbY].setBackground(Color.WHITE);for (int i = 0; i < 8; i++) {int jb_X = jbX + around[i][0];int jb_Y = jbY + around[i][1];try{boolean flag = Mine[jb_X][jb_Y].getName().contains("@");if (jb_X >= 0 && jb_X < lage && jb_Y >= 0 && jb_Y < lage && flag == false) {

cheakMine(jb_X, jb_Y);

}

}catch(ArrayIndexOutOfBoundsException ae) {

;

}

}

}

}public voidmousePressed(MouseEvent e) {

}public voidmouseReleased(MouseEvent e) {

}public voidmouseEntered(MouseEvent e) {

}public voidmouseExited(MouseEvent e) {

}

}class timeStart extendsThread {public voidrun() {int time = 0;while(timeStop) {

tf_time.setText("" + time + "秒");//可以输出.可以暂停.

try{

sleep(1000);

}catch(InterruptedException ae) {

System.out.println("sleep Error");

}

time= time + 1;

}

}

}

}

}

以下是一个简单Java 扫雷游戏代码示例: ```java import java.util.Random; import java.util.Scanner; public class Minesweeper { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Random random = new Random(); System.out.println("欢迎来到扫雷游戏!"); // 设置雷区大小 System.out.print("请输入雷区的行数:"); int rows = scanner.nextInt(); System.out.print("请输入雷区的列数:"); int cols = scanner.nextInt(); // 设置雷数 System.out.print("请输入雷数:"); int mines = scanner.nextInt(); // 初始化雷区 int[][] board = new int[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { board[i][j] = 0; } } // 随机布雷 int count = 0; while (count < mines) { int x = random.nextInt(rows); int y = random.nextInt(cols); if (board[x][y] == 0) { board[x][y] = -1; count++; } } // 计算每个格子周围的雷数 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (board[i][j] == -1) { continue; } int numMines = 0; for (int k = i - 1; k <= i + 1; k++) { for (int l = j - 1; l <= j + 1; l++) { if (k < 0 || k >= rows || l < 0 || l >= cols) { continue; } if (board[k][l] == -1) { numMines++; } } } board[i][j] = numMines; } } // 开始游戏 int[][] revealed = new int[rows][cols]; boolean gameover = false; while (!gameover) { // 打印当前状态 System.out.println("当前状态:"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (revealed[i][j] == 0) { System.out.print("# "); } else if (revealed[i][j] == 1) { System.out.print(board[i][j] + " "); } else if (revealed[i][j] == 2) { System.out.print("* "); } } System.out.println(); } // 输入下一步操作 System.out.print("请输入操作(格式:x y r/l):"); int x = scanner.nextInt(); int y = scanner.nextInt(); String op = scanner.next(); // 执行操作 if (op.equals("r")) { if (board[x][y] == -1) { System.out.println("你输了!"); gameover = true; } else { revealed[x][y] = 1; } } else if (op.equals("l")) { if (board[x][y] == -1) { revealed[x][y] = 2; } else { System.out.println("你输了!"); gameover = true; } } else { System.out.println("无效操作!"); } // 判断是否胜利 int countRevealed = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (revealed[i][j] == 1) { countRevealed++; } } } if (countRevealed == rows * cols - mines) { System.out.println("你赢了!"); gameover = true; } } scanner.close(); } } ``` 该代码实现了一个简单扫雷游戏,包括设置雷区大小和雷数、随机布雷、计算每个格子周围的雷数、开始游戏、执行操作、判断胜负等功能。其中,用二维数组 `board` 存储雷区,-1 表示有雷,其他数字表示周围的雷数;用二维数组 `revealed` 存储已经揭开的格子,0 表示未揭开,1 表示已揭开,2 表示已标记为雷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值