扫雷游戏 and Java题解 <随缘学习>
Posted Fearless→
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫雷游戏 and Java题解 <随缘学习>相关的知识,希望对你有一定的参考价值。
解题前言(!!!重点!!!)
在我个人看来,扫雷游戏在众多编程题中应该属于相对简单的一道题。对于入门编程不久的我而言,虽然已经解出此题,但是其中的算法还有很多地方需要优化。这里就希望各位“工程师”在评论区积极讨论一番,我们一起学习学习。本人在此表示热烈欢迎!!!
题目描述
扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字一一提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
输入格式
第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。
接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符‘*’表示相应格子是地雷格,字符‘?’表示相应格子是非地雷格。相邻字符之间无分隔符。
输出格式
输出文件包含n行,每行m个字符,描述整个雷区。用‘*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
输入输出样例
输入##1
3 3
*??
?*?
?*?
输出##1
*21
3*2
2*2
Java题解
public class TheMinesweeperGame {
public static void main(String[] args) {
// 创建带边界的雷区初始字符数组
char[][] array1 = chuShiArray();
// 后台生成雷区结果字符数组
char[][] array2 = jieGuoArray(array1);
// 输出雷区结果字符数组
printArray(array2);
}
// 创建n行m列带边界雷区的方法(),即创建n+2行m+2列的字符数组
public static char[][] chuShiArray(){
java.util.Scanner s = new java.util.Scanner(System.in);
int n = s.nextInt();
int m = s.nextInt();
// 创建“带边界雷区初始字符数组array1”
char[][] array1 = new char[n + 2][m + 2];
// “字符串”输入
s.nextLine();
for(int i = 1; i < n + 1; i ++) {
// “字符串”转换成“临时字符数组tempArray”
char[] tempArray = s.nextLine().toCharArray();
// 不在“带边界雷区初始字符数组array1”的边界上赋值,
// 为以后的地雷格判断做准备
for(int j = 1; j < m + 1; j ++) {
// 将“临时字符数组tempArray”赋值到
// “带边界雷区初始字符数组array1”的i行上
array1[i][j] = tempArray[j - 1];
}
}
return array1;
}
// 计算雷区结果字符数组的方法(字符数组)
public static char[][] jieGuoArray(char[][] array1){
// 创建“不带边界雷区结果字符数组array2”
char[][] array2 = new char[array1.length - 2][array1[0].length - 2];
// 将“带边界雷区初始字符数组array1”有效的区域字符赋值到
// “不带边界雷区结果字符数组array2”上
for(int i = 1; i < array1.length - 1; i ++) {
for(int j = 1; j < array1[0].length - 1; j ++) {
// num代表周围地雷格数
int num = 0;
// 如果该格子为地雷,则保持不变,赋值给array2
if(array1[i][j] == '*')
array2[i - 1][j - 1] = array1[i][j];
else {
// 以下检查array2格子的周围八个方向在
// array1相应位置上是否为地雷格
if(array1[i - 1][j - 1] == '*')
num ++;
if(array1[i - 1][j] == '*')
num ++;
if(array1[i - 1][j + 1] == '*')
num ++;
if(array1[i][j - 1] == '*')
num ++;
if(array1[i][j + 1] == '*')
num ++;
if(array1[i + 1][j - 1] == '*')
num ++;
if(array1[i + 1][j] == '*')
num ++;
if(array1[i + 1][j + 1] == '*')
num ++;
// 类似将array1上的有效区域整体向左上角移动一个单位
// 将数字转换成字符串再转换成单个字符
array2[i - 1][j - 1] = (num + "").charAt(0);
}
}
}
return array2;
}
// 输出字符数组的方法(字符数组)
public static void printArray(char[][] array) {
for(int i = 0; i < array.length; i ++) {
for(int j = 0; j < array[0].length; j ++) {
System.out.print(array[i][j]);
}
System.out.println();
}
}
}
结束语
最后还是希望大家在评论区积极讨论呀!哈哈哈哈
<随缘学习>
以上是关于扫雷游戏 and Java题解 <随缘学习>的主要内容,如果未能解决你的问题,请参考以下文章