扫雷怎么统计周围雷的数量?(绝对菜鸟)

cart55free99 2010-02-03 02:38:00
我是用二维数组弄得很多个button,然后btn[i][j-1] btn[i][j] btn[i][j+1]...(共8个)..像这样把周围的雷数加起来,
但是对于特殊的情况又要特殊的考虑,比如说边缘,第一行,最后一行啦 最边缘上的四个...又要有8个
感觉这样的做法太不明智了,各位大侠是怎样做的?


要是不明白看下面的部分

if(btn[i-1][j-1].getText().equals("*")){
System.out.println("count");
countMine++;
}
if(btn[i-1][j].getText().equals("*")){
countMine++;
}
if(btn[i-1][j+1].getText().equals("*")){
countMine++;
}
if(btn[i][j-1].getText().equals("*")){
countMine++;
}
if(btn[i][j+1].getText().equals("*")){
countMine++;
}
if(btn[i+1][j-1].getText().equals("*")){
countMine++;
}
if(btn[i+1][j].getText().equals("*")){
countMine++;
}
if(btn[i+1][j+1].getText().equals("*")){
countMine++;
}
这还仅仅是周围8个都有,特殊情况怎么办呢?真的要分9次吗?
...全文
1167 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cart55free99 2010-02-06
  • 打赏
  • 举报
回复
哇,几天没来,都这么多回答了!
zqfddqr 2010-02-05
  • 打赏
  • 举报
回复
恩 呵呵
gao512008 2010-02-05
  • 打赏
  • 举报
回复
递归遍历
shilight 2010-02-05
  • 打赏
  • 举报
回复
8楼正解,只是没有运用迷宫的概念,使得代码看起来有点累,而且貌似只能是正方形的扫雷
我改了下 用了迷宫的边界



package csdn;

import java.util.Random;

public class Mine {

private int[][] mineArray;

public final static int MINE = -1;

public Mine(int x, int y, int total) {
if (x * y < total) {
throw new IllegalArgumentException(total
+ " is too many, total must be less than or equal to "
+ (x * y));
}
mineArray = new int[x+2][y+2];
Random r = new Random();
int xx = 0, yy = 0, t = 0;
while (t < total) {
xx = r.nextInt(x)+1;
yy = r.nextInt(y)+1;
if (mineArray[xx][yy] != MINE) {
mineArray[xx][yy] = MINE;
t++;
}
}
}

public void calculated(){
for (int i = 1; i < (mineArray.length-1); i++) {
for (int j = 1; j < (mineArray[i].length-1); j++) {
if(mineArray[i][j]==MINE){

}
else{
if(mineArray[i-1][j-1]==MINE)
mineArray[i][j]++;
if(mineArray[i-1][j]==MINE)
mineArray[i][j]++;
if(mineArray[i-1][j+1]==MINE)
mineArray[i][j]++;
if(mineArray[i][j-1]==MINE)
mineArray[i][j]++;
if(mineArray[i][j+1]==MINE)
mineArray[i][j]++;
if(mineArray[i+1][j-1]==MINE)
mineArray[i][j]++;
if(mineArray[i+1][j]==MINE)
mineArray[i][j]++;
if(mineArray[i+1][j+1]==MINE)
mineArray[i][j]++;

}
}
}
}

public void printMineArray() {
for (int i = 1; i < (mineArray.length-1); i++) {
for (int j = 1; j < (mineArray[i].length-1); j++) {
if(mineArray[i][j]==MINE)
System.out.print("* ");
else
System.out.print(mineArray[i][j]+" ");
}
System.out.println();
}
}

public static void main(String[] args) {
Mine mine = new Mine(10, 20, 35);
mine.calculated();
mine.printMineArray();
}
}
harrybest 2010-02-04
  • 打赏
  • 举报
回复
经典迷宫问题
shilight 2010-02-04
  • 打赏
  • 举报
回复
对的,就像楼上说的,迷宫问题。
解决迷宫的时候,你是8*8的,可是你要new 10*10的。将最外面的一圈设置成为墙壁。
这样用循环解决的时候就很容易了。
放到扫雷,就是将围墙设置成为无雷,只是用的人看不到罢了,这样写循环是很容易的
Z_FEI 2010-02-04
  • 打赏
  • 举报
回复
8楼的代码,学习了,谢谢
dinghun8leech 2010-02-04
  • 打赏
  • 举报
回复
多谢8楼的代码,学习了。
  • 打赏
  • 举报
回复
原来写的,有兴趣的话可以看一下:

import java.util.Random;

public class MineTest {

public static void main(String[] args) {
Mine mine = new Mine(10, 10, 35);
char[][] mineArray = mine.toArray();
Mine.printMineArray(mineArray);
}
}

