Swift Playground - コードを学ぼう1【関数】Part 2

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

Swift Playground - コードを学ぼう1【関数】Part 2

関数の作り方をマスターしよう

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

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

  • レッスン1〜4:前回の Part 1 で取り上げ、関数がどういうものなのかを学習しました。
  • レッスン5〜7:この記事で解説します。自分で関数を作ることに慣れていきましょう。

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

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

レッスンのポイント

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

  • 関数は、よく使う処理をひとまとめにして名前をつけたものです。
  • 新しく関数を作ることを「関数を定義する」といいます。
  • 関数名に複数の単語を使うときは、2つ目以降の単語の先頭を大文字にします。
  • 関数は定義しただけでは何もしません。実際に使うときは、関数名と括弧を入力します。これを「関数を呼び出す」といいます。
// 関数を定義する
func 関数の名前() {

    // 一連の処理...

}

// 関数を呼び出す
関数の名前()

今回は、ステージをクリアする方法を複数の関数に分解する練習をしていきます。分解とは、ある問題を1つの大きなものとして捉えるのではなく、いくつかの小さな問題に分けることです。

最初からいっぺんに多くのことを解決するのは大変ですよね。そこで、まずはステージの一部分をクリアするパターンを見つけて関数を作り、その関数を組み合わせて大きな部分をクリアするための関数を作る、という方法でコーディングしていきます。

  1. 大きい問題を小さい問題に分ける(分解する)
  2. 小さい問題を解決する関数を作る
  3. 小さい問題を解決する関数を組み合わせて、大きい問題を解決する関数を作る
問題を分解して解決するイメージ
問題を分解して解決するイメージ

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

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

レッスン 5「パターンをネストする」

【目標】

  • 繰り返すパターンを複数の関数に分解する
  • 関数を別の関数の中で呼び出す
Swift Playground/コードを学ぼう1/関数/パターンをネストする
Swift Playground/コードを学ぼう1/関数/パターンをネストする

課題解決の流れ

1. 入力済みのコードを確認しよう
このステージをクリアするために繰り返されるのは、「階段を上って宝石を取り、もとの位置に戻る」という、階段1つを達成する動きです。

今回は、あらかじめ繰り返すパターンが分解され、以下のコードが入力されています。

// 入力済みのコード

func turnAround() {
    turnLeft()
    turnLeft()
}

func solveStair() {
    // クリックしてコードを入力
}

solveStair()

最初に定義されている turnAround() は、宝石を取ったあとにくるりと向きを変えるための関数です。

  • turnAround():ターン・アラウンド「後ろを向く」

その下には、solveStair() という関数を作る準備がされています。これが、階段1つを達成するための関数になります。

  • solveStair():ソルブ・ステア「階段をクリアする」

2. 階段をクリアする関数を定義しよう
solveStair() を定義していきましょう。

{ } の中には1つの階段をクリアするパターンを入力します。すでに定義済みの turnAround() をこの関数の中で組み合わせてください。

// 階段をクリアする関数を定義する
func solveStair() {

    // 1マス進んで宝石を取る
    moveForward()
    collectGem()

    // 後ろを向く
    turnAround()

    // 中央に戻って別の階段の方を向く
    moveForward()
    turnLeft()
}
1つの階段をクリアする
1つの階段をクリアする

3. 関数を呼び出そう
solveStair() でクリアできるのは1つの階段だけです。四方にある4つの宝石を集めるためには、solveStair() を4回呼び出します。

solveStair() // 1つ目の階段をクリア
solveStair() // 2つ目の階段をクリア
solveStair() // 3つ目の階段をクリア
solveStair() // 4つ目の階段をクリア

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

// コード正解例

// 後ろを向く関数
func turnAround() {
    turnLeft()
    turnLeft()
}

// 階段をクリアする関数
func solveStair() {
    moveForward()
    collectGem()
    turnAround()
    moveForward()
    turnLeft()
}

// 4つの階段をクリアする
solveStair()
solveStair()
solveStair()
solveStair()

レッスン 6「並んだ階段」

【目標】

  • 繰り返すパターンを複数の関数に分解する
  • 関数を別の関数の中で呼び出す
Swift Playground/コードを学ぼう1/関数/並んだ階段
Swift Playground/コードを学ぼう1/関数/並んだ階段

課題解決の流れ

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

// 入力済みのコード

func collectGemTurnAround() {
    moveForward()
    moveForward()
    collectGem()
    turnLeft()
    turnLeft()
    moveForward()
    moveForward()
}

func solveRow() {
    collectGemTurnAround()
}

solveRow()

あらかじめ定義されている collectGemTurnAround() は、前に進んで宝石を取り、後ろを向いてもとの位置に戻る関数です。この関数によってステージの一部分をクリアできます。

  • collectGemTurnAround():コレクト・ジェム・ターン・アラウンド「宝石を取って後ろを向く」

そして、この関数を別の関数 solveRow() の中で呼び出しています。これは、宝石を取って1列分を達成するための関数で、定義は不完全です。solveRow() では、より大きな部分を解決できるようにしていきます。

  • solveRow():ソルブ・ロー「列をクリアする」

はじめに、入力済みのコードで Byte がどのように動くのか、「コードを実行」を押して確認しましょう。solveRow() を呼び出すと collectGemTurnAround() が実行されるので、Byte は宝石を1つ取ってからもとの位置に戻ってきます。

solveRow()を呼び出したときの動き
solveRow()を呼び出したときの動き

