扫雷游戏 and Java题解 <随缘学习>

扫雷游戏 and Java题解 <随缘学习>

    • 解题前言(!!!重点!!!)
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
    • 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();
		}
	}
	
}

结束语

最后还是希望大家在评论区积极讨论呀!哈哈哈哈
<随缘学习>

你可能感兴趣的:(java,算法,游戏)