class Mine {

/**
* 雷阵列
*/
private char[][] mineArray;

/**
* 雷的总数
*/
private int total;

/**
* 有雷时的标记
*/
public final static char MINE = '#';

/**
* 周围无雷时的标记
*/
public final static char BLANK = '0';

public Mine(int height, int width, int total) {
if(height * width < total) {
throw new IllegalArgumentException(total + " is too many, total must be less than or equal to " + (height * width));
}
this.total = total;
init(height, width);
}

public int getTotal() {
return total;
}

public char[][] toArray() {
return this.mineArray.clone();
}

/**
* 输出雷阵列的工具方法
* @param mineArray 雷阵列
*/
public static void printMineArray(char[][] mineArray) {
for(int i = 0; i < mineArray.length; i++) {
for(int j = 0; j < mineArray[i].length; j++) {
System.out.printf("%2c", mineArray[i][j]);
}
System.out.println();
}
}

/**
* 初始化雷阵列
* @param height 阵列的行数
* @param width 阵列的列数
*/
private void init(int height, int width) {
mineArray = new char[height][width];
Random r = new Random();
int y = 0, x = 0, t = 0;

// 置雷
while(t < total) {
y = r.nextInt(height);
x = r.nextInt(width);
if (mineArray[y][x] != MINE) {
pubMine(y, x);
t++;
}
}

// 将空白处置为周围无雷标记
for (int i = 0, m = mineArray.length; i < m; i++) {
for (int j = 0, n = mineArray[i].length; j < n; j++) {
if(mineArray[i][j] == 0) {
mineArray[i][j] = BLANK;
}
}
}
}

/**
* 置雷,并在九宫周围单元格中置上单元格周围雷的数量
* @param y 纵坐标
* @param x 横坐标
*/
private void pubMine(int y, int x) {
// 扫描整个九宫
for(int i = y - 1; i <= y + 1; i++) {
// 行值在范围之外时忽略
if(i < 0 || i > mineArray.length - 1) {
continue;
}

for(int j = x - 1; j <= x + 1; j++) {
// 列值在范围之外时忽略
if(j < 0 || j > mineArray.length - 1 ) {
continue;
}
// 在九宫中心位置时置雷
if(i == y && j == x) {
mineArray[i][j] = MINE;
}
// 如果周围单元格为雷时忽略
if(mineArray[i][j] == MINE) {
continue;
}

if(mineArray[i][j] == 0) {
// 周围单元格为空时,标记为“1”
mineArray[i][j] = '1';
}else{
// 周围单元格不为空时,标记为当前数值增加1
mineArray[i][j] += 1;
}
}
}
}
}
hardycheng 2010-02-03
  • 打赏
  • 举报
回复
迷宫问题

bayougeng 2010-02-03
  • 打赏
  • 举报
回复
是啊是啊,前一行,当前行,后一行……
然后是列。
加上最大最小值的限制,就OK了。
  • 打赏
  • 举报
回复
是啊
全算出来 就这么几种可能
ChDw 2010-02-03
  • 打赏
  • 举报
回复
哦,应该是 m < Math.min(btn.length, i + 2) 和n < Math.min(btn[m].length, j + 2);
ChDw 2010-02-03
  • 打赏
  • 举报
回复
可以用循环就行啦
for(int m = Math.max(0, i - 1); m < Math.min(btn.length, i + 1); m++)
for(int n = Math.max(0, j - 1); n < Math.min(btn[m].length, j + 1); n++)
if(btn[m][n].getText().equals("*"))
countMine++;
内容概要:本文档聚焦于通信系统中的调制解调技术与Turbo码的结合应用,系统研究了GMSK调制的二比特差分解调方法,以及Turbo码分别与BPSK、GMSK调制方式联合使用的系统性能。通过Matlab平台实现了完整的通信链路仿真,涵盖信号调制、信道编码、解调解码及误码率分析等关键环节,深入探讨了不同调制体制下Turbo编码系统的抗干扰能力与频谱效率表现。研究不仅提供了算法实现代码,还包含了详细的性能对比分析,有助于理解现代数字通信中高效编码调制技术的设计原理与工程实现。此外,文档附带多个相关科研方向的仿真案例,展现出广泛的技术延展性与实际应用价值。; 适合人群:具备通信原理、数字信号处理等相关基础知识,熟悉Matlab编程环境,正在从事无线通信系统仿真、信道编码理论研究或相关领域科研工作的研究生、高校教师及工程技术研究人员。; 使用场景及目标:①深入掌握GMSK调制与Turbo码相结合的技术机制,理解其在提高通信可靠性与频谱利用率方面的优势;②熟练运用Matlab构建完整的数字通信仿真系统,完成从调制编码到解调译码的全流程建模与性能评估;③为无人机通信、卫星通信、移动通信等实际应用场景下的高可靠传输系统设计提供理论支持与算法参考。; 阅读建议:建议结合所提供的Matlab代码逐模块运行与调试,重点关注GMSK差分解调过程与Turbo译码的迭代收敛特性,同时可参考文档中列出的其他研究课题拓展仿真范围,提升综合科研与工程实践能力。
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 标题中所指的"RS485转USB驱动"是一种硬件接口转换技术,其功能在于将传统的RS485通信协议转换为USB接口形式,从而使得现代计算机或设备能够便捷地与采用RS485协议的设备展开通信。RS485作为一种在工业控制、远程通信及多点系统中得到普遍应用的串行通信标准,具备传输距离长、抗干扰性能优异等显著优势。文中提及的型号(CH340、CH341、FT232RL、PL2303、Y-105)是几种常见的USB至UART(通用异步接收发送器)桥接芯片,它们在USB接口与RS485网络之间充当转换媒介的角色。这些芯片赋予USB通信能力,使得计算机可以通过USB接口与RS485网络中的设备执行数据交换。 1. CH340/CH341:这些由韦东山科技研制的USB转串口芯片,常被用于构建低成本的USB转串口适配器。它们提供从USB到UART的转换功能,支持多种波特率的设定,并且在Windows操作系统环境下通常需要安装相应的驱动程序方可正常运作。 2. FT232RL:FTDI公司推出的一款高性能且低功耗的USB到UART桥接器。FT232RL配备全速USB 1.1接口,支持多种串行接口模式,在数据通信、工业控制等领域能够得到广泛应用。同样地,采用FT232RL的设备在连接至电脑时也需要安装对应的驱动程序。 3. PL2303:硅光电子(Prolific)公司所生产的产品,亦是一种常用的USB到UART桥接芯片。它展现出良好的兼容性以及广泛的驱动程序支持,适用于各类USB至串口的应用场景。 4. Y-105:这可能是一款特定的RS485转USB转换模块,或许集成了上述其中一种或多种转换...

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