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

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次吗?
...全文
1175 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++;
内容概要:本文针对阶梯碳交易与绿色证书(绿证)联合机制下的虚拟电厂多时间尺度优化调度问题,提出了一种综合考虑碳排放成本与绿证交易收益的优化模型,并通过Matlab代码实现。该模型在日前和实时等不同时间尺度上,对虚拟电厂内部的风电、光伏、储能、可控负荷等多种能源资源进行协调优化调度,旨在最小化系统综合运行成本、降低碳排放强度并最大化绿证收益。研究重点刻画了阶梯碳交易机制中碳价随排放量跃升的非线性特征,以及绿证交易对可再生能源消纳的激励作用,构建了一个更贴合实际电力市场的综合能源系统运营框架。通过仿真案例验证了所提模型在提升经济性、低碳性和可再生能源利用率方面的有效性与优越性。; 适合人群:具备电力系统、能源经济、优化调度等相关专业背景,熟悉Matlab编程,从事新能源并网、虚拟电厂运营、碳交易与绿证市场机制等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究虚拟电厂在碳-绿证联合市场机制下的最优竞价与运营策略;②掌握多时间尺度协调优化调度的建模与求解方法;③实现综合能源系统在多重外部市场约束下的经济性与低碳性协同优化。; 阅读建议:建议读者结合所提供的Matlab代码,深入理解模型的目标函数构建、约束条件设定及求解流程,重点关注碳成本与绿证收益项的数学表征方式,并可通过调整阶梯碳价参数、绿证价格或可再生能源渗透率等情景,探究不同政策导向对虚拟电厂调度决策与经济效益的影响。
内容概要:本文针对传统三相并网逆变器在谐波抑制、电网适应性和动态响应方面的不足,提出一种基于电流和功率双模式模型预测控制(MPC)的闭环控制策略。通过Simulink仿真与Matlab代码实现,分别构建电流预测控制与功率预测控制模型,系统分析三相并网逆变器在稳态运行、电网电压波动及负载突变等工况下的性能表现。电流预测控制通过建立离散数学模型实时预测并网电流,结合代价函数优化选择最优电压矢量,实现对并网电流的快速精确跟踪,显著降低电流谐波含量,提升电能质量;功率预测控制则基于瞬时功率理论预测有功与无功功率动态,通过滚动优化目标函数实现对功率的独立精准调节,增强系统在电网扰动下的稳定性与调节能力。两种MPC策略均采用有限控制集模型预测控制(FCS-MPC)框架,具备原理清晰、动态响应快、易于实现多目标优化的优点,有效克服了传统PI控制带宽限制与解耦控制复杂的问题。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真环境,从事新能源并网、逆变器控制等相关研究的研究生及科研人员。; 使用场景及目标:① 掌握模型预测控制在三相并网逆变器中的应用方法;② 比较电流型与功率型MPC控制策略的性能差异;③ 实现高电能质量、强抗扰能力的并网逆变系统仿真设计; 阅读建议:此资源以仿真复现为核心,建议读者结合文中控制模型搭建Simulink仿真系统,调试Matlab代码,深入理解预测模型构建、代价函数设计及开关矢量选择等关键环节,进而掌握MPC控制精髓。

62,622

社区成员

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

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