Swift Playground - コードを学ぼう1【while ループ】Part 2

Swift Playground「コードを学ぼう1」で while ループをネストする方法をマスターしましょう。本記事ではプログラミング初心者にも分かりやすいように解説し、コードの正解例を掲載しています。

Swift Playground - コードを学ぼう1【while ループ】Part 2

while ループをネストする方法を学ぼう

プログラミング言語 Swift を楽しく体験できる Swift Playground で、コーディングの基礎を学びましょう。

「コードを学ぼう1」の第6チャプタ「while ループ」のレッスンを、Part 1・Part 2 の2回に分けて解説しています。今回はその Part 2 です。

  • レッスン1〜6:前回の Part 1 で取り上げ、while ループの基本的な使い方を学習しました。
  • レッスン7〜9:この記事で解説します。while ループの中に別の while ループを含める(ネストする)課題に取り組んでいきましょう。

while ループ基本的な使い方は実習済みですか?まだの方は Part 1 の記事からご覧ください。

Swift Playground - コードを学ぼう1【while ループ】Part 1
Swift Playground「コードを学ぼう1」でwhile ループについて学習しましょう。本記事ではプログラミング初心者にも分かりやすいように解説し、コードの正解例を掲載しています。

レッスンのポイント

前回の Part 1 で学んだことの復習も兼ねて、レッスンを始める際に知っておきたいポイントを下にまとめました。

  • while ループは、条件を指定して特定の処理を繰り返す仕組みです。
  • 条件が満たされている(true である)間はループします。
  • 条件が満たされなくなる(false になる)とループは終了します。
// 条件がtrueの間繰り返す
while 条件 {

	// 繰り返す処理...

}

今回は、while ループを2つ使ってコーディングしていきます。while ループを入れ子にする練習をしていきましょう。

  • 外側のループでは、全体の処理をいつまで繰り返すかを決める条件を指定します。
    • 例:ゴールに到達するまで、繰り返す
  • 内側のループでは、ゴールに着くまでの間で、同じ動きを何度も繰り返すための条件を指定します。
    • 例:行き止まりになるまで、繰り返し進む
// 外側のループ(ゴールに着くまで繰り返す)
while 条件 {

	// 内側のループ(よく出てくる動きのパターンを繰り返す)
	while 条件 {

	}

	// 内側のループがfalseになったあとの処理...

}

では、次のセクションからレッスン開始です。Byte を正しく動かすためのコードを書いていきましょう!

※ この記事で紹介しているコードは、あくまで一つの例です(動作確認 Swift Playground 4.7)。プログラミングでは、同じ動きを作る方法がいくつもあります。いろいろなやり方を試しながら、自分なりの答えを見つけてみてください。

レッスン 7「ループをネストする」

【目標】

  • 全体の処理を繰り返す条件を見つける
  • パターンと繰り返す条件を見つける
Swift Playground/コードを学ぼう1/whileループ/ループをネストする
Swift Playground/コードを学ぼう1/whileループ/ループをネストする

課題解決の流れ

1. ゴールまで繰り返す条件を考えよう(外側のループ)
このレッスンでは以下のコードがすでに入力されています。

// 入力済みのコード

while Condition {
	while Condition {
		// コマンドをループに追加
	}
	// コマンドをループに追加
}

はじめに、Byte の進む道順を確認しましょう。

  • 宝石を集めながら左回りで進む
  • 最後に取る宝石のマスはブロックに囲まれていて行き止まり

ゴール、つまり、最後に取る宝石のマスは、前だけでなく左右を向いても行き止まりです。外側のループでは、行き止まりになるまで繰り返す条件を指定します。「行き止まりになるまで繰り返す」 = 「行き止まりではない間は繰り返す」です。したがって、条件は !isBlocked 「行き止まりではない」となります。

// 行き止まりではないなら繰り返す
while !isBlocked {
	while Condition {

	}

}

2. 一定のパターンを繰り返そう(内側のループ)
次は、内側の while ループです。このループでは、宝石のあるマスまで1歩ずつ進むことを繰り返します。言い換えると、「宝石の上にいないなら、進む」です。

!isOnGemtrue であるなら、moveForward() で進みましょう。

