当前位置: 首页 > news >正文

Java 扫雷游戏

程序分析

使用Java编写的扫雷游戏界面程序,主要内容总结如下:

  1. Frame类继承自JFrame,构建了扫雷游戏的界面。
    • 包含文本框text、标签nowBombsetBomb、按钮start、面板MenuPamelbombPanel等组件。
    • 通过jbInit方法进行初始化设置,包括布局、组件添加和事件监听等。
  2. 游戏逻辑相关方法:
    • start_actionPerformed:处理开始按钮的动作,根据设置的地雷数进行相应操作。
    • startBomb:开始布雷,设置地雷位置并计算周围雷数。
    • CountRoundBomb:计算方块周围的雷数。
    • isWin:判断是否挖完了所有的雷。
    • isNull:当选中的位置为空时,翻开周围的地图。
    • turn:翻开方块。
    • actionPerformed:处理左键点击事件。
    • mouseClicked:处理右键点击事件。
  3. 内部类:
    • Frame1_start_actionAdapter:处理开始按钮的动作事件。
    • Bomb:表示游戏中的方块按钮,包含相关属性和方法。
    • Bomb_actionAdapter:处理方块按钮的动作事件。
    • Bomb_mouseAdapter:处理方块按钮的鼠标点击事件。

最后,在main方法中创建Frame对象并使其可见,启动游戏界面。

