while
выполняет набор инструкций, пока его условие не становится ложным. Эти виды циклов наиболее хорошо подходят для ситуации, когда число итераций неизвестно до начала первой итерации. Swift предоставляет два вида циклов while
:
while
начинается с вычисления единственного условия. Если условие true
, то набор инструкций будет повторяться, пока условие не станет false
.
let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
Игровая доска представлена массивом типа Int
. Его размер основан на константе с finalSquare
, которая используется для инициализации массива, а также для проверки условия победы в этом примере. Так как игроки начинают за пределами доски, на "нулевом квадрате", то доска инициализируется с 26-ю нулевыми Int-значениями, а не 25-ю.
board[03]
устанавливается в +08, что является эквивалентом целому значению 8 (разница между 3 и 11). Чтобы выровнять значения и инструкции, унарный оператор плюс (+i) явно используется вместе с оператором минуса (-i), а числа, меньшие 10, претворяются нулём. (Хотя стилистическая техника не строго необходима, но она ведёт к более качественному коду.)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
diceRoll
значения 0. На каждой итерации цикла while diceRoll
увеличивается на единицу и проверяется на то, не стала ли она слишком большой. Если она стала равной 7, то значит игральный кубик стал слишком большим и он будет сброшен в 1. В результате последовательность значений diceRoll
всегда будет 1, 2, 3, 4, 5, 6, 1, 2 и так далее.
diceRoll
. Возможно, что игральный кубик переместит игрока за клетку 25, в этом случае игра будет закончена. Чтобы реализовать этот сценарий, код проверяет, меньше ли square
, чем свойство count
массива board
. Если square корректен, то значение, хранимое в board[square]
, будет добавлено к текущему значению square
для перемещения игрока вниз или вверх по лестницам или змеям.
board[square]
может попытаться получить доступ к значению за пределами границ массива board
, что вызовет ошибку времени выполнения.
while
будет завершена, а значение условия цикла будет проверено для выяснения того, выполняться циклу вновь или нет. Если игрок передвинулся на или за клетку номер 25, то условие цикла будет вычислено в false
и игра завершится.
while
в данном случае подходит, так как длина игры неизвестна заранее в начале цикла while
. Вместо этого цикл будет выполняться, пока конкретное условие удовлетворяется.
var square = 0
var diceRoll = 0
while square < finalSquare {
// бросить кубик
diceRoll += 1
if diceRoll == 7 {diceRoll = 1}
// сброс значения кубика
square += diceRoll
if square < board.count {
// Если мы всё ещё на доске, переместиться вверх или вниз через змею или лестницу
square += board[square]
}
}
print("Game over!")