사용자로부터 문자를 입력받아 숨겨진 단어를 맞추는 행맨 게임을 작성 하기
- 횟수가 정해진 반복(문자열 검사)에는 for 사용
- 사용자 입력 문자에 따른 전체 프로그램 반복에는 while 사용
- 문자열 길이 범위까지 반복 자주 실행되므로 문자열 길이 변수로 생성
CheckInput(string input)
- 입력받은 문자열과 정답 문자열을 비교하는 함수
- 인덱스의 문자가 서로 같으면 추측된 단어 배열의 인덱스 문자를 _에서 맞춘 문자로 변경
- 입력받은 문자열 길이가 정답 문자열과 다른 경우를 고려하여 검사 범위 보정
CheckEqual()
- 추측한 문자 배열이 정답 문자열과 일치하는지 확인하는 함수
- 추측한 문자 배열을 문자열로 만들고 정답 문자열과 바로 비교하는 방법도 있음(오버헤드 있을 것으로 예상)
TODO : 현재 방법과 문자 배열 병합하고 비교하는 방법 성능 비교해보기
/******************* 행맨 프로그램 *******************/
/* 기본 설정 초기화 */
string secretWord = "hangman"; // 맞춰야 할 단어
int answerLen = secretWord.Length; // 정답 문자열의 길이
// 사용자가 맞춘 문자 저장하는 배열
// 맞춰야 할 단어의 길이만큼 공간 할당
char[] guessWord = new char[answerLen];
for (int i = 0; i < answerLen; i++)
{
// 모두 언더바로 초기화
guessWord[i] = '_';
}
int attempts = 6; // 가능한 시도 횟수
bool wordGuessed = false; // 사용자가 단어 모두 맞췄는지 확인
/* 게임 실행부 */
while (true)
{
// 문제 제시하며 지금까지 사용자가 맞춘 문자와 가능한 시도 횟수를 표시
Console.Write("Guess the word ");
for (int i = 0; i < answerLen; i++)
{
Console.Write(guessWord[i]);
}
Console.Write($" (life : {attempts}) => ");
string input = Console.ReadLine(); // 사용자 입력문자열
// 문자열 검사
CheckInput(input); // 정답문자열과 입력문자열 비교
wordGuessed = CheckEqual(); // 정답문자열과 추측된 문자 배열 비교
// 정답 여부에 따른 분기
// 정답을 맞추면 축하메시지를 띄우고 프로그램 종료
if (wordGuessed)
{
Console.WriteLine($"Congratulations! The Answer is {secretWord}.");
return;
}
// 정답을 맞추지 못하면
else
{
attempts--; // 시도 횟수 차감
if (attempts <= 0) // 모든 시도 횟수 소진하면
{
// 종료 메시지 띄우고 프로그램 종료
Console.WriteLine("GAME OVER");
return;
}
else // 아직 시도 횟수 남아있으면
{
// 다시 시도하라는 메시지 띄우기
Console.WriteLine("Try again!");
}
}
}
/* 함수부 */
// 입력문자열을 정답문자열과 비교해 추측한 문자 배열 변경하는 함수
void CheckInput(string input) // 입력문자열은 while 내부 선언이므로 인자로 받기
{
// 검사할 문자열 길이 조정
// 입력받는 문자열 길이에 따른 예외 발생 방지
int len = Math.Min(input.Length, answerLen);
for (int i = 0; i < len; i++)
{
if (input[i] == secretWord[i])
{
guessWord[i] = input[i];
}
}
}
// 추측한 문자 배열이 정답문자열과 같은지 확인하는 함수
bool CheckEqual()
{
for (int i = 0; i < answerLen; i++)
{
// 문자가 다르면 바로 false로 반환
if (guessWord[i] != secretWord[i])
return false;
}
// 모든 문자가 동일하므로 true를 반환
return true;
}'내일배움캠프 > 달리기반' 카테고리의 다른 글
| [내배캠][Unity_6기][과제] 8. 숫자 야구 게임 (0) | 2024.09.02 |
|---|---|
| [내배캠][Unity_6기][과제] 6. 배열의 최대, 최소 찾기 (0) | 2024.09.01 |
| [내배캠][Unity_6기][과제] 5. 구구단 출력 (0) | 2024.09.01 |
| [내배캠][Unity_6기][과제] 4. 숫자 맞추기 게임 (0) | 2024.09.01 |
| [내배캠][Unity_6기][과제] 3. 팩토리얼 계산 (0) | 2024.09.01 |