안드로이드

안드로이드 easy mode 스도쿠 제작 - 1.문제 만들기

알통몬_ 2019. 5. 15. 12:21
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 

안드로이드 스도쿠 앱을 만드는 포스팅을 해보려 합니다.

먼저 스도쿠 문제를 만들어야겠죠?

저는 3x3, 4x4, 5x5 까지만 들어보려고 합니다.

거기에 시간이 허락된다면 

4x4x4, 6x6x6까지 추가로 만들어보도록 하겠습니다.

package al.tong.mon.sudoku;


import java.util.Random;

public class SudokuMatrix {

private int level;


private int[][] ORIGIN_3X3 = {
{1, 2, 3},
{3, 1, 2},
{2, 3, 1}
};

private int[][] ORIGIN_4X4 = {
{1, 2, 3, 4},
{4, 1, 2, 3},
{3, 4, 1, 2},
{2, 3, 4, 1}
};

private int[][] ORIGIN_5X5 = {
{1, 2, 3, 4, 5},
{5, 1, 2, 3, 4},
{4, 5, 1, 2, 3},
{3, 4, 5, 1, 2},
{2, 3, 4, 5, 1}
};

private int[][] empty3x3 = {
{0},
{0},
{0}
};

private int[][] empty4X4 = {
{0},
{0},
{0},
{0}
};

private int[][] empty5X5 = {
{0},
{0},
{0},
{0},
{0}
};


public SudokuMatrix(int level) {
this.level = level;
}

public int[][] genMatrix() {
int[][] matrix;
switch (level) {
case 1: // 3 x 3 , blank = 4 ~ 5
matrix = verticalShuffle((horizontalShuffle(ORIGIN_3X3)));
break;
case 2: // 4 x 4 , blank = 6 ~ 7
matrix = verticalShuffle((horizontalShuffle(ORIGIN_4X4)));
break;
case 3: // 4 x 4 , blank = 8 ~ 10
matrix = verticalShuffle((horizontalShuffle(ORIGIN_4X4)));
break;
case 4: // 5 x 5 , blank = 9 ~ 13
matrix = verticalShuffle((horizontalShuffle(ORIGIN_5X5)));
break;
}
return matrix;
}

public int getBlankSpace() {
Random random = new Random();
switch (level) {
case 1: // 3 x 3 , blank = 4 ~ 5
return random.nextInt(2) + 5;
case 2: // 4 x 4 , blank = 6 ~ 7
return random.nextInt(2) + 6;
case 3: // 4 x 4 , blank = 8 ~ 10
return random.nextInt(3) + 8;
case 4: // 5 x 5 , blank = 9 ~ 13
return random.nextInt(5) + 9;
}
}

private int[][] horizontalShuffle(int[][] matrix) {
int horizontal = matrix.length;
for (int i = 0; i < horizontal; i++) {
int r = i + (int) (Math.random() * (horizontal - i));
int[] tmp = matrix[r];
matrix[r] = matrix[i];
matrix[i] = tmp;
}

return matrix;
}

private int[][] verticalShuffle(int[][] matrix) {
int[][] tmp = getEmpty();
if (tmp != null) {
int vertical = tmp.length;
for (int i = 0; i < vertical; i++) {
int r = i + (int) (Math.random() * (vertical - i));
int r2 = i + (int) (Math.random() * (vertical - i));
for (int j = 0; j < vertical; j++) {
tmp[j][0] = matrix[j][r];
matrix[j][r] = matrix[j][r2];
matrix[j][r2] = tmp[j][0];

}

}
}
return matrix;
}

private int[][] getEmpty() {
switch (level) {
case 1:
return empty3x3;
case 2:
case 3:
case 5:
return empty4X4;
case 4:
return empty5X5;
default:
return empty6X6;
}
}

}

ORIGIN_3X3, ORIGIN_4X4, ORIGIN_5X5 필드는 각 스도쿠 문제의

기본이 되는 이중 배열입니다. 이 값들을 행으로 섞고 열로 섞어서

문제를 만듭니다.

horizontalShuffle() 과 verticalShuffle() 메소드로 행을 섞고 열을 섞습니다.

결과적으로 레벨 값을 인자로 가지는 Sudoku 객체를 생성하고

genMatrix()를 호출하면 2차원 배열이 생성됩니다.

레벨에 따라 3x3, 4x4, 5x5 가 생성되겠죠?

이제 문제 겸 정답이 생성되었으니,

다음 포스팅에서는 getBlankSpace()의 반환 값 만큼 숫자칸을 빈칸으로 만드는

코드에 대해 포스팅하겠습니다.

반응형