好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java二维数组实现数字拼图效果

二维数组实现数字拼图,供大家参考,具体内容如下

二维数组可以自己随意定义大小,通过方法判断来实现对所有的数字进行随机打乱,并可以通过移动来正确还原,并可以判断0(表示空格)是否可以移动,是否在范围内。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

public static void main(String[] args) {

   Scanner scanner = new Scanner(System.in);

   int [][] arrays = { { 1 , 2 , 3 }, { 4 , 5 , 6 }, { 7 , 8 , 0 } };

   int sum = 1 ;

   String direction;

   bianLi(arrays);

   daLuanErWeiShuZu(arrays);

   System.out.println( "========================================" );

   while ( true ) {

    bianLi(arrays);

    if (isOk(arrays)) {

     break ;

    }

    sum++;

    try {

     Thread.sleep( 500 );

    } catch (InterruptedException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

    }

    System.out.println( "请输入移动方向(W 上、S 下、A 左、D 右)" );

    direction = scanner.next();

    switch (direction) {

    case "W" :

    case "w" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "上" , arrays);

 

     break ;

    case "S" :

    case "s" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "下" , arrays);

     break ;

    case "A" :

    case "a" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "左" , arrays);

     break ;

    case "D" :

    case "d" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "右" , arrays);

     break ;

    default :

     System.out.println( "非法输入,重新输入" );

     break ;

    }

   }

   System.out.println( "一共走了" + sum + "步" );

   System.out.println( "挑战成功" );

 

}

判断当前坐标是否可以移动

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/**

   * 判断当前坐标是否可以移动

   *

   * @param arrays

   * @return 可以移动返回true

   */

  public static boolean isYiDong( int [][] arrays) {

   int returnX = returnX(arrays);

   int returnY = returnY(arrays);

   System.out.println(returnX + ":" + returnY);

   if (returnX >= 0 && returnX + 1 < arrays.length && returnY >= 0 && returnY + 1 < arrays.length) {

    return true ;

   }

   return false ;

  }

获取当前0所在行的具体地址

?

1

2

3

4

5

6

7

8

9

10

11

// 获取0所在行的位置

public static int returnX( int [][] arrays) {

  for ( int i = 0 ; i < arrays.length; i++) {

   for ( int j = 0 ; j < arrays[i].length; j++) {

    if ( 0 == arrays[i][j]) {

     return i;

    }

   }

  }

  return - 1 ;

}

获取当前0所在列的具体地址

?

1

2

3

4

5

6

7

8

9

10

11

// 获取0所在列的位置

public static int returnY( int [][] arrays) {

  for ( int i = 0 ; i < arrays.length; i++) {

   for ( int j = 0 ; j < arrays[i].length; j++) {

    if ( 0 == arrays[i][j]) {

     return j;

    }

   }

  }

  return - 1 ;

}

二维数组随机打乱,需要判断左上角、右上角、左下角、右下角、中间、上中、下种、左中、右中,那些方向可以移动,生成随机数来确定移动方向

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

