Swift Playground - コードを学ぼう1【アルゴリズム】

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

Swift Playground - コードを学ぼう1【アルゴリズム】

アルゴリズムを学ぼう

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

今回紹介するのは、「コードを学ぼう1」の第7チャプタ「アルゴリズム」です。「コードを学ぼう1」の項目はこれが最後となります。全部で5つのレッスンを順番に見ていきましょう!

第6チャプタの「while ループ」は実習済みですか?まだの方は以下の記事からご覧ください。

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

レッスンのポイント

アルゴリズムとは、問題を解決するための具体的な手順のことです。コンピュータは曖昧な指示が分かりません。そのため、コンピュータにやってほしい作業を、「細かく・はっきり・正しい順序」で指示してあげる必要があります。

ほとんどのアルゴリズムは、次の3つの組み合わせでできています。

  1. 順次:上から順番に実行する
  2. 分岐:条件に応じてやることを分ける「もし〇〇なら」
  3. 反復:同じことを繰り返す(ループ)
アルゴリズムの基本構造
アルゴリズムの基本構造

3つとも、これまでのレッスンで学んできたことですね。今まで私たちは、Byte をゴールに導くためのアルゴリズムを書いてきた、というわけです。

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

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

レッスン 1「右手法」

【目標】

  • 右手法の使い方を知る
  • while ループを直す
Swift Playground/コードを学ぼう1/アルゴリズム/右手法
Swift Playground/コードを学ぼう1/アルゴリズム/右手法

課題解決の流れ

1. 入力済みのコードを確認しよう
このレッスンでは以下のコードがすでに入力されています。

// 入力済みのコード

func navigateAroundWall() {
	if isBlockedRight {
		moveForward()
	} else {
		turnRight()
		moveForward()
	}
}

while !isOnGem {
	navigateAroundWall()
}

最初に、関数 navigateAroundWall() が定義されています。これは、右側に壁があることをチェックしながら壁に沿って進むための関数です。このように進む方法のことを「右手法」と呼びます。

  • navigateAroundWall():ナビゲイト・アラウンド・ウォール「壁を周って進む」

続く while ループでは、宝石のマスに着くまで navigateAroundWall() を繰り返し実行します。コードを実行してみて、Byte が壁をぐるりと周って1つ目の宝石まで進むことを確認してみてください。

壁を周って進む
壁を周って進む

2. スイッチまで進めるようにしよう
このステージをクリアするためには、宝石を取りながら切れているスイッチまで進む必要があります。しかし、今の while ループの条件だと1つ目の宝石の所でループが止まってしまい、それ以上進むことができません。

切れているスイッチまで進めるように、while ループの条件 !isOnGem!isOnClosedSwitch に変更しましょう。

// 切れているスイッチの上にいない間は繰り返す
while !isOnClosedSwitch {
	navigateAroundWall()
}

3. 宝石を取りながら進もう
while ループで進み続ける間に、宝石があったら取ります。宝石を取ったあとは、再び進み続けられるように向きを変えましょう。

while !isOnClosedSwitch {
	navigateAroundWall()

	// もし宝石の上にいるなら
	if isOnGem {
		//宝石を取って、後ろを向く
		collectGem()
		turnLeft()
		turnLeft()
	}

}

4. スイッチを切り替えよう
切れているスイッチまで来たら、while ループの条件である !isOnClosedSwitchfalse になるので繰り返しが終了します。ループの下に、スイッチをオンにするコマンドを入力しましょう。

while !isOnClosedSwitch {
	navigateAroundWall()
	if isOnGem {
		collectGem()
		turnLeft()
		turnLeft()
	}
}

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

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

// コード正解例

func navigateAroundWall() {
	if isBlockedRight {
		moveForward()
	} else {
		turnRight()
		moveForward()
	}
}

while !isOnClosedSwitch {
	navigateAroundWall()
	if isOnGem {
		collectGem()
		turnLeft()
		turnLeft()
	}
}
toggleSwitch()

レッスン 2「アルゴリズムを直す」

【目標】

  • 右手法のアルゴリズムを直す
  • 擬似コードを書いてみる
Swift Playground/コードを学ぼう1/アルゴリズム/アルゴリズムを直す
Swift Playground/コードを学ぼう1/アルゴリズム/アルゴリズムを直す

課題解決の流れ

1. 入力済みのコードを確認しよう
このレッスンでは以下のコードがすでに入力されています。

// 入力済みのコード

func navigateAroundWall() {
	if isBlockedRight {
		moveForward()
	} else {
		turnRight()
		moveForward()
	}
}

while !isOnClosedSwitch {
	navigateAroundWall()
	if isOnGem {
		collectGem()
		turnLeft()
		turnLeft()
	}
}
toggleSwitch()

これは、1つ前のレッスンの正解コードと同じです。宝石を取りながら右手法で進み、最後にスイッチを切り替えます。

