【発展編】19-b コードで走ろう

Q1. ☆問題☆

ミッション2で

ev3.move(forSeconds: 3, leftPort: .b, rightPort: .c, leftPower: 100, rightPower: 100)

という命令を使ったよね。EV3アプリではモーターがつながっているところを「B+C」のように書いていたから、Swiftでも

ev3.move(forSeconds: 3, port: .b+.c, leftPower: 100, rightPower: 100)

のように書くことはできるだろうか。説明としてもっともふさわしいものを次の中から選んでね。

  • このように書くことはできない。SwiftにはSwiftの「認められる書き方」があるので、その通りに書かないと動いてくれない。
  • このように書くことはできない。ただし、「b+c.」とすれば動く。
  • このように書くことができる。
  • このように書くことができる。しかし、うまくいかないことも多いので、ワークブックのように書いたほうがよい。

正解

  • このように書くことはできない。SwiftにはSwiftの「認められる書き方」があるので、その通りに書かないと動いてくれない。
  • このように書くことはできない。ただし、「b+c.」とすれば動く。
  • このように書くことができる。
  • このように書くことができる。しかし、うまくいかないことも多いので、ワークブックのように書いたほうがよい。

解説

英語の「if」は日本語だと「もし」という意味だ。では、電話にでるときの「もしもし」は、英語では「if if」なのかな?
ちがうよね。知っている人もいるだろうけれども、電話にでるときには「Hello」(ハロー)という。
日本語には日本語の、英語には英語の言い方があるんだ。

これと同じことが、EV3アプリとSwiftの間でも言える。

EV3アプリにはEV3アプリのやり方が、SwiftにはSwiftのやり方があるんだ。EV3アプリを参考にするのはいいことだし、
「EV3アプリでやっていたことをSwiftでやるにはどうすればいいのか」と考えることは大事だけど、
「EV3アプリがこうだったから、Swiftでも同じようにできないのはおかしい」というのはちがう。
それぞれのちがいを知って、それぞれの「よさ」を感じてほしい。

Q2. ☆問題☆

ev3.move(forSeconds:1, leftPort:.b, rightPort:.c, leftPort:100, rightPower:100)

というプログラムは、「左のモーターはBに、右のモーターはCにつないで、それぞれのモーターを1秒間、100のパワーで動かす」ものだよね。
それでは、次のプログラムはどのような動きをするだろうか。正しいものを選んでね。

ev3.motorOn(forSeconds:1, on:.b, withPower:100)
ev3.motorOn(forSeconds:1, on:.c, withPower:100)

  • ev3.moveで作った「左のモーターはBに、右のモーターはCにつないで、それぞれのモーターを1秒間、100のパワーで動かす」と同じ動きをする
  • ev3.moveで作った「左のモーターはBに、右のモーターはCにつないで、それぞれのモーターを1秒間、100のパワーで動かす」と似た動きをするが、右側のモーターのほうが、ほんの少しだけ止まるのがおそい
  • 左のモーターが1秒間動いて止まり、そのあとに右のモーターが1秒間動いて止まる
  • 左のモーターが動き始めて、0.1秒くらいしてから右のモーターが動くため、ふらふらと動く

正解

  • ev3.moveで作った「左のモーターはBに、右のモーターはCにつないで、それぞれのモーターを1秒間、100のパワーで動かす」と同じ動きをする
  • ev3.moveで作った「左のモーターはBに、右のモーターはCにつないで、それぞれのモーターを1秒間、100のパワーで動かす」と似た動きをするが、右側のモーターのほうが、ほんの少しだけ止まるのがおそい
  • 左のモーターが1秒間動いて止まり、そのあとに右のモーターが1秒間動いて止まる
  • 左のモーターが動き始めて、0.1秒くらいしてから右のモーターが動くため、ふらふらと動く

解説

実際に試してみよう。

プログラムは上から順番に実行されるから、「左のモーターが1秒間動いて止まり、そのあとに右のモーターが1秒間動いて止まる」が正解。EV3アプリでプログラミングブロックをおくことを考えるとイメージしやすいかな。

Q3. ☆問題☆

次のプログラムのデバッグをしよう。まちがっているところはどこかな。すべて選んでね。

repeat{
ev3.move(forSecond:1, leftPort:.b, rightport:c, leftPower:50, rightPower:50)
ev3.playSound(file: .blip, atVolume: 40, withStyle: .waitForCompletion )
} while true

  • forSecondではなくforSeconds
  • leftPort:.bではなく、LeftPort:b
  • rightport:cではなく、rightPort:.c
  • file:.blipではなく、file://blip
  • while trueの前の } はいらない

正解

  • forSecondではなくforSeconds
  • leftPort:.bではなく、LeftPort:b
  • rightport:cではなく、rightPort:.c
  • file:.blipではなく、file://blip
  • while trueの前の } はいらない

解説

これも実際に試してみるとわかるよね。

forSecondではなくforSeconds → 正しい!
leftPort:.bではなく、LeftPort:b → さいしょの l は小文字なのでまちがい。さらに、bの前に「 . 」もない。
rightport:cではなく、rightPort:.c → 正しい!
file:.blipではなく、file://blip → このような書き方はしないので、まちがい。
while trueの前の } はいらない → 必要。

プログラミングするときには、一文字まちがえただけでもプログラムは動かない。正しく入力できているかをたしかめるクセをみにつけよう。