숫자 야구 게임은 두 명이 즐길 수 있는 추리 게임으로, 상대방이 설정한 3자리의 숫자를 맞히는 것이 목표입니다. 각 자리의 숫자와 위치가 모두 맞으면 '스트라이크', 숫자만 맞고 위치가 다르면 '볼'로 판정됩니다. 예를 들어, 상대방의 숫자가 123일 때 132를 추리하면 1스트라이크 2볼이 됩니다. 이러한 힌트를 활용하여 상대방의 숫자를 추리해 나가는 게임입니다.
코드 뼈대를 봐버렸다...
내가 만든 Lv1 코드이다...
콘솔창에 이쁘게 나왔다.. 매번 랜덤으로 잘 박히는지도 확인하였다.
학부때 처음 C언어로 프로그래밍을 배우는 느낌이다.. 재밌다...
Lv2를 위해
func checkAnswer
함수와getNumber
함수를 만들어 주었다.getNumber
는 사용자에게 숫자 3개를 입력받고숫자 3개
가 입력되면 int를 담은 배열을 return 해준다(중복된 숫자가 들어왔을 때 예외처리를 해야할 것 같은데..).func checkAnswer
는 사용자에게 입력받은 숫자와 랜덤으로 생성한 숫자 3개를 비교하여 strikes와 balls를 알려주는 함수이다.
if let
으로
swift의 입출력 방법을 잘 몰라 참고한 자료
참고->https://dev-dain.tistory.com/287
게임을 실행하는 while문 작성
1~9
에서0~9
까지 숫자를 다루고0
은 맨 앞에 올 수 없게, 중복으로 사용할 수 없게 변경하면 된다.
Lv3 조건에 맞게 정답 생성 코드 변경하고
입력 받는 조건도 수정해주었다.
Lv4 추가 조건이다. Lv3과 다르게 추가할게 많아 보인다.
import Foundation
// BaseballGame 클래스 구현
class Main{
var isRunning = true
let baseballGame = BaseballGame()
let viewGameRecord = saveRecord()
init(){
baseballGame.cancelGameHandler = { [weak self] in
self?.start()
}
}
func start() {
while isRunning {
print("--------------------------------------------------------------------------")
print(" 환영합니다 ! 원하시는 번호를 입력해주세요.")
print(" 1. 게임 시작하기 2. 게임 기록보기 3. 모든 기록 삭제 4. 게임 종료")
print("--------------------------------------------------------------------------")
if let input = readLine() {
switch input {
case "1":
baseballGame.start()
case "2":
viewGameRecord.view()
case "3":
viewGameRecord.removeRecord()
case "4":
print("게임을 종료합니다.")
isRunning = false
default :
print("잘못 입력하셨습니다. 다시 입력해주세요.")
}
}
}
}
}
let app = Main()
app.start()
Main
클래스를 새로 만들어 메뉴화면을 구성해보았다.
//
// ViewGameHistory.swift
// baseball_game
//
// Created by Hwangseokbeom on 11/6/24.
//
import Foundation
import CoreData
struct GameRecord: Codable{
let userName: String
let isWin: Bool
let count: Int
}
class saveRecord{
var records: [GameRecord] = []
func save(userName: String, isWin: Bool, count: Int) {
let record = GameRecord(userName: userName, isWin: isWin, count: count)
records.append(record)
print(records)
if let data = try? JSONEncoder().encode(records) {
UserDefaults.standard.set(data, forKey: "records")
}
print("\n--------------- 게임 기록 저장 ---------------")
for (i, record) in records.enumerated() {
print("\(i+1). \(record.userName)님은 \(record.count)번만에 맞추셨습니다.")
}
}
func view() {
if let data = UserDefaults.standard.data(forKey: "records") {
if var records = try? JSONDecoder().decode([GameRecord].self, from: data) {
records.sort{$0.count < $1.count}
print("\n--------------- 게임 기록 보기 ---------------")
for (i, record) in records.enumerated() {
print("\(i+1)등. \(record.userName)님은 \(record.count)번만에 맞추셨습니다.")
}
}
else{
print("기록된 게임이 없습니다.")
}
}
else{
print("기록된 게임이 없습니다.")
}
}
func removeRecord() {
UserDefaults.standard.removeObject(forKey: "records")
print("모든 기록 삭제")
}
}
게임 기록을 저장하고 저장된 기록을 보고 기록들을 삭제하기 위한
saveRecord
클래스를 구현해 주었다.
Lv6까지 구현하면서 추가적으로 게임이 시작되고 특정값 '000' 을 입력하면 게임을 포기하는 기능을 구현하기위해 루프가 도는 함수가 있는 두 개의 클래스들의 순한참조(?)가 되지 않기 위해
closer
와delegate
를 사용하였고 게임 기록들을 누적으로 저장하기 위해UserDefaults
를 사용하였다.UserDefaults
에struct
을 그냥 저장할 수가 없어서struct
을Json
으로 인코딩하여 저장하고 디코딩하여 출력하게 만들어 주었다.
잘 만들어진 것 같다...