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

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

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

while ループの使い方を学ぼう

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

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

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

第5チャプタの「論理演算子」は実習済みですか?まだの方は以下の記事からご覧ください。

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

レッスンのポイント

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

// 条件がtrueの間繰り返す
while 条件 {

	// 繰り返す処理...

}

繰り返しといえば、第3チャプタで for ループを学びましたね。 for ループは、繰り返す回数が決まっているときに使われます。一方で while ループは、何回繰り返すかが不明な場合に使うことができます。

for ループについては以下の記事をご覧ください。

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

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

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

レッスン 1「条件を決めてコードをループする」

【目標】

  • while ループの使い方を知る
  • 繰り返す条件と繰り返すパターンを見つける
Swift Playground/コードを学ぼう1/whileループ/条件を決めてコードをループする
Swift Playground/コードを学ぼう1/whileループ/条件を決めてコードをループする

課題解決の流れ

1. 繰り返す条件を考えよう
このステージは、切れているスイッチの先に1つだけオンのスイッチが現れます。切れているスイッチの数は、コードを実行してみるまで分かりません。スイッチを全部オンにするためには、どのような条件で、何を繰り返せば良いでしょうか。

今回は while ループを使うレッスンなので、次のように考えてコーディングしていきます。

  • スイッチを切り替えて進むことを繰り返す
  • オンのスイッチに到達したら繰り返しを終わりにする

今いるマスのスイッチがオフであれば、「スイッチを切り替えて、進む」を繰り返します。これをいつまで繰り返すのかというと、オンのスイッチに到達するまでです。ということは、while ループで繰り返す条件は、「切れているスイッチの上にいる」となります。

  • isOnClosedSwitch:イズ・オン・クローズド・スイッチ「切れているスイッチの上にいる」

2. 繰り返す条件を入力しよう
このレッスンでは以下のコードがすでに入力されています。

// 入力済みのコード

while condition {
    // クリックしてコードを入力
}

「切れているスイッチの上にいる間は繰り返す」という while ループになるよう、condition の部分に条件を入力しましょう。

// 切れているスイッチの上にいる間は繰り返す
while isOnClosedSwitch {

}

3. 繰り返すパターンを入力しよう
isOnClosedSwitchtrue である間(= 切れているスイッチの上にいる間)は、「スイッチを切り替えて進む」を繰り返します。{ } の中にコマンドを入力しましょう。

while isOnClosedSwitch {

	// スイッチを切り替えて進む
	toggleSwitch()
	moveForward()

}

オンのスイッチに着くと isOnClosedSwitchfalse になる(= 条件が成立しない)ので、ループは終了します。

4. コードを実行しよう
「コードを実行」を押して動きを確かめましょう。スイッチをオンにしながら進んで、最初から入っていたスイッチの上で止まれば、ステージクリアです!

// コード正解例

while isOnClosedSwitch {
	toggleSwitch()
	moveForward()
}
ステージクリアの動き
ステージクリアの動き

レッスン 2「while ループをじょうずに使う」

【目標】

  • while ループと if 文を組み合わせる
  • 繰り返す条件と繰り返すパターンを見つける
Swift Playground/コードを学ぼう1/whileループ/while ループをじょうずに使う
Swift Playground/コードを学ぼう1/whileループ/while ループをじょうずに使う

課題解決の流れ

1. 繰り返す条件を考えよう
このステージは、切れているスイッチと入っているスイッチがランダムに現れます。

すべてのスイッチをオンにするために、Byte は3本の道をワープしながら進んでいきます。ただし、3本目の道の先端にワープはなく、そのまま進んだら落ちてしまいます。このことから、次のように考えることができるでしょう。

  • オフのスイッチを切り替えながら進むことを繰り返す
  • 行き止まりになったらループを終わりにする

したがって、while ループで繰り返す条件は、「行き止まりではない」です。

2. while ループを入力しよう
「行き止まりではない間は繰り返す」という while ループを入力していきましょう。

条件が「〜ではない」のような否定になる場合の書き方は覚えていますか?

条件の先頭に NOT 演算子 を付けて、!isBlocked のようにするんでしたね。これを while ループの条件にします。ショートカットバーから while を選び、条件も入力してください。

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

}

NOT 演算子については以下の記事をご覧ください。

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

3. 繰り返すパターンを入力しよう
条件 !isBlocked が成立する場合に繰り返す処理を入力しましょう。

今いるマスの状態を調べるために if 文で条件分岐し、切れているスイッチの上にいる場合は切り替えます。入っているスイッチやワープの上では進むだけです。

while !isBlocked {

	// もし切れているスイッチの上にいるなら切り替える
	if isOnClosedSwitch {
		toggleSwitch()
	}

	// 1マス進む
	moveForward()

}