2. 列をクリアする関数を定義しよう
現在の solveRow() の定義では列の半分しかクリアできません。同じ列にあるもう1つの宝石も集められるように、関数 solveRow() にコードを追加します。

列の反対側も同じパターンでクリアできるので、collectGemTurnAround() をもう一度呼び出しましょう。

func solveRow() {
    collectGemTurnAround()
    collectGemTurnAround() // 列の反対側の宝石を取って戻る
}

以上で、1列クリアするための関数 solveRow() を定義できました。

3. すべての宝石を取りに行こう
2列目、3列目の宝石も取りに行けるよう、コードを入力しましょう。

solveRow()

// 2列目に行く
turnRight()
moveForward()
turnLeft()
solveRow() // 2列目をクリアする

// 3列目に行く
turnRight()
moveForward()
turnLeft()
solveRow() // 3列目をクリアする

4. コードを実行しよう
「コードを実行」を押して動きを確かめます。宝石を残らず集められたら、ステージクリアです!

// コード正解例

// 宝石を取って後ろを向く関数
func collectGemTurnAround() {
    moveForward()
    moveForward()
    collectGem()
    turnLeft()
    turnLeft()
    moveForward()
    moveForward()
}

// 列をクリアする関数
func solveRow() {
    collectGemTurnAround()
    collectGemTurnAround()
}

// 全ての列をクリアする
solveRow() // 1列目クリア
turnRight()
moveForward()
turnLeft()
solveRow() // 2列目クリア
turnRight()
moveForward()
turnLeft()
solveRow() // 3列目クリア

レッスン 7「パターンを探す」

【目標】

  • 小さいパターンを見つけて関数を作る
  • より大きいパターンを見つけて関数を作る
Swift Playground/コードを学ぼう1/関数/パターンを探す
Swift Playground/コードを学ぼう1/関数/パターンを探す

課題解決の流れ

1. 小さいパターンを見つけよう
関数のレッスンはこれが最後です。一気にステージクリアを目指すのではなく、まずは小さな問題を見つけ出し、それを解決する関数を作ります。

ステージを見て、スイッチの位置を確認してください。「何もないマスが1つあり、その先にスイッチがある」というパターンが見えてきますね。まずは、この部分をクリアする動きを小さいパターンとして関数にまとめていきましょう。

小さいパターン
小さいパターン

2. 新しい関数を定義しよう(小さいパターン)
関数を作るためにショートカットバーから func を選びます。そうすると、新しく関数を作るためのコードが自動的に入力されます。

// funcを選択して入力されるコード
func name() {
    // function body
}

「2マス進んで、スイッチを切り替える」という処理を実行する関数を作りましょう。

  • moveThenToggle():ムーブ・ゼン・トグル「進んでから切り替える」
// 進んでから切り替える関数を定義する
func moveThenToggle() {

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

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

3. より大きいパターンを見つけよう
続いて、もっと大きいパターンで繰り返される動きがないかを確認します。

端にあるスイッチを切り替えたあとは、残りのスイッチを切り替えに行くために、くるりと向きを変えて戻ります。今度はこれを大きい部分を解決する関数として定義しましょう。

大きいパターン
大きいパターン

4. 新しい関数を定義しよう(より大きいパターン)
「2マス進んでスイッチを切り替え、後ろを向いて、2マス進む」という処理を実行する関数を作ります。この関数では、先ほど作った小さいパターンの関数 moveThenToggle() を呼び出します。

  • toggleThenReturn():トグル・ゼン・リターン「切り替えてから戻る」
// 切り替えてから戻る関数を定義する
func toggleThenReturn() {

    // 2マス進んでスイッチをオンにする
    moveThenToggle()

    // 後ろを向く
    turnLeft()
    turnLeft()

    // 2マス進む
    moveForward()
    moveForward()
}

5. すべてのスイッチを切り替えに行こう
関数を定義できたら、適切なタイミングで、適切な関数を呼び出します。切れているスイッチを残らずオンにできるようコーディングしましょう。

// 1列クリアする
toggleThenReturn()
toggleThenReturn()

// 向きを変える
turnRight()

// 端までクリアし2マス戻る
moveThenToggle()
toggleThenReturn()

// 中央に戻る
moveForward()
moveForward()

// 反対側の端までクリアする
moveThenToggle()
moveThenToggle()

6. コードを実行しよう
「コードを実行」を押して動きを確かめます。すべてのスイッチをオンにできたら、ステージクリアです!

// コード正解例

// 進んでから切り替える関数
func moveThenToggle() {
    moveForward()
    moveForward()
    toggleSwitch()
}

// 切り替えてから戻る関数
func toggleThenReturn() {
    moveThenToggle()
    turnLeft()
    turnLeft()
    moveForward()
    moveForward()
}

// 全てのスイッチを入れに行く
toggleThenReturn()
toggleThenReturn()
turnRight()
moveThenToggle()
toggleThenReturn()
moveForward()
moveForward()
moveThenToggle()
moveThenToggle()

まとめ

今回は、Swift Playground の「コードを学ぼう1」で、関数の作り方を学習しました。

何か大きな問題を解決するときは、小さいパーツに分けて考えます。これを分解といいます。よく使う小さな処理を関数にしておき、それを大きな処理の関数の中で組み合わせると、関数を再利用しやすくなり、コードも整理されて読みやすくなります。

一般的に関数名は英語なので、名前を考えるのが難しく感じるかもしれませんが、少しずつ慣れていきましょう!

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

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.