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

Swift 12. Enum

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

 2. Сделайте так, чтобы энумовские значения имели rawValue типа String. Каждому типу фигуры установите соответствующее английское название. Создайте функцию, которая выводит в консоль (текстово, без юникода) название фигуры, цвет и расположение. Используя эту функцию распечатайте все фигуры в массиве.

 3. Используя красивые юникодовые представления шахматных фигур, выведите в консоли вашу доску. Если клетка не содержит фигуры, то используйте белую или черную клетку. Это должна быть отдельная функция, которая распечатывает доску с фигурами (принимает массив фигур и ничего не возвращает)

 4. Создайте функцию, которая будет принимать шахматную фигуру и тюпл новой позиции. Эта функция должна передвигать фигуру на новую позицию, причем перемещение должно быть легальным: нельзя передвинуть фигуру за пределы поля и нельзя двигать фигуры так, как нельзя их двигать в реальных шахматах (для мегамонстров программирования). Вызовите эту функцию для нескольких фигур и распечатайте поле снова.

 5. Следите чтобы ваш код был красивым!

 */

enum ChessColor: String {
    case  white, black
}
enum ChessLetter: String {
    case a , b, c, d, e, f, g, h
}

enum ChessDigit: Int {
 case one = 1 , two, three, four, five, six, seven, eight
}

enum ChessType: String {
    case rook, knight, bishop, pawn, king, queen
    
}
typealias ChessFigure = (ChessType,ChessColor, ChessLetter, ChessDigit)


var whiteKing: ChessFigure = (ChessType.king, ChessColor.white, ChessLetter.b, ChessDigit.one)
var whiteRook1: ChessFigure = (ChessType.rook, ChessColor.white, ChessLetter.d, ChessDigit.seven)
var whiteRook2: ChessFigure = (ChessType.rook, ChessColor.white, ChessLetter.e, ChessDigit.eight)
var blackKing: ChessFigure = (ChessType.king, ChessColor.black, ChessLetter.f, ChessDigit.eight)

let figureArray = [whiteKing, whiteRook1, whiteRook2, blackKing]

/*
 2
 */


func descriptionFigures(figureArray array: [ChessFigure]) {
    for figure in array {
        print(figure.0.rawValue, figure.1.rawValue, figure.2, figure.3.rawValue)
    }
}

descriptionFigures(figureArray: figureArray)

/*
 3
 */

print("\nN 3 \n")


func createEmptyChessMate() -> [[Character]] {
    var chessArray = [[Character]]()
    for vertical in 0...7 {
        var line = [Character]()
        for horizontal in 0...7 {
            line += (horizontal + vertical) % 2 == 0 ? "⬛" : "⬜"
        }
        chessArray.append(line)
    }
    return chessArray
}
func showChessMate(chessMate: [[Character]]) {
    let letter = "   a b c d e f g h"
    print(letter)
    for (index,lineArray) in chessMate.enumerated().reversed() {
        var lineChar = String(index + 1) + " "
        for char in lineArray {
            lineChar += String(char)
        }
       
        print(lineChar)
    }
    print(letter)
}

func setFiguresInChess(chessMate: [[Character]], figureArray array: [ChessFigure]) ->  [[Character]]{
    var chessArray = chessMate
    
    for figure in array {
        
        let indexes = indexInChessArray(chessLetter: figure.2, chessDigit: figure.3)
        chessArray[indexes.verticalIndex][indexes.horizontalIndex] = unicodeSymbol(figureType: figure.0, figureColor: figure.1)
    }
    return chessArray
}

func indexInChessArray(chessLetter: ChessLetter, chessDigit: ChessDigit) -> (horizontalIndex: Int, verticalIndex: Int) {
    
    let letters = "abcdefgh"
    return (letters.index(of: chessLetter.rawValue.first!)!.encodedOffset, chessDigit.rawValue - 1)
}

func unicodeSymbol(figureType: ChessType, figureColor: ChessColor) -> Character {
    switch (figureType, figureColor) {
    case (let figureType, let figureColor) where figureType == .king:
        return figureColor == .white ? "♔" : "♚"
    case (let figureType, let figureColor) where figureType == .queen:
        return figureColor == .white ? "♕" : "♛"
    case (let figureType, let figureColor) where figureType == .rook:
        return figureColor == .white ? "♖" : "♜"
    case (let figureType, let figureColor) where figureType == .bishop:
        return figureColor == .white ? "♗" : "♝"
    case (let figureType, let figureColor) where figureType == .knight:
        return figureColor == .white ? "♘" : "♞"
    case (let figureType, let figureColor) where figureType == .pawn:
            return figureColor == .white ? "♙" : "♟"

    default:
        return "*"
    }
}
var chessMate = createEmptyChessMate()
chessMate = setFiguresInChess(chessMate: chessMate, figureArray: figureArray)
showChessMate(chessMate: chessMate)

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

func moveFigureChess(figure: ChessFigure, moveTo coordinate: (ChessLetter, ChessDigit)) {
    var emptyChessMate = createEmptyChessMate()
    var mutableFigure = figure
    let startPosition = setFiguresInChess(chessMate: emptyChessMate, figureArray: [figure])
    print("Start Position")
    showChessMate(chessMate: startPosition)
    mutableFigure.2 = coordinate.0;
    mutableFigure.3 = coordinate.1
    
    print("\nFinish Position\n")
    let finishPosition = setFiguresInChess(chessMate: emptyChessMate, figureArray: [mutableFigure])
    showChessMate(chessMate: finishPosition)
}


moveFigureChess(figure: whiteRook1, moveTo: (ChessLetter.d, ChessDigit.one))

Console:

king white b 1
rook white d 7
rook white e 8
king black f 8

N 3 

   a b c d e f g h
8 ⬜⬛⬜⬛♖♚⬜⬛
7 ⬛⬜⬛⬛⬜⬛⬜
6 ⬜⬛⬜⬛⬜⬛⬜⬛
5 ⬛⬜⬛⬜⬛⬜⬛⬜
4 ⬜⬛⬜⬛⬜⬛⬜⬛
3 ⬛⬜⬛⬜⬛⬜⬛⬜
2 ⬜⬛⬜⬛⬜⬛⬜⬛
1 ⬛⬜⬛⬜⬛⬜
   a b c d e f g h

N 4

Start Position
   a b c d e f g h
8 ⬜⬛⬜⬛⬜⬛⬜⬛
7 ⬛⬜⬛⬛⬜⬛⬜
6 ⬜⬛⬜⬛⬜⬛⬜⬛
5 ⬛⬜⬛⬜⬛⬜⬛⬜
4 ⬜⬛⬜⬛⬜⬛⬜⬛
3 ⬛⬜⬛⬜⬛⬜⬛⬜
2 ⬜⬛⬜⬛⬜⬛⬜⬛
1 ⬛⬜⬛⬜⬛⬜⬛⬜
   a b c d e f g h

Finish Position

   a b c d e f g h
8 ⬜⬛⬜⬛⬜⬛⬜⬛
7 ⬛⬜⬛⬜⬛⬜⬛⬜
6 ⬜⬛⬜⬛⬜⬛⬜⬛
5 ⬛⬜⬛⬜⬛⬜⬛⬜
4 ⬜⬛⬜⬛⬜⬛⬜⬛
3 ⬛⬜⬛⬜⬛⬜⬛⬜
2 ⬜⬛⬜⬛⬜⬛⬜⬛
1 ⬛⬜⬛⬛⬜⬛⬜
   a b c d e f g h

Комментариев нет:

Отправить комментарий