@K-VKO

Как научиться правильно использовать классы?

Я учу Свифт и все вроде бы ок, но я никак не могу понять как использовать классы и структуры.

Прочитав оф. документацию я понимаю что класс может хранить это и это, у него могут быть методы и бла бла бла....
Но когда доходит до: "написать простенькую игру" у меня проблемы "версткой" кода.

Должен быть 1 глобальный класс Game, который хранит все свойства и методы всего что есть в игре ?
Должен быть класс Game, внутри вложенные классы ?
Классы должны быть разделены, например: класс Game, класс Person, класс Board(поле) и т.д. ?
Другой вариант?

Коротко об игре(для примера):
Рисуется поле, добавляется игрок, коробка и портал. (все в консоли)
Нужно сдвинуть коробку в портал чтобы победить.
61a09e5333c3b421009568.jpeg

Пример моего кода

import Foundation


class Game {
    var height: Int
    var width: Int
    private lazy var board: [[String]] = {
            var gameBoard: [[String]] = []
             for i in 0...height - 1 {
                 if i == 0 || i == height - 1 {
                     gameBoard.append(Array(repeating: "", count: width))
                 } else {
                     var basicLine = Array(repeating: "⬜", count: width)
                     basicLine[0] = ""
                     basicLine[basicLine.count - 1] = ""
                     gameBoard.append(basicLine)
                 }
             }
            return gameBoard
   } ()
    private var alienPosition = (1, 1) {
        willSet {
            board[alienPosition.0][alienPosition.1] = "⬜"
        } didSet {
            if boxPosition == (board.count - 2, board.count - 2) {
                clearConsole()
                    print("YOU WIN!!! ")
            } else {
                clearConsole()
                addBoxOnBoard()
                addAlienOnBoard()
                print(self.board.forEach { print($0.joined(separator: "")) })
            }
        }
    }
    private lazy var boxPosition = (board.count / 2, board.count / 2)
    
    init(height: Int, width: Int) {
        self.height = height
        self.width = width
        loading()
        clearConsole()
        addBoxOnBoard()
        addAlienOnBoard()
        addPortalOnBoard()
        print(self.board.forEach { print($0.joined(separator: "")) })
    }
    private func loading() {
        var loadingPercent = 0
        let size = 10
        var squares = Array(repeating: "□", count: size)
        for (i, _) in squares.enumerated() {
           clearConsole()
           squares[i] = "■"
           loadingPercent += 10
           print("\(squares.joined(separator: " ")) \(loadingPercent) %")
            usleep(5)
        }
    }
    private func clearConsole() {
        for _ in 1...30 {
            print("")
        }
    }
    private func addAlienOnBoard() {
        board[alienPosition.0][alienPosition.1] = ""
    }
    private func addBoxOnBoard() {
        board[boxPosition.0][boxPosition.1] = ""
    }
    private func addPortalOnBoard() {
        board[board.count - 2][board.count - 2] = ""
    }
   
    enum Move {
        case up
        case down
        case right
        case left
    }
    func moveAlien(direction: Move) {
        switch direction {
        case .up:
            if (alienPosition.0 - 1, alienPosition.1) != boxPosition && board[alienPosition.0 - 1][alienPosition.1] != " " {
                alienPosition.0 -= 1
            } else if (alienPosition.0 + 1, alienPosition.1) == boxPosition && board[boxPosition.0 - 1][boxPosition.1] != " "{
                boxPosition.0 -= 1
                alienPosition.0 -= 1
            }
        case .down:
            if (alienPosition.0 + 1, alienPosition.1) != boxPosition && board[alienPosition.0 + 1][alienPosition.1] != "" {
                alienPosition.0 += 1
            } else if (alienPosition.0 + 1, alienPosition.1) == boxPosition && board[boxPosition.0 + 1][boxPosition.1] != ""{
                boxPosition.0 += 1
                alienPosition.0 += 1
            }
        case .right:
            if (alienPosition.0, alienPosition.1 + 1) != boxPosition && board[alienPosition.0][alienPosition.1 + 1] != "" {
                alienPosition.1 += 1
            } else if (alienPosition.0, alienPosition.1 + 1) == boxPosition && board[boxPosition.0][boxPosition.1 + 1] != ""{
                boxPosition.1 += 1
                alienPosition.1 += 1
            }
        case .left:
            if (alienPosition.0, alienPosition.1 - 1) != boxPosition && board[alienPosition.0][alienPosition.1 - 1] != "" {
                alienPosition.1 -= 1
            } else if (alienPosition.0, alienPosition.1 - 1) == boxPosition && board[boxPosition.0][boxPosition.1 - 1] != " "{
                boxPosition.1 -= 1
                alienPosition.1 -= 1
            }
        }
    }
    
}


let myGame8 = Game(height: 6, width: 6)

  • Вопрос задан
  • 322 просмотра
Пригласить эксперта
Ответы на вопрос 2
briahas
@briahas
ObjC, Swift, Python
Ваш вопрос относится к архитектуре приложения, а не к "как правильно использовать классы".

И, правильный ответ на ваш вопрос об архитектуре приложения, может дать лишь тот, кто ставил перед вами задачу о написании этого приложения.
- можно написать все в одном классе.
- можно разбить на разные классы.
- можно разбить на разные библиотеки.

Мой ответ - пишите как хотите (это в себе подразумевает и "как нравится" и " как легче" и "как левая пятка захочет"). Вы только учитесь, и если вы не гений, то, полюбому, сначала напишите не правильно. Так что - тренируйтесь, и , как следствие, учитесь.
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Курить принципы SOLID, GRASP, DI, и т.д. Паттерны, опять же. Во время сочинения кода проверять, соответствуют ли твои идеи этим принципам. Конечная цель - "сильная связность и слабая зацепленность", тогда твой код сможет быть простым и понятным.
Но всё в меру.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы