24.06.14 Today I Learned
Command Line Tool로 숫자 야구게임 만들기
여기서 이제 가독성을 위해 .swift파일을 생성해 각 클래스를 나눠서 만들던중 파일이 다 날아가서 처음부터 다시 시작했다.
아래 코드블럭은 .swift 파일에 각 클래스를 나눈 블럭이다
// randomNumberGenerator.swift
import Foundation
// 임의의 세 자리 숫자를 생성하는 클래스
class RandomNumberGenerator {
// 세 자리 랜덤 숫자 생성 메서드
func generateRandomNumber() -> String {
var randomnumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
randomnumbers.shuffle() // 숫자 배열을 무작위로 섞음
var result = "" // result 문자열 초기화
for i in 0..<3 { // 세자리 숫자를 생성하기 위해 0 ~ 2까지 반복
result.append(String(describing: randomnumbers[i]))
// String(describing:)으로 number[i]의 값을 문자열로 변환
// result라는 문자열을 담고있는 배열을 만듦
}
return result // 세 자리 랜덤 숫자 문자열 반환
}
}
여기는 컴퓨터가 임의로 세 자리의 랜덤한 숫자를 생성하는 클래스다.
변수로 randomnumbers를 생성해주고 0부터 9까지의 범위를 정해주었다.
그 후 .shuffle()를 사용해 randomnubers의 배열을 랜덤으로 섞어주었다.
추가로 for문에서 세자리 숫자를 생성하기위해 0번째 ~ 2번째 자릿수를 만들기위해 0..<3의 범위를 지정해주었다.
import Foundation
// 게임 로직을 처리하는 클래스
class gameProgress {
// 스트라이크와 볼을 계산하는 메서드
func calculateStrikeAndBall(guess: String, answer: String) -> (strike: Int, ball: Int) {
var strike = 0 // 스트라이크 개수 초기화
var ball = 0 // 볼 개수 초기화
let guess = Array(guess) // 추측한 숫자를 문자 배열로 변환
let answer = Array(answer) // 정답 숫자를 문자 배열로 변환
// 각 자리 숫자를 비교하여 스트라이크와 볼 개수 계산
for i in 0..<guess.count {
if guess[i] == answer[i] {
strike += 1 // 위치와 값이 모두 일치하면 스트라이크 증가
} else if answer.contains(guess[i]) {
ball += 1 // 값은 일치하지만 위치가 다르면 볼 증가
}
}
return (strike, ball) // 스트라이크와 볼 개수를 return
}
}
strike와 ball 이라는 변수를 생성하고 개수를 초기화 시켜주었다.
그 후 사용자의 추측이라는 의미의 guess, 정답이라는 answer이라는 변수를 생성하고 이 두 변수를 각각 String타입의 문자배열로 변환했다.
for문을 이용해 추측과 정답의 배열이 모두 일치하면 strike증가, 값은 맞지만 위치가 다르다면(같은 문자를 함유하고 있다의미) ball을 등장하도록 했다.
import Foundation
// 사용자 입력을 관리하는 클래스
class userInput {
// 사용자로부터 세 자리 숫자 입력받기
func getUserInput() -> String? {
print("세 자리 숫자를 입력하세요: ", terminator: "") // 사용자에게 입력 요구 메시지 출력
return readLine() // 사용자 입력을 문자열로 반환
}
}
이 클래스는 사용자가 입력한 숫자를 관리하는 클래스이다.
사용자로부터 "세 자리 숫자를 입력하세요"라는 문구로 사용자에게 입력을 요구하고 요구받은 세 자리 숫자를 문자열로 반환받는다.
import Foundation
// 게임을 진행하는 함수
func playGame() { // playGame이라는 함수를 만듦
let randomNumberGenerator = RandomNumberGenerator() // 랜덤 숫자 생성기 인스턴스 생성
let gameLogic = gameProgress() // 게임 로직 처리기 인스턴스 생성
let inputManager = userInput() // 입력 관리자 인스턴스 생성
let answer = randomNumberGenerator.generateRandomNumber() // 정답 생성
var attempts = 0 // 시도 횟수 초기화
let maxAttempts = 9 // 최대 시도 횟수
print("게임을 시작합니다. 세 자리 숫자를 맞춰보세요.") // 게임 시작 메시지 출력
while attempts < maxAttempts {
attempts += 1 // 시도 횟수 증가
// 사용자로부터 추측 숫자를 입력받음
if let input = inputManager.getUserInput(), input.count == 3, let _ = Int(input) {
let (strike, ball) = gameLogic.calculateStrikeAndBall(guess: input, answer: answer) // 스트라이크와 볼 계산
// 결과 출력
if strike == 0 && ball == 0 {
print("\(attempts)회차: 아웃")
} else {
print("\(attempts)회차: \(strike) 스트라이크, \(ball) 볼")
}
// 정답 여부 확인
if strike == 3 {
print("성공. \(attempts)번 만에 맞췄습니다.") // 정답 메시지 출력
return // 정답을 맞추면 게임 종료
}
} else {
print("잘못된 입력입니다. 세 자리 숫자를 입력하세요.") // 오류 메시지 출력
}
}
// 최대 시도 횟수를 넘기면 게임 종료 메시지 출력
print("실패. 최대 시도 횟수를 초과하였습니다. 정답은 \(answer)입니다.")
}
// 게임 시작
playGame() // 게임 실행
playGame이라는 함수를 만들고 그 안에 .swift파일로 따로 만들어놨던 랜덤 숫자 생성기, 게임 로직 처리, 유저 입력 관리를 변수로 따로 지정해줘서 .swfit파일을 불러와서 그 변수에 각각 들어갈 수 있도록 했다.
그 후 사용자가 추측하는 숫자를 입력 받으면, strike, ball, out 총 세 가지 힌트를 주게되고, 1회차에서 9회차까지 반복하도록 했다.
만약 세 가지 숫자가 아니라면, 잘못된 입력이라는 메세지와 함께 회차를 소모하지 않게 설정했다.
추가해야 할 점
1. 프로그램을 시작할 때 안내문구가 나오게하기, 그리고 해당 숫자를 입력했을 때 그 내용이 구현되게 하기
"환영합니다 ! 원하시는 번호를 입력해주세요."
"1. 게임 시작 2. 게임 기록 보기 3. 종료하기"
2. 3번을 눌렀을 때 기록이 초기화되고 프로그램이 종료되도록 하기, 1 ~ 3이외의 입력값에 대해서는 오류 메세지를 보이게하기
'Today I Learned > 2024' 카테고리의 다른 글
24.06.18 Today I Learned (0) | 2024.06.18 |
---|---|
24.06.17 Today I Learned (0) | 2024.06.17 |
24.06.12 Today I Learned (0) | 2024.06.13 |
24.06.11 Today I Learned (0) | 2024.06.11 |
24.06.10 Today I Learned (0) | 2024.06.10 |