Java利用递归实现扫雷

来源:互联网 发布:郑和发现美洲 知乎 编辑:程序博客网 时间:2024/06/03 13:55
package 扫雷;
import java.math.*;
import java.util.Scanner;
public class 扫雷 {
//记录翻开次数
static int k=0;
//两个数组
        //给玩家看的
static int [][] map=new int[22][22];
        //用来保存数据
static int [][] bomb=new int[22][22];
//传染,递归,即遇见空白向周围扩散
public static void cr(int x,int y){
if(x-1>=0&y-1>=0){
if(map[x-1][y-1]==999){
if(bomb[x-1][y-1]==0){
map[x-1][y-1]=bomb[x-1][y-1];
k++;
cr(x-1,y-1);
}
else{
map[x-1][y-1]=bomb[x-1][y-1];
k++;
}
}
if(map[x-1][y]==999){
if(bomb[x-1][y]==0){
map[x-1][y]=bomb[x-1][y];
k++;
cr(x-1,y);
}
else{
map[x-1][y]=bomb[x-1][y];
k++;
}
}
if(map[x-1][y+1]==999){
if(bomb[x-1][y+1]==0){
map[x-1][y+1]=bomb[x-1][y+1];
k++;
cr(x-1,y+1);
}
else{
map[x-1][y+1]=bomb[x-1][y+1];
k++;
}
}
if(map[x][y-1]==999){
if(bomb[x][y-1]==0){
map[x][y-1]=bomb[x][y-1];
k++;
cr(x,y-1);
}
else{
map[x][y-1]=bomb[x][y-1];
k++;
}
}
if(map[x][y+1]==999){
if(bomb[x][y+1]==0){
map[x][y+1]=bomb[x][y+1];
k++;
cr(x,y+1);
}
else{
map[x][y+1]=bomb[x][y+1];
k++;
}
}
if(map[x+1][y-1]==999){
if(bomb[x+1][y-1]==0){
map[x+1][y-1]=bomb[x+1][y-1];
k++;
cr(x+1,y-1);
}
else{
map[x+1][y-1]=bomb[x+1][y-1];
k++;
}
}
if(map[x+1][y]==999){
if(bomb[x+1][y]==0){
map[x+1][y]=bomb[x+1][y];
k++;
cr(x+1,y);
}
else{
map[x+1][y]=bomb[x+1][y];
k++;
}
}
if(map[x+1][y+1]==999){
if(bomb[x+1][y+1]==0){
map[x+1][y+1]=bomb[x+1][y+1];
k++;
cr(x+1,y+1);
}
else{
map[x+1][y+1]=bomb[x+1][y+1];
k++;
}
}
}
}


public static void main(String[] args) {
//将map中间部分设为999
for(int i=0;i<22;i++){
for(int j=0;j<22;j++){
map[i][j]=999;
}
}
//随机产生40个雷,并对周围数加一
for(int i=0;i<41;i++){
int m=(int)Math.round((Math.random()*(20-1)+1));
int n=(int)Math.round((Math.random()*(20-1)+1));
if(bomb[m][n]==9){
i--;
continue;
}
bomb[m][n]=9;
if(bomb[m-1][n-1]!=9){
bomb[m-1][n-1]=bomb[m-1][n-1]+1;
}
if(bomb[m-1][n]!=9){
bomb[m-1][n]=bomb[m-1][n]+1;
}
if(bomb[m-1][n+1]!=9){
bomb[m-1][n+1]=bomb[m-1][n+1]+1;
}
if(bomb[m][n-1]!=9){
bomb[m][n-1]=bomb[m][n-1]+1;
}
if(bomb[m][n+1]!=9){
bomb[m][n+1]=bomb[m][n+1]+1;
}
if(bomb[m+1][n-1]!=9){
bomb[m+1][n-1]=bomb[m+1][n-1]+1;
}
if(bomb[m+1][n]!=9){
bomb[m+1][n]=bomb[m+1][n]+1;
}
if(bomb[m+1][n+1]!=9){
bomb[m+1][n+1]=bomb[m+1][n+1]+1;
}
}
//将map,bomb周围设为10
for(int i=0;i<22;i++){
if(i==0){
for(int j=0;j<22;j++){
map[i][j]=10;
bomb[i][j]=10;
}
}
if(i==21)
{
for(int j=0;j<22;j++){
map[i][j]=10;
bomb[i][j]=10;
}
}
map[i][0]=10;
map[i][21]=10;
bomb[i][0]=10;
bomb[i][21]=10;
}
//把bomb输出,这便于程序员试验程序,真正游戏没有这一步
for(int i=0;i<22;i++){
        for(int j=0;j<22;j++){
        System.out.print(bomb[i][j]+"  ");
     
       
       
        }
         System.out.print("\n");
        }
        
           //游戏开始
           for(;;){
          //输出界面
          for(int i=0;i<22;i++){
              for(int j=0;j<22;j++){
             
              if(map[i][j]>=10&map[i][j]<999){
              System.out.print("+ ");
              }
              if(map[i][j]==999){System.out.print("? ");}
              if(map[i][j]<9){
              System.out.print(map[i][j]+" ");
              }
             
             
              }
              System.out.print("\n");
               }
          //请用户输入坐标
          Scanner input=new Scanner(System.in);
          System.out.println("Please key in the y:");
               int x=input.nextInt();
               System.out.println("Please key in the x:");
               int y=input.nextInt();
               //如果是雷
               if(bomb[x][y]==9){
              //把所有雷的位置传给map
              for(int i=0;i<21;i++){
              for(int j=0;j<21;j++){
              if(bomb[i][j]==9){
              map[i][j]=bomb[i][j];
              }
              }
             
              }
              //显示map
              for(int i=0;i<22;i++){
          for(int j=0;j<22;j++){
          if(map[i][j]>=10&map[i][j]<999){
                  System.out.print("+ ");
                  }
                  if(map[i][j]==999){System.out.print("? ");}
                  if(map[i][j]==9){
                  System.out.print("* ");
                  }
                  if(map[i][j]<9){
                  System.out.print(map[i][j]+" ");
                  }
                 
                 
          }
          System.out.print("\n");
          }
              System.out.println("You die!");
              System.out.println("Game over!");
              //退出程序
              System.exit(0);
              
              
               }
               else{
              //如果是空格
              if(bomb[x][y]==0){
              map[x][y]=bomb[x][y];
             k++;
             //调用递归,传递参数为x,y,即为用户所输入
              cr(x,y);
              
              }
              //不是空格
              else{
              k++;
               map[x][y]=bomb[x][y];
              }
               }
               //如果翻开了360个格子
               if(k==360){
              //输出map
              for(int i=0;i<22;i++){
                  for(int j=0;j<22;j++){
                 
                  if(map[i][j]>=10&map[i][j]<999){
                  System.out.print("+ ");
                  }
                  if(map[i][j]==999){System.out.print("? ");}
                  if(map[i][j]<9){
                  System.out.print(map[i][j]+" ");
                  }
                 
                 
                  }
                   System.out.print("\n");
                   }
              System.out.println("You win!");
              //end
              break;
               }
          
           }
}


}
原创粉丝点击