扫雷——游戏操作(Java)
描述:首先选择难度,根据选择的难度生成地雷图,并在控制台输出游戏界面,其中‘~’表示灰色区域,‘*’表示地雷,‘_’表示空白区域,‘1~8’表示提示数字,之后根据提示输入进行游戏操作。
说明:控制台输入输出,根据输入的行、列情况进行显示,可标注地雷。若当前选中的为数字则显示数字,若为地雷则游戏结束,若为灰色区域则将灰色区域周围的8格全部显示,直至周围全为数字为止。当提示数字周围标注的地雷数与数字相等,再次输入提示数字的行列时,则会自动显示提示数字周围未选中的区域。当提示数字和灰色区域全部显示完后,则过关,并输出用时。
注:1、控制台输入只能输入数字,输入其他会报错,并且输入的数字若超出范围则会提示重新输入;2、灰色区域周围只能是数字,不可能有其他情况;3、地雷周围的8格内至少有一个数字,否则不合规则;4、第一步绝对不会踩中地雷。
源代码:
import java.util.Scanner;
/**
* 游戏操作
*
* 与SaoLei相配,主函数中调用new SaoLei2();
*
* -2-->灰色, -1-->地雷, 0-->空白, 1~8-->提示数字
*
* @author lixiang
*
*/
public class SaoLei2 {
private int[][] game;
private SaoLei sl;
private Scanner sc;
private int choose; // 游戏选择
private boolean start = true; // 第一步判断
private long startTime; // 开始时间
private long endTime; // 结束时间
private boolean pass = false; // 是否过关
private boolean jump = false; // 跳过输入
private boolean flag = false; // 结果不全面标志
// 8个方向 上、下、左、右、左上、左下、右上、右下
public static final int[][] move = {
{-1,0},{
1,0},{
0,-1},{
0,1},{-1,-1},{
1,-1},{-1,1},{
1,1}};
public SaoLei2() {
sc = new Scanner(System.in);
// 初始化开始
start();
game = new int[sl.rows+1][sl.columns+1];
print(game);
// 执行游戏
play(0,0,0);
}
// 递归显示灰色区域
private void dfs(int i, int j){
game[i][j] = -2;
for (int k = 0; k < 8; k++) {
if(dfs_range(i, j, move[k][0], move[k][1])){
if(sl.data[i+move[k][0]][j+move[k][1]]==-2 && game[i+move[k][0]][j+move[k][1]]==0){
game[i+move[k][0]][j+move[k][1]] = -2;
dfs(i+move[k][0], j+move[k][1]);
}else{
game[i+move[k][0]][j+move[k][1]] = sl.data[i+move[k][