import java.util.Random;
import java.util.Scanner;
public static int gameDlCount=10; //地雷数量
public static int n=9; //地图大小
public static char [][]DlMaps; //地雷地图
public static char [][]GameMaps; //游戏地图
public static final char DlBiaoShi='×'; //地雷标识
public static final char ZgBiaoShi='■'; //遮盖标识
public static final char BjBiaoShi='!'; //标记标识
public static Scanner input = new Scanner(System.in);//定义键盘扫描类
public static Random random = new Random();//定义随机类
//初始化地图
public static void into(){
DlMaps=new char[n][n];
GameMaps=new char[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
DlMaps[i][j]=' ';
GameMaps[i][j]=ZgBiaoShi;
}
}
//布雷
int count =0;
for(;count<gameDlCount;){
int i=random.nextInt(n);
int j=random.nextInt(n);
if(DlMaps[i][j]==' '){
DlMaps[i][j]=DlBiaoShi;
count++;
}
}
}
//显示
public static void show(char [][]map){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
//生成雷边的数字
public static void LbShuZi(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(DlMaps[i][j]==' '){
//周围坐标
int x0=i-1;
int x1=i+1;
int y0=j-1;
int y1=j+1;
//越界
if(x0<0)x0=0;
if(x1>=n)x1=n-1;
if(y0<0)y0=0;
if(y1>=n)y1=n-1;
//统计雷数
int count=0;
for(int x=x0;x<=x1;x++){
for(int y=y0;y<=y1;y++){
if(DlMaps[x][y]==DlBiaoShi){
count++;
}
}
}
if(count!=0){
DlMaps[i][j]=(char)('0'+count);//将整数数字变为字符数字
}
}
}
}
}
//判断是否为整数
public static int inputInt(String title){
do{
System.out.print(title);
String n=input.next();
try{
int x=Integer.parseInt(n);
return x;
}catch(Exception e){
System.out.println("输入错误!");
}
}while(true);
}
//输入行
public static int inputRow(){
int row=-1;
while(true){
row=inputInt("请输入行(1-"+n+"): ");
if(row>=1&&row<=9){
break;
}else{
System.out.println("输入错误!");
}
}
return row;
}
//输入列
public static int inputCol(){
int col=-1;
while(true){
col=inputInt("请输入列(1-"+n+"): ");
if(col>=1&&col<=9){
break;
}else{
System.out.println("输入错误!");
}
}
return col;
}
//输入标记
public static String inputBiaoJi(){
String BiaoJi1=" ";
while(true){
System.out.println("请输入扫雷(M)标记(T):");
Scanner input1 =new Scanner(System.in);
BiaoJi1=input1.nextLine();
if(BiaoJi1.equalsIgnoreCase("M")||(BiaoJi1.equalsIgnoreCase("T"))){
break;
}else{
System.out.println("输入错误!");
}
}
return BiaoJi1;
}
//扫描雷
public static void SaoMiao(int row,int col ){
int r=row-1;
int c=col-1;
if(r<0||r>=n) return;
if(c<0||c>=n) return;
if(GameMaps[r][c]==ZgBiaoShi){
GameMaps[r][c]=DlMaps[r][c];
if(DlMaps[r][c]==' '){//打开空格
/* int i0=r-1; //范围
int i1=r+1;
int j0=c-1;
int j1=c+1;
if(i0<0)i0=0; //越界
if(i1>=n)i1=n-1;
if(j0<0)j0=0;
if(j1>=n)j1=n-1;
for(int i=i0;i<=i1;i++){
for(int j=j0;j<=j1;j++){
if(!(i==r&&j==c)){
if(GameMaps[i][j]==ZgBiaoShi&&DlMaps[i][j]==DlBiaoShi){
SaoMiao(i+1,j+1);
}
}
}
}
*/
//扫正上
SaoMiao(r-1+1,c+1);
//上左
SaoMiao(r-1+1,c-1+1);
//上右
SaoMiao(r-1+1,c+1+1);
//左
SaoMiao(r+1,c-1+1);
//右
SaoMiao(r+1,c+1+1);
//下左
SaoMiao(r+1+1,c-1+1);
//下
SaoMiao(r+1+1,c+1);
//下右
SaoMiao(r+1+1,c+1+1);
}
}
}
//标记雷
public static void BiaoJi(int row,int col ){
int r=row-1;
int c=col-1;
if(GameMaps[r][c]==ZgBiaoShi){
GameMaps[r][c]=BjBiaoShi;
}else if(GameMaps[r][c]==BjBiaoShi){
GameMaps[r][c]=ZgBiaoShi;
}
}
//操作标记和扫描
public static void CzBjSm(int row,int col,String s){
if(s.equalsIgnoreCase("M")){
SaoMiao(row,col);
}else if(s.equalsIgnoreCase("T")){
BiaoJi(row,col);
}
}
//游戏结束条件
public static boolean isOver(){
boolean r=false;
int zgcnt=0;//遮盖的个数
int bjcnt=0;//标记的个数
int lcnt=0;//雷的个数
int zqcnt=0;//正确标记的个数
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(GameMaps[i][j]==ZgBiaoShi){
zgcnt++;
}
if(GameMaps[i][j]==DlBiaoShi){
lcnt++;
}
if(GameMaps[i][j]==BjBiaoShi){
bjcnt++;
if(GameMaps[i][j]==DlBiaoShi){
zqcnt++;
}
}
}
}
if((zgcnt>0&&bjcnt>0&&lcnt>0)||
(lcnt==gameDlCount&&zgcnt==0&bjcnt==0)||
(zgcnt+bjcnt==gameDlCount&&lcnt==0)||
(zqcnt==lcnt&&zqcnt==gameDlCount)){
r=true;
}
return r;
}
//是否赢
public static boolean isWin(){
boolean r=false;
int zgcnt=0;//遮盖的个数
int bjcnt=0;//标记的个数
int lcnt=0;//雷的个数
int ok=0; //标记正确的雷
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(GameMaps[i][j]==ZgBiaoShi){
zgcnt++;
}
if(GameMaps[i][j]==DlBiaoShi){
lcnt++;
}
if(GameMaps[i][j]==BjBiaoShi){
bjcnt++;
if(GameMaps[i][j]==DlBiaoShi){
ok++;
}
}
}
}
if(
(lcnt==gameDlCount&&lcnt==0&bjcnt==0)||
(zgcnt+bjcnt==gameDlCount&&lcnt==0&&bjcnt==ok)||
(ok==bjcnt&&ok==gameDlCount)){
r=true;
}
return r;
}
//游戏主方法
public static void play(){
//获取游戏开始时的时间
long st=System.currentTimeMillis();
while(true){
int row=inputRow();
int col=inputCol();
String BiaoJi1=inputBiaoJi();
CzBjSm(row,col,BiaoJi1);
//判断是否游戏结束
if(isOver()){
break;
}
show(GameMaps);
}
//显示布雷地图
show(DlMaps);
if(isWin()){
System.out.println("游戏胜利,排雷成功");
}else{
System.out.println("游戏失败,继续努力");
}
long et=System.currentTimeMillis();
long time=0;
time=(et-st)/1000;
long m=0,f=0;;
m=time%60;
f=time/60;
System.out.println("游戏一共用时"+f+"分"+m+"秒");
}
//方法入口
public static void main(String[] args){
into();//地图初始化
LbShuZi();//初始化数字
//show(DlMaps); //显示布雷地图
show(GameMaps); //游戏界面
play();//游戏主方法
}
}
效果图