Swift Playgrounds на русском, Parameters 8 урок | Twin Peaks

preview_player
Показать описание
Друзья, я рад приветствовать всех на второй части по урокам в Swift Playgrounds. Мы с вами приступаем к восьмому уроку в части по Параметрам. Успехов в прохождении!!!

Мой телеграм канал, где перевод уроков по swift playgrounds выходит чаще и раньше чем видео!

1-8 Twin Peaks 1-8
Параметры

Испытание: Используйте все ваши навыки в программировании чтобы собрать рандомное количество кристаллов, представленное константой totalGems(всегоКристаллов).

Проверьте свои знания о параметрах, инициализации, методах, переменных и всём остальном пройдя это испытание! Проходите головоломку собирая кристаллы, которые будут постоянно появляться на вашем пути. Ваша цель заключается в том чтобы перестать собирать кристаллы в тот момент, когда вы соберёте количество кристаллов, определённое константой totalGems.

#swiftplaygroundsнарусском #swiftplayground #learntocode2 #swift
Рекомендации по теме
Комментарии
Автор

Спасибо большое за уроки! Дальше придется разбираться самому. Всем удачи в обучении.

let expert = Expert()
let character = Character()

world.place(expert, facing: north, atColumn: 0, row: 4)
world.place(character, facing: north, atColumn: 4, row: 0)
expert.turnLock(up: true, numberOfTimes: 2)
func char() {
for i in 1 ... 6 {
if character.isOnGem {
character.collectGem()
}
character.jump()
}
}
func char2() {
for i in 1 ... 2 {
if character.isOnGem {
character.collectGem()
}
character.jump()
}
}

char()
character.turnLeft()
char2()
character.turnLeft()
char()
character.turnLeft()
char2()

ivadik_pro
Автор

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

let expert = Expert()
let character = Character()

world.place(expert, facing: north, atColumn: 0, row: 4)
world.place(character, facing: north, atColumn: 2, row: 0)

var gemCounter = 0
var jumpCounter = 0

expert.turnLock(up: true, numberOfTimes: 2)
while gemCounter != totalGems {
if character.isOnGem {
character.collectGem()
gemCounter += 1
}
if jumpCounter != 6 && gemCounter != totalGems {
character.jump()
jumpCounter += 1
}else if jumpCounter == 6 {
character.turnRight()
character.jump()
if character.isOnGem {
character.collectGem()
gemCounter += 1
}
character.jump()
jumpCounter = 0
character.turnRight()
}
}

AquaRioUK
Автор

Спасибо за уроки! Ждем следующие и продолжение! И еще вопрос автору: когда станешь джуном - разработчиком?))

str-yydd
Автор

У меня код значительно отличается, но я решил сделать вечный круг чтобы он пробегал всю дистанцию, а не только боковые, но знал бы я что можно считать прыжки, точно бы сделал бы короче и быстрее! Спасибо за альтернативное мышление!

let totalGems = randomNumberOfGems

var gemCounter = 0

let expert = Expert()
let character = Character()

world.place(expert, facing: north, atColumn: 0, row: 4)
world.place(character, facing: north, atColumn: 4, row: 0)

func moveTurnLeft() {
if character.isOnGem{
character.collectGem()
gemCounter += 1
}
if character.isBlocked && !character.isBlockedLeft{
character.turnLeft()
character.moveForward()
character.turnLeft()

}else if character.isBlocked && !character.isBlockedRight{
character.turnRight()
character.moveForward()
character.turnRight()

}

}

func moveAndJump(distance: Int) {
for a in 1...distance{
if character.isOnGem{
character.collectGem()
gemCounter += 1
}
character.jump()
}
}

func move(distance: Int) {
for a in 1...distance{
if character.isOnGem{
character.collectGem()
gemCounter += 1
}
character.moveForward()
}
}

func moveJumpTurn() {
moveAndJump(distance: 6)
moveTurnLeft()
move(distance: 6)
moveTurnLeft()
moveAndJump(distance: 6)
}

expert.turnLock(up: true, numberOfTimes: 3)
while gemCounter != totalGems {
moveJumpTurn()
if character.isBlocked{
character.turnLeft()
character.turnLeft()

}




}

ProMTS
Автор

С твоими пояснениями прошел игру, каждый день по несколько уроков делал. Четко объясняешь еще и на русском 😁Не планируешь продолжать курс?

dani_zi
Автор

Красивый у тебя код получился. У меня в полтора раза длиннее вышел.

dani_zi
Автор

Автор не совсем понял суть задание - через подсчет шагов!
Поскольку в этом случает, можно вообще не создавать Expert (с крайней нижней платформы можно спрыгнуть вниз и запрыгнуть на другую).
Здесь важно было создать алгоритм, согласно которому, Expert должен двигать платформу то вниз, то вверх, а персонаж должен через подвижную платформу прыгать с одной стороны на другую. Здесь нужно считать не прыжки, а движение платформы.
Вот мое решение (выполнил очень быстро, поскольку нарисовал сначала алгоритм на бумаге и все стало понятно):

let expert = Expert ()
let character = Character ()
var countGem = 0
var platform = 1

world.place(expert, facing: north, atColumn: 0, row: 4)
world.place(character, facing: west, atColumn: 4, row: 6)

expert.turnLockUp()

func jump() {
if character.isOnGem {
character.collectGem()
countGem += 1
}
character.jump()
}

