
안녕하세요! 천하를 호령하는 영웅들의 이야기, '삼국지'를 좋아하시나요? 오늘은 복잡한 그래픽 없이, 오직 텍스트만으로 나만의 삼국지 세계를 만들어보는 아주 특별한 시간을 갖겠습니다.
이 가이드를 따라오시면, 여러분은 군주가 되어 금과 군량을 관리하고, 장수를 등용하며, 천하 통일을 향해 나아가는 간단한 턴제 전략 시뮬레이션 게임을 직접 만들게 됩니다. 자바(Java)의 기본 문법을 활용해 게임의 핵심 로직을 구현하면서 프로그래밍의 진짜 재미를 느껴보세요! 그럼, 지금부터 코드로 천하를 경영해 보겠습니다. ⚔️
게임 컨셉 및 핵심 시스템
먼저 우리가 만들 게임의 간단한 규칙을 정해볼까요?
- 플레이어: 난세를 살아가는 한 명의 군주가 됩니다.
- 핵심 자원: 국력을 나타내는 금(Gold), 군량(Food), 병력(Soldiers) 세 가지 자원을 관리합니다.
- 게임 방식: 턴(Turn) 방식으로 진행되며, 매 턴마다 하나의 명령을 내릴 수 있습니다.
- 핵심 액션: 징병, 훈련, 영토 정벌 등 다양한 명령을 통해 세력을 확장합니다.
- 승리 조건: 3개의 영토를 모두 정복하면 승리하며 게임이 종료됩니다.
자바 코드 구현 단계별 가이드
이제 본격적으로 자바 코드를 작성해 보겠습니다. ThreeKingdomsGame.java라는 하나의 파일에 모든 코드를 담을 거예요.
1. 게임의 기본 틀 만들기
가장 먼저 게임의 상태를 저장할 변수들을 선언하고, 게임이 계속 진행될 메인 루프(Main Loop)를 만듭니다.
import java.util.Scanner;
import java.util.Random;
public class ThreeKingdomsGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
// 게임 기본 자원 설정
int gold = 1000;
int food = 5000;
int soldiers = 200;
int territory = 1; // 시작 영토 1개
int turn = 1;
System.out.println("--- 천하를 호령하라! 삼국지 게임 ---");
System.out.print("군주의 이름을 입력하세요 >> ");
String lordName = scanner.nextLine();
System.out.println("\n" + lordName + " 군주, 난세에 오신 것을 환영합니다.");
// 게임이 종료될 때까지 반복되는 메인 루프
while (territory < 3) {
// 여기에 게임 로직이 들어갑니다.
}
// 게임 종료 후 Scanner 닫기
scanner.close();
}
}
- while (territory < 3): 영토가 3개 미만일 동안 계속 게임을 진행시킨다는 의미의 핵심 루프입니다.
2. 현재 상태 표시 및 명령 메뉴 구현
매 턴이 시작될 때마다 군주가 현재 자원 상황을 보고받고, 어떤 명령을 내릴지 선택할 수 있도록 메뉴를 보여줘야 합니다.
// ... while 루프 안에 이어서 작성 ...
System.out.println("\n---------- [ " + turn + "년차 ] ----------");
System.out.println("현재 상태 > 금: " + gold + " | 군량: " + food + " | 병력: " + soldiers + " | 영토: " + territory + "개");
System.out.println("------------------------------------");
System.out.println("1. 징병 (금 100, 군량 500 소모 -> 병력 50 증가)");
System.out.println("2. 훈련 (금 200 소모 -> 병력 전투력 강화)");
System.out.println("3. 영토 정벌 (병력 300 이상 필요)");
System.out.println("4. 휴식 (턴 종료)");
System.out.print("명령을 내려주세요 >> ");
int choice = scanner.nextInt();
3. 선택에 따른 액션 구현하기
플레이어가 선택한 메뉴(choice)에 따라 각기 다른 동작을 하도록 switch 문을 사용해 코드를 작성합니다.
1. 징병 (Conscription) 자원을 소모하여 병력을 늘립니다. 자원이 부족하면 징병에 실패해야 합니다.
// ... choice 변수 선언 아래에 이어서 작성 ...
switch (choice) {
case 1: // 징병
System.out.println("징병을 시작합니다.");
if (gold >= 100 && food >= 500) {
gold -= 100;
food -= 500;
soldiers += 50;
System.out.println("성공적으로 병력을 모집했습니다! (병력 +50)");
} else {
System.out.println("자원이 부족하여 징병에 실패했습니다.");
}
break;
// ... 다른 case 추가 예정 ...
}
2. 훈련 & 3. 영토 정벌 (Battle) 훈련은 간단히 자원만 소모하는 것으로 처리하고, 영토 정벌은 전투 로직을 추가합니다. 전투는 간단하게 Random 객체를 이용한 확률로 승패를 결정합니다.
// ... case 1 다음에 이어서 작성 ...
case 2: // 훈련
System.out.println("병사들의 훈련을 시작합니다.");
if (gold >= 200) {
gold -= 200;
System.out.println("훈련을 통해 병사들의 사기가 충만해졌습니다!");
} else {
System.out.println("금이 부족하여 훈련을 할 수 없습니다.");
}
break;
case 3: // 영토 정벌
System.out.println("이웃 영토를 정벌하러 출정합니다!");
if (soldiers >= 300) {
System.out.println("적군과의 치열한 전투가 벌어집니다...");
// 전투 승리 확률 70%
if (random.nextInt(10) < 7) {
System.out.println("전투에서 승리했습니다! 새로운 영토를 획득합니다!");
territory++;
soldiers -= 100; // 병력 손실
gold += 500; // 전리품 획득
} else {
System.out.println("전투에서 패배했습니다... 병력을 크게 잃습니다.");
soldiers -= 150; // 더 큰 병력 손실
}
} else {
System.out.println("병력이 300명 이상이어야 출정할 수 있습니다.");
}
break;
// ... 다른 case 추가 예정 ...
4. 휴식 및 턴 증가 휴식을 선택하거나, 어떤 행동이든 끝나면 턴(년차)이 1씩 증가해야 합니다.
// ... case 3 다음에 이어서 작성 ...
case 4: // 휴식
System.out.println("휴식을 취하며 다음 해를 준비합니다.");
break;
default:
System.out.println("잘못된 명령입니다.");
break;
}
turn++; // 어떤 행동을 하든 턴(년차)이 지남
4. 게임 승리 조건 및 엔딩 메시지
while 루프가 종료되는 조건, 즉 territory가 3이 되면 루프 밖으로 빠져나오게 됩니다. 이때 승리 메시지를 출력합니다.
// ... while 루프가 끝난 후, main 메서드 안에 작성 ...
System.out.println("\n====================================");
System.out.println("🎉 천하 통일을 달성했습니다! 🎉");
System.out.println(lordName + " 군주의 이름이 역사에 길이 남을 것입니다.");
System.out.println("최종 시점: " + turn + "년차");
System.out.println("====================================");
전체 소스 코드 및 실행 방법
아래는 위에서 작성한 모든 코드를 합친 완전한 소스 코드입니다.
import java.util.Scanner;
import java.util.Random;
public class ThreeKingdomsGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
// 게임 기본 자원 설정
int gold = 1000;
int food = 5000;
int soldiers = 200;
int territory = 1; // 시작 영토 1개
int turn = 1;
System.out.println("--- 천하를 호령하라! 삼국지 게임 ---");
System.out.print("군주의 이름을 입력하세요 >> ");
String lordName = scanner.nextLine();
System.out.println("\n" + lordName + " 군주, 난세에 오신 것을 환영합니다.");
// 게임이 종료될 때까지 반복되는 메인 루프
while (territory < 3) {
System.out.println("\n---------- [ " + turn + "년차 ] ----------");
System.out.println("현재 상태 > 금: " + gold + " | 군량: " + food + " | 병력: " + soldiers + " | 영토: " + territory + "개");
System.out.println("------------------------------------");
System.out.println("1. 징병 (금 100, 군량 500 소모 -> 병력 50 증가)");
System.out.println("2. 훈련 (금 200 소모 -> 병력 전투력 강화)");
System.out.println("3. 영토 정벌 (병력 300 이상 필요)");
System.out.println("4. 휴식 (턴 종료)");
System.out.print("명령을 내려주세요 >> ");
int choice = scanner.nextInt();
switch (choice) {
case 1: // 징병
System.out.println("징병을 시작합니다.");
if (gold >= 100 && food >= 500) {
gold -= 100;
food -= 500;
soldiers += 50;
System.out.println("성공적으로 병력을 모집했습니다! (병력 +50)");
} else {
System.out.println("자원이 부족하여 징병에 실패했습니다.");
}
break;
case 2: // 훈련
System.out.println("병사들의 훈련을 시작합니다.");
if (gold >= 200) {
gold -= 200;
System.out.println("훈련을 통해 병사들의 사기가 충만해졌습니다!");
} else {
System.out.println("금이 부족하여 훈련을 할 수 없습니다.");
}
break;
case 3: // 영토 정벌
System.out.println("이웃 영토를 정벌하러 출정합니다!");
if (soldiers >= 300) {
System.out.println("적군과의 치열한 전투가 벌어집니다...");
// 전투 승리 확률 70%
if (random.nextInt(10) < 7) {
System.out.println("전투에서 승리했습니다! 새로운 영토를 획득합니다!");
territory++;
soldiers -= 100; // 병력 손실
gold += 500; // 전리품 획득
} else {
System.out.println("전투에서 패배했습니다... 병력을 크게 잃습니다.");
soldiers -= 150; // 더 큰 병력 손실
}
} else {
System.out.println("병력이 300명 이상이어야 출정할 수 있습니다.");
}
break;
case 4: // 휴식
System.out.println("휴식을 취하며 다음 해를 준비합니다.");
break;
default:
System.out.println("잘못된 명령입니다.");
break;
}
turn++; // 어떤 행동을 하든 턴(년차)이 지남
}
// 게임 승리
System.out.println("\n====================================");
System.out.println("🎉 천하 통일을 달성했습니다! 🎉");
System.out.println(lordName + " 군주의 이름이 역사에 길이 남을 것입니다.");
System.out.println("최종 시점: " + (turn-1) + "년차");
System.out.println("====================================");
scanner.close();
}
}
실행 방법
- 위 코드를 ThreeKingdomsGame.java 파일로 저장합니다.
- 터미널(명령 프롬프트)을 열고 파일이 저장된 폴더로 이동합니다.
- javac ThreeKingdomsGame.java 명령어로 컴파일합니다.
- java ThreeKingdomsGame 명령어로 게임을 실행하고 천하를 통일해 보세요!
이 간단한 게임을 시작으로 '장수 등용' 시스템을 추가하거나, 적국의 개념을 도입하고, 매년 풍년이나 흉년 같은 랜덤 이벤트를 발생시키는 등 여러분만의 새로운 규칙을 더하며 더욱 멋진 삼국지 게임으로 발전시켜 나갈 수 있습니다. 여러분의 상상력으로 코딩의 즐거움을 만끽해 보세요!