源码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class Frameextends JFrame {JTextField text;JLabel nowBomb, setBomb;int BombNum, BlockNum; // 当前雷数,当前方块数int rightBomb, restBomb, restBlock; // 找到的地雷数,剩余雷数,剩余方块数JButton start = new JButton(" 开始 ");JPanel MenuPamel = new JPanel();JPanel bombPanel = new JPanel();Bomb[][] bombButton;JPanel c;BorderLayout borderLayout1 = new BorderLayout();GridLayout gridLayout1 = new GridLayout();public Frame() {try {setDefaultCloseOperation(EXIT_ON_CLOSE);jbInit();} catch (Exception exception) {exception.printStackTrace();}}private void jbInit() throws Exception {c = (JPanel) getContentPane();setTitle("扫雷");c.setBackground(Color.WHITE);MenuPamel.setBackground(Color.GRAY);c.setLayout(borderLayout1);setSize(new Dimension(600, 600));setResizable(false);BlockNum = 144;BombNum = 10;text = new JTextField("10 ", 3);nowBomb = new JLabel("当前雷数" + ":" + BombNum);setBomb = new JLabel("设置地雷数");start.addActionListener(new Frame1_start_actionAdapter(this));MenuPamel.add(setBomb);MenuPamel.add(text);MenuPamel.add(start);MenuPamel.add(nowBomb);c.add(MenuPamel, java.awt.BorderLayout.SOUTH);bombPanel.setLayout(gridLayout1);gridLayout1.setColumns((int) Math.sqrt(BlockNum));gridLayout1.setRows((int) Math.sqrt(BlockNum));bombButton = new Bomb[(int) Math.sqrt(BlockNum)][(int) Math.sqrt(BlockNum)];for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {bombButton[i][j] = new Bomb(i, j);// bombButton[i][j].setSize(10, 10);bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));// 设置字体大小bombButton[i][j].setForeground(Color.white);bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this));bombButton[i][j].addActionListener(new Bomb_actionAdapter(this));bombPanel.add(bombButton[i][j]);}}c.add(bombPanel, java.awt.BorderLayout.CENTER);startBomb();}/* 开始按钮 */public void start_actionPerformed(ActionEvent e) {int num = Integer.parseInt(text.getText().trim());if (num >= 5 && num < 50) {BombNum = num;startBomb();} else if (num < 5) {JOptionPane.showMessageDialog(null, "您设置的地雷数太少了,请重设!", "错误",JOptionPane.ERROR_MESSAGE);num = 10;BombNum = num;} else {JOptionPane.showMessageDialog(null, "您设置的地雷数太多了,请重设!", "错误",JOptionPane.ERROR_MESSAGE);num = 10;BombNum = num;}}/* 开始,布雷 */public void startBomb() {nowBomb.setText("当前雷数" + ":" + BombNum);for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {bombButton[i][j].isBomb = false;bombButton[i][j].isClicked = false;bombButton[i][j].isRight = false;bombButton[i][j].BombFlag = 0;bombButton[i][j].BombRoundCount = 9;bombButton[i][j].setEnabled(true);bombButton[i][j].setText("");bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));// 设置字体大小bombButton[i][j].setForeground(Color.BLUE);rightBomb = 0;restBomb = BombNum;restBlock = BlockNum - BombNum;}}for (int i = 0; i < BombNum;) {int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));if (bombButton[x][y].isBomb != true) {bombButton[x][y].isBomb = true;i++;}}CountRoundBomb();}/* 计算方块周围雷数 */public void CountRoundBomb() {for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {int count = 0;// 当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数if (bombButton[i][j].isBomb != true) {for (int x = i - 1; x < i + 2; x++) {for (int y = j - 1; y < j + 2; y++) {if ((x >= 0) && (y >= 0)&& (x < ((int) Math.sqrt(BlockNum)))&& (y < ((int) Math.sqrt(BlockNum)))) {if (bombButton[x][y].isBomb == true) {count++;}}}}bombButton[i][j].BombRoundCount = count;}}}}/* 是否挖完了所有的雷 */public void isWin() {restBlock = BlockNum - BombNum;for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {if (bombButton[i][j].isClicked == true) {restBlock--;}}}if (rightBomb == BombNum || restBlock == 0) {JOptionPane.showMessageDialog(this, "您挖完了所有的雷,您胜利了!", "胜利",JOptionPane.INFORMATION_MESSAGE);startBomb();}}/** 当选中的位置为空,则翻开周围的地图* */public void isNull(Bomb ClickedButton) {int i, j;i = ClickedButton.num_x;j = ClickedButton.num_y;for (int x = i - 1; x < i + 2; x++) {for (int y = j - 1; y < j + 2; y++) {if (((x != i) || (y != j)) && (x >= 0) && (y >= 0)&& (x < ((int) Math.sqrt(BlockNum)))&& (y < ((int) Math.sqrt(BlockNum)))) {if (bombButton[x][y].isBomb == false&& bombButton[x][y].isClicked == false&& bombButton[x][y].isRight == false) {turn(bombButton[x][y]);}}}}}/* 翻开 */public void turn(Bomb ClickedButton) {ClickedButton.setEnabled(false);ClickedButton.isClicked = true;if (ClickedButton.BombRoundCount > 0) {ClickedButton.setText(ClickedButton.BombRoundCount + "");} else {isNull(ClickedButton);}}/* 左键点击 */public void actionPerformed(ActionEvent e) {if (((Bomb) e.getSource()).isClicked == false&& ((Bomb) e.getSource()).isRight == false) {if (((Bomb) e.getSource()).isBomb == false) {turn(((Bomb) e.getSource()));isWin();} else {for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {if (bombButton[i][j].isBomb == true) {bombButton[i][j].setText("b");}}}((Bomb) e.getSource()).setForeground(Color.RED);((Bomb) e.getSource()).setFont(new Font("", Font.BOLD, 20));((Bomb) e.getSource()).setText("X");JOptionPane.showMessageDialog(this, "你踩到地雷了,按确定重来", "踩到地雷", 2);startBomb();}}}/* 右键点击 */public void mouseClicked(MouseEvent e) {Bomb bombSource = (Bomb) e.getSource();boolean right = SwingUtilities.isRightMouseButton(e);if ((right == true) && (bombSource.isClicked == false)) {bombSource.BombFlag = (bombSource.BombFlag + 1) % 3;if (bombSource.BombFlag == 1) {if (restBomb > 0) {bombSource.setForeground(Color.RED);bombSource.setText("F");bombSource.isRight = true;restBomb--;} else {bombSource.BombFlag = 0;}} else if (bombSource.BombFlag == 2) {restBomb++;bombSource.setText("Q");bombSource.isRight = false;} else {bombSource.setText("");}if (bombSource.isBomb == true) {if (bombSource.BombFlag == 1) {rightBomb++;} else if (bombSource.BombFlag == 2) {rightBomb--;}}nowBomb.setText("当前雷数" + ":" + restBomb);isWin();}}public static void main(String[] args) {Frame frame = new Frame();frame.setVisible(true);}
}class Frame1_start_actionAdapterimplements ActionListener {private Frame adaptee;Frame1_start_actionAdapter(Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.start_actionPerformed(e);}
}class Bombextends JButton {int num_x, num_y; // 第几号方块int BombRoundCount; // 周围雷数boolean isBomb; // 是否为雷boolean isClicked; // 是否被点击int BombFlag; // 探雷标记boolean isRight; // 是否点击右键public Bomb(int x, int y) {num_x = x;num_y = y;BombFlag = 0;BombRoundCount = 9;isBomb = false;isClicked = false;isRight = false;}
}class Bomb_actionAdapterimplements ActionListener {private Frame adaptee;Bomb_actionAdapter(Frame adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.actionPerformed(e);}
}class Bomb_mouseAdapterextends MouseAdapter {private Frame adaptee;Bomb_mouseAdapter(Frame adaptee) {this.adaptee = adaptee;}public void mouseClicked(MouseEvent e) {adaptee.mouseClicked(e);}
}

