// 퍼즐 정보 목록 public Vector<PuzzleData> PuzzleDBlist()// puzzle table -> puzzle data list{
Vector<PuzzleData> Ar = new Vector<PuzzleData>();
try{
st = conn.createStatement();
String sql = "Select DENSE_RANK() OVER (ORDER BY Time ASC ) as RANK, ID, Time from puzzle";
rs = st.executeQuery(sql);
while (rs.next()) {
Ar.add(new PuzzleData(rs.getString(1), rs.getString(2), rs.getString(3)));
}
}catch (SQLException e) {
e.printStackTrace();
} finally {
DBClose();
}
return Ar;
}
Vector 사용하여 데이터형을 PuzzleData(DTO)로 정하였고, DB에 있는 퍼즐 정보를 불러와 저장하는 메소드입니다.
// 퍼즐 정보 업데이트publicvoidUpdatePuzzleDB(PuzzleData puzzledata)// puzzle table -> puzzle data update{
try {
String Updata = "update puzzle set Rank = ?, where Time = ?;";
ps = conn.prepareStatement(Updata);
ps.setString(1, puzzledata.GetRank());
ps.setString(2, puzzledata.GetTime());
ps.executeUpdate();
}catch(SQLException e){
e.printStackTrace();
} finally {
DBClose();
}
}
퍼즐 정보를 수정하는 메소드입니다.
// 퍼즐 정보 삭제publicvoidDelete(String ID)// puzzle table -> puzzle data delete{
String Delete = "delete from puzzle where ID = ?;";
try {
ps = conn.prepareStatement(Delete);
ps.setString(1, ID);
ps.executeUpdate();
}catch (SQLException e) {
e.printStackTrace();
} finally {
DBClose();
}
}
}
퍼즐 정보를 삭제하는 메소드입니다.
Puzzle Swing
package Puzzle_pkg;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import Login_pkg.LoginData;
import Login_pkg.LoginDB;
publicclassPuzzle_SwingextendsJFrame{
PuzzleDB Pdb = new PuzzleDB();
LoginData Ldata = new LoginData();
LoginDB Ldb = new LoginDB();
private JButton changebtn; // 빈칸과 바꿀 칸 변경private JButton[][] numbtn = new JButton[4][4]; // 15 까지의 버튼privateint[][] numcount = newint[4][4]; // 15까지의 숫자privateint row = 0, col = 0;
privatestatic String timerBuffer; //경과 시간 문자열이 저장될 버퍼 정의privatestaticint oldTime; //타이머 시작 시각을 기억하고 있는 변수publicPuzzle_Swing(){
stopwatch(1); // 시간 측정 시작// 배치
setTitle("슬라이딩 퍼즐");
setSize(350, 350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new GridLayout(4, 4));
int k = 1;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
numbtn[i][j] = new JButton(String.valueOf(k));
numbtn[i][j].setFont(new Font("굴림체", Font.BOLD, 30));
c.add(numbtn[i][j]);
numbtn[i][j].addKeyListener(new MyKeyListener());
k++;
}
}
getNum();
display();
setVisible(true);
}
// 0~16 난수발생publicvoidgetNum(){
int[] num = newint[16];
int n = 0;
boolean Check = false;
for (int i = 0; i < 16; i++) {
Check = true;
while (Check) {
n = (int) (Math.random() * 16);
Check = false;
for (int j = 0; j < i; j++) {
if (n == num[j]) // 같은 수 저장 방지
{
Check = true;
break;
}
}
}
num[i] = n;
numcount[i / 4][i % 4] = n;
if (n == 15) { // 랜덤 칸 생성
row = i / 4;
col = i % 4;
}
}
}
// 디스플레이publicvoiddisplay(){
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (i == row && j == col) {
numbtn[i][j].setText(String.valueOf(""));
numbtn[i][j].setEnabled(false);
} else {
System.out.println("numcount["+i+"]"+"["+j+"] "+numcount[i][j]+" ");
numbtn[i][j].setText(String.valueOf(numcount[i][j] + 1));
numbtn[i][j].setEnabled(true);
}
}
}
}
// 종료 여부 확인 numbtn 과 k 가 같으면 종료publicbooleanisEnd(){
int k = 1;
try {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (Integer.parseInt(numbtn[i][j].getText()) != k)
returnfalse;
System.out.println("k :"+k);
k++;
}
}
}catch(NumberFormatException e) {
}
returntrue;
}
privateclassMyKeyListenerextendsKeyAdapter{
publicvoidkeyPressed(KeyEvent e){
boolean isEnd = false;
int keyCode = e.getKeyCode();
switch (keyCode) {
case KeyEvent.VK_UP: // 방향키 ↑ 클릭 시 동작if (row == 0) { // 바깥 나감 방지break;
} else {
changebtn = numbtn[row - 1][col]; // 변경할 위 버튼
numbtn[row][col].setText(String.valueOf(changebtn.getText())); // 변경할 버튼 숫자 변경
numbtn[row][col].setEnabled(true);
row = row - 1; // 위에를 다시 가리킴
changebtn = numbtn[row][col]; // 빈칸 버튼 지정
numbtn[row][col].setText("");
numbtn[row][col].setEnabled(false);
isEnd(); // 게임 종료 확인if (isEnd) { // isEnd를 true로 변경하면 키보드 입력 시 테스트가 바로 가능 함.
String getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
int s = Ldb.LoginOX(new LoginData(getID));
if(s== -1) {
JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
while(true) {
getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
s = Ldb.LoginOX(new LoginData(getID));
if(s == 1) {
break;
}
else JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
}
JOptionPane.showMessageDialog(null, "등록 완료 ID: "+getID+", 걸린 시간: "+timerBuffer);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
else {
JOptionPane.showMessageDialog(null, "등록 완료 ID: "+getID+", 걸린 시간: "+timerBuffer);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
}
break;
}
case KeyEvent.VK_DOWN: // 방향키 ↓ 클릭 시 동작if (row == 3) { // 바깥 나감 방지break;
} else {
changebtn = numbtn[row + 1][col]; // 변경할 아래 버튼
numbtn[row][col].setText(String.valueOf(changebtn.getText())); // 변경할 버튼 숫자 변경
System.out.println("row : " + row + " col : " + col);
numbtn[row][col].setEnabled(true);
row = row + 1; // 아래를 다시 가리킴
changebtn = numbtn[row][col]; // 빈칸 버튼 지정
numbtn[row][col].setText("");
numbtn[row][col].setEnabled(false);
isEnd(); // 게임 종료 확인if (isEnd) {
String getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
int s = Ldb.LoginOX(new LoginData(getID));
if(s== -1) {
JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
while(true) {
getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
s = Ldb.LoginOX(new LoginData(getID));
if(s == 1) {
break;
}
else JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
}
JOptionPane.showMessageDialog(null, "등록 완료 ID: "+getID+", 걸린 시간: "+timerBuffer);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
else {
JOptionPane.showMessageDialog(null, "Your message: "+getID);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
}
break;
}
case KeyEvent.VK_RIGHT: // 방향키 → 클릭 시 동작if (col == 3) { // 바깥 나감 방지break;
} else {
changebtn = numbtn[row][col + 1]; // 변경할 오른쪽 버튼
numbtn[row][col].setText(String.valueOf(changebtn.getText())); // 변경할 버튼 숫자 변경
System.out.println("row : " + row + " col : " + col);
numbtn[row][col].setEnabled(true);
col = col + 1; // 오른쪽을 다시 가리킴
changebtn = numbtn[row][col]; // 빈칸 버튼 지정
numbtn[row][col].setText("");
numbtn[row][col].setEnabled(false);
isEnd(); // 게임 종료 확인if (isEnd) {
String getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
int s = Ldb.LoginOX(new LoginData(getID));
if(s== -1) {
JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
while(true) {
getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
s = Ldb.LoginOX(new LoginData(getID));
if(s == 1) {
break;
}
else JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
}
JOptionPane.showMessageDialog(null, "등록 완료 ID: "+getID+", 걸린 시간: "+timerBuffer);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
else {
JOptionPane.showMessageDialog(null, "Your message: "+getID);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
}
}
break;
case KeyEvent.VK_LEFT: // 방향키 ← 클릭 시 동작if (col == 0) { // 바깥 나감 방지break;
} else {
changebtn = numbtn[row][col - 1]; // 변경할 왼쪽 버튼
numbtn[row][col].setText(String.valueOf(changebtn.getText())); // 변경할 버튼 숫자 변경
System.out.println("row : " + row + " col : " + col);
numbtn[row][col].setEnabled(true);
col = col - 1; // 왼쪽을 다시 가리킴
changebtn = numbtn[row][col]; // 빈칸 버튼 지정
numbtn[row][col].setText("");
numbtn[row][col].setEnabled(false);
isEnd(); // 게임 종료 확인if (isEnd) {
String getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
int s = Ldb.LoginOX(new LoginData(getID));
if(s== -1) {
JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
while(true) {
getID = JOptionPane.showInputDialog("아이디를 입력 해주세요.");
s = Ldb.LoginOX(new LoginData(getID));
if(s == 1) {
break;
}
else JOptionPane.showMessageDialog(null, "아이디가 동일하지 않습니다.");
}
JOptionPane.showMessageDialog(null, "등록 완료 ID: "+getID+", 걸린 시간: "+timerBuffer);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
else {
JOptionPane.showMessageDialog(null, "Your message: "+getID);
Pdb.InsertPuzzleDB(new PuzzleData(getID, timerBuffer));
System.exit(0);
}
}
break;
}
}
stopwatch(0); // 시간 측정 종료
}
}
publicstaticvoidstopwatch(int onOff){
if (onOff == 1) //타이머 on
oldTime = (int) System.currentTimeMillis() / 1000;
if (onOff == 0) // 타이머 off, 시분초 timerBuffer 에 저장
secToHHMMSS( ((int) System.currentTimeMillis() / 1000) - oldTime );
}
// 정수로 된 시간을 초단위(sec)로 입력 받고, 문자열로 시분초를 저장publicstaticvoidsecToHHMMSS(int secs){
int hour, min, sec;
sec = secs % 60;
min = secs / 60 % 60;
hour = secs / 3600;
timerBuffer = String.format("%02d%02d%02d", hour, min, sec);
}
}
// 회원 정보 저장publicvoidInsertLogin(LoginData logindata){
String sql = "insert into login values(?, ?, ?)";
try{
ps = conn.prepareStatement(sql);
st = conn.createStatement();
rs = st.executeQuery("Select * From login order by position*1");
while(rs.next())
{
int Number1 = rs.getInt("position");
if(Number1 == count) count++;
}
ps.setInt(1, count);
ps.setString(2, logindata.GetID());
ps.setString(3, logindata.GetPassword());
ps.executeUpdate();
count++;
}catch(SQLException e)
{
e.printStackTrace();
}finally
{
DBClose();
}
}
회원정보번호가 중복되지 않게 전역변수를 count로 만들고, DB의 position(회원정보번호)를 가져와 Number1 변수에 저장하여 count와 비교해 값을 증가시킨다. 마지막 while 루프를 돌게되면 count 값은 position보다 1이 증가한 값이 되게 됩니다.
// 회원 정보 삭제publicvoidDelete(String ID){ // login table -> Login ID data delete
String sql = "Delete from login where ID =?";
try{
ps = conn.prepareStatement(sql);
ps.setString(1, ID);
ps.executeUpdate();
}catch(SQLException e)
{
e.printStackTrace();
} finally
{
DBClose();
}
}
//회원 정보 저장publicvoidInsertLogin(LoginData logindata){
String sql = "insert into login_management values(?, ?, ?)";
try{
ps = conn.prepareStatement(sql);
st = conn.createStatement();
rs = st.executeQuery("Select * From login_management order by position*1");
while(rs.next())
{
int Number1 = rs.getInt("position");
if(Number1 == count) count++;
}
ps.setInt(1, count);
ps.setString(2, logindata.GetID());
ps.setString(3, logindata.GetPassword());
ps.executeUpdate();
count++;
}catch(SQLException e)
{
e.printStackTrace();
}finally
{
DBClose();
}
}
회원정보번호가 중복되지 않게 전역변수로 count 만들고, DB의 position(회원정보번호)를 가져와 Number1 변수에 저장하여 count와 비교해 값을 증가 시킨다. 마지막 while 루프를 돌게되면 count 값은 position 보다 1 이 증가한 값이 되게 됩니다.
//회원정보 삭제publicvoidDelete(String ID){ // login_management table -> Login ID data delete
String sql = "Delete from login_management where ID =?";
try{
ps = conn.prepareStatement(sql);
ps.setString(1, ID);
ps.executeUpdate();
}catch(SQLException e)
{
e.printStackTrace();
} finally
{
DBClose();
}
}
// ID, Password 확인 즉, 로그인 시도 시 회원 확인 publicintLoginTry(LoginData logindata){ // login_management table -> Login ID, Password Confirm
String sql = "select * from login_management where ID = ? and Password = ?";
try{
ps = conn.prepareStatement(sql);
ps.setString(1, logindata.GetID());
ps.setString(2, logindata.GetPassword());
rs = ps.executeQuery();
if(rs.next())
{
return1;
}
}catch(Exception e)
{
e.printStackTrace();
}
return -1;
}
GUI에서 입력한 ID, Password가 DB에 있는지 확인하는 메소드이다. 성공 시 1을 리턴하고, 실패시 -1을 리턴합니다.