вторник, 20 февраля 2018 г.

Swift 19, 20, 21. Initialization And DeInitialization

В 19, 20 и 21 уроке рассмотрены инициализаторы и деинициализаторы. Эта тема разбита на 3 урока и не имеет явного домашнего задания (кроме разбора документации и примеров из урока).


среда, 7 февраля 2018 г.

Swift 18. Inheritance

В 18 уроке рассмотрена тема наследования классов
Домашнее задание:

/*
 1. Создайте базовый класс артист с "именем", "фамилией" и методом "выступление". У каждого дочернего класса свой метод "выступление" (актер - играет, клоун - развлекает, танцор - танцует), включающее в себя представление участника, в каком жанре выступление и действие (можно просто вывод строки). Создайте дочерний класс "художник", который не хочет, чтобы его называли вы и всегда ставит другое имя, когда вы пытаетесь его назвать. Положить все экземпляры в один массив и пройдясь по нему вызвать у всех выступление.

 2. Базовый класс - "транспортное средство"; свойства - скорость, вместимость, стоимость одной перевозки (все computed properties). Несколько дочерних классов (самолет, корабль, вертолет, машина, поезд) с переопределенными свойствами (для каждого своя скорость вместимость и стоимость). Создать по одному объекту каждому дочернему классу. У всех есть метод, который что-то расчитывает (скорость, расстояние, количество пассажиров), конкретно сколько уйдет денег и времени, чтобы перевести определенное количество человек из пункта А в пункт В. При перевозке 100 и 1000 человек ответить на следующие вопросы:
 -Как быстро мы сможем это сделать и каким транспортом?
 -Стоимость всех перевозок и количество?
 -Какой транспорт быстрее справится и какой более выгодный?

 */

import Foundation
import CoreGraphics

class Artist {
    var firstName: String
    var lastName: String
    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }
    func Show() -> String {
        return "\(firstName) \(lastName) Show:"
    }
}

class Actor: Artist {
    override func Show() -> String {
        return super.Show() + " actor's game"
    }
}

class Clown: Artist {
    override func Show() -> String {
        return super.Show() + " сlown`s joke"
    }
}
class Dancer: Artist {
    override func Show() -> String {
        return super.Show() + " breakdancing"
    }
}
class Painter: Artist {
    override var firstName: String {
        get {
            return String(super.firstName.reversed())
        }
        set {
            super.firstName = newValue
        }
        
    }
    override func Show() -> String {
        return super.Show() + " drawing picture"
    }
    
}

let array: [Artist] = [
    Dancer(firstName: "Dan", lastName: "Cer"),
    Clown(firstName: "Clo", lastName: "Wn"),
    Painter(firstName: "Paint", lastName: "Er"),
    Actor(firstName: "Act", lastName: "Or")
]

for artist in array {
    print(artist.Show())
}

/*
 2
 */
print("\nN 2\n")

class Transport {
    var name: String {
        return ""
    }
    var speed: Double {
        return 0
    }
    var capacity: Int {
        return 0
    }
    var price: Double {
        return 0
    }
    func calculatePriceAndTimeAndCountTrips(distance: Double, passengers: Int) -> (Double, Double, Int) {
        if speed <= 0 || capacity <= 0 || price <= 0 {
            return (0, 0, 0)
        }
        let oneTripTime = distance / speed
        let countTrip = ceil (Double(passengers) / Double(capacity))
        return (price * distance * countTrip, oneTripTime * countTrip, Int(countTrip))
        
    }
}

class Car: Transport {
    
    override var name: String {
        return "Car"
    }
    override var speed: Double {
        return 60
    }
    override var capacity: Int {
        return 5
    }
    override var price: Double {
        return 10
    }
}

class Fly: Transport {
    
    override var name: String {
        return "Fly"
    }
    override var speed: Double {
        return 750
    }
    override var capacity: Int {
        return 500
    }
    override var price: Double {
        return 200
    }
}

class Ship: Transport {
    override var name: String {
        return "Ship"
    }
    override var speed: Double {
        return 40
    }
    override var capacity: Int {
        return 500
    }
    override var price: Double {
        return 50
    }
}

let arrayTransport: [Transport] = [Car(), Fly(), Ship()]
func showTransport(distance: Double, passengers: Int) {
    print("Show Transport for Distance: \(distance) and Passengers: \(passengers)")
    var minPriceTransport = arrayTransport.first!
    var (minPrice, minTime, _) = minPriceTransport.calculatePriceAndTimeAndCountTrips(distance: distance, passengers: passengers)
    var minTimeTransport = arrayTransport.first!
    
    for transport in arrayTransport {
        let (price, time, count) = transport.calculatePriceAndTimeAndCountTrips(distance: distance, passengers: passengers)
        print("Transport type: \(transport.name). Distance: \(distance). Passengers: \(passengers). Price: \(price). Time: \(time). Count Trips: \(count)")
        if minTime > time {
            minTimeTransport = transport
            minTime = time
        }
        if minPrice > price {
            minPriceTransport = transport
            minPrice = price
        }
    }
    print("Minimum Price Transport: \(minPriceTransport.name). Price: \(minPrice)\n Minimum Time Transpoert: \(minTimeTransport.name). Time: \(minTime)")
    
}
showTransport(distance: 1000, passengers: 100)
showTransport(distance: 1000, passengers: 1000)