相关文章:

Java 扫雷游戏

程序分析 使用Java编写的扫雷游戏界面程序&#xff0c;主要内容总结如下&#xff1a; Frame类继承自JFrame&#xff0c;构建了扫雷游戏的界面。 包含文本框text、标签nowBomb和setBomb、按钮start、面板MenuPamel和bombPanel等组件。通过jbInit方法进行初始化设置&#xff0c;…...

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上--port --8080 就可以将端口号修改为8080&#xff08;修改后边的数字就可以修改为你想要的端口号&#xff09;...

由CANoe自带协议栈在TCP断开连接时同时发送两条FIN报文引起的注意事项

在我写这篇文章CAPL如何在底层模拟TCP Server端断开TCP连接时,我发现了一个奇怪的现象。我为了使用CAPL组装报文的方式实现TCP Server断开连接的过程,插入一个网络节点作为Client端。为了让Client能够发起连接和发起断开连接,给网络节点配置了独立的TCP/IP Stack,也就是CAN…...

FastGPT部署和接入使用重排模型bce-reranker-base

bce-reranker简介 bce-reranker 是一种专门用于信息检索和自然语言处理领域中的重排序(reranking)模型。这种模型由北京智源人工智能研究院(BAAI)开发,是 BGE(BAAI General Embedding)系列的一部分。BGE 系列模型专注于提供通用的嵌入表示,而 bce-reranker 则更进一步…...

Android笔试面试题AI答之线程Handler、Thread(2)

答案仅供参考&#xff0c;来自 讯飞星火大模型 目录 1.Android多线程间通信和多进程之间通信有什么不同&#xff0c;分别怎么实现?2.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系&#xff1f;3.Android 线程间通信有哪几种方式?4.子线程发消息…...

某某物联rabbitmqhttp二轮充电桩协议充电协议对接

对接方式概述&#xff1a; 1&#xff09;请求采用 http 协议方式&#xff0c;推送数据采用 amqp(默认 rabbitmq)点对点消息队 列方式。 2&#xff09;消息队列连接信息&#xff0c;需贵方完善。 1 hostIp&#xff1a; 2 virtualHost&#xff1a; 3 userName&#xff1a; 4 pass…...

黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型

文章目录 前言一、正文排版1. 视频标签: < video >2. 音频标签: < audio >3. 换行标签: < br >4. 段落标签 < p >5. vscode实现 二、布局1. 盒子模型2. 布局标签< div >和< span >3. VScode实现 三、源代码和运行结果总结 前言 本篇文章是…...

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…...

