์๋ฐ ์์ผ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฐ์ ๋ฉํฐํ๋ ์ด์ด ๋งํผ์ ๊ฒ์์ ๋๋ค.
- ๋น ๋ฅธ ์์
- ๊ฒ์ ๋ฐฉ๋ฒ
- ์ญํ ์ค๋ช
- ์ฃผ์ ๊ธฐ๋ฅ
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๊ฐ๋ฐ ๊ฐ์ด๋
- ๊ธฐ์ ์คํ
- Java 17 ์ด์
- Maven 3.6 ์ด์
# ์ ์ฅ์ ํด๋ก
git clone https://github.com/khg9859/Mafia.git
cd Mafia
# Maven ๋น๋
mvn clean package1. ์๋ฒ ์คํ
java -jar target/mafia-game-1.0.0-server-executable.jar- ์๋ฒ GUI๊ฐ ์ด๋ฆฝ๋๋ค
- Port Number ํ์ธ (๊ธฐ๋ณธ๊ฐ: 30000)
- "Start Server" ๋ฒํผ ํด๋ฆญ
- ํ๋ ์ด์ด ์ ์ ๋๊ธฐ
2. ํด๋ผ์ด์ธํธ ์คํ (์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ)
java -jar target/mafia-game-1.0.0-client-executable.jar- User Name ์ ๋ ฅ
- IP Address ์ ๋ ฅ (๋ก์ปฌ: 127.0.0.1)
- Port Number ์ ๋ ฅ (์๋ฒ์ ๋์ผ)
- "Connect to Game" ๋ฒํผ ํด๋ฆญ
3. ๊ฒ์ ์์
- ์ต์ 4๋ช ์ด์ ์ ์ ํ์
- ์๋ฒ์์ "Start Game" ๋ฒํผ ํด๋ฆญ
๊ฐ๋ฐ ๋ฐ ํ ์คํธ๋ฅผ ์ํ ์๋ํ ๋ชจ๋์ ๋๋ค.
ํ์ฑํ ๋ฐฉ๋ฒ:
MafiaGameServer.java 74๋ฒ ์ค:
private static final boolean TEST_MODE = true;MafiaGameClientMain.java 52๋ฒ ์ค:
private static final boolean TEST_MODE = true;ํ ์คํธ ๋ชจ๋ ๊ธฐ๋ฅ:
- ํด๋ผ์ด์ธํธ: ์๋ ๋ก๊ทธ์ธ (๋๋ค ์ด๋ฆ ์์ฑ)
- ์๋ฒ: 8๋ช ์ ์ ์ ์๋ ๊ฒ์ ์์
๋น ๋ฅธ ํ ์คํธ:
# ์ปดํ์ผ
mvn clean compile
# ์๋ฒ ์คํ
java -cp target/classes mafia.game.MafiaGameServer &
# ํด๋ผ์ด์ธํธ 8๊ฐ ์คํ
for i in {1..8}; do
java -cp target/classes mafia.game.MafiaGameClientMain &
sleep 0.5
done1๋จ๊ณ: ๋๊ธฐ (WAITING)
- ์ต์ 4๋ช ์ด์ ์ ์
- ์๋ฒ ๊ด๋ฆฌ์๊ฐ ๊ฒ์ ์์
2๋จ๊ณ: ๋ฐค (NIGHT) - 30์ด
- ๋งํผ์: ์ ๊ฑฐํ ๋์ ์ ํ
- ์์ฌ: ๋ณดํธํ ๋์ ์ ํ
- ๊ฒฝ์ฐฐ: ์กฐ์ฌํ ๋์ ์ ํ
- ๊ธฐํ ํน์ ์ง์ : ๋ฅ๋ ฅ ์ฌ์ฉ
- ์๋ฏผ: ๋๊ธฐ
3๋จ๊ณ: ๋ฐค ๊ฒฐ๊ณผ ๋ฐํ
- ๋งํผ์์๊ฒ ์ ๊ฑฐ๋ ์ฌ๋ ๊ณต๊ฐ
- ์์ฌ ๋ณดํธ ์ฑ๊ณต ์ ์์กด
- ๊ตฐ์ธ ๋ฐฉ์ด๋ง์ผ๋ก ์์กด ๊ฐ๋ฅ
4๋จ๊ณ: ๋ฎ (DAY) - 30์ด
- ์์ ํ ๋ก
- ์์ฌ๋๋ ์ฌ๋ ์ฐพ๊ธฐ
- ๊ธฐ์ ํน์ข ๋ฐํ (ํด๋น ์)
- ์ฑ์ง์ ๋ถํ (ํด๋น ์)
5๋จ๊ณ: ํฌํ (VOTE) - 20์ด
- ์์ฌ๋๋ ์ฌ๋์๊ฒ ํฌํ
- ์ต๋ค ๋ํ์ ์ ๊ฑฐ
- ๋์ ์ ์๋ฌด๋ ์ ๊ฑฐ ์ ๋จ
6๋จ๊ณ: ์ตํ์ ๋ฐ๋ก - 15์ด
- ์ ๊ฑฐ ๋์์์ ๋ณ๋ก
- ์ฐฌ๋ฐ ํฌํ๋ก ์ต์ข ๊ฒฐ์
7๋จ๊ณ: ์น๋ฆฌ ์กฐ๊ฑด ํ์ธ
- ์๋ฏผ ํ ์น๋ฆฌ: ๋ชจ๋ ๋งํผ์ ์ ๊ฑฐ
- ๋งํผ์ ํ ์น๋ฆฌ: ๋งํผ์ ์ โฅ ์๋ฏผ ์
์กฐ๊ฑด ๋ฏธ์ถฉ์กฑ ์ 2๋จ๊ณ๋ก ๋ฐ๋ณต
์๋ฏผ ํ ์ ๋ต:
- ๊ฒฝ์ฐฐ ์ ๋ณด ์ ์คํ ํ๋จ
- ํฌํ ํจํด ๋ถ์
- ํ๋ ํจํด ๊ด์ฐฐ
- ์ ๋ณด ๊ณต์
๋งํผ์ ํ ์ ๋ต:
- ์๋ฏผ์ฒ๋ผ ์์ฐ์ค๋ฝ๊ฒ ํ๋
- ๋ฅ๋ ฅ์(์์ฌ/๊ฒฝ์ฐฐ) ์ฐ์ ์ ๊ฑฐ
- ๋ค๋ฅธ ํ๋ ์ด์ด์๊ฒ ์์ฌ ์ ๋
- ๋๋ฃ์ ํฌํ ๋ถ์ฐ
๋งํผ์ (MAFIA)
- ๋ฐค์ ์๋ฏผ ํ ๋ช ์ ๊ฑฐ
- ๋งํผ์ ์ โฅ ์๋ฏผ ์ ์ ์น๋ฆฌ
- 4๋ช : 1๋ช / 5๋ช ์ด์: 2๋ช
์คํ์ด (SPY)
- ๋ฐค์ ํ ๋ช ์ ์ง์ ์กฐ์ฌ
- ๋งํผ์ ์กฐ์ฌ ์ ์ ์ ํ์ฌ ๋งํผ์ ํ ํฉ๋ฅ
- ๊ตฐ์ธ์๊ฒ ์ ์ฒด ๋ ธ์ถ
๋ง๋ด (MADAME)
- ๋ฎ ํฌํ๋ก ํ๋ ์ด์ด ์ ํน
- ์ ํน๋นํ ํ๋ ์ด์ด๋ ๋ฐค ๋ฅ๋ ฅ ์ฌ์ฉ ๋ถ๊ฐ
- ๋งํผ์ ์ ํน ์ ์ ์ ํ์ฌ ๋งํผ์ ํ ํฉ๋ฅ
์์ฌ (DOCTOR)
- ๋ฐค์ ํ ๋ช ๋ณดํธ
- ๋งํผ์ ๊ณต๊ฒฉ ๋ฐฉ์ด
๊ฒฝ์ฐฐ (POLICE)
- ๋ฐค์ ํ ๋ช ์กฐ์ฌ
- ๋งํผ์ ์ฌ๋ถ ํ์ธ
์ ์น์ธ (POLITICIAN)
- ํฌํ๋ก ์ฃฝ์ง ์์
- 2ํ ํ์ฌ
๊ตฐ์ธ (SOLDIER)
- ๋งํผ์ ๊ณต๊ฒฉ 1ํ ๋ฐฉ์ด
- ์คํ์ด ์กฐ์ฌ ์ ์คํ์ด ์ ์ฒด ํ์
์๋งค (SHAMAN)
- ์ฃฝ์ ์ ๋ํ ํ์ธ
- ํ ๋ช ์ฑ๋ถ์์ผ ์ง์ ํ์ธ
๊ธฐ์ (REPORTER)
- 2~8์ผ์ฐจ ๋ฐค์ ํ ๋ช ์ทจ์ฌ
- ๋ค์ ๋ ์ง์ ๊ณต๊ฐ
๋๊ตด๊พผ (GHOUL)
- ์ฒซ๋ ๋ฐค ๋งํผ์ ํฌ์์์ ์ง์ ํ๋
๊ฑด๋ฌ (GANGSTER)
- ๋ฐค๋ง๋ค ํ ๋ช ์ ํ
- ๋ค์ ๋ ํฌํ ๊ธ์ง
์ฑ์ง์ (PRIEST)
- ๊ฒ์ ์ค 1ํ ๋ถํ ๋ฅ๋ ฅ
- ์ฑ๋ถ๋ ํ๋ ์ด์ด๋ ๋ถํ ๋ถ๊ฐ
์๋ฏผ (CITIZEN)
- ํน๋ณ ๋ฅ๋ ฅ ์์
- ํฌํ๋ก ๋งํผ์ ์ฐพ๊ธฐ
๋ฎ ์๊ฐ์ ์ต๋ช ์ชฝ์ง ์ ์ก ๊ฐ๋ฅ
์ฌ์ฉ๋ฒ:
/whisper [๋์] [๋ด์ฉ]
ํน์ง:
- ์ต๋ช ์ ์ก
- ์๊ฐ๋น ์ต๋ 10๊ฐ ์ ํ
- 200์ ์ ํ
๊ฒ์ ์์ ์ 30์ด ๋๊ธฐ์ค
๊ธฐ๋ฅ:
- ์ค๋น ์ํ ํ์ธ
- ์ญํ ์ ํธ๋ ์ค์ (์ต๋ 3๊ฐ)
- ์์ ์ฑํ
- ๋ชจ๋ ์ค๋น ์ ์๋ ์์
ํ๋ ์ด์ด ๊ธฐ๋ก ์ถ์ ๋ฐ ์ ์
๋ช ๋ น์ด:
/stats - ๋ด ํต๊ณ
/leaderboard - ๋ฆฌ๋๋ณด๋
/achievements - ์
์ ํ์ธ
์ ์ ๋ชฉ๋ก:
- ์ฒซ ์น๋ฆฌ
- ์๋ฒฝํ ๋งํผ์
- ์์กด์ (10๊ฒ์ ์ฐ์)
- ๋ช ํ์ (๋งํผ์ 3๋ช ์ด์ ์ฐพ๊ธฐ)
- ๋ถ์ฌ์กฐ (2๋ฒ ๋ถํ)
- ๋ฒ ํ ๋ (100๊ฒ์)
- ์ฑํผ์ธ (์น๋ฅ 70% ์ด์)
ํฌํ ์งํ ์ํฉ ์ค์๊ฐ ํ์
๊ธฐ๋ฅ:
- ๋ํ์ ๋ฐ ์ฐจํธ
- ํฌํ์จ ๊ณ์ฐ
- ๊ณต๊ฐ/์ต๋ช ๋ชจ๋
์์:
ํ๋ ์ด์ด1: โโโโโโโโโโ 8ํ
ํ๋ ์ด์ด2: โโโโโโโโโโ 7ํ
ํ๋ ์ด์ด3: โโโโโโโโโโ 4ํ
๋ชจ๋ ์ญํ ์ ์์ธ ์ค๋ช
๋ช ๋ น์ด:
/guide - ๋ด ์ญํ ๊ฐ์ด๋
/guide MAFIA - ๋งํผ์ ๊ฐ์ด๋
/tutorial - ๊ธฐ๋ณธ ํํ ๋ฆฌ์ผ
/help - ๋์๋ง
์ด๋ชจ์ง๋ก ๊ฐ์ ํํ
๋ช ๋ น์ด:
/emotion THUMBS_UP - ๐
/emotion SHOCKED Player1 - Player1์๊ฒ ๐ฑ
/emotions - ์ด๋ชจ์ง ๋ชฉ๋ก
์ด๋ชจ์ง ์ข ๋ฅ:
- ๊ธ์ : ๐ ๐ โค๏ธ ๐ ๐
- ๋ถ์ : ๐ ๐ก ๐ข ๐
- ์ค๋ฆฝ: ๐ค ๐ ๐คท
- ๊ฒ์: ๐ฑ ๐ฏ ๐
โ ๏ธ ๐ค ๐ญ ๐
์ฐ๊ฒฐ ๋๊น ์ 30์ด ๋ด ์ฌ์ ์ ๊ฐ๋ฅ
๊ธฐ๋ฅ:
- ๊ฒ์ ์ํ ์๋ ์ ์ฅ
- ์ญํ , ์ ๋ณด ๋ณต์
- ์ฑํ ํ์คํ ๋ฆฌ ์ ๊ณต
- ํ์์์ ์ ์๋ ์ฒ๋ฆฌ
์์ฆ๋ณ ํน๋ณ ์ด๋ฒคํธ
ํฌ๋ฆฌ์ค๋ง์ค ์ด๋ฒคํธ (12์):
- ์ฐํ๊ฐ ๋๋ค ํ๋ ์ด์ด์๊ฒ 2ํ ์คํฌ ์ ๋ฌผ
- ํฌ๋ฆฌ์ค๋ง์ค ํ ๋ง ๋ฉ์์ง
ํฅํ ์ถ๊ฐ ์์ :
- ํ ๋ก์ (10์): ๋ฑํ์ด์ด, ๋๋์ธ๊ฐ
- ์ค๋ (1-2์): ์ ์์ด, ์กฐ์๋
- ์ฌ๋ฆ (7-8์): ๋ผ์ดํ๊ฐ๋, ์์ด
๋งํผ์2/
โโโ src/main/java/mafia/game/
โ โโโ MafiaGameServer.java # ์๋ฒ ๋ฉ์ธ
โ โโโ MafiaGameClientMain.java # ํด๋ผ์ด์ธํธ ๋ก๊ทธ์ธ
โ โโโ MafiaGameClientView.java # ํด๋ผ์ด์ธํธ ๊ฒ์ ํ๋ฉด
โ โ
โ โโโ models/ # ๋ฐ์ดํฐ ๋ชจ๋ธ
โ โ โโโ PlayerStatistics.java
โ โ โโโ Message.java
โ โ
โ โโโ features/ # ๊ธฐ๋ฅ ๋ชจ๋
โ โ โโโ WhisperManager.java # ์ชฝ์ง ์์คํ
โ โ โโโ LobbyManager.java # ๋ก๋น ์์คํ
โ โ โโโ StatisticsManager.java # ํต๊ณ ์์คํ
โ โ โโโ VoteTracker.java # ํฌํ ์ง๊ณ
โ โ โโโ RoleGuideManager.java # ์ญํ ๊ฐ์ด๋
โ โ โโโ EmotionManager.java # ๊ฐ์ ํํ
โ โ โโโ ReconnectionManager.java # ์ฌ์ ์ ๊ด๋ฆฌ
โ โ
โ โโโ events/ # ์ด๋ฒคํธ ์์คํ
โ โโโ EventModeManager.java
โ
โโโ src/main/resources/
โ โโโ GameSound/ # ๊ฒ์ ์ฌ์ด๋
โ โโโ info/ # ์ด๋ฏธ์ง ๋ฆฌ์์ค
โ
โโโ game_data/statistics/ # ํ๋ ์ด์ด ํต๊ณ ์ ์ฅ
โโโ pom.xml # Maven ์ค์
โโโ README.md # ์ด ํ์ผ
# ์ปดํ์ผ๋ง
mvn compile
# ํ
์คํธ ๋ฐ ํจํค์ง
mvn clean package
# ํ
์คํธ ๊ฑด๋๋ฐ๊ณ ๋น๋
mvn clean package -DskipTestsSingleton Pattern
- ๋ชจ๋ ๋งค๋์ ํด๋์ค
Observer Pattern
- ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์คํ
Strategy Pattern
- ์ญํ ๋ณ ์ ๋ต
Builder Pattern
- ๋ณต์กํ ๊ฐ์ฒด ์์ฑ
Memento Pattern
- ์ฌ์ ์ ์ํ ์ ์ฅ
1. ์ ๋งค๋์ ์์ฑ
public class CustomManager {
private static CustomManager instance;
public static synchronized CustomManager getInstance() {
if (instance == null) {
instance = new CustomManager();
}
return instance;
}
private CustomManager() {
// ์ด๊ธฐํ
}
}2. ์๋ฒ์ ํตํฉ
public class MafiaGameServer {
private CustomManager customManager;
private void initializeManagers() {
customManager = CustomManager.getInstance();
}
}EventMode newEvent = new EventMode.Builder("NEW_EVENT", "์ ์ด๋ฒคํธ")
.description("์ค๋ช
")
.activePeriod(Month.APRIL, 1, Month.APRIL, 30)
.addSpecialRole("NEW_ROLE", "์ ์ญํ ", "๋ฅ๋ ฅ")
.build();
EventModeManager.getInstance().registerEvent(newEvent);GitHub Actions ์๋ ๋น๋ ๋ฐ ๋ฆด๋ฆฌ์ค
๋ฆด๋ฆฌ์ค ๋ฐฉ๋ฒ:
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0- ์ธ์ด: Java 17
- ๋น๋: Maven 3.x
- GUI: Java Swing
- ๋คํธ์ํฌ: Java Socket
- ์ฌ์ด๋: Java Sound API
- CI/CD: GitHub Actions
์๋ฒ โ ํด๋ผ์ด์ธํธ:
ROLE:์ญํ ๋ช
- ์ญํ ๋ฐฐ์
PHASE:๋จ๊ณ๋ช
- ๊ฒ์ ๋จ๊ณ ๋ณ๊ฒฝ
PLAYERS:์ด๋ฆ1,์ด๋ฆ2,... - ํ๋ ์ด์ด ๋ชฉ๋ก
DEAD:true/false - ์ฌ๋ง/๋ถํ
SYSTEM: ๋ฉ์์ง - ์์คํ
๋ฉ์์ง
ํด๋ผ์ด์ธํธ โ ์๋ฒ:
/login ์ด๋ฆ - ๋ก๊ทธ์ธ
NIGHT_ACTION:์ญํ :๋์ - ๋ฐค ํ๋
VOTE:๋์ - ํฌํ
[์ด๋ฆ] ๋ฉ์์ง - ์ฑํ
/exit - ์ข
๋ฃ
์ด ํ๋ก์ ํธ๋ ๊ต์ก ๋ชฉ์ ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
์ด์์ PR์ ์ธ์ ๋ ํ์ํฉ๋๋ค!
GitHub Issues: https://github.com/khg9859/Mafia/issues
๋ฒ์ : 2.0
์ต์ข
์
๋ฐ์ดํธ: 2025-12-04