# 从拼图游戏开始(一)_简单java模拟

2130人阅读 评论(1)

今天看Android，看到一个开源库android-FlipView,然后看着看着就绕到了拼图游戏上，现在我打算写一个简单的拼图游戏。这将是我第二个连载的系列文章，今天是第一天，简单的用java命令行模拟一下拼图游戏的实现。代码：

package com.wly.algorithmproblem;

import java.util.Scanner;

/**
* 拼图游戏的简单模拟
* @author wly
*
*/
public class PicGame {

private static int COLUMN = 4;
private static int[][] elems = new int[COLUMN][COLUMN];

public static void main(String[] args) {
int elemsNum = elems.length*elems.length-1;

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

//1.生成随机数据，随机的两两交换
for(int i=0;i<elems.length;i++) {
for(int j=0;j<elems[0].length;j++) {
int random = (int)(Math.random() * elemsNum);
exchangeElems(elems,i,j,random/elems.length,random%elems.length);
}
}
printMatrix(elems);

while(true) {
System.out.print("输入x和y:");
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int y = scanner.nextInt();
move(x, y);
printMatrix(elems);
}
}

public static void move(int line,int column) {

//检查参数合法性
if(line < 0 || line > (elems.length-1) || column < 0 || column > (elems.length -1)) {
System.out.println("输入数据有误，不再有效范围内!");
return;
}

if(line > 0) { //上
if(elems[line-1][column] == 0) {
exchangeElems(elems, line, column, line-1, column);
return;
}
}
if(line < (elems.length-1)) { //下
if(elems[line+1][column] == 0) {
exchangeElems(elems, line, column, line+1, column);
return;
}
}
if(column > 0) { //左
if(elems[line][column-1] == 0) {
exchangeElems(elems, line, column, line, column-1);
return;
}
}
if(column < (elems.length-1)) { //右
if(elems[line][column+1] == 0) {
exchangeElems(elems, line, column, line, column+1);
return;
}
}

System.out.println("不能移动当前元素");
return;
}

/**
* 交换二维数组中相邻的两个元素
* @param array
* @param x1
* @param y1
* @param x2
* @param y2
*/
private static void exchangeElems(int[][] array,int x1,int y1,int x2,int y2) {
int temp = array[x1][y1];
array[x1][y1] = array[x2][y2];
array[x2][y2] = temp;
}

/**
* 打印二维矩阵
* @param matrix
*/
private static void printMatrix(int[][] matrix) {
for(int i=0;i<matrix.length;i++) {
for(int j=0;j<matrix[0].length;j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}

运行效果：

14 8 5 13
10 6 1 7
15 0 11 12
4 3 9 2

14 8 5 13
10 6 1 7
0 15 11 12
4 3 9 2

14 8 5 13
0 6 1 7
10 15 11 12
4 3 9 2

0 8 5 13
14 6 1 7
10 15 11 12
4 3 9 2

东西很简单，没什么好说的，仅仅想做一个简单的开篇。计划用5天时间讨论一下拼图游戏的算法问题。之后再用5天左右的时间，实现一下Android版的拼图游戏。敬请期待!

注意：这里随机生成的谜题仅仅是简单的模拟矩阵的样子，实际上这样生成的谜题大约有%50左右是无解的，这将在下一篇博客中加以介绍。

O啦~~~

谢谢!!

0
1

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：164657次
• 积分：2899
• 等级：
• 排名：第12238名
• 原创：107篇
• 转载：9篇
• 译文：5篇
• 评论：137条
阅读排行
评论排行
最新评论