분리해서 관리할 클래스 정리
- IGame ( 인터페이스 )
- Input ( 콘솔에서 받아올 입력 값 , 처리 , 예외 )
- GameManager ( 게임 전체 흐름 / 메인 메뉴 / 루프 담당 )
- 그리고 각 미니게임들..
어제는 GameManager 를 조금 작성했었는데 오늘은 최대한 마무리할수 있게 작성해보자
MainMenu 나 RunGameLoop 는 같은 메서드는 GameManager 에서 작성하는게 좋을것 같다
GameManager 의 역할
크게 세가지로 나눠 작업
- 게임 등록 관리 ( ID 중복 되면 안됨 )
- 메인 메뉴 표시 , 사용자 선택 처리 ( 미니 게임 선택 , 종료 )
- 선택된 게임의 실행 루프 관리 ( 재도전 / 메인메뉴로 복귀 )
public class GameManager
{
private readonly List<IGame> games = new List<IGame>(); // 등록된 게임 목록
private bool running = true; // 프로그램 메인메뉴 루프
public void Register(IGame game) // 게임 등록
{
games.Add(game);
/*foreach (IGame g in games)
{
if (g.Id == game.Id)
{
return; // 등록된 게임은 패스
}
}*/
}
▲Register 에서 중복된 게임 ID 체크 예외 처리를 작성하려다가 말았다.
어차피 협업도 아니고 미니게임을 넣을때 나만 알고 있으면 될것 같아서 일단은 이정도만 작성.
필요하면 주석 없애고 다시 작성해야겠다.
private void MainMenu() // 메인화면
{
Console.Clear();
Console.WriteLine("==============================");
Console.WriteLine(" HoChan MiniGames ");
Console.WriteLine("==============================");
Console.WriteLine("[0] 종료");
for ( int i = 0; i < games.Count; i++ )
{
Console.WriteLine($"[{i+1}] - {games[i].Title}");
}
Console.WriteLine();
}
=====
게임
=====
[1] - 숫자야구
[2] - UP & DOWn
▲메인메뉴에 아스키 아트를 넣어보려고 했는데 폰트가 안맞는지 깨져서 나왔다.
일단은 간단하게 작성하고 꾸미는건 나중에 해야겠다.
public void Run() // 프로그램의 메인 루프를 담당
{
Console.Title = "HoChan Mini Games"; // 콘솔 창 제목 설정
while ( running )
{
MainMenu();
int choice = Input.ReadIntRange("선택: ", 0, games.Count);
if ( choice == 0 ) // 0 입력시 종료
{
running = false; // running 루프 탈출
break;
}
var select = games[choice]; // <<<<<<< 여기 인덱스 나중에 수정해야함
RunGameLoop(select); // 이것도 수정 필요
}
Console.WriteLine("프로그램을 종료합니다.");
}
▲미니게임 만들고 나서 인덱스를 내가 지정해줄지는 아직 고민중이라 일단 보류
한 게임에 대한 재도전 / 메인메뉴 복귀 루프를 관리할 메서드가 필요하다
미니게임에서 종료후 메인메뉴를 이동하도록 각각 넣어줘야하나?
아니면 메서드 하나에서 관리하는게 좋으려나?
RunGameLoop 메서드를 하나 만들어서 관리하는게 좋으려나?
private void RunGameLoop(IGame game)
{
bool retry = true;
while (retry)
{
Console.Clear();
Console.WriteLine($"{game.Title} 시작");
Console.WriteLine("-----");
game.Run();
Console.WriteLine("-----");
Console.WriteLine($"{game.Title} 종료");
Console.WriteLine();
// 한 판이 끝날 때마다 사용자의 행동 묻기
Console.WriteLine("[1] 재도전 [2] 메뉴로 돌아가기");
int r = Input.ReadIntRange("선택: ", 1, 2);
retry = (r == 1); // 1입력 받을 경우 재시도
}
}
메인메뉴의 틀은 갖춰졌다
미니게임을 하나씩 작성해야겠다.
발생한 문제와 해결
1. 람다식의 사용법
public string Id = "UP & DOWN";
public string Id => "UP & DOWN";
작성하면서 문득 든 생각이다
위랑 아래랑 둘다 같지 않나? 어떤 점이 다르지?

물어보기도 하고 검색도 해봤다.
public string Id => "game";
람다식은 그 쓰임새에 따라 여러가지로 해석이 가능한데
위의 코드의 경우는 이렇게 해석할 수 있다.
- public sting Id => "game"
└ public string Id( get { return "game" } );
└ 항상 "game"을 반환 - 절대 값이 바뀌지 않는다는 의미
오늘 다시 알게된 람다식 사용법은 블로그에 다시 정리해야겠다.
2. 인덱스는 0 부터 시작한다

라고 주석을 달아놓고 까먹고 있었다
3. 오늘도 코드를 날려먹었다

새로 써보는 키워드
Up&Down 미니게임 중 일부
▼예전에 작업한 코드
if ( guess < target ) { " UP! " }
if ( target < guess ) { " DOWN! " }
▼수정한 코드
Console.WriteLine( n < cpuChoose ? "UP!" : "DOWN!");
삼항연산자를 쓰면 편하구나
문법
조건식 ? 값 1 : 값 2
조건식이 true 이면 값 1 실행
조건식이 false 이면 값 2 실행
'📖TIL > 🔥Projects' 카테고리의 다른 글
| 프로젝트 진행과정 004 (0) | 2025.10.03 |
|---|---|
| 프로젝트 진행과정 003 (0) | 2025.10.02 |
| 콘솔 프로젝트 진행과정 001 (0) | 2025.10.02 |
| 콘솔 프로젝트 기획 초안 (0) | 2025.10.01 |
| 모의 발표 준비 가이드 (0) | 2025.10.01 |