스도쿠를 만들면서
이번에 2차원 배열을 사용할려고 하였지만
부분 겹침부분을 결국 잡지 못했다
결국 현철이의 도움을 받아서
2차원에서 3차원 배열로 바꾸면서 해결하게 되었다
바뀐 부분을 보자면
처음 맵을 생성하기 위해 첫번째 맵 부분을 만드는 부분이다
class SudokuMain
{
private Random ran = new Random(); //랜덤한 값을 사용하기 위한 랜덤함수 선언
private int[][] met1()
{
int one[][] = new int[3][3]; //2차원배열 one[3][3]배열을 만든다
int choose[] = new int[9]; // 1~9까지의 숫자를 choose함수에 저장한다
int ch;
int temp;
int su;
for(int i=0; i<9; i++)
choose[i] = i+1;
su = 9;
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
{
ch = ran.nextInt(su); //9개의 숫자중 랜덤하게 숫자를 뽑아 ch에 넣는다
temp = choose[ch]; //temp에 choose함수에 랜덤하게 담긴 숫자를 넣는다
choose[ch] = choose[su-1]; //choose[su-1]의 값을 choose[ch]에 넣는다
choose[su-1] = temp; //temp의 값을 choose[su-1]에 넣는다
one[i][j] = choose[su-1]; //배열 one에 choose[su-1]값을 넣는다
su--; //su를 -시킨다
}
return one; //for문이 끝나면 one값을 리턴시킨다
}
이런 형식으로 되며 실행시킨다면
일단 한 부분의 값이 완성된다
다음부터는
/* 선택 판 3개 사용 */
for(int i=0; i<3; i++)
for(int j=0; j<9; j++)
choose[i][j] = j+1;
/* 세개의 판에 들어갈 수 없는 숫자 걸러냄 */
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
choose[i][asb[i][j]-1] = 0;
/* 가로줄 검색해서 불가능한 수 삭제 */
choose = delete(choose,abs,0);
/* 세로줄 검색해서 불가능한 수 삭제 */
choose = delete(choose,abs1,1);
/* 배열 조합 */
one = makeOne(choose);
if(one == null) return null;
가로줄과 세로줄에 대해 검색하여 겹치는 숫자는 지우고 다시 만들어야 하기때문에
private int[][][] delete(int choose[][][], int abs[][], int rec)
{
int ch;
/* 가로줄 검색해서 불가능한 수 삭제 */
if(rec == 0)
{
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
ch = abs[i][j];
for(int k=0; k<3; k++)
{
choose[i][k][ch-1] = 0;
}
}
}
return choose;
}
/* 세로줄 검색해서 불가능한 수 삭제 */
if(rec == 1)
{
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
ch = abs[i][j];
for(int k=0; k<3; k++)
{
choose[k][j][ch-1] = 0;
}
}
}
return choose;
}
스도쿠를 만들기 위해서
public int[][][] makeSudoku()
{
int su[][][] = new int [9][3][3];
int temp[][][] = new int [3][3][3];
su[0] = met1();
su[1] = met2(su[0]);
su[2] = met3(su[0],su[1]);
temp[0] = rev(su[0]);
temp[1] = met2(temp[0]);
temp[2] = met3(temp[0], temp[1]);
su[3] = rev(temp[1]);
su[6] = rev(temp[2]);
while(true)
{
if((su[7] = met4(su[6], su[1])) == null) continue;
if((su[8] = met5(su[6], su[7], su[2])) == null) continue;
if((su[5] = met6(su[3], su[2], su[8])) == null) continue;
if((su[4] = met7(su[3], su[5], su[1], su[7])) == null) continue;
break;
}
return su;
}
만든 스도쿠에 대해서 재대로 만들어 졌는지 체크하기 위해
boolean형으로 확인할 수 있게 밑에 처럼 만들었다
public boolean checkSudoku(int abs[][][])
{
boolean check[] = new boolean[9];
for(int k=0; k<3; k++)
{
for(int i=0; i<9; i++)
check[i] = false;
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
check[abs[k][i][j]-1] = true;
}
}
for(int i=0; i<9; i++)
{
if(check[i] == false) return false;
}
}
for(int k=0, w=0; k<3; k++)
{
w = k*3;
for(int i=0; i<3; i++)
{
for(int j=0; j<9; j++)
check[i] = false;
for(int j=0; j<3; j++)
{
check[abs[w][i][j]-1] = true;
check[abs[w+1][i][j]-1] = true;
check[abs[w+2][i][j]-1] = true;
}
for(int j=0; j<9; j++)
{
if(check[j] == false) return false;
}
}
}
for(int k=0, w=0; k<3; k++)
{
for(int i=0; i<3; i++)
{
for(int j=0; j<9; j++)
check[i] = false;
for(int j=0; j<3; j++)
{
check[abs[w][j][i]-1] = true;
check[abs[w+3][j][i]-1] = true;
check[abs[w+6][j][i]-1] = true;
}
for(int j=0; j<9; j++)
{
if(check[j] == false) return false;
}
}
}
return true;
}
만들어진 스도쿠에 대해서 게임을 진행하게 랜덤하게 각 판마다 숫자를 가리기 위해
밑에 처럼 만들었다
public int[][][] testSudoku(int test[][][])
{
for (int i=0 ; i<5 ; i++ )
{
for (int j=0 ; j<9 ; j++ )
{
int a = ran.nextInt(3);
int b = ran.nextInt(3);
test[j][a][b] = 0;
}
}
return test;
}
3주정도 블로그가 밀리다 보니
이렇게 한번에 쓰게 되었다
스도쿠 판이 완성된거는 1주 전에 완성이 되었다
현재는 이렇게 작업된 것에 대해
swing을 사용하여 그래픽적으로 바꾸는 작업을 하는 중이다
수업시간에도 지적받았지만
어떻게 이동시킬것인가에 대해
현재는 시간이 부족하기에 JLIST가 아닌
TEXTAREA를 사용할려고 파일을 수정하는 중이다
현재는 훈이와 말한것은
게임판와 채팅프로그램 메뉴판을 넣기 위해 작업중에 있다