while !isBlocked {

	// 宝石の上にいないなら進む
	while !isOnGem {
		moveForward()
	}

}

3. 宝石を取って方向転換しよう
宝石のあるマスに着いたとき、内側のループの条件 !isOnGemfalse になるので、moveForward() は実行されません。引き続き進むためには、内側のループの下にコマンドを入力します。

左回りで進み続けられるように、宝石を取って左を向きましょう。

while !isBlocked {

	while !isOnGem {
		moveForward()
	}

	// 宝石を取って左を向く
	collectGem()
	turnLeft()

}

宝石を取って左を向いたあとは、外側のループに戻ります。向いた先が行き止まりではない場合、外側のループの条件 !isBlockedtrue となるため、再び内側のループに入ります。

宝石を取って左を向いた後もループが続く
宝石を取って左を向いた後もループが続く

最後のマスで宝石を取ったあとは、左を向いても行き止まりです。外側のループの条件 !isBlockedfalse となるので、繰り返しが終了します。

4. コードを実行しよう
「コードを実行」を押して動きを確かめましょう。左回りで進みながら宝石を集め、最後のマスで止まれば、ステージクリアです!

// コード正解例

while !isBlocked {
	while !isOnGem {
		moveForward()
	}
	collectGem()
	turnLeft()
}

レッスン 8「ランダムな四角形」

【目標】

  • 全体の処理を繰り返す条件を見つける
  • パターンと繰り返す条件を見つける
Swift Playground/コードを学ぼう1/whileループ/ランダムな四角形
Swift Playground/コードを学ぼう1/whileループ/ランダムな四角形

課題解決の流れ

1. ゴールまで繰り返す条件を考えよう(外側のループ)
このステージは、コードを実行するたびにステージのサイズが変化します。まずは、Byte の進む道順を確認しましょう。

  • 右回りで進む
  • 最後にスイッチをオンにする

ゴールのマスにだけスイッチが現れるので、外側のループでは切れているスイッチに着くまで繰り返すようにします。したがって、ループの条件は !isOnClosedSwitch です。

// 切れているスイッチの上にいないなら繰り返す
while !isOnClosedSwitch {
	
}

2. 一定のパターンを繰り返そう(内側のループ)
次は、内側の while ループです。このループでは、角のマスまで1歩ずつ進むことを繰り返します。

!isBlockedtrue である(= 行き止まりではない)なら、moveForward() で進みましょう。

while !isOnClosedSwitch {

	// 行き止まりではないなら進む
	while !isBlocked {
		moveForward()
	}
	
}

3. 方向転換しよう
角のマスに着いたとき、内側のループの条件 !isBlockedfalse になるので、moveForward() は実行されません。

右回りで進み続けられるように向きを変えましょう。内側のループの下に turnRight() を入力してください。

while !isOnClosedSwitch {

	while !isBlocked {
		moveForward()
	}

	// 右を向く
	turnRight()

}

右を向いたあとは外側のループに戻ります。切れているスイッチの上にいない( = ゴールのマスにいない)場合は、外側のループの条件 !isOnClosedSwitchtrue となるため、再び内側のループに入ります。

右を向いた後もループが続く
右を向いた後もループが続く

4. スイッチを切り替えよう
最後のマスまで来たら、前が行き止まりです。!isBlockedfalse になるので、内側のループを抜けて turnRight() で右を向き、外側のループに戻ります。

最後のマスには切れているスイッチがあるため、外側のループの条件 !isOnClosedSwitchfalse となり、繰り返しは終了です。

ループの下に toggleSwitch() を入力し、スイッチを切り替えましょう。

while !isOnClosedSwitch {
	while !isBlocked {
		moveForward()
	}
	turnRight()
}

// スイッチを切り替える
toggleSwitch()

5. コードを実行しよう
「コードを実行」を押して動きを確かめます。右回りで進み、終点にあるスイッチをオンにできたら、ステージクリアです!

// コード正解例

while !isOnClosedSwitch {
	while !isBlocked {
		moveForward()
	}
	turnRight()
}
toggleSwitch()

レッスン 9「どんな方法でも」

【目標】

  • 全体の処理を繰り返す条件を見つける
  • パターンと繰り返す条件を見つける