はじめに「コードを実行」を押して Byte の動きを確認しましょう。このステージは前のステージよりもブロックが増え、行き止まりの場所も増えます。そのため、今のコードではうまくいきません。

前が行き止まりだと進めない
前が行き止まりだと進めない

2. 疑似コードを使って考えよう
前回のレッスンで定義された関数 navigateAroundWall() では、右に壁がある(= 右が行き止まり)かどうかだけをチェックしていました。一方で、今回のステージで壁を周って進み続けるためには、次の3つの条件で動きを分ける必要があります。

  • 右と前が行き止まりの場合
  • 右だけが行き止まりの場合
  • それ以外の場合

条件が3つとなると、少し複雑なコードになりそうですね。そこで、実際のコードを書く前に「擬似コード」を書いてアルゴリズムを整理してみましょう。擬似コードとは、コマンドを普段の言葉に置き換えたもののことです。

// 擬似コード

// func
壁を周って進む {
	// if / else if / else
	もし右が行き止まりかつ前が行き止まりならば {
		左を向く
	} そうではなくてもし右が行き止まりならば {
		進む
	} そうでなければ {
		右を向く
		進む
	}
}

// while
切れているスイッチの上にいない間は {
	壁を周って進む
	// if
	もし宝石の上にいるならば {
		宝石を取る
	}
}
スイッチを切り替える

3. アルゴリズムを直して実行しよう
擬似コードを参考にアルゴリズムを直して、動きを確かめます。右側に常に壁があるようにして進み(右手法アルゴリズム)、スイッチをオンにできたらステージクリアです!

// コード正解例

func navigateAroundWall() {
	if isBlockedRight && isBlocked {
		turnLeft()
	} else if isBlockedRight {
		moveForward()
	} else {
		turnRight()
		moveForward()
	}
}

while !isOnClosedSwitch {
	navigateAroundWall()
	if isOnGem {
		collectGem()
	}
}
toggleSwitch()

レッスン 3「迷路を解く」

【目標】

  • アルゴリズムを直す
Swift Playground/コードを学ぼう1/アルゴリズム/迷路を解く
Swift Playground/コードを学ぼう1/アルゴリズム/迷路を解く

課題解決の流れ

1. コードを入力しよう
このレッスンは、前のレッスンと同じコードを入力してから始めます。

// 1つ前のレッスンの正解コードを入力する

func navigateAroundWall() {
	if isBlockedRight && isBlocked {
		turnLeft()
	} else if isBlockedRight {
		moveForward()
	} else {
		turnRight()
		moveForward()
	}
}

while !isOnClosedSwitch {
	navigateAroundWall()
	if isOnGem {
		collectGem()
	}
}
toggleSwitch()

前回書いた右手法のアルゴリズムは、今回のステージでも正しく働きます。ただし、直さなければいけない部分もあります。それがどこなのか、ステージとコードを見比べて考えてみてください。

2. 疑似コードを使って考えよう
今回のステージにスイッチはありません。あるのはゴール地点に宝石が1つだけです。なので、while ループと最後のコマンドを変更する必要がありますね。宝石まで進み続けてから宝石を取るように、アルゴリズムを直しましょう。

// 擬似コード

// while
宝石の上にいない間は {
	壁を周って進む
}

宝石を取る

3. アルゴリズムを直して実行しよう
コードを直してから動きを確かめます。右手法で進み、最後に宝石を取ったらステージクリアです!

// コード正解例

func navigateAroundWall() {
	if isBlockedRight && isBlocked {
		turnLeft()
	} else if isBlockedRight {
		moveForward()
	} else {
		turnRight()
		moveForward()
	}
}

while !isOnGem {
	navigateAroundWall()
}
collectGem()

レッスン 4「どっちの手を使う?」

【目標】

  • 自分でアルゴリズムを考える
Swift Playground/コードを学ぼう1/アルゴリズム/どっちの手を使う?
Swift Playground/コードを学ぼう1/アルゴリズム/どっちの手を使う?

課題解決の流れ

1. 道順とパターンを確認しよう
まずは、Byte の進む道順を確認しましょう。切れているスイッチに注目して、パターンを見つけてください。

  • スイッチのないマス:前に進む
  • スイッチの先が行き止まりではない場合:スイッチをオンにして右を向く
  • スイッチの先が行き止まりの場合:スイッチをオンにして左を向く

2. 疑似コードを使って考えよう
道順とパターンを確認できたら、アルゴリズムを一から書いてみましょう。どうすればゴールに辿り着けるのか、擬似コードで整理してみます。

  • while ループで宝石のマス(= ゴール)まで動かし続けます。
  • 1歩進むごとにマスの状態を調べてやることを分けます。
  • 宝石のマスで while ループが終了するので、最後に宝石を取ります。
// 擬似コード