func jumpLeft() {
if platform == 1 {
expert.turnLockUp()
platform = 1
} else {
expert.turnLockDown()
platform = 2
}
jump()
jump()
character.turnLeft()
jump()
character.turnLeft()
}

func jumpRight() {
if platform == 1 {
expert.turnLockUp()
platform = 2
} else {
expert.turnLockDown()
platform = 1
}
jump()
jump()
character.turnRight()
jump()
character.turnRight()
}

while countGem != totalGems {
jumpLeft()
jumpRight()
}

tankovali
Автор

Решил по максимуму потрениться и пройти без эксперта, с 3-мя персонажами + с джамп и мув каунтерами))

let character = Character()
let characterFirst = Character()
let characterSecond = Character()


var gemCounter = 0
var jumpCounterOne = 0
var jumpCounterTwo = 0
var moveCounter = 0

world.place(character, facing: north, atColumn: 2, row: 0)
world.place(characterFirst, facing: north, atColumn: 3, row: 0)
world.place(characterSecond, facing: north, atColumn: 4, row: 0)

func navigate() {
if character.isOnGem {
character.collectGem()
gemCounter += 1
}else {
character.jump()
jumpCounterOne += 1
}

}

func navigateFirst() {
if characterFirst.isOnGem {
characterFirst.collectGem()
gemCounter += 1
}else {
characterFirst.moveForward()
moveCounter += 1
}

}

func navigateSecond() {
if characterSecond.isOnGem {
characterSecond.collectGem()
gemCounter += 1
}else {
characterSecond.jump()
jumpCounterTwo += 1
}

}

while gemCounter != totalGems {

if jumpCounterOne == 6 {
character.turnLeft()
character.turnLeft()
jumpCounterOne = 0
navigate()
}else{
navigate()
}

if jumpCounterTwo == 6 {
characterSecond.turnLeft()
characterSecond.turnLeft()
jumpCounterTwo = 0
navigateSecond()
}else{
navigateSecond()
}

if moveCounter == 6 {
characterFirst.turnLeft()
characterFirst.turnLeft()
moveCounter = 0
navigateFirst()
}else{
navigateFirst()
}

}

АртёмБоровский-йт
Автор

Я смог решить данную задачку без прыжков )

serg_skkver
Автор

let e = Expert()
let c = Character()
world.place(e, facing: north, atColumn: 0, row: 4)
world.place(c, facing: north, atColumn: 4, row: 0)

func solv(count: Int) {
var tRtL = false
for i in 1...count {
for i in 1...6 {
if c.isOnGem {
c.collectGem()
}
c.jump()
}
if tRtL == true {
c.turnRight()
c.jump()
c.turnRight()
tRtL == false
} else {
c.turnLeft()
c.jump()
c.turnLeft()
tRtL = true
}
}
}

e.turnLock(up: true, numberOfTimes: 2)
solv(count: 3)

hhkpinc.
Автор

Немного по читерски наверное, но я не догадался до jumpCounter(
Максимально короткий код, который смог выжать

var gemCounter = 0
let character1 = Character()
let character2 = Character()
let character3 = Character()

func character1Solution() {
if character1.isOnGem {
character1.collectGem()
gemCounter += 1
}else if character1.isBlockedLeft{
character1.jump()
}
}
func character3Solution() {
if character3.isOnGem {
character3.collectGem()
gemCounter += 1
}else if character1.isBlockedLeft{
character3.jump()
}
}
func character2Solution() {
if character2.isOnGem{
character2.collectGem()
gemCounter += 1
}else if !character2.isBlocked {
character2.moveForward()
}
}
world.place(character1, facing: south, atColumn: 4, row: 6)
world.place(character2, facing: north, atColumn: 3, row: 0)
world.place(character3, facing: north, atColumn: 2, row: 0)

while totalGems != gemCounter {
character1Solution()
character2Solution()
character3Solution()
}

YanAviltsev
Автор

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

var collectedGems = 0
let red = Expert()
let blue = Character()

func moveAndCollect(steps: Int) {
for i in 1 ... steps {

if blue.isOnGem {
blue.collectGem()
collectedGems += 1
}
blue.jump()
}
}

world.place(red, facing: north, atColumn: 0, row: 4)
world.place(blue, facing: north, atColumn: 2, row: 0)

red.turnLock(up: true, numberOfTimes: 2)

while collectedGems < totalGems {

moveAndCollect(steps: 6)
blue.turnRight()
moveAndCollect(steps: 2)
blue.turnRight()
}

TheHeartOfTheCore
Автор

var gemCouter = 0
var blockCouter = 0

let expert = Expert()
let character = Character()

world.place(expert, facing: north, atColumn: 0, row: 4)
world.place(character, facing: north, atColumn: 2, row: 0)
expert.turnLock(up: true, numberOfTimes: 1)

func navigate() {
if character.isOnGem {
character.collectGem()
gemCouter += 1
}

if !character.isBlockedLeft {
character.turnLeft()
character.moveForward()
character.turnLeft()
}
if !character.isBlockedRight {
character.turnRight()
character.moveForward()
character.turnRight()
}
if character.isBlockedLeft && character.isBlockedRight {
character.turnLeft()
character.turnLeft()
}

}

func travel() {
if character.isBlocked {
character.jump()
}else{
character.moveForward()
}
blockCouter += 1
}

while gemCouter != totalGems {
if character.isOnGem {
character.collectGem()
gemCouter += 1
}
if gemCouter != totalGems {
travel()
if blockCouter == 6 {
navigate()
blockCouter -= 6
}
}
}

alex_minsk