Console 

Dan Cer Show: breakdancing
Clo Wn Show: сlown`s joke
tniaP Er Show: drawing picture
Act Or Show: actor's game

N 2

Show Transport for Distance: 1000.0 and Passengers: 100
Transport type: Car. Distance: 1000.0. Passengers: 100. Price: 200000.0. Time: 333.333333333333. Count Trips: 20
Transport type: Fly. Distance: 1000.0. Passengers: 100. Price: 200000.0. Time: 1.33333333333333. Count Trips: 1
Transport type: Ship. Distance: 1000.0. Passengers: 100. Price: 50000.0. Time: 25.0. Count Trips: 1
Minimum Price Transport: Ship. Price: 50000.0
 Minimum Time Transpoert: Fly. Time: 1.33333333333333
Show Transport for Distance: 1000.0 and Passengers: 1000
Transport type: Car. Distance: 1000.0. Passengers: 1000. Price: 2000000.0. Time: 3333.33333333333. Count Trips: 200
Transport type: Fly. Distance: 1000.0. Passengers: 1000. Price: 400000.0. Time: 2.66666666666667. Count Trips: 2
Transport type: Ship. Distance: 1000.0. Passengers: 1000. Price: 100000.0. Time: 50.0. Count Trips: 2
Minimum Price Transport: Ship. Price: 100000.0
 Minimum Time Transpoert: Fly. Time: 2.66666666666667



понедельник, 5 февраля 2018 г.

Swift 17. Subscipts

В 17 уроке рассмотрены санскриты или  индексы в квадратных скобках.
Домашнее задание - эмуляция поля и  ходов в игре крестики/нолики:

/*
 Крестики нолики (Средний уровень)

 1. Создать тип, представляющий собой поле для игры в крестики нолики
 На каждой клетке может быть только одно из значений: Пусто, Крестик, Нолик
 Добавьте возможность красиво распечатывать поле

 2. Добавьте сабскрипт, который устанавливает значение клетки по ряду и столбцу,
 причем вы должны следить за тем, чтобы программа не падала если будет введен не существующий ряд или столбец.

 3. Также следите за тем, чтобы нельзя было устанавливать крестик либо нолик туда, где они уже что-то есть. Добавьте метод очистки поля.

 4. Если хотите, добавте алгоритм, который вычислит победителя
 */


enum FieldType: Character {
    case o = "⭕"
    case x = "❌"
    case empty = "⬜"
}

class TicTacToe {
    let size: Int
    var array: [[FieldType]] = [[FieldType]]()
    init(size: Int) {
        self.size = size
        create()
    }
    func create() {
        print("Create new Tic Tac Toe")
        array = [[FieldType]]()
        for _ in 0..<size {
            let line = Array(repeating: FieldType.empty, count: size)
            array.append(line)
        }
    }
    func show() {
        for line in array {
            var lineString = ""
            for character in line {
                lineString += String(character.rawValue)
            }
            print(lineString)
        }
    }
    subscript (x: Int, y: Int) -> FieldType {
        get {
            if x < 0 || y < 0 || x >= size || y >= size {
                return .empty
            }
            return array[y][x]
        }
        set {
            print("\(newValue.rawValue) - (\(x), \(y))")
            if !(x < 0 || y < 0 || x >= size || y >= size || newValue == .empty || array[y][x] != .empty) {
                array[y][x] = newValue
            }
        }
    }
}

let ticTacToe = TicTacToe(size: 3)
ticTacToe.show()
ticTacToe[0,2] = .x
ticTacToe.show()
ticTacToe[1,1] = .o
ticTacToe.show()
ticTacToe[1,2] = .x
ticTacToe.show()
ticTacToe[2,0] = .o
ticTacToe.show()
ticTacToe[2,2] = .x
ticTacToe.show()
ticTacToe.create()
ticTacToe.show()




Console:

Create new Tic Tac Toe
⬜⬜⬜
⬜⬜⬜
⬜⬜⬜
- (0, 2)
⬜⬜⬜
⬜⬜⬜
❌⬜⬜
- (1, 1)
⬜⬜⬜
⬜⭕⬜
❌⬜⬜
- (1, 2)
⬜⬜⬜
⬜⭕⬜
❌❌⬜
- (2, 0)
⬜⬜⭕
⬜⭕⬜
❌❌⬜
- (2, 2)
⬜⬜⭕
⬜⭕⬜
❌❌❌
Create new Tic Tac Toe
⬜⬜⬜
⬜⬜⬜
⬜⬜⬜

Swift 16. Methods

В 16 уроке рассмотрены методы экземпляров и методы классов.
В качестве домашнего задания сделать игру, где управляешь мужиком и толкаешь сердце к заданной точке (сердце с бантиком). Массивом задаю последовательность движений.

enum SpaceType: String {
    case empty = "⬜"
    case player = "👨"
    case box = "💚"
    case finish = "💝"
    case gameOver = "💘"
    
}
enum Direction: String {
    case left, right, up, down
}

class Room {
    let width: Int
    let height: Int
    var roomArray = [[SpaceType]]()
    
    
    init(width: Int, height: Int) {
        self.width = width
        self.height = height
        for _ in 0..<height {
            var line = [SpaceType]()
            for _ in 0..<width {
                line.append(.empty)
            }
            self.roomArray.append(line)
        }
    }
    func show() {
        let wallSymbol: Character = "⬛"
        let topRoom = String(Array(repeatElement(wallSymbol, count: roomArray.count + 2)))
        
        print(topRoom)
        for line in roomArray {
            var stringLine = String(wallSymbol)
            for coordinate in line {
                stringLine += coordinate.rawValue
            }
            stringLine += String(wallSymbol)
            print(stringLine)
        }
        print(topRoom)
    }
    
}

class Box {
    var x: Int
    var y: Int
    let xFinish: Int
    let yFinish: Int
    let room: Room
    init(x: Int, y: Int, xFinish: Int, yFinish: Int, room: Room) {
        self.x = x
        self.y = y
        self.xFinish = xFinish
        self.yFinish = yFinish
        self.room = room
        room.roomArray[y][x] = SpaceType.box
        room.roomArray[yFinish][xFinish] = SpaceType.finish
    }
    func isFinish() -> Bool {
        
        if x == xFinish && y == yFinish {
            room.roomArray[y][x] = .gameOver
            print("Finish")
            return true
        }
        return false
    }
    func move(direction: Direction) -> Bool {
        if isFinish() {
            print("Finish. Game over")
            return false
        }
        print("Box Move:", direction.rawValue)
        var newX = x
        var newY = y
        switch direction {
        case .up:
            if y <= 0 {
                return false
            }
            newY -= 1
        case .down:
            if y >= room.height - 1   {
                return false
            }
            newY += 1
        case .left:
            if x <= 0 {
                return false
            }
            newX -= 1
        case .right:
            if x >= room.width - 1 {
                return false
            }
            newX += 1
        }
        
        if newX != x || newY != y {
            
            room.roomArray[y][x] = SpaceType.empty
            room.roomArray[newY][newX] = SpaceType.box
            x = newX
            y = newY
        }
        
        isFinish()
        return true
    }
}

class Player {
    var x: Int
    var y: Int
    let room: Room
    let box: Box
    
    init(x: Int, y: Int, room: Room, box: Box) {
        self.x = x
        self.y = y
        self.room = room
        self.box = box
        room.roomArray[y][x] = SpaceType.player
    }
    func move(direction: Direction) -> Bool {
        
        print("Player Move:", direction.rawValue)
        var newX = x
        var newY = y
        switch direction {
        case .up:
            if y <= 0 {
                return false
            }
            newY -= 1
        case .down:
            if y >= room.height - 1   {
                return false
            }
            newY += 1
        case .left:
            if x <= 0 {
                return false
            }
            newX -= 1
        case .right:
            if x >= room.width - 1 {
                return false
            }
            newX += 1
        }
        if room.roomArray[newY][newX] == SpaceType.empty || (room.roomArray[newY][newX] == SpaceType.box && box.move(direction: direction)) {
            room.roomArray[y][x] = SpaceType.empty
            room.roomArray[newY][newX] = SpaceType.player
            x = newX
            y = newY
            return true
        }
        if room.roomArray[newY][newX] == SpaceType.gameOver {
            print("That Finish. Game Over")
        }
        return false
    }
}

let room = Room(width: 6, height: 6)
let box = Box(x: 1, y: 1,xFinish: 4, yFinish: 5, room: room)

let player = Player(x: 0, y: 0, room: room, box: box)

room.show()
let moveArray:[Direction]
moveArray = [.right, .down, .down, .down, .down, .left, .down, .right, .right, .right, .right, .right]

for direction in moveArray {
    player.move(direction: direction)
    
    if box.isFinish() {
        room.show()
        break
    }
    room.show()
}


Console:

⬛⬛⬛⬛⬛⬛⬛⬛
⬛👨⬜⬜⬜⬜⬜⬛
⬛⬜💚⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: right
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜👨⬜⬜⬜⬜⬛
⬛⬜💚⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: down
Box Move: down
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜👨⬜⬜⬜⬜⬛
⬛⬜💚⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: down
Box Move: down
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜👨⬜⬜⬜⬜⬛
⬛⬜💚⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: down
Box Move: down
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜👨⬜⬜⬜⬜⬛
⬛⬜💚⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: down
Box Move: down
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜👨⬜⬜⬜⬜⬛
⬛⬜💚⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: left
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛👨⬜⬜⬜⬜⬜⬛
⬛⬜💚⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: down
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛👨💚⬜⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: right
Box Move: right
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜👨💚⬜💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: right
Box Move: right
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜👨💚💝⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Player Move: right
Box Move: right
Finish
Finish
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜👨💘⬜⬛

⬛⬛⬛⬛⬛⬛⬛⬛