// 二维数组随机打乱

  public static void daLuanErWeiShuZu( int [][] arrays) {

   for ( int i = 0 ; i < arrays.length; i++) {

    for ( int j = 0 ; j < arrays[i].length; j++) {

     // 左上

     if (i == 0 && j == 0 ) {

      // 根据生成的随机数确定向右边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

      }

     }

 

     // 右上

     if (i == 0 && j == arrays[ 0 ].length - 1 ) {

      // 根据生成的随机数确定向左边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

      }

     }

 

     // 左下

     if (i == arrays.length - 1 && j == 0 ) {

      // 根据生成的随机数确定向左边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

      }

     }

 

     // 右下

     if (i == arrays.length - 1 && j == arrays[i].length - 1 ) {

      // 根据生成的随机数确定向左边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

      }

     }

 

     // 上中

     if (i == 0 && j > 0 && j < arrays[i].length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     // 左中

     if (j == 0 && i > 0 && i < arrays.length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     // 下中

     if (i == arrays.length - 1 && j > 0 && j < arrays[i].length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     // 右中

     if (j == arrays[i].length - 1 && i > 0 && i < arrays[i].length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     if (i > 0 && j > 0 && i < arrays.length - 2 && j < arrays[i].length - 2 ) {

      switch (oneToThree( 4 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

      case 3 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

 

      default :

       break ;

      }

     }

    }

   }

  }

该方法实现对0的位置和需要替换位置数据的替换,并对0范围进行验证,怕0出现数组下标越位。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

/**

   * 根据输入的数据,对二维数组进行数据替换

   *

   * @param i         高位坐标

   * @param j         地位坐标

   * @param direction 移动方向

   * @param arrays    需要交换数据的数组

   */

  public static void tiHuanShuZuWeiZhi( int i, int j, String direction, int [][] arrays) {

   int tem = - 1 ;

   switch (direction) {

   case "上" :

    if (i > 0 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i - 1 ][j];

     arrays[i - 1 ][j] = tem;

    }

    break ;

   case "下" :

    if (i < arrays.length - 1 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i + 1 ][j];

     arrays[i + 1 ][j] = tem;

    }

    break ;

   case "左" :

    if (j > 0 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i][j - 1 ];

     arrays[i][j - 1 ] = tem;

    }

    break ;

   case "右" :

    if (j < arrays.length - 1 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i][j + 1 ];

     arrays[i][j + 1 ] = tem;

    }

    break ;

 

   default :

    break ;

   }

  }

完整代码如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

import java.util.Random;

import java.util.Scanner;

 

public class Demo {

  public static void main(String[] args) {

   Scanner scanner = new Scanner(System.in);

   int [][] arrays = { { 1 , 2 , 3 }, { 4 , 5 , 6 }, { 7 , 8 , 0 } };

   int sum = 1 ;

   String direction;

   bianLi(arrays);

   daLuanErWeiShuZu(arrays);

   System.out.println( "========================================" );

   while ( true ) {

    bianLi(arrays);

    if (isOk(arrays)) {

     break ;

    }

    sum++;

    try {

     Thread.sleep( 500 );

    } catch (InterruptedException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

    }

    System.out.println( "请输入移动方向(W 上、S 下、A 左、D 右)" );

    direction = scanner.next();

    switch (direction) {

    case "W" :

    case "w" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "上" , arrays);

 

     break ;

    case "S" :

    case "s" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "下" , arrays);

     break ;

    case "A" :

    case "a" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "左" , arrays);

     break ;

    case "D" :

    case "d" :

     tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "右" , arrays);

     break ;

    default :

     System.out.println( "非法输入,重新输入" );

     break ;

    }

   }

   System.out.println( "一共走了" + sum + "步" );

   System.out.println( "挑战成功" );

 

  }

 

// /**

//  * 判断当前坐标是否可以移动

//  *

//  * @param arrays

//  * @return 可以移动返回true

//  */

// public static boolean isYiDong(int[][] arrays) {

//  int returnX = returnX(arrays);

//  int returnY = returnY(arrays);

//  System.out.println(returnX + ":" + returnY);

//  if (returnX >= 0 && returnX + 1 < arrays.length && returnY >= 0 && returnY + 1 < arrays.length) {

//   return true;

//  }

//  return false;

// }

 

  /**

   *

   * @param arrays 需要验证的数据

   * @return 成功返回true

   */

  public static boolean isOk( int [][] arrays) {

   int sum = 1 ;

   for ( int i = 0 ; i < arrays.length; i++) {

    for ( int j = 0 ; j < arrays.length; j++) {

     if (sum == 9 ) {

      sum = 0 ;

     }

     if (arrays[i][j] != sum) {

      return false ;

     }

     sum++;

    }

   }

   return true ;

  }

 

  // 获取0所在行的位置

  public static int returnX( int [][] arrays) {

   for ( int i = 0 ; i < arrays.length; i++) {

    for ( int j = 0 ; j < arrays[i].length; j++) {

     if ( 0 == arrays[i][j]) {

      return i;

     }

    }

   }

   return - 1 ;

  }

 

  // 获取0所在列的位置

  public static int returnY( int [][] arrays) {

   for ( int i = 0 ; i < arrays.length; i++) {

    for ( int j = 0 ; j < arrays[i].length; j++) {

     if ( 0 == arrays[i][j]) {

      return j;

     }

    }

   }

   return - 1 ;

  }

 

  // 遍历二维数组

  public static void bianLi( int [][] arrays) {

   for ( int [] is : arrays) {

    for ( int is2 : is) {

     System.out.print(is2 + "\t" );

    }

    System.out.println();

   }

  }

 

  // 二维数组随机打乱

  public static void daLuanErWeiShuZu( int [][] arrays) {

   for ( int i = 0 ; i < arrays.length; i++) {

    for ( int j = 0 ; j < arrays[i].length; j++) {

     // 左上

     if (i == 0 && j == 0 ) {

      // 根据生成的随机数确定向右边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

      }

     }

 

     // 右上

     if (i == 0 && j == arrays[ 0 ].length - 1 ) {

      // 根据生成的随机数确定向左边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

      }

     }

 

     // 左下

     if (i == arrays.length - 1 && j == 0 ) {

      // 根据生成的随机数确定向左边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

      }

     }

 

     // 右下

     if (i == arrays.length - 1 && j == arrays[i].length - 1 ) {

      // 根据生成的随机数确定向左边边移动还是向下移动

      if (ouShuOrJiShu()) {

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

      } else {

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

      }

     }

 

     // 上中

     if (i == 0 && j > 0 && j < arrays[i].length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     // 左中

     if (j == 0 && i > 0 && i < arrays.length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     // 下中

     if (i == arrays.length - 1 && j > 0 && j < arrays[i].length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     // 右中

     if (j == arrays[i].length - 1 && i > 0 && i < arrays[i].length - 1 ) {

      switch (oneToThree( 3 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

 

      default :

       break ;

      }

     }

     if (i > 0 && j > 0 && i < arrays.length - 2 && j < arrays[i].length - 2 ) {

      switch (oneToThree( 4 )) {

      case 0 :

       tiHuanShuZuWeiZhi(i, j, "上" , arrays);

       break ;

      case 1 :

       tiHuanShuZuWeiZhi(i, j, "右" , arrays);

       break ;

      case 2 :

       tiHuanShuZuWeiZhi(i, j, "下" , arrays);

       break ;

      case 3 :

       tiHuanShuZuWeiZhi(i, j, "左" , arrays);

       break ;

 

      default :

       break ;

      }

     }

    }

   }

  }

 

  /**

   * 判断是否是偶数

   *

   * @return 偶数返回true

   */

  public static boolean ouShuOrJiShu() {

   return new Random().nextInt( 1000 ) % 2 == 0 ? true : false ;

  }

 

  /**

   *

   * @param n 需要模的值

   * @return 返回0-(n-1)的值

   */

  public static int oneToThree( int n) {

   return new Random().nextInt( 1000 ) % n;

  }

 

  /**

   * 根据输入的数据,对二维数组进行数据替换

   *

   * @param i         高位坐标

   * @param j         地位坐标

   * @param direction 移动方向

   * @param arrays    需要交换数据的数组

   */

  public static void tiHuanShuZuWeiZhi( int i, int j, String direction, int [][] arrays) {

   int tem = - 1 ;

   switch (direction) {

   case "上" :

    if (i > 0 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i - 1 ][j];

     arrays[i - 1 ][j] = tem;

    }

    break ;

   case "下" :

    if (i < arrays.length - 1 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i + 1 ][j];

     arrays[i + 1 ][j] = tem;

    }

    break ;

   case "左" :

    if (j > 0 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i][j - 1 ];

     arrays[i][j - 1 ] = tem;

    }

    break ;

   case "右" :

    if (j < arrays.length - 1 ) {

     tem = arrays[i][j];

     arrays[i][j] = arrays[i][j + 1 ];

     arrays[i][j + 1 ] = tem;

    }

    break ;

 

   default :

    break ;

   }

  }

 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/MsyLaoLi/article/details/107675610

查看更多关于Java二维数组实现数字拼图效果的详细内容...

  阅读:18次