Swift Playground/コードを学ぼう1/whileループ/どんな方法でも
Swift Playground/コードを学ぼう1/whileループ/どんな方法でも

課題解決の流れ

1. ゴールまで繰り返す条件を考えよう(外側のループ)
while ループのレッスンはこれが最後です。

このステージは、コードを実行するたびにスイッチの ON / OFF が変わります。宝石は必ず同じ場所に1つだけ現れます。まずは、Byte の進む道順を確認しましょう。

  • 切れているスイッチをオンにしながら右回りで進む
  • 最後に宝石を取る

ゴールのマスにだけ宝石があるので、外側のループでは宝石のマスに着くまで繰り返すようにします。「宝石のマスまで繰り返す」 = 「宝石の上にいない間は繰り返す」です。したがって、ループの条件は !isOnGem となります。

// 宝石の上にいないなら繰り返す
while !isOnGem {
	
}

2. 一定のパターンを繰り返そう(内側のループ)
次は、内側の while ループです。このループでは、スイッチを切り替えながら直進することを繰り返します。

!isBlockedtrue である(= 行き止まりではない)なら、moveForward() で進み、切れているスイッチがあったらオンにしましょう。

while !isOnGem {

	// 行き止まりではないなら進む
	while !isBlocked {
		moveForward()
		// もし切れているスイッチの上にいるなら切り替える
		if isOnClosedSwitch {
			toggleSwitch()
		}
	}

}

3. 方向転換しよう
行き止まりになったとき、内側のループの条件 !isBlockedfalse になるので { } 内の処理は実行されません。

先に進み続けられるように向きを変えましょう。内側のループの下に turnRight() を入力してください。

while !isOnGem {

	while !isBlocked {
		moveForward()
		if isOnClosedSwitch {
			toggleSwitch()
		}
	}

	// 右を向く
	turnRight()

}

右を向いたあとは外側のループに戻ります。宝石の上にいない(= ゴールのマスにいない)場合は、外側のループ条件 !isOnGemtrue となり、再び内側のループに入ります。

4. 宝石を取ろう
宝石のマスまで来たら、前が行き止まりです。!isBlockedfalse になるので、内側のループを抜けて turnRight() で右を向き、外側のループに戻ります。

最後のマスには宝石があるため、外側のループの条件 !isOnGemfalse となり、全体のループが終了します。

ループの下に collectGem() を入力して、宝石を取りましょう。

while !isOnGem {
	while !isBlocked {
		moveForward()
		if isOnClosedSwitch {
			toggleSwitch()
		}
	}
	turnRight()
}

// 宝石を取る
collectGem()
ループが終了した後に宝石を取る
ループが終了した後に宝石を取る

5. コードを実行しよう
「コードを実行」を押して動きを確かめます。スイッチをオンにしながら進み、宝石を取ることができたら、ステージクリアです!

// コード正解例

while !isOnGem {
	while !isBlocked {
		moveForward()
		if isOnClosedSwitch {
			toggleSwitch()
		}
	}
	turnRight()
}
collectGem()

まとめ

今回は、Swift Playground の「コードを学ぼう1」で、while ループをネストする課題に取り組みました。

while ループを使うコードは、このあとのチャプタにもよく出てきます。ループをネストするときの考え方を整理しておきましょう。

  • 外側のループ:
    • 全体の流れを管理する
    • ゴールに到達すると条件が false になり、外側のループが終了する
  • 内側のループ:
    • 一部分の繰り返しを担当する
    • 条件が false になると内側のループを抜け、外側のループの処理に戻る

最後まで読んでいただき、ありがとうございます。この記事をシェアしてくれると嬉しいです!

SNS で Pyxofy とつながりましょう! LinkedInThreadsBlueskyMastodon X (Twitter) @pyxofyFacebook

関連記事

Scratch - Pyxofy
Scratch 3.0の使い方を、プログラミング初心者や子どもにも分かりやすく紹介しています。
JavaScript - Pyxofy
プログラミング言語のJavaScriptについて、初心者向けに解説しています。
CSS Art
Articles for creating CSS Art.
CSS Animation
Articles for creating CSS Animation.