if 文と moveForward() の順番は逆でも問題ありません。「今いるマスの状態を調べてから進む」か「進んでから調べるか」の違いです。ただし、もしスタート地点にもアイテムが出現する可能性がある場合は、必ず if 文を先にしてくださいね。

if 文については以下の記事をご覧ください。

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

4. コードを実行しよう
「コードを実行」を押して動きを確かめましょう。切れているスイッチをオンにしながら進み、最後のマスで止まれば、ステージクリアです!

// コード正解例

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

レッスン 3「正しいループを使う」

【目標】

  • 繰り返す条件を見つける
  • while ループと関数を組み合わせる
Swift Playground/コードを学ぼう1/whileループ/正しいループを使う
Swift Playground/コードを学ぼう1/whileループ/正しいループを使う

課題解決の流れ

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

// 入力済みのコード

func turnAndCollectGem() {
	moveForward()
	turnLeft()
	moveForward()
	collectGem()
	turnRight()
}

これは宝石を取るためのパターンで、すでに関数にまとめてあります。全部の宝石を集めるために、どのような条件でこのパターンを繰り返せば良いかを考えましょう。

繰り返すパターン
繰り返すパターン

2. 条件を指定して繰り返そう
順番に宝石を集めていくと、最後に取る宝石の先にはマスがありません。つまり、行き止まりです。

行き止まりになるまで宝石を集め続けられるように !isBlocked を条件にして、宝石を取るパターンを while ループで繰り返しましょう。

// 行き止まりではない間は繰り返す
while !isBlocked {
	turnAndCollectGem()
}

3. コードを実行しよう
「コードを実行」を押して動きを確かめます。同じパターンを繰り返しながら宝石を集め、最後の宝石を取ったあとに止まれば、ステージクリアです!

// コード正解例

func turnAndCollectGem() {
	moveForward()
	turnLeft()
	moveForward()
	collectGem()
	turnRight()
}

while !isBlocked {
	turnAndCollectGem()
}

レッスン 4「2つのループ」

【目標】

  • 繰り返すパターンと繰り返す条件を見つける
  • while ループと for ループを組み合わせる
Swift Playground/コードを学ぼう1/whileループ/2つのループ
Swift Playground/コードを学ぼう1/whileループ/2つのループ

課題解決の流れ

1. 繰り返すパターンを見つけよう
このステージには4つのスイッチが現れます。位置は固定されていますが、コードを実行するたびにスイッチのON / OFF が変わります。

どのような道順で進めば、すべてのスイッチをオンにできるでしょうか。

階段やワープがあるので一見複雑ですが、ステージの外側を右回りで進めば最後のスイッチまで到達することができますね。繰り返すパターンは「3マス進む、スイッチが切れていたらオンにする、右を向く」です。この動作で角を曲がるまでの一辺をクリアすることができます。

// 繰り返すパターン

// 3マス進む
moveForward()
moveForward()
moveForward()

// もし切れているスイッチの上にいるなら切り替える
if isOnClosedSwitch {
	toggleSwitch()
}

// 右を向く
turnRight()
繰り返すパターン
繰り返すパターン

さて、このレッスンのタイトルは「2つのループ」となっています。2つのループとは、while ループと for ループのことです。繰り返すパターンの中に moveForward() が3つ続いているので、これを for ループにまとめてしまいましょう。

// 3回繰り返す
for i in 1 ... 3 {
	moveForward()
}

if isOnClosedSwitch {
	toggleSwitch()
}
turnRight()

2. 条件を指定して繰り返そう
一辺をクリアするパターンを while ループで繰り返します。繰り返す条件は何になると思いますか?

最後のスイッチは周りより1段高い所にありますね。そのまま進むと落ちてしまうので、この先は行き止まりである、といえます。したがって、繰り返す条件は「行き止まりではない」です。

while ループに条件を指定し、{ } の中に繰り返すパターンを入力しましょう。

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

	for i in 1 ... 3 {
		moveForward()
	}
	if isOnClosedSwitch {
		toggleSwitch()
	}
	turnRight()

}

3. コードを実行しよう
「コードを実行」を押して動きを確かめます。同じパターンを繰り返してスイッチをオンにし、最後のマスで止まれば、ステージクリアです!

// コード正解例

while !isBlocked {
	for i in 1 ... 3 {
		moveForward()
	}
	if isOnClosedSwitch {
		toggleSwitch()
	}
	turnRight()
}

レッスン 5「回る」

【目標】

  • パターンを見つけて繰り返す
Swift Playground/コードを学ぼう1/whileループ/回る
Swift Playground/コードを学ぼう1/whileループ/回る

課題解決の流れ

1. 宝石がなくなるまで繰り返そう
すべての宝石を集め終わるまで Byte を動かし続けられるように、「宝石の上にいる」という条件で繰り返す while ループを書いていきましょう。

// 宝石の上にいる間は繰り返す
while isOnGem {

}

