В 19, 20 и 21 уроке рассмотрены инициализаторы и деинициализаторы. Эта тема разбита на 3 урока и не имеет явного домашнего задания (кроме разбора документации и примеров из урока).
вторник, 20 февраля 2018 г.
среда, 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
⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜⬜⬜⬜⬛
⬛⬜⬜⬜👨💘⬜⬛
⬛⬛⬛⬛⬛⬛⬛⬛
Подписаться на:
Сообщения (Atom)