Django REST Framework(十三)视图集-GenericViewSet

Django REST Framework 中&#xff0c;ModelViewSet 和 ReadOnlyModelViewSet 提供了快速实现常见视图操作的便捷方法。它们分别继承自 GenericViewSet 并组合了多个 Mixin 类&#xff0c;使得视图的编写变得更加简单。 ModelViewSet ModelViewSet 继承自 GenericViewSet&…...

《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取

一、深度爬取 深度爬取是指在网络爬虫中&#xff0c;获取网页上的所有链接并递归地访问这些链接&#xff0c;以获取更深层次的页面数据。 通常&#xff0c;一个简单的爬虫只会获取到初始页面上的链接&#xff0c;并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获…...

Python Pygame制作简单五子棋游戏

代码参考自&#xff1a;https://blog.csdn.net/weixin_43918046/article/details/119521845 新增功能&#xff1a;1任意棋盘大小&#xff1b;2.任意棋子连线 # 棋盘大小 [670, 670] # 棋盘行列 15*15 import pygame from pygame.locals import QUIT, KEYDOWN import numpy as…...

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…...

kafka源码阅读-ReplicaStateMachine(副本状态机)解析

概述 Kafka源码包含多个模块&#xff0c;每个模块负责不同的功能。以下是一些核心模块及其功能的概述&#xff1a; 服务端源码 &#xff1a;实现Kafka Broker的核心功能&#xff0c;包括日志存储、控制器、协调器、元数据管理及状态机管理、延迟机制、消费者组管理、高并发网络…...

【MetaGPT系列】【MetaGPT完全实践宝典——如何定义单一行为多行为Agent】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent&#xff08;ProductManager&#xff09;2-3、拥有单一行为的Agent&#xff08;SimpleCoder&#xff09;2-3-1、定义写代码行为2-3-2、角色定义2-3…...

Kolla-Ansible的确是不支持CentOS-Stream系列产品了

看着OpenStack最新的 C 版本出来一段时间了&#xff0c;想尝个鲜、用Kolla-Ansible进行容器化部署&#xff0c;结果嘛。。。 根据实验结果&#xff0c;自OpenStack Bobcat版本开始&#xff0c;Kolla-Ansible就适合在CentOS系列产品上部署了&#xff0c;通过对 Bobcat和Caracal…...

IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错

这篇文章写的就很详细了(IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错_error occurred during initialization of vm failed -CSDN博客)...

ctfshow298-300(java信息泄露,代码审计)

Web298 代码审计 这里看到getVipStatus方法&#xff0c;获得了获取flag的条件就是user等于admin&#xff0c;password等于ctfshow Poc: https://d036a90d-ac1c-4de1-9b0b-86f52d2586b9.challenge.ctf.show/ctfshow/login?usernameadmin&passwordctfshow Web299 打开页面…...

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类&#xff08;修饰类除外&#xff09;&#xff1f; 一个 Java 文件中是可以存在多个类的&#xff0c;但是一个 Java 文件中只能存在一个 public 所修饰的类&#xff0c;而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…...

【LabVIEW作业篇 - 5】:水仙花数、数组与for循环的连接

文章目录 水仙花数数组与for循环的连接 水仙花数 水仙花数&#xff0c;是指一个3位数&#xff0c;它的每个位上的数字的3次幂之和等于它本身。如371 3^3 7^3 1^3&#xff0c;则371是一个水仙花数。 思路&#xff1a;水仙花数是一个三位数&#xff0c;通过使用for循环&#xf…...

Kafka系列之如何提高消费者消费速度

前言 在实际开发过程中&#xff0c;如果使用Kafka处理超大数据量(千万级、亿级)的场景&#xff0c;Kafka消费者的消费速度可能决定系统性能瓶颈。 实现方案 为了提高消费者的消费速度&#xff0c;我们可以采取以下措施&#xff1a; 将主题的分区数量增大&#xff0c;如 20&…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...