Java 编程挑战扫雷舰帮助:如何检查*&引用;在二维字符串数组中?
我正试图为编程挑战网站编写一个扫雷舰程序,我很难检测2D阵列中的某个元素是否是地雷并增加周围区域。 下面是我的代码,它检查阵列角落中的地雷,并增加周围区域Java 编程挑战扫雷舰帮助:如何检查*&引用;在二维字符串数组中?,java,matrix,multidimensional-array,arrays,minesweeper,Java,Matrix,Multidimensional Array,Arrays,Minesweeper,我正试图为编程挑战网站编写一个扫雷舰程序,我很难检测2D阵列中的某个元素是否是地雷并增加周围区域。 下面是我的代码,它检查阵列角落中的地雷,并增加周围区域 public void constructPointers(){ int counter = 0; for(int i = 0; i<row;i++){ for(int j = 0;j<colm;j++){ if(minefield[i][j].equals("*")){
public void constructPointers(){
int counter = 0;
for(int i = 0; i<row;i++){
for(int j = 0;j<colm;j++){
if(minefield[i][j].equals("*")){
if(i == 0 && j == 0){
int val = Integer.parseInt(minefield[i+1][j]);
val++;
minefield[i+1][j] = "" + val;
val = Integer.parseInt(minefield[i][j+1]);
val++;
minefield[i][j+1] = "" + val;
val = Integer.parseInt(minefield[i+1][j+1]);
val++;
minefield[i+1][j+1] = "" + val;
}
if(i == minefield.length -1 && j == 0){
int val = Integer.parseInt(minefield[i-1][j]);
val++;
minefield[i-1][j] = "" + val;
val = Integer.parseInt(minefield[i][j+1]);
val++;
minefield[i][j+1] = "" + val;
val = Integer.parseInt(minefield[i-1][j+1]);
val++;
minefield[i-1][j+1] = "" + val;
}
if(i == 0 && j == minefield[i].length - 1){
int val = Integer.parseInt(minefield[i+1][j]);
val++;
minefield[i+1][j] = "" + val;
val = Integer.parseInt(minefield[i][j-1]);
val++;
minefield[i][j-1] = "" + val;
val = Integer.parseInt(minefield[i+1][j-1]);
val++;
minefield[i+1][j-1] = "" + val;
}
if(i == minefield.length - 1 && j == minefield[i].length -1){
int val = Integer.parseInt(minefield[i-1][j-1]);
val++;
minefield[i-1][j-1] = "" + val;
val = Integer.parseInt(minefield[i-1][j]);
val++;
minefield[i-1][j] = "" + val;
val = Integer.parseInt(minefield[i][j-1]);
val++;
minefield[i][j-1] = "" + val;
}
if(i == 0){
int val = Integer.parseInt(minefield[i+1][j]);
val++;
minefield[i+1][j] = "" + val;
val = Integer.parseInt(minefield[i][j+1]);
val++;
minefield[i][j+1] = "" + val;
val = Integer.parseInt(minefield[i+1][j+1]);
val++;
minefield[i+1][j+1] = "" + val;
}
}
此代码将输出:
* 2 *
2 4 2
* 2 *
我的问题是:如何让我的代码“跳过”相邻的矿山并增加周围区域?
如果我输入
*.*
*..
*.*
我希望它输出:
* 3 *
* 5 2
* 3 *
编辑:你们都有很好的答案,但我选择了第一个答案,因为它解决了很多我没有提到的其他问题。谢谢大家的帮助
if(minefield[i][j] == "*"){
// do stuff
}
我不明白有什么大不了的,嗯
编辑
不正确-如评论中所述:
if(minefield[i][j].equals("*")){
// do stuff, they are equal.
}
p、 不是很有建设性的回答,但我留下它是因为有建设性的评论。你可能会发现迭代每个单元格更容易,对于每个不是地雷的单元格,计算单元格周围的地雷数量。换句话说,您可以一次计算每个单元格的计数。这将解决您关于如何处理相邻矿山的问题。仅为您的矿山更新循环提供建议:
// You are on a mine
if(minefield[i][j].equals("*")){
// Now go around your current position
for(int tempRow = i-1; tempRow <= i+1; tempRow++) {
for(int tempCol = j-1; tempCol <= j+1; tempCol++) {
// If a valid square and not a mine
if(tempRow >= 0 && tempRow < row &&
tempCol >= 0 && tempCol < colm &&
!minefield[tempRow][tempCol].equals("*"))
{
// Do your update stuff
int val = Integer.parseInt(minefield[tempRow][tempCol]);
val++;
minefield[tempRow][tempCol] = "" + val;
}
}
}
}
//你在矿井上
if(雷区[i][j]。等于(“*”){
//现在看看你现在的位置
对于(int-tempRow=i-1;tempRow=0&&tempCol
这个循环可以扩展到更大的电路板尺寸,也比较容易
注:如果不是地雷,我假设雷区被初始化为“0”。否则,第一个
parseInt
==将出现问题,这是比较字符串的糟糕方法。equals()是正确的方法,就像他在代码中已经做的那样。哦,当然,失败了。我将删除我的答案,因为它不是建设性的。同意@Pescis决不使用==作为字符串,因为这将检查引用相等性而不是实际相等性。使用.equals();我认为整数作为TBH的内部表示形式会更好。例如,使用-1表示矿山,其余表示相邻矿山的数量。计算机更喜欢整数而不是字符和数字Strings@Pescis字符是一个整数。。字符串是一个字符序列。(操作的边界将根据可变性/不可变性和索引而变化——当然在Java中是不可变的。)请编写一个包含所有单步增量的方向枚举,而不是将代码写出8次。例如,在JavaWow中。我不敢相信我竟然没有想到这一点。非常感谢你!看起来你只是在每个单元格上迭代,对于每个不是地雷的单元格,计算单元格周围地雷的数量。换句话说,您可以一次计算每个单元格的计数。这就解决了如何处理相邻地雷的问题。@ChrisGerken上面的代码片段是为了生活在OP访问每个单元格的原始循环中。第一个测试将检查当前电池是否为地雷。然后,内部循环将绕过它,并增加非地雷空间的每个计数。我选择此模式是为了支持“执行每个单元格并累积计数”模式,因为我假设地雷单元格少于非地雷单元格,因此在外循环中以仅地雷单元格为目标将限制内循环需要运行的次数。
// You are on a mine
if(minefield[i][j].equals("*")){
// Now go around your current position
for(int tempRow = i-1; tempRow <= i+1; tempRow++) {
for(int tempCol = j-1; tempCol <= j+1; tempCol++) {
// If a valid square and not a mine
if(tempRow >= 0 && tempRow < row &&
tempCol >= 0 && tempCol < colm &&
!minefield[tempRow][tempCol].equals("*"))
{
// Do your update stuff
int val = Integer.parseInt(minefield[tempRow][tempCol]);
val++;
minefield[tempRow][tempCol] = "" + val;
}
}
}
}