[Swift] Baseball Game 만들기

술술·2024년 3월 14일

TIL

목록 보기
7/21

야구 게임 만들기

📌 게임의 기본 규칙

1에서 9까지의 서로 다른 임의의 수 3개를 정하고 맞추는 게임
같은 자리에 같은 숫자가 있는 경우 스트라이크, 다른 자리에 숫자가 있는 경우 볼입니다.

  • 정답 : 456 인 경우
    • 435를 입력한 경우 → 1스트라이크 1볼
    • 357를 입력한 경우 → 1스트라이크
    • 678를 입력한 경우 → 1볼
    • 123를 입력한 경우 → Nothing

일단 나의 정답을 만드는 코드


func makeAnswer() -> String {
    
    var numbers: [Int] = []
    var stringNumbers: [String] = []
    var answers: [String] = []
    
    for number in 102...987 {
      numbers.append(number)
    }
    
    stringNumbers = numbers.map({ number in
      String(number)
    })
    
    for str in stringNumbers {
      if str[str.startIndex] != str[str.index(after: str.startIndex)] &&
          str[str.index(after: str.startIndex)] != str[str.index(before: str.endIndex)] &&
          str[str.startIndex] != str[str.index(before: str.endIndex)] &&
          !str.contains("0") {
        answers.append(str)
      }
    }
    
    return answers.randomElement() ?? "잘못된 숫자입니다."
  }
}

나는 makeAnswer의 리턴값을 String으로 만들었다. 이유는... 그냥 그럴 생각은 없었는데 마지막에 String으로 만든 배열을 굳이 Int로 바꾸어야 하나? 라는 아주 작은 쓸모없는 생각..으로..😓

나는 숫자를 일단 배열에 다 넣은 뒤 거기서 조건에 맞는 숫자만 배열에 추가하는 식으로 진행했는데, 간단하게 Int로 만들 수 있는 방법이 있었다.
다음 단계를 봤을 때, 과제의 의도도 이게 아닌 것 같긴하다.
그래도 이렇게 만든 덕분에 String에 대해 공부를 할 수 있었다.

그래서 다음에는 간단하게 Int로 만들 수 있는 방법을 사용해서 다시 Int 버전으로 만들어 보려고 한다.

아무튼 그 다음! 이제 게임을 시작하고, 게임을 진행해나가는 과정이다.

func start() {
    let answer = makeAnswer()
    print("⚾️ 안녕하세요! 야구 게임을 시작합니다 ⚾️")
    print("1에서 9까지의 서로 다른 임의의 수 3개를 정하고 맞추는 게임입니다")
    print("0도 포함되면 안 됩니다!")
    print("숫자를 입력해주세요!")

    var correctNumber: Bool = true
    var answerNumbers = Array(answer)
    
    while correctNumber {
      
      var input = readLine()!
      var inputNumbers = Array(input)
      var strike = 0
      var ball = 0
      
      if (Int(input) == nil) {
        print("문자열 말고, 숫자를 입력해주세요.")
      } else if Int(input) ?? -1 < 0 {
        print("음수입니다. 양수를 입력해주세요.")
      } else if input.count != 3 {
        print("세 자리 숫자를 입력해주세요.")
      } else if input[input.startIndex] == input[input.index(after: input.startIndex)] ||
                  input[input.index(after: input.startIndex)] == input[input.index(before: input.endIndex)] ||
                  input[input.startIndex] == input[input.index(before: input.endIndex)] ||
                  input.contains("0") {
        print("1-9까지의 서로 다른 임의의 수 3개를 입력해주세요. 0이 들어가도 안 됩니다.")
      } else if input.count == 3 {
        for index in 0...2 {
          if inputNumbers[index] == answerNumbers[index] {
            strike += 1
          } else if answerNumbers.contains(inputNumbers[index]) {
            ball += 1
          }
        }
        
        if strike == 3 {
          print("정답입니다! 게임이 끝났습니다.")
          correctNumber = false
        } else if strike == 0 && ball == 0 {
          print("스트라이크와 볼 중 아무것도 해당되지 않습니다.")
        } else {
          print("\(strike) 스트라이크, \(ball) 볼")
        }
      }
      
    }
  }

과제를 제출하는 시점에 고쳐야 할 곳 들이 많이 보였는데,
일단 과제 제출을 하고 싶었고, 너무 String에 시달려서 그만 보고 싶었다...🥲
그래서 그냥 제출해버렸다..!

다음엔 Int에 시달리겠지?

Int로 만들면서 고쳐보려고 한다.
사용자의 입력을 받아오는 부분도 그냥 처음부터 배열로 만들어도 될 것 같고..🤔
배열이 아닌 다른 방법이 있을텐데 그 방법을 사용해보고 싶기도 하다.
문자열인지 아닌지 알아보는 방법도 여러가지가 있겠지?

제일 맘에 안 드는 부분은 서로 다른 임의의 수를 구별해내는 부분.
다른 방법이 생각이 났었는데 지금은 또 생각이 안 난다. 생각이 날듯 말듯한...

profile
Hello

0개의 댓글