// while
宝石の上にいない間は {
	進む
	// if / else if
	もし切れているスイッチの上にいるかつ前が行き止まりならば {
		スイッチを切り替える
		左を向く
	} そうではなくてもし切れているスイッチの上にいるならば {
		スイッチを切り替える
		右を向く
	}
}
宝石を取る

if 文の条件の順番には注意が必要です。ifelse if の条件を逆にすると正しく動きません。

  • if:2つの条件を満たす場合
  • else if :1つの条件を満たす場合
マスの状態に応じてやることを変える
マスの状態に応じてやることを変える

3. コードを書き出して実行しよう
擬似コードを参考に Swift コードを書き出して動きを確かめましょう。スイッチをオンにしながら進み、宝石を取ったらステージクリアです!

// コード正解例

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

レッスン 5「右に行くか、左に行くか」

【目標】

  • 自分でアルゴリズムを考える
Swift Playground/コードを学ぼう1/アルゴリズム/右に行くか、左に行くか
Swift Playground/コードを学ぼう1/アルゴリズム/右に行くか、左に行くか

課題解決の流れ

1. 疑似コードを使って考えよう
アルゴリズムのレッスンはこれが最後です。宝石とスイッチの位置、どこが行き止まりになっているかに注目して、Byte の進む道順を確認してください。

「どんな状態のときに、何をすればゴールに辿り着けるのか」、擬似コードを書いて整理してみましょう。

  • while ループで入っているスイッチまで動かし続けます(外側のループ)。
  • さらに while ループで、行き止まりになるまで進み続けます(内側のループ)。
  • 1歩進むごとに if / else if でマスの状態を調べてやることを分けます。
  • 前が行き止まりになったら、周りの状態に応じて向きを変えます。
// 擬似コード

// while
入っているスイッチの上にいない間は {
	// while
	前が行き止まりではない間は {
		進む
		// if / else if
		もし宝石の上にいるならば {
			宝石を取る
			右を向く
			進む
			宝石を取る
		} そうではなくてもし切れているスイッチの上にいるならば {
			スイッチを切り替える
			左を向く
			進む
			スイッチを切り替える
		}

	// if
	もし右が行き止まりならば {
		左を向く
	// else
	} そうではないなら {
		右を向く
	}
}
マスの状態に応じてやることを変える
マスの状態に応じてやることを変える

2. コードを書き出して実行しよう
擬似コードを参考に Swift コードを書き出して動きを確かめましょう。すべての宝石を集めてスイッチをオンにできたら、ステージクリアです!

// コード正解例

while !isOnOpenSwitch {
    while !isBlocked {
        moveForward()
        if isOnGem {
            collectGem()
            turnRight()
            moveForward()
            collectGem()
        } else if isOnClosedSwitch {
            toggleSwitch()
            turnLeft()
            moveForward()
            toggleSwitch()
        }
    }
    if isBlockedRight {
        turnLeft()
    } else {
        turnRight()
    }
}

まとめ

今回は、Swift Playground の「コードを学ぼう1」で、アルゴリズムを学習しました。

目的を達成するための作業を正確に・具体的に・正しい順序で書いたもの、これがアルゴリズムです。アルゴリズムの基本構造は「上から順に実行」「条件分岐」「繰り返し」です。

複雑なアルゴリズムになりそうな場合は、擬似コードを書いてみると良いでしょう。擬似コードは、本物のコードを書く前の「下書き」や「設計図」のようなものです。分かりやすい言葉で考えを整理することができるので、実際にコードを書くときに失敗しにくくなるというメリットがあります。

さて、以上で「コードを学ぼう1」のレッスンは終わりです。ここまで、なんと47もの課題をクリアしてきました!コードを書いて、動かして、直す。この積み重ねで、確実にレベルアップしてきましたね。続いてのチャレンジは「コードを学ぼう2」です。変数や配列など、プログラミングに重要なスキルをさらに身につけていきましょう!

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

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

関連記事

スクラッチプログラミング - たっきゅうゲームのつくりかた - Part 1
コンピューターと対戦(たいせん)する卓球(たっきゅう)ゲームをつくってみましょう。ラケットのプログラムは簡単(かんたん)です。ボールをいろいろな方向(ほうこう)にうごくようにするのが、プログラミングのポイントになります。
JavaScript - ピンポンゲームの作り方 Part 1 - キーで操作する
JavaScript でピンポンゲームを作成します。キーで操作する方法や衝突判定、ゲームループなどを3回に分けて解説します。今回の Part 1 では、キー押下でパドルを動かせるようにコーディングします。
CSS Art - How to Make a Game Character - Super Mario
A plumber jumping in and out of pipes, throwing fireballs while rescuing a princess. Step-by-step article to create a world renowned game character.
CSS Animation – Diagonal Movement
Zip to the bottom right, then to the upper left hand corner, then switch directions. Let’s learn how to do just that in this step-by-step article.