このループを働かせるためには、スタート地点から宝石のあるマスまで進んでおく必要があります。先頭に moveForward() を入力しておいてください。

// 宝石のあるマスに進む
moveForward()

while isOnGem {

}

2. 繰り返すパターンを見つけよう
宝石の上にいるときにやることは、2つの宝石を集めて角を曲がることです。

// 繰り返すパターン

// 進む方に向きを変えてから宝石を2つ集める
turnLeft()
collectGem()
moveForward()
collectGem()

// 角を曲がって宝石のあるマスまで進む
turnLeft()
moveForward()
turnRight()
moveForward()
繰り返すパターン
繰り返すパターン

このパターンを { } の中に入力すれば、while ループの完成です。宝石を全部集め終わると、条件の isOnGemfalse になるのでループは終了します。

3. コードを実行しよう
「コードを実行」を押して動きを確かめましょう。同じパターンを繰り返してすべての宝石を集められたら、ステージクリアです!

// コード正解例

moveForward()
while isOnGem {
	turnLeft()
	collectGem()
	moveForward()
	collectGem()
	turnLeft()
	moveForward()
	turnRight()
	moveForward()
}

レッスン 6「方法はたくさん」

【目標】

  • 関数の中で while ループを使う
  • while ループと if / else if を組み合わせる
Swift Playground/コードを学ぼう1/whileループ/方法はたくさん
Swift Playground/コードを学ぼう1/whileループ/方法はたくさん

課題解決の流れ

1. 行き止まりになるまで繰り返そう
このステージは、コードを実行してみるまで、宝石やスイッチの数、進むべきマスの数が分かりません。

切れているスイッチをオンにし、すべての宝石を集め終わるまで Byte を動かし続けられるようにコーディングします。「行き止まりではない」という条件で繰り返す while ループを書いていきましょう。

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

}

2. 繰り返すパターンを見つけよう
行き止まりではない間に繰り返しやることは、マスの状態を調べながら進むことです。if / else if を使って、「切れているスイッチの上にいる場合」と「宝石の上にいる場合」でやることを分けます。

while !isBlocked {

	// マスの状態に応じてやることを分ける
	if isOnClosedSwitch {
		toggleSwitch()
	} else if isOnGem {
		collectGem()
	}
	// 次のマスへ進む
	moveForward()

}

さて、このループは1列目の端に到達したら止まります。2列目、3列目も同じように進んでいけばいいので、この while ループを関数にまとめて再利用できるようにしておきましょう。

  • solveRow():ソルブ・ロー「1列クリアする」
// 1列クリアする関数
func solveRow() {

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

}

3. 3列クリアしよう
3列クリアできるよう、順番にコマンドを入力してください。

// 1列目をクリア
solveRow()

// 2列目へ行く
turnRight()
moveForward()
turnRight()

// 2列目をクリア
solveRow()

// 3列目へ行く
turnLeft()
moveForward()
turnLeft()

// 3列目をクリア
solveRow()

4. コードを実行しよう
「コードを実行」を押して動きを確かめます。切れているスイッチをオンにして宝石を集められたら、ステージクリアです!

// コード正解例

// 1列クリアする関数
func solveRow() {
	while !isBlocked {
		if isOnClosedSwitch {
			toggleSwitch()
		} else if isOnGem {
			collectGem()
		}
		moveForward()
	}
}

solveRow() // 1列目をクリア
turnRight()
moveForward()
turnRight()
solveRow() // 2列目をクリア
turnLeft()
moveForward()
turnLeft()
solveRow() // 3列目をクリア

まとめ

今回は、Swift Playground の「コードを学ぼう1」で、while ループを学習しました。

while ループは、指定した条件が true の間だけ繰り返す仕組みです。条件が false になるとループが終了します。コードを実行してみるまでアイテムやマスの数が分からない場合などは、「回数」で繰り返す for ループではなく、「条件」で繰り返す while ループを使うのが便利です。

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

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

関連記事

スクラッチプログラミング - ゲームのつくりかた|おすすめトップ10
Pyxofy (ピクソファイ)で人気(にんき)のゲーム記事(きじ)をピックアップしました。車(くるま)のゲームやプラットフォーマーなど、簡単(かんたん)なものからむずかしいものまで、いろいろなゲームのサンプルをのせてあります。
JavaScript - クリックカウンターの作り方【初心者向け】
ボタンのクリック数を画面に表示するクリックカウンターを作ります。コードのポイントとなるのはインクリメント演算子 ++ と innerHTML です。プログラミング初心者の方でも分かりやすいように、簡単な HTML と JavaScript で解説します。
CSS Art – How to Make Gradients
Gradients are powerful tools for your CSS art tool belt. We’ll learn about linear, radial and conic gradients. Then let’s make repeating patterns.
CSS Animation – Changing Color
Viva Magenta, Molten Metallic or Tranquil Blue? You’ll learn how to use colors and more with CSS in this step-by-step article.