์๋ง์ ์ฌ๋ถ๋ฆ ์ด๋๋ฒค์ณ
์๋ฐ 2์ฃผ๊ฐ ๋ฐฐ์ฐ๊ณ ์ฒ์์ผ๋ก ๋ง๋ค์ด ๋ณธ ์ฝ์๊ฒ์
https://drive.google.com/file/d/1QRswVEz51rFTdVxNGaMDaSe6O_JCVlnf/view?usp=drive_link
https://drive.google.com/file/d/12a-eTcsVM6Ucyc0_bBgURXKHoNUA_n3N/view?usp=drive_link
์ฐ๋ฆฌ์กฐ๋ ์ฒ์์ ๊ฐ์ ๋ฏธ๋๊ฒ์์ ํ๋์ฉ ๋ง๋ค์ด ์์ ํ๋๋ก ํฉ์น๊ธฐ๋ก ํ๋ค. ๋ง๋ ์ฝ๋๋ฅผ ํฉ์น๋ ์์
์ด ๋ณดํต ์ผ์ด ์๋ ๊ฑฐ๋ผ ์๊ฐํ์ง๋ง ์ผ๋จ ๋ง๋ค๊ณ ํฉ์น๋ ๊ฑด ๋์ค์ ์ฒ์ฒํ ์๊ฐ ํด ๋ณด๊ธฐ๋ก ํ๋ค.
์ต๋ค์ธ: ์ํ ost 3์ด ๋ฃ๊ณ ๋ง์ถ๊ธฐ Cinema Quiz
์ต๋ณํ: AI๋ณด์ด์ค๋ก ๊ฐ์ฌ ๋ฃ๊ณ ๋
ธ๋/๊ฐ์ ๋ง์ถ๊ธฐ
๊น์์
: Baccarat
๋ฐ๊ธฐ์: Black Jack
์ฒ์๋ถํฐ ๋๊น์ง ๋ณํ๋์ด๋ ๋๋ ์๊ฒฌ ์ถฉ๋์ด ์์๋ค. ๋ณํ๋์ ๊ทธ๋ฅ ๊น๋ํ๊ณ ์ฌํํ๊ฒ ํฉ์น๊ธธ ์ํ๊ณ , ๋๋ ์คํ ๋ฆฌ๋ฅผ ๋ฃ์ด์ ๋ฏธ๋๊ฒ์์ด ์คํ ๋ฆฌ์ ์ผ๋ถ๊ฐ ๋๋ ๊ฒ์ ์ํ๋ค.
๋ค๋ฅธ ํ๋ค์ ๋ฏธ์ฐ์ ์ฐ์ ์๋ฎฌ๋ ์ด์
, ํฌ์ผ๋ชฌ ๊ฒ์, ์ง๊ฐ ์ ํ๊ธฐ ๊ฒ์ ๋ง๋๋๋ฐ ์ฐ๋ฆฌ๋ ์คํ ๋ฆฌ ๋ฉด์์ ๋ค๋จ์ด์ง๋ฉด ์ด์ฉ์ง? ๋ฐํํ๋๋ฐ ๋
ธ์ผ์ด๋ฉด ์ด์ฉ๋... ํ๋ ์๊ฐ์ด ๋ค์๋ค. ์ฐ๋ฆฌํ์ด ์ ์ผ ์๋ง๋ค์ด์ผ ํ๋๋ฐใ
ใ
ใ
ใ
ใ
ใ
ใ
๋ณํ๋์ ๋๋ณด๊ณ ๋ณด์ฌ์ฃผ๊ธฐ์ ์ง์ฐฉํ๋ค
VS
๋๋ ๋ณํ๋์ด ๊ตฌ๋ฅ๋ค๋ฆฌ ํ๋ฑ์ฝ๋ฉ
์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ๋ง์ด ๋คํ๋ค....
๋ณํ๋ VS ๋
๋ณํ๋ ์์ด๋์ด | ํ ์์ ๋ฏธ๋๊ฒ์ ๋ชจ์์ ๋ง๋ค์ด ํน์ ํค๋ฅผ ๋๋ฅด๋ฉด ์ํ๋ ์ข ๋ฅ์ ๊ฒ์์ด ์คํ๋๊ฒ ํ๋ ๊ฒ. ๋ญํน ๊ธฐ๋ฅ๊ณผ ๊ฒ์ํ ๊ธฐ๋ฅ ์ถ๊ฐ |
๋ด ์์ด๋์ด | ์๋ง ์ฌ๋ถ๋ฆ ๊ฐ๋ ๊ธธ์ ์ฃผ์ธ๊ณต์ด ์ฌ๋ฌ ์ธ๋ฌผ๋ค์ ๋ง๋ ๋ฏธ๋ ๊ฒ์์ ์ํํ๋ค. 1. ์คํ ๋ฆฌํ ๊ฒ์์ ๋ง๋ค๊ณ ๋๋ค์์๋ฅผ ์ถ๊ฐํ์ 2. ์ฝ์์ฐฝ์ ์๊ฐ์ ์ธ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ํด ์์คํค ์ํธ๋ฅผ ์ต๋ํ ํ์ฉ |
์ฒ์์ ์คํ ๋ฆฌ ์ด์์ ์์ฑํด์ ๋ณํ๋๊ป ์นดํก์ ๋ณด๋๋๋ฐ ๋ต์ด ์์๋ค. ๋ง์ฝ ๊ทธ๋ฅ ํฌ๊ธฐํ๋ค๋ฉด ๋ด ์์ด๋์ด๋ ์ฐ๋ฆฌํ์์ ์ ํ ๊ณ ๋ ค ๋์์ด ์ ๋ ๊ฒ ๊ฐ์์ ๋ฏธ๋ฆฌ ์ค๋ฌผ์ ๋ง๋ค์ด ๊ฐ์ผ ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. ๋ณํ๋๋ '์คํ ๋ฆฌ ๋ฃ๊ณ ์ถ์ผ๋ฉด ํ ๋ฒ ์ง์ ๋ง๋ค์ด ์ ๋ด'๋ผ๊ณ ํ์
จ๊ธฐ ๋๋ฌธ์ ๋๋ ๋ง๋ค์ด ์ค๋ฉด ๋ฐ์์ค๋ค๋ ๋ป์ผ๋ก ์ดํดํ๊ณ ์ฃผ๋ง ๋ด๋ด ๊ตฌ๊ธ์์ ์์คํค ์ํธ๋ฅผ ์ฐพ์์ ํธ์งํ๋ค. ๋ฏธ๋ํ๋ก์ ํธ ๊ธฐ๊ฐ์ด 4์ผ ๋ฐ์ ์๋์ ์ง์ง ๋๋ฌด ํ๋ ๋
ธ๊ฐ๋ค์๋ค.....
์ฌ์ค ๋ณํ๋์ ์ด๋ฏธ ์ํ๋ ๊ตฌ์ฑ์ผ๋ก ๋ก์ง์ ๋ค ์ง ๋์ผ์
จ๊ณ MVC ๋๋๋ ์์
์ ๋๋ด์
จ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์คํ ๋ฆฌ๋ฅผ ์ง์ค๋ฉด ๋ค์ ๋๊ท๋ชจ ์ฝ๋ ์์ ์ ํด์ผ ํ๋ ์ํฉ์ด์๋ค. ๊ทธ๋ฌ๊ฒ ๋ค๊ฐ์ด ํ์ง ์ ๋ฏธ๋ฆฌ ๋ง๋์ ๊ฒ๋๊น? ํญ์ ์์ด๋์ด๋ฅผ ๋ด๋ ์ฌ๋์ ์๋ก ์ถฉ๋ํ๊ธฐ ๋ง๋ จ์ด๋ค. ์ด๋ฐ ๊ณผ์ ์์ ํ๋ฆฌํฐ ์๋ ์ํ์ด ๋์จ๋ค๊ณ ์๊ฐํ๋ค. ๋ฌดํผ ํฐ๊ฒฉํ๊ฒฉ ํ๋ฉด์ ์์ฑํ ๊ฒ์...!
์ง์ง ๋ค ๋ช
์ด ์ผ์ฐ์ผ์ฐ ์ด์ฌํ ๊ณ ์ํด์ ๋ง๋ค์๋ค....ใ
ใ
ใ
ใ
ใ
ใ
ใ
!!! ๋จ ํ๋ช
๋ ์ด์ฌํ ์ํ ์ฌ๋์ด ์์...
ํ ๋ด์์๋ ๊ฑฐ์ ๋๊ฐ๋๊ฐ ๋ ์๋ง๋ค์๋ ๋๊ฒฐ ๊ตฌ๋ใ
ใ
ใ
ใ
ใ
ใ
ใ
์ค๋ฅ์์ _๋ฏธ๋๊ฒ์ 5๋ AI ๋ชฉ์๋ฆฌ๋ก ๊ฐ์ฌ ๋ฃ๊ณ ์ ๋ชฉ ๋ง์ถ๊ธฐ ๊ฒ์***
์๊ฐ์ ์ซ๊ฒจ์ ์กฐ๊ธํ๊ฒ ๋ง๋ค๋ค ๋ณด๋ ์ฆ์ ์ค์๊ฐ... ์ฌ์ค ์ค์๊ฐ ์๋๋ผ ์ค๋ฅ/์คํ์ธ๊ฑฐ ์๋๋ฐ๋ ์๊ฐ์ด ์์ด์ ๋ชป๊ณ ์น๊ฑฐ... ๋ฐํ์ง์ ๊น์ง ๋ค๋ค ์ฝ๋์ง๊ณ ์์ ํ๋๋ผ ๋ฐ๋น ์...ใ
ใ
ใ
ใ
ใ
๋ฏธ๋๊ฒ์1. ํ ๋จธ๋ ๋์๋๋ฆฌ๊ธฐ : 3์ด์ ๊ฐ๊น๊ฒ ์ํฐ ์น๊ธฐ
๋ฏธ๋๊ฒ์2. ๋๋์ก๊ธฐ : ๋ธ๋ ์ญ
์์คํค๋ก ๊ท์ฝ๊ฒ ๊พธ๋ฉฐ๋์ ๋ธ๋์ญ ๋ฃฐ
์นด๋ ์ ํ ์๋ฆฌ๋ ํจ๊ณผ ๋ฌด์ใ ใ ใ ใ ์ง์ง ์ ๋ง๋ค์๋ค.
๋ฏธ๋๊ฒ์3. ์น๊ตฌ๊ฐ ์ข์ํ๋ ์ํ ๋ง์ถ๊ณ ๋งํธ ๊ฐ์ด ๊ฐ๊ธฐ : ์๋ค๋ง ํด์ฆ
๋ฏธ๋๊ฒ์4. ๋ฐ์นด๋ผ
์์ฌ์ด ์
1. ๊ฒ์์ ํฉ์น๋ ๊ณผ์ ์์ ์ ์์
์ด ํ๋ ์ด๋๋ฉด ๊ธฐ์กด ์์
์ ์ ์ง ์ํค๋ ๋ก์ง์ ๋ฏธ์ฒ ๊ตฌํํ์ง ๋ชปํด์ ์ฌ์ด๋๊ฐ ๊ฒน์น๋ ๋ถ๋ถ์ด ์๋ค.
2. ๋ง์ง๋ง์ ์คํ์ง๋ฐฅ ์๋ฉ ์ก์ ๋ง์ถฐ์ ์ํ ์ ๋ชฉ/์ฃผ์ ๊ฐ/์ํฐ์คํธ๋ช
๋ฑ์ด ์ํ ์๋ฉํฌ๋ ๋ง ์ฌ๋ผ๊ฐ๋ฏ์ด ๊ตฌํํด ๋์ ๊ฒ ์์๋๋ฐ, ๊ฒ์๋ค์ ํ๋๋ก ํฉ์น๋ ๊ณผ์ ์์ ํด๋น ๋ถ๋ถ์ด ์๋ํ์ง ์์. ๋ฐํ๋ ์ค์ ์ ์์ ํ๋ ค ํ์ผ๋ ๊น์ด ๊ผฌ์ฌ์ ๋ ๋ ค๋จน์ ์ฝ๋ ์์ ํ๊ณ ๋๋๊ณค์ด๋ ์ ํฌํ๋ ๋ถ๋ถ ๋ก์ง ๋ ์ง ๊ฑฐ ํผ์ ์ง๋๋ผ ๊ฒฐ๊ตญ ์์ ๋ชป ํจ....
3. ์์คํค๊ฐ ๋ถ๋ถ ๋ถ๋ถ ๋ง์ด ๊นจ์ ธ์ ์์ฝ๋ค! ใ
ใ
ใ
ใ
ใ
ใ
ใ
๋ก๊ทธ์ธ ๊ตฌํ ์ฝ๋
Account
package Account;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.logging.Level;
import java.util.logging.Logger;
import DAO.DBFactory;
import Pages.PageId;
import Utils.Base64;
import Utils.SQLUtil;
/*
*๋ชฉ์ : ์ถ๊ฐ
*๊ฐ์ ์ด๋ ฅ : ๋ฐ๊ธฐ์, 2023.07.24,
*์ต์ ์์ ํ ๊ฒ :
*1) _totalpoint ๊ฐ ์ถ๊ฐ (get,set)
*/
public class Account {
/** ๋ฐฐํ
๊ธ์ก */
private int _totalpoint;
/** ๊ณ์ ๋ช
*/
private String _name;
/** ํจ์ค์๋(์ํธํ ๋จ) */
private String _password;
/** ์ต๊ทผ ์ ์์ผ */
private Timestamp _lastActive;
/** ๊ณ์ ์ ํจ ์ ๋ฌด(True == ์ ํจ) */
private boolean _isValid = false;
/** ํ์ฌ ์ํ, ํ์ด์ง ๋ฒํธ */
private int _page;
/** ์๋ธ ํ์ด์ง ๋ฒํธ */
private int _subPage;
/** ๋ฉ์ธ์ง ๋ก๊ทธ์ฉ */
private static Logger _log = Logger.getLogger(Account.class.getName());
public Account() {
}
/**
* ์ ํจํ ๊ณ์ ์ธ๊ฐ
*
* @return boolean
*/
public boolean isValid() {
return _isValid;
}
public void setValid(Boolean b){
_isValid = b;
}
public int get_totalpoint() {
return _totalpoint;
}
public void set_totalpoint(int _totalpoint) {
this._totalpoint = _totalpoint;
}
/**
* ๊ณ์ ์ ์ด๋ฆ์ ๊ตฌํด์จ๋ค.
*
* @return _name ๊ฐ์ ๋๋ ค์ค๋ค.
*/
public String getName() {
return _name;
}
/**
* ๊ณ์ ์ ์ด๋ฆ์ ์ค์ ํ๋ค.
*
* @param name
*/
public void setName(String name) {
this._name = name;
;
}
/**
* ๋ง์ง๋ง ์ ์์๊ฐ์ ๊ตฌํด์จ๋ค.
*
* @return _lastActive
*/
public Timestamp getLastActive() {
return _lastActive;
}
/**
* ํ์ฌ ์ ์ํ ํ์ด์ง๋ฅผ ๊ตฌํด์จ๋ค.
*
* @return _page
*/
public int getPages() {
return _page;
}
/**
* ํ์ด์ง๋ฅผ ์ค์ ํ๋ค.
*
* @param _page
*/
public void setPages(int _page) {
this._page = _page;
}
/**
* ์๋ธํ์ด์ง๋ฅผ ๊ตฌํด์จ๋ค.
*
* @return _subpage
*/
public int getSubPage() {
return _subPage;
}
/**
* ์๋ธ ํ์ด์ง๋ฅผ ์ค์ ํ๋ค.
*
* @param _subPage
*/
public void setSubPage(int _subPage) {
this._subPage = _subPage;
}
/**
* ์ข
๋ฃ ํ์ด์ง์ธ์ง ํ์ธํ๋ค.
*
* @return
*/
public boolean isExit() {
return (this._page == PageId.EXIT);
}
/**
* ํจ์ค์๋๋ฅผ ์ํธํํ๋ค.
*
* @param rawPassword
* ํจ์ค์๋
* @return String
* @throws NoSuchAlgorithmException
* ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์์ ๋
* @throws UnsupportedEncodingException
* ์ธ์ฝ๋ฉ์ด ์ง์๋์ง ์์ ๋
*/
private static String encodePassword(final String rawPassword)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
byte[] buf = rawPassword.getBytes("UTF-8");
buf = MessageDigest.getInstance("SHA-256").digest(buf);
return Base64.encodeBytes(buf);
}
/**
* ์ ๊ท ๊ณ์ ์์ฑ
*
* @param name
* ๊ณ์ ๋ช
* @param rawPassword
* ํจ์ค์๋
* @param ip
* ์ ์์ IP์ฃผ์
* @param host
* ์ ์์ ํธ์คํธ๋ช
* @return Account
*/
public static boolean create(final String name, final String rawPassword,
final String ip, final String host) {
PreparedStatement pstm = null;
try (Connection con = DBFactory.getInstance().getConnection()) {
if (doesCharNameExist(name)) {
System.out.println("ํด๋น ๊ณ์ ๋ช
์ด ์กด์ฌํฉ๋๋ค.");
return false;
}
if (!AccountNameFilter.getInstance().nameFilter(name)) {
System.out.println("๊ณ์ ๋ช
์ ๋ถํ์ํ ๋จ์ด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.");
return false;
}
String sqlstr = "INSERT INTO accounts (id, password, lastactive) VALUES (?, ?, ?)";
pstm = con.prepareStatement(sqlstr);
pstm.setString(1, name);
try {
pstm.setString(2, encodePassword(rawPassword));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
pstm.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
pstm.executeUpdate();
_log.info("created new account for " + name);
System.out.println("๊ณ์ ์ด ๋ง๋ค์ด์ก์ต๋๋ค.");
return true;
} catch (SQLException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
SQLUtil.close(pstm);
}
return false;
}
/**
* name ์ ๊ฐ์ ๋ฐ์ ์ด๋ฏธ ์กด์ฌํ๋ name ์ธ์ง ํ์ธํ๋ค.
* ์์ผ๋ฉด true ์, ์์ผ๋ฉด false ๊ฐ์ ๋ฐํํ๋ค.
*
* @param name
* @return
*/
public static boolean doesCharNameExist(String name) {
boolean result = true;
java.sql.Connection con = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
con = DBFactory.getInstance().getConnection();
pstm = con
.prepareStatement("SELECT id FROM accounts WHERE id=?");
pstm.setString(1, name);
rs = pstm.executeQuery();
result = rs.next();
} catch (SQLException e) {
_log.warning("could not check existing charname:" + e.getMessage());
} finally {
SQLUtil.close(rs, pstm, con);
}
return result;
}
/**
* DB์์ ๊ณ์ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
*
* @param name
* ๊ณ์ ๋ช
* @return Account
*/
public static Account load(final Account account, final String name) {
Connection con = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
con = DBFactory.getInstance().getConnection();
String sqlstr = "SELECT * FROM accounts WHERE id=?";
pstm = con.prepareStatement(sqlstr);
pstm.setString(1, name);
rs = pstm.executeQuery();
if (!rs.next()) {
return account;
}
account._name = rs.getString("id");
account._password = rs.getString("password");
account._lastActive = rs.getTimestamp("lastactive");
account._totalpoint = rs.getInt("totalpoint");
_log.fine("account exists");
} catch (SQLException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
SQLUtil.close(rs, pstm, con);
}
return account;
}
/**
* DB์ ์ต๊ทผ ์ ์์ผ ์
๋ฐ์ดํธ
*
* @param account
* ๊ณ์ ๋ช
*/
public static void updateLastActive(final Account account) {
Connection con = null;
PreparedStatement pstm = null;
Timestamp ts = new Timestamp(System.currentTimeMillis());
try {
con = DBFactory.getInstance().getConnection();
String sqlstr = "UPDATE accounts SET lastactive=? WHERE id = ?";
pstm = con.prepareStatement(sqlstr);
pstm.setTimestamp(1, ts);
pstm.setString(2, account.getName());
pstm.execute();
account._lastActive = ts;
_log.fine("update lastactive for " + account.getName());
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
SQLUtil.close(pstm, con);
}
}
public static void updateTotalPoint(final Account account) {
Connection con = null;
PreparedStatement pstm = null;
try {
con = DBFactory.getInstance().getConnection();
String sqlstr = "UPDATE accounts SET TOTALPOINT=? WHERE id = ?";
pstm = con.prepareStatement(sqlstr);
pstm.setInt(1,account.get_totalpoint());
pstm.setString(2, account.getName());
pstm.execute();
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
SQLUtil.close(pstm, con);
}
}
/**
* ์
๋ ฅ๋ ๋น๋ฐ๋ฒํธ์ DB์ ์ ์ฅ๋ ํจ์ค์๋๋ฅผ ๋น๊ต
*
* @param rawPassword
* ํจ์ค์๋
* @return boolean
*/
public boolean validatePassword(String accountName, final String rawPassword) {
// ์ธ์ฆ ์ฑ๊ณต ํ์ ์ฌ์ฐจ ์ธ์ฆ๋์์ ๊ฒฝ์ฐ๋ ์คํจ์ํจ๋ค.
// if (_isValid) {
// return false;
// }
try {
_isValid = (_password.equals(encodePassword(rawPassword)));
if (_isValid) {
_password = null;
}
return _isValid;
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
return false;
}
}
Account Controller
/**
* Account ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ด๋ค.
* account ๋ฅผ ์ ์ฅ, ์ญ์ , ๊ฐฏ์๋ฅผ ์ฒ๋ฆฌํ๋ค.
*/
package Account;
import java.util.concurrent.ConcurrentHashMap;
public class AccountController {
private static ConcurrentHashMap<String, Account> accountsMap = new ConcurrentHashMap<String, Account>();
private AccountController() {
}
private static AccountController _instance = null;
public static AccountController getInstance() {
if (_instance == null) {
_instance = new AccountController();
}
return _instance;
}
/**
* ๋ชจ๋ account ์ ๊ฐฏ์๋ฅผ ์ ๋ ฌ ํ ๊ตฌํด์จ๋ค.
*
* @return
*/
public Account[] getAllAccounts() {
return accountsMap.values().toArray(
new Account[accountsMap.size()]);
}
/**
* key ์ผ๋ก map ์์ ํด๋น ์ ๋ณด๋ฅผ ๊ตฌํด์จ๋ค.
*
* @param key
* @return
*/
public static Account getAllAccountsHashMap(String key) {
return accountsMap.get(key);
}
public int getOnlinePlayerCount() {
return accountsMap.size();
}
/**
* account ์ ์ ๋ณด๋ฅผ map ์ ๋ฃ๋๋ค.
* ๋จ ํ๊ฐ๋์ง ์์ ๊ณ์ ์ ๊ฒฝ์ฐ ๋ฆฌํดํ๋ค.
* @param account
*/
public synchronized void login(Account account) {
if (!account.isValid()) {
throw new IllegalArgumentException("ํ๊ฐ๋์ง ์์ ๊ณ์ ์
๋๋ค.");
}
accountsMap.put(account.getName(), account);
}
/**
* logout ํ์์ ๊ฒฝ์ฐ map ์์ ์ ๊ฑฐํ๋ค.
* @param client
* @return
*/
public synchronized boolean logout(Account client) {
if (client.getName() == null) {
return false;
}
return accountsMap.remove(client.getName()) != null;
}
}
AccountNameFilter
/**
* account ์ name์ ๋ฐ์ ํด๋น id ๊ฐ ์ ์์ ์ธ์ง ํ์ธํ๋ค.
*/
package Account;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class AccountNameFilter {
private static Logger _log = Logger.getLogger(AccountNameFilter.class
.getName());
private static AccountNameFilter _instance = null;
public static AccountNameFilter getInstance() {
if (_instance == null) {
_instance = new AccountNameFilter();
}
return _instance;
}
private AccountNameFilter() {
}
/**
* name ์ ๊ฒ์ฌํ๋ค.
* length ๊ฐ 0 ์ผ ๊ฒฝ์ฐ false ๋ฅผ ๋ฐํํ๋ค.
* @param name
* @return
*/
public Boolean nameFilter(String name) {
if (name.length() == 0) {
return false;
}
return isInvalidName(name);
}
/**
* name ๊ฐ์ ๋ฐ์ ๋ฌธ์์ธ์ง ํ์ธํ๋ค.
* @param name
* @return
*/
private static boolean isAlphaNumeric(String name) {
boolean flag = true;
char ac[] = name.toCharArray();
int i = 0;
do {
if (i >= ac.length) {
break;
}
if (!Character.isLetterOrDigit(ac[i])) {
flag = false;
break;
}
i++;
} while (true);
return flag;
}
/**
* name ๊ฐ์ ๋ฐ์ ์ ๊ทํํ์์ ๋ง๋ ํ์์ธ์ง ํ์ธํ๋ค.
* a-z ๋ก ์์ํ๋์ง ํ์ธ
* 0-9 ์ซ์๋ก ์์ํ๋ค๋ฉด false๋ฅผ ๋ฆฌํด
* ๋ฌธ์์ด์ a-z, 0-9 ๋ฅผ ์ ์ธํ ๋ฌธ์๊ฐ ํฌํจ๋์ด์์ผ๋ฉด false ๋ฅผ ๋ฆฌํดํ๋ค.
* @param name
* @return
*/
private static boolean isInvalidName(String name) {
int numOfNameBytes = 0;
try {
numOfNameBytes = name.getBytes("UTF-8").length;
if (5 < (numOfNameBytes - name.length()) || 12 < numOfNameBytes) {
return false;
}
} catch (UnsupportedEncodingException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
return false;
}
if (!name.matches("^[a-zA-Z].*$")) {
return false;
}
if (name.matches("^[0-9].*$")) {
return false;
}
if (!name.matches("^[a-zA-Z0-9]+$")) {
return false;
}
if (!isAlphaNumeric(name)) {
return false;
}
return true;
}
}
์๋ค๋งํด์ฆ ์ฝ๋(CinemaAscii, CinemaField, CinemaQuitMain)
์นํ๋ก์ ํธ๊ฐ ์๋๋ผ์ ์ฝ์์ฐฝ์ ๋์ ์ธ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ด๋ ค์ ๋ค.
ํ๋ฉด์ ๋์ ์ธ ์์๋ฅผ ์ฃผ๋ ์ฝ๋๋ ์ฌ๋งํ๋ฉด ๋ค Thread.sleep()์ผ๋ก ์๊ฐ์ฐจ๋ฅผ ์ค์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
Thread.sleep()์ ์ฐ๋ฉด ๊ธ์๊ฐ ํ๋์ฉ ๋จ๋๊ฑฐ, ๋ก๋ฉ๋ฐ ๊ตฌํ, ์๋ฉ ํฌ๋ ๋ง ์ฌ๋ผ๊ฐ๋๊ฑฐ ๋ค ๊ตฌํ ๊ฐ๋ฅ
CinemaField
package Game.Dain;
public class CinemaField {
private String movieNameKR;
private String movieNameENG;
private int year;
private String movieSongName;
private String movieSongArtist;
private String movieSongFileName;
public String getMovieNameKR() {
return movieNameKR;
}
public void setMovieNameKR(String movieNameKR) {
this.movieNameKR = movieNameKR;
}
public String getMovieNameENG() {
return movieNameENG;
}
public void setMovieNameENG(String movieNameENG) {
this.movieNameENG = movieNameENG;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public String getMovieSongName() {
return movieSongName;
}
public void setMovieSongName(String movieSongName) {
this.movieSongName = movieSongName;
}
public String getMovieSongArtist() {
return movieSongArtist;
}
public void setMovieSongArtist(String movieSongArtist) {
this.movieSongArtist = movieSongArtist;
}
public String getMovieSongFileName() {
return movieSongFileName;
}
public void setMovieSongFileName(String movieSongPath) {
this.movieSongFileName = movieSongPath;
}
public CinemaField() {
}
public CinemaField(String movieNameKR, int year, String movieSongName, String movieSongArtist, String movieSongFileName) {
this.movieNameKR = movieNameKR;
this.year = year;
this.movieSongName = movieSongName;
this.movieSongArtist = movieSongArtist;
this.movieSongFileName = movieSongFileName;
}
public CinemaField(String movieNameKR, String movieNameENG, int year, String movieSongName, String movieSongArtist, String movieSongFileName) {
this.movieNameKR = movieNameKR;
this.movieNameENG = movieNameENG;
this.year = year;
this.movieSongName = movieSongName;
this.movieSongArtist = movieSongArtist;
this.movieSongFileName = movieSongFileName;
}
}
CinemaQuizMain
package Game.Dain;
import java.util.ArrayList;
import java.util.Scanner;
import Account.Account;
import Game.GameDAO.CinemaDataTable;
import Utils.SC;
import javazoom.jl.player.MP3Player;
public class CinemaQuizMain {
Account account = new Account();
private static CinemaQuizMain _instance = null;
public static CinemaQuizMain getInstance() {
if (_instance == null) {
_instance = new CinemaQuizMain();
}
return _instance;
}
public CinemaQuizMain() {
}
public void isGameStart(Account _account) {
account = _account;
Scanner sc = SC.getScanner();
// ์ํ๋ค์ ํ๋๋ก ์ ์ฅ
ArrayList<CinemaField> cinemasList = new ArrayList<CinemaField>();
String comPath = "data\\song\\cinema\\";
MP3Player mp3 = new MP3Player();
try {
cinemasList.add(new CinemaField(" ์คํ์์ฆ ", 1977, "The Imperial March", "Carmen Twillie", comPath + "01_Starwars.mp3"));
cinemasList.add(new CinemaField(" ์กฐ ์ปค ", 2019, "Rocken And Roll(Part 2)", "Gary Glitter", comPath + "02_Joker.mp3"));
cinemasList.add(new CinemaField(" ํด๋ฆฌํฌํฐ ", 2003, "Hedwig's Theme", "Christoph Eschenbach", comPath + "03_HarryPotter.mp3"));
cinemasList.add(new CinemaField(" ๋ผ์ด์ธํน ", 1994, "Circle of Life", "Carmen Twillie", comPath + "04_LionKing.mp3"));
cinemasList.add(new CinemaField(" ๊ฒจ์ธ์๊ตญ ", 2013, "Love is An Open Door", "Kristen Bell", comPath + "05_Frozen.mp3"));
cinemasList.add(new CinemaField(" ์บ๋ฆฌ๋น์์ํด์ ", 2003, "He's a Pirate", "Klaus Badelt", comPath + "06_PiratesOfTheCarribean.mp3"));
cinemasList.add(new CinemaField(" ํ์ดํ๋ ", 1997, "My Heart Will Go On", "Celine Dion", comPath + "07_Titanic.mp3"));
cinemasList.add(new CinemaField(" ์ํผ๋ง๋ฆฌ์ค๋ธ๋ผ๋์ค ", 2023,"Peaches", "Jack Black", comPath + "08_SuperMarioBrothers.mp3"));
cinemasList.add(new CinemaField(" ์๋ผ๋ ", 1992 , "Friend Like Me", "Ne-Yo", comPath + "09_Aladdin.mp3"));
cinemasList.add(new CinemaField(" ๋ ์น ", 1994, "Shape Of My Heart", "Sting", comPath + "10_Leon.mp3"));
// cinemasList = CinemaDataTable.getInstance(comPath).getCinemaList();
mp3.play(comPath + "opening.mp3");
CinemaAscii.getInstance().openingAsciiArt();
String line = " โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ \n";
int timeLap = 200; // ์๊ฐ ๊ฐ๊ฒฉ (200๋ฐ๋ฆฌ์ด)
for (int i = 0; i < line.length(); i++) {
System.out.print(line.charAt(i));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(
" ๋ก๋ฉ ์๋ฃ!! \n\n");
try {
Thread.sleep(200);
System.out.print(" ๊ฒ์ ์ค๋ช
์ ๋ณด์๊ฒ ์ต๋๊น? ");
System.out.print(" [1] YES [2] NO ");
System.out.println();
System.out.println();
String gameRule = sc.nextLine();
if (gameRule.equals("1") || gameRule.toLowerCase().equals("y")
|| gameRule.toLowerCase().equals("yes")) {
CinemaAscii.getInstance().getExplanation();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
System.out.printf("\n%s\n\n\n", " ๊ฒ์์ ์์ํ์๊ฒ ์ต๋๊น? " + "[1] YES [2] NO ");
String gameStart = sc.nextLine();
if (!gameStart.equals("1")) {
Thread.sleep(timeLap);
System.out.println();
System.out.println();
System.out.println(" ์์!! ๋ด ๊ฒ์์ด ์ผ๋ง๋ ์ฌ๋ฐ๋๋ฐ... ( ๊ฒ์๊ฐ์ ์์!! ) ");
Thread.sleep(timeLap);
}
} catch (Exception e) {
e.printStackTrace();
}
if (mp3.isPlaying()) {
mp3.stop();
}
getQuiz(1, sc, cinemasList, mp3, comPath, "01_other.mp3");
getQuiz(2, sc, cinemasList, mp3, comPath, "02_other.mp3");
getQuiz(3, sc, cinemasList, mp3, comPath, "03_other.mp3");
getQuiz(4, sc, cinemasList, mp3, comPath, "04_other.mp3");
getQuiz(5, sc, cinemasList, mp3, comPath, "05_other.mp3");
getQuiz(6, sc, cinemasList, mp3, comPath, "06_other.mp3");
getQuiz(7, sc, cinemasList, mp3, comPath, "07_other.mp3");
getQuiz(8, sc, cinemasList, mp3, comPath, "08_other.mp3");
getQuiz(9, sc, cinemasList, mp3, comPath, "09_other.mp3");
getQuiz(10, sc, cinemasList, mp3, comPath, "10_other.mp3");
// System.out.println(
// " ================================================================================================================\n");
// Thread.sleep(200);
// System.out.println();
// Thread.sleep(200);
// System.out.println(
// " MOVIE NAME YEAR TITLE ARTIST ");
// Thread.sleep(200);
// System.out.println();
// System.out.println();
// System.out.println();
// Thread.sleep(200);
// for (int i = 0; i < cinemasList.size(); i++) {
// String mname = cinemasList.get(i).getMovieNameKR();
// int year = cinemasList.get(i).getYear();
// String title = cinemasList.get(i).getMovieSongName();
// String artist = cinemasList.get(i).getMovieSongArtist();
// System.out.println(" " + mname + " " + year + " " + title
// + " " + artist);
// System.out.println("\n\n");
// Thread.sleep(1000);
// }
} catch (Exception e) {
e.printStackTrace();
}
}
private int inputNum(Scanner sc) {
System.out.println(" [1] ์์
์ฌ์ [2] ๊ทธ๋ฆผ ํํธ! [3] ๋ค๋ฅธ ๊ตฌ๊ฐ ๋ฃ๊ธฐ [4] ํฌ๊ธฐํ๊ณ ๋ค์๋ฌธ์ ");
int playMusic = 0;
try {
playMusic = sc.nextInt();
} catch (Exception e) {
System.out.println(" ์๋ชป ์
๋ ฅํ์
จ์ต๋๋ค. ");
}
return playMusic;
}
private void questions(int n) {
System.out.printf("\n\n\n\n\n%s\n\n\n",
" ================================================================================= \n"
+ " โช(^∇^*) โฉ โช โฌ โ´โก`โ [ " + n
+ "๋ฒ ๋ฌธ์ !! ] โฉ โช โฌ ใฝ(โฟ๏พโฝ๏พ)ใ \n"
+ " ================================================================================= ");
}
private boolean answers(int n, Scanner sc, ArrayList<CinemaField> cinemasList, MP3Player mp3,
String comPath) {
System.out.println(" ์ ๋ต์ ์
๋ ฅํ์ธ์(ํ๊ตญ์ด๋ก) >>");
String movieName = sc.next();
if (movieName.equals(cinemasList.get(n - 1).getMovieNameKR().trim())) {
if (mp3.isPlaying()) {
mp3.stop();
}
System.out.println(" SUCCESS! ์ ๋ต ์
๋ ๋ค!! ");
System.out.println();
System.out.println(" ๋ค์ ๋ฌธ์ ๋ก ๋์ด๊ฐ๋๋ค... ");
return true;
} else {
if (mp3.isPlaying()) {
mp3.stop();
}
System.out.println(" Fail...! ํ ๋ ธ ์ต ๋ ๋ค... ");
System.out.println();
}
return false;
}
private void getQuiz(int number, Scanner sc, ArrayList<CinemaField> cinemasList,
MP3Player mp3, String comPath, String fileNameString) {
questions(number);
while (true) {
int playMusic = inputNum(sc);
if (playMusic == 0) {
System.out.println(" ๋ค์ ์ ํํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.... ");
continue;
}
if (playMusic == 1) {
mp3.play(cinemasList.get(number - 1).getMovieSongFileName());
} else if (playMusic == 2) {
CinemaAscii.getInstance().getCinemaPosterAsciiArt(number);
} else if (playMusic == 3) {
mp3.play(comPath + fileNameString);
} else if (playMusic == 4) {
System.out.println(" ๋ค์ ๋ฌธ์ ๋ก ๋์ด๊ฐ๋๋ค... ");
if (mp3.isPlaying()) {
mp3.stop();
}
break;
}
if (answers(number, sc, cinemasList, mp3, comPath))
break;
}
if (mp3.isPlaying()) {
mp3.stop();
}
}
}
BlackjackDataTable
package Game.GameDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import DAO.DBFactory;
/*
*๋ชฉ์ : Blackjack db ํ ํ ์ ์ update ๋ฐ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ.
*๊ฐ์ ์ด๋ ฅ : ๋ฐ๊ธฐ์, 2023.07.24,
*์ต์ ์์ ํ ๊ฒ :
*1) ํ
์ด๋ธ ACCOUNT ์ TOTAL POINT ์ถ๊ฐ ๋ฐ ๊ธฐ๋ณธ ๊ฐ DEFAULT = 1000 <- ๋ฐฐํ
๊ธ์ก
*2) ํ
์ด๋ธ
*
*/
public class BlackjackDataTable {
// ๋ฐฐํ
๊ธ์ก UPDATE
public void saveTotalPoint(String ID, int totalPoint) {
try (Connection con = DBFactory.getInstance().getConnection();
PreparedStatement pstm = con.prepareStatement("UPDATE ACCOUNTS SET TOTALPOINT = ? WHERE ID = ?");) {
pstm.setInt(1, totalPoint);
pstm.setString(2, ID);
pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
//๋ฐฐํ
๊ธ์ก ๋ถ๋ฌ์ค๊ธฐ
public int getTotalPoint(String ID) {
int totalPoint=0;
try (Connection con = DBFactory.getInstance().getConnection();
PreparedStatement pstm = con.prepareStatement("SELECT TOTALPOINT FROM ACCOUNTS WHERE ID = ?");)
{
pstm.setString(1, ID);
ResultSet rs = pstm.executeQuery();
while (rs.next())
{
totalPoint = rs.getInt("TOTALPOINT");
}
} catch (SQLException e) {
e.printStackTrace();
}
return totalPoint;
}
}
CinemaDataTable
package Game.GameDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Logger;
import DAO.DBFactory;
import Game.Dain.CinemaField;
import Utils.SQLUtil;
public class CinemaDataTable {
private static Logger _log = Logger.getLogger(CinemaDataTable.class.getName());
private String path;
private CinemaDataTable(String path) {
this.path = path;
}
private static CinemaDataTable _instance = null;
public static CinemaDataTable getInstance(String path) {
if (_instance == null) {
_instance = new CinemaDataTable(path);
}
return _instance;
}
public ArrayList<CinemaField> getCinemaList() {
ArrayList<CinemaField> cinemasList = null;
try (Connection con = DBFactory.getInstance().getConnection();
PreparedStatement pstm = con.prepareStatement("SELECT * FROM cinema");
ResultSet rs = pstm.executeQuery()) {
cinemasList = new ArrayList<CinemaField>();
while (rs.next()) {
CinemaField cinemaField = new CinemaField();
cinemaField.setMovieNameKR(rs.getString("name_kr"));
cinemaField.setMovieNameENG(rs.getString("name_eng"));
cinemaField.setYear(rs.getInt("year"));
cinemaField.setMovieSongName(rs.getString("song_name"));
cinemaField.setMovieSongArtist(rs.getString("song_artist"));
cinemaField.setMovieSongFileName(path + rs.getString("file_name"));
cinemasList.add(cinemaField);
}
return cinemasList;
} catch (SQLException e) {
e.printStackTrace();
}
return cinemasList;
}
}
CinemaQuizDataTable
package Game.GameDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import DAO.DBFactory;
public class CinemaQuizDataTable {
private static Logger _log = Logger.getLogger(CinemaQuizDataTable.class.getName());
private CinemaQuizDataTable() {
}
private static CinemaQuizDataTable _instance = null;
public static CinemaQuizDataTable getInstance() {
if (_instance == null) {
_instance = new CinemaQuizDataTable();
}
return _instance;
}
public boolean insertQuizResult(final String name, final String ox, final int q_no) {
String sqlstr = "INSERT INTO cinemaquiz (no, id, ox, q_no, datetime) VALUES (tmp_seq.NEXTVAL, ?, ?, ?, to_date(sysdate, 'yyyy.mm.dd hh24:mi:ss'))";
try (Connection con = DBFactory.getInstance().getConnection();
PreparedStatement pstm = con.prepareStatement(sqlstr)) {
pstm.setString(1, name);
pstm.setString(2, ox);
pstm.setInt(3, q_no);
pstm.executeUpdate();
return true;
} catch (SQLException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
return false;
}
}
'Design Note' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์น ๋์์ธ ์์ด๋์ด ๋ ธํธ 1 (0) | 2024.04.22 |
---|