|
還是原來的配方 還是熟悉的味道 把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;
}
/////////////////////////////////////////////////////
}
|
|