找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4008|回复: 0
打印 上一主题 下一主题
收起左侧

扫雷雷阵生成JAVA版(对昨天C版的一个小BUG进行了修复)

[复制链接]
跳转到指定楼层
楼主
ID:72008 发表于 2015-1-11 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
还是原来的配方 还是熟悉的味道 把C版的用JAVA进行了封装和修改,接口做的非常干净可复用性果断上了一个档次





这次源文件分为两个两个文件要放在同个根目录下其中saolei.java文件必须放在一个命名为JAVA的文件夹中:
先是入口类 saolei_ts.java 文件:

import JAVA.saolei; //引入扫雷类
public class saolei_ts{
  // 程序的入口
  public static void main(String args[]){
   
    final int LEI=10;  //地雷标记
    int x,y;
    int LQ[][]=new int[10][10]; //用于接收saolei类的计算数据
   
    saolei L=new saolei(10,10); //创建并操作saolei对象
    L.LEI_buju_bulei();
    L.LEI_buju_print();
    L.LEI_buju_tishi();
    L.LEI_buju_tishi_print();
    L.LEI_buju_shuchu(LQ);
   
      //向屏幕输出saolei对象返回的数据
      System.out.print("接收到的数据如下:\n");
      for(y=0;y<10;y++)
      {
        for(x=0;x<10;x++)
        {
         if(LQ[y][x]==LEI) System.out.print("Q ");
             else if(LQ[y][x]==0) System.out.print("  ");
              else System.out.print(LQ[y][x]+" ");
        }
        System.out.print("\n");
       }
     
    }
}

接着是saolei.java 文件 :

