[iOS 3주차] 과제2 야구게임 만들기

황석범·2024년 11월 4일
0

내일배움캠프_iOS_5기

목록 보기
11/76

swift로 야구게임 만들기

숫자 야구 게임은 두 명이 즐길 수 있는 추리 게임으로, 상대방이 설정한 3자리의 숫자를 맞히는 것이 목표입니다. 각 자리의 숫자와 위치가 모두 맞으면 '스트라이크', 숫자만 맞고 위치가 다르면 '볼'로 판정됩니다. 예를 들어, 상대방의 숫자가 123일 때 132를 추리하면 1스트라이크 2볼이 됩니다. 이러한 힌트를 활용하여 상대방의 숫자를 추리해 나가는 게임입니다.

Lv1

코드 뼈대를 봐버렸다...

내가 만든 Lv1 코드이다...

콘솔창에 이쁘게 나왔다.. 매번 랜덤으로 잘 박히는지도 확인하였다.
학부때 처음 C언어로 프로그래밍을 배우는 느낌이다.. 재밌다...


Lv2

Lv2를 위해 func checkAnswer 함수와 getNumber 함수를 만들어 주었다. getNumber 는 사용자에게 숫자 3개를 입력받고 숫자 3개 가 입력되면 int를 담은 배열을 return 해준다(중복된 숫자가 들어왔을 때 예외처리를 해야할 것 같은데..). func checkAnswer 는 사용자에게 입력받은 숫자와 랜덤으로 생성한 숫자 3개를 비교하여 strikes와 balls를 알려주는 함수이다.

if let 으로

swift의 입출력 방법을 잘 몰라 참고한 자료
참고->https://dev-dain.tistory.com/287

게임을 실행하는 while문 작성


Lv3

1~9 에서 0~9 까지 숫자를 다루고 0 은 맨 앞에 올 수 없게, 중복으로 사용할 수 없게 변경하면 된다.

Lv3 조건에 맞게 정답 생성 코드 변경하고

입력 받는 조건도 수정해주었다.


Lv4

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' 을 입력하면 게임을 포기하는 기능을 구현하기위해 루프가 도는 함수가 있는 두 개의 클래스들의 순한참조(?)가 되지 않기 위해 closerdelegate 를 사용하였고 게임 기록들을 누적으로 저장하기 위해 UserDefaults를 사용하였다. UserDefaultsstruct 을 그냥 저장할 수가 없어서 structJson 으로 인코딩하여 저장하고 디코딩하여 출력하게 만들어 주었다.


잘 만들어진 것 같다...

profile
iOS 공부중...

0개의 댓글

관련 채용 정보