package JAVA; //声明包名为JAVA
import java.util.Random; //因为要使用随机数发生器所以要引入这个类
public class saolei{
//扫雷类的定义及实现
  final int LEI=10;  //地雷标记
  private int LEI_X; //雷区列数
  private int LEI_Y; //雷区行数
  private int[][] LEI_buju;  //雷区地图用二维数组表示
  private int[][] BJ;  //用于保存计算雷区状况提示后的布局
/////////////////////////////////////////////////////
  public saolei( int Y,int X)
   {
    //X,Y参数指定要生成的雷阵大小
    //构造函数代替C版本的LEI_buju_inint函数完成初始化任务
    int x,y;
    LEI_X=X;
    LEI_Y=Y;
    //初始化雷区数组
    LEI_buju=new int[Y][X];
    BJ=new int[Y][X];
    for(y=0;y<LEI_Y;y++)
     for(x=0;x<LEI_X;x++)
     {
      LEI_buju[y][x]=0;               
     }
     for(y=0;y<LEI_Y;y++)
     for(x=0;x<LEI_X;x++)
     {
      BJ[y][x]=0;               
     }  
   }
/////////////////////////////////////////////////////
   public int LEI_buju_print()
   {
     //向屏幕输出雷区状态
     int x,y;
     System.out.print(LEI_Y+"X"+LEI_X+"雷区布雷情况如下(Q表示雷0表示安全):\n");
      for(y=0;y<LEI_Y;y++)
      {
        for(x=0;x<LEI_X;x++)
        {
         if(LEI_buju[y][x]==0) System.out.print(LEI_buju[y][x]+" ");
             else System.out.print("Q ");
        }
        System.out.print("\n");
       }
       //////////////////////////////////////////////
       System.out.print("\n去掉安全区域后的雷区布局如下:\n");
         for(y=0;y<LEI_Y;y++)
      {
        for(x=0;x<LEI_X;x++)
        {
         if(LEI_buju[y][x]==0) System.out.print("  ");
             else System.out.print("Q ");
        }
        System.out.print("\n");
       }
     return 1;
   }
/////////////////////////////////////////////////////
   public int LEI_buju_bulei()
   {
     //向雷区中随机布雷
     int x,y,L,l;
     L=LEI_Y*LEI_X/10; //雷区中地雷总数
     for(l=0;l<L;)
    {
    y=new Random().nextInt(LEI_Y-1); //随机产生地雷所在的行系数
    x=new Random().nextInt(LEI_X-1); //随机产生地雷所在的列系数
    if(LEI_buju[y][x]==LEI) {continue;}
     else if(LEI_buju[y][x]==0)
     {
        LEI_buju[y][x]=LEI;
        l++;
     }  
    }   
     return 1;
   }
/////////////////////////////////////////////////////
   public int LEI_buju_tishi()
   {
      //计算地雷位置提示,结果保存在雷区布局数组BJ[][]中
      int x,y;
      //计算四个角
     if(LEI_buju[0][0]==LEI)
            {
              BJ[0][0]=LEI;
             }else BJ[0][0]=(LEI_buju[0][1]+LEI_buju[1][0]+LEI_buju[1][1])/10;
            
     if(LEI_buju[LEI_Y-1][0]==LEI)
            {
              BJ[LEI_Y-1][0]=LEI;
             }else BJ[LEI_Y-1][0]=(LEI_buju[LEI_Y-2][0]+LEI_buju[LEI_Y-2][1]+LEI_buju[LEI_Y-1][1])/10;
   
     if(LEI_buju[0][LEI_X-1]==LEI)
            {
              BJ[0][LEI_X-1]=LEI;
             }else BJ[0][LEI_X-1]=(LEI_buju[0][LEI_X-2]+LEI_buju[0][LEI_X-1]+LEI_buju[1][LEI_X-2])/10;
   
     if(LEI_buju[LEI_Y-1][LEI_X-1]==LEI)
            {
              BJ[LEI_Y-1][LEI_X-1]=LEI;
             }else BJ[LEI_Y-1][LEI_X-1]=(LEI_buju[LEI_Y-2][LEI_X-2]+LEI_buju[LEI_Y-2][LEI_X-1]+LEI_buju[LEI_Y-1][LEI_X-2])/10;
   //计算第一行
   for(y=0,x=1;x<LEI_X-1;x++)
   {
       if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else
             {                       
             BJ[y][x]=(LEI_buju[y][x-1]+LEI_buju[y][x+1]+
             LEI_buju[y+1][x-1]+ LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;
             }                     
    }
    //计算第一列
    for(y=1,x=0;y<LEI_Y-1;y++)
    {
      if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else
             {                        
              BJ[y][x]=(LEI_buju[y-1][x]+LEI_buju[y-1][x+1]+
              LEI_buju[y][x+1]+
              LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;  
              }            
    }
    //计算最后一行
   for(y=LEI_Y-1,x=1;x<LEI_X-1;x++)
   {
      if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else
             {                              
               BJ[y][x]=(LEI_buju[y][x-1]+LEI_buju[y][x+1]+
              LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+LEI_buju[y-1][x+1])/10;
              }                           
   }
   //计算最后一列
    for(y=1,x=LEI_X-1;y<LEI_Y-1;y++)
    {
        if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else  
             {                           
               BJ[y][x]=(LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+
               LEI_buju[y][x-1]+
               LEI_buju[y+1][x-1]+LEI_buju[y+1][x])/10;
             }
     }
    //计算其余的部分
     for(y=0;y<LEI_Y;y++)
    {
     for(x=0;x<LEI_X;x++)
     {
        if(x>=1&&x<LEI_X-1&&y>=1&&y<LEI_Y-1)  
        {
           if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else {
                     BJ[y][x]=(LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+LEI_buju[y-1][x+1]+
                     LEI_buju[y][x-1]+LEI_buju[y][x+1]+
                     LEI_buju[y+1][x-1]+LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;
                   }                                 
        }              
     }
    }
      return 1;
   }
/////////////////////////////////////////////////////
   public int LEI_buju_tishi_print()
    {
      //向屏幕输出计算后的提示信息
       int x,y;
      System.out.print(LEI_Y+"X"+LEI_X+"雷区布雷提示情况如下:\n");
      for(y=0;y<LEI_Y;y++)
      {
        for(x=0;x<LEI_X;x++)
        {
         if(BJ[y][x]==LEI) System.out.print("Q ");
             else if(BJ[y][x]==0) System.out.print("  ");
              else System.out.print(BJ[y][x]+" ");
        }
        System.out.print("\n");
       }
      return 1;
    }
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
   public int LEI_buju_shuchu(int[][] LQ)
    {
      //向外部提供一个以数组形试输出的雷区状态接口
      //LQ形参用于返回计算提示后的雷区信息
      int x,y;
      for(y=0;y<LEI_Y;y++)
      {
        for(x=0;x<LEI_X;x++)
        {
         LQ[y][x]=BJ[y][x];
        }
      }
      return 1;
    }
/////////////////////////////////////////////////////
}   

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表