2018年2月23日金曜日

Scratchでプログラミング その18 大きな数字の計算(Inifinity)

Scratchの使い方解説です、今回の難易度はEasy
この記事だけで内容が完結しています。

記事をまとめたページはこちら。


Scratchでの大きな数値の扱いについて調べてみました。

2×2=4
4×4=16
16×16=256
・・・
と繰り返すと、数字は段々と大きな数字になっていきます。
電卓で言うと「2××」って入れた状態かな。

これをScratchで計算し続けるとどうなるのか調べてみました。

変数valanswerを用意して
初期値としてval = 2 を指定しいます。

そのあと、15回計算を繰り返しています。
15回という数字には意味はありません。

繰り返しの中で、
answerval × val の結果を代入して
その結果を表示しています。
最後に変数val にanswerの結果(val×val)を代入します。
として繰り返すだけです。

このときの計算結果を表示してみます。



このように計算がだんだんと進んでいきます。


最終的に1行では計算が表示できなくなって、計算結果にInfinityと表示されます。
本題ではないのですが、計算式の掛け算が変なものに変わっているのは大きな数値の表し方です。

その状態で、さらに計算を続けると、図のようにInfinityのみの計算結果に・・・


このように数字は最終的に「Infinity」になります。

一度「Inifinity」になった変数は、割り算など計算をした結果はずっと「Infinity」のままです。

ただし-1×Inifinity-Infinityとなり、正の数と負の数の違いはあります。
また、Infinity×0は「NAN(非数)」として扱われます。
NANもInifinityと同様に計算できない数値です。

計算できないInifinityですが、制御文のなかでinifinityの判定は可能です。


Scratchではこのように大きな数値が表示されますが、プログラム言語や扱う数値の種類によっては、そこで例外というエラーが発生して、ゲームが動かなくなります。

実際のプログラムでは滅多にこんなサイズの数値を扱うことはないと思います。
というか、こんな数値を見るのは、だいだいはバグが原因ですね。
サンプルのようにすごい数値の掛け算をするときに発生することもあるかなと思います。

もし、自分で作るプログラムの中に掛け算を繰り返す場所がある場合は問題ないか確認してみましょう。

今回作成したプログラムを公開しています。
動作の確認をしてみてください。


2018年2月21日水曜日

Scratchでプログラミング その17 メッセージを利用して変数をプライベート変数にする

Scratchの使い方解説です、今回の難易度はNormal
ここまでの記事を使うので、部分的に読んでもわからないかもです。

記事をまとめたページはこちら。

前回解説しましたが、グローバル変数を使うことは出来るだけ避けたほうが良いです。
今回はこれまでの動作をメッセージを利用することで代用してみようと思います。
メッセージを利用することで全体の処理がわかりやすくなります。

0.目次

  1. グローバル変数を削除
  2. ダメージ受けたときのメッセージを追加
  3. メッセージを受け取る

1.グローバル変数を削除

ここまで、当たり判定では「プレイヤー」に登録した変数Lifeを利用しています。

これはこれで良い様な気もしますが、プレイヤーの操作のなかではライフ計算までしないと考えることにしてみます。
つまり、プレイヤーに書くコマンドは、あくまで、プレイヤーの動きに関わることだけをコマンドに設定しよう
ということです。うぅむ、説明が難しい。

とりあえず!ライフの計算とゲームオーバーについてのコマンドを削除します。

まずはプレイヤーのコマンドに含まれていたLifeの初期設定を消します。


当たり判定からもLifeの計算部分を消します。


最後にデータの「Life」を右クリックで削除します。


Lifeを削除しました。

Lifeについてのコマンドを削除したので、いまは敵に当たってもライフが減らない状態です。


2.ダメージ受けたときのメッセージを追加

次にこれまでの変数Lifeの変わりにメッセージを使用します。

プレイヤーの当たり判定のコマンドにイベントの「○○を送る」を追加します。


コマンドは新しいメッセージを作成して使用します。
イベントの「○○を送る」をクリックして「新しいメッセージ」を作成します。


メッセージは「ダメージを受けた」という名前にしました。
 

これで、プレイヤーは「ダメージを受けた」というメッセージを送るだけで、そのあとの処理には関係なくなります。
以前のコマンドと比べても、プレイヤーのコマンドが単純になりました。


3.メッセージを受け取る

今度は「残りライフ」のスプライトに「ダメージを受けた」というメッセージを受け取る処理を追加します。


まずはプライベート変数としてのLifeを追加します。
これまで使用していたLifeはどのスプライトからでも使用可能なグローバルな変数として作成されていました。

今回は「残りライフ」のスプライトにのみ使用される変数として「このスプライトのみ」で変数を作成します。


変数Lifeをコマンドに追加しました。

これまで「プレイヤー」のスプライトに書かれていた変数Lifeの初期設定を追加しています。

ただし、ここまでのコマンドの修正で「プレイヤー」に設定していたライフを減らす処理を消しているので、敵にぶつかってもライフが減らなくなっています

「1.」では、「プレイヤー」はライフを減らす代わりに「ダメージを受けた」というメッセージを送るように修正しました。
「残りライフ」のスクリプトではそのメッセージを利用します。


イベントの「ダメージを受けた」を使って、新しいブロックを追加します。
まず、ダメージを受けたので変数Lifeを減らします。
その後にクローンの削除判定を追加します。
クローンの削除する判定は、もともと「クローンされたとき」で使用していたものを利用しています。

最後にLifeがなくなったときに「すべてを止める」ようにしています。


これで、メッセージへの置き換えが完了しました。

動作は変わらないですが、それぞれのコマンドが独立して、読みやすくなっていると思います。






2018年2月20日火曜日

Scratchでプログラミング その16 残りライフをイラストで表現

Scratchの使い方解説です、今回の難易度はNormal

記事をまとめたページはこちら。

前回は残りライフを画面に表示しましたが、味気ないものでした。
今回はクローンを使って残りライフを表示します。




0.目次


  1. シルエットの作成
  2. クローンで残りライフを複製
  3. ダメージを受けたときライフを減らす


1.シルエットの作成

これが前回作った残りライフ

変数をそのまま使用していて見えにくいです。

まずは表示していたライフを非表示にします。
ライフを右クリックして「隠す」を選択すれば非表示にできます。



次にライフを表示するためのスプライトを追加して画面の左上に配置します。
スプライトの名前は「残りライフ」に変更しています。


作成した「残りライフ」の見た目をシルエットのみにします。


「残りライフ」に以下のコマンドを追加します。

シルエットへの変更には見た目の「明るさの効果を-100にする」を使用しました。

「明るさの効果を-100にする」は、の効果を0にする」の「」部分を変更してください。



2.クローンで残りライフを複製

今回はライフを5つという設定にしてみました
(プレイヤーでライフを3に設定している場所は直してください)

以前に使用したクローンを利用してライフを5つ分表示します。
ここまでの作り方を利用すると、こんな風なコマンドまでは作れると思います。
ただし、このままだとクローンは同じ場所に重なって配置されます。
敵キャラなどと違って、自動で移動していくものでもないし、乱数でランダムな位置に表示するものでもありません。

ここでは変数を使用します。

データの「変数を作る」ボタンをクリックして残りライフのアイコンを管理する「LifeIcon」を作成します。
この変数は「このスプライトのみ」にチェックを入れてください。

この変数を利用してコマンドを編集します。
メインの「旗がクリックされたとき」側のブロックに
データの「LifeIconを1にする」で初期値を1に指定しています。

そして、クローンを繰り返すごとに「LifeIconを1ずつ変える」ようにしました。
こうすることで、クローンを作るたびに変数LifeIconは1,2,3,4,5とだんだん数字が変わっていくことになります。


「クローンされたとき」側のコマンドではx座標の指定LifeIconを指定します。
x座標の指定LifeIcon×30という座標を指定しています。
クローンが作られるたびに、変数LifeIconは1,2,3,4,5という値がだんだんと増えていきます。なので、x座標は30、60、90、120、150と30ずつ変化します。

3.ダメージを受けたときライフを減らす

ダメージを受けると変数Lifeを1ずつ減らしています。

「残りライフ」の各クローンは変数LifeIconと変数Lifeの値を比較しています。
Lifeが徐々に減っていって、各クローンの持つLifeIconより小さくなったときクローンを削除してしまいます。

これで「残りライフ」が表示できました。


4.グローバル変数とプライベート変数

今回のポイントとして
  • 変数Lifeグローバルな変数
  • 変数LifeIconプライベートな変数
という点があります。

変数Lifeは作成時に「すべてのスプライト」を選択しました。
「すべてのスプライト」を選択した変数は
「プレイヤー」でも「残りライフ」でも使用できます。
また、どこかで値が変更になったときに、他で使用している場所も全て値が変更になります。
このような変数をグローバル変数だったりパブリックな変数と呼びます。

それに対して、変数LifeIconは「このスプライトのみ」を選択しました。

「このスプライトのみ」を選択した場合はスプライトごと(クローンごと)に別々に値を保持します。どこかで変数を変えても、そのスプライト(クローン)意外には影響ありません。
なので、変数LifeIconは「残りライフ」では表示されますが、「プレイヤー」のスプライトでは変数として表示されません。
また、各「残りライフ」ごとに1,2,3,4,5という異なる値を持ち続けていました。
このような変数をプライベート変数と呼びます。

変数をどちらで作るべきかは使用方法によって変わります。
基本的には「このスプライトのみ」を使用すべきです。

どこからでも変更可能な「すべてのスプライト」の方が便利そうに見えますが、
どこからでも変更可能ということは大きなプログラムでは、どこで値が変えられたかわからなくなるという危険があります。
そのため影響範囲がわかりやすい「このスプライトのみを」を使うほうが良いです。

ただし、今回のLifeのように各スプライトで値を使いたいものについては「すべてのスプライト」を選択しましょう。
また「すべてのスプライト」を使用した場合でも出来るだけ値を変更するのは1つのスプライトに限定して、他のスプライトからは値を変更せずに数字の比較などに使用するだけにしたほうが、バグが発生しにくいです。

グローバル変数である「すべてのスプライト」のような変数は、あまり沢山用意しないのが理想です。今回はLifeIconに「すべてのスプライト」を使用しましたが、メッセージを併用することで「このスプライトのみ」に変更しても同じ動きをすることができます。

2018年2月19日月曜日

Scratchでプログラミング その15 イラストに名前をつける(命名規約)

Scratchの使い方解説です、今回の難易度は超Easy

記事をまとめたページはこちら。

今回はイラストの名前についてです。
やることは簡単だけど、解説が長いです。
初心者は難しかったら読み飛ばして、そのうち読み直してください。


0.目次

  1. 名前の変更
  2. 名前を付けるルール

1.名前の変更

ここまでに、複数のイラスト(スプライトって言います)を使って来ました。
僕の記事を参考にプログラムを作っていると、スプライトが5つ登録されているかなと思います。
スプライトを追加すると、sprite1やSun, Treesなど、英語の名前が自動で指定されます。
そのままでも良いのですが、スプライトが多くなるとそれぞれのスプライトが何なのかわからなくなっていくこともあるので名前を変更してみます。
画像はネコの名前を「プレイヤー」に変更してあります。

名前の変更は簡単。
スプライト一覧で選択したスプライトを選択します。
選択されているスプライトは青枠で囲まれます。
この状態で右クリックして表示される「info」を選択します。

スプライトの情報が表示されます。
ここの画面で「sprite1」などと付けられている名前を「プレイヤー」などの好きな名前に変更します。

すべて変更してみました。
この図ではネコのイラストを複数用意しています。
このように、同じスプライトを複数の目的で使う場合、名前を指定しておかないと使い方がわからなくなってしまいます。


2.名前を付けるルール(命名規約)

今回はスプライトの名前を日本語で指定しました。
理由は日本語の方がわかりやすいからです。
そのまんまですね(笑

でも、一般的にはスプライトの名前や変数などは、英語で名前を付けるほうが良いです。
Scratchは大丈夫なようですが、C言語など昔から使われている言語は日本語に対応していないものもあります。

また、日本語を使うと日本人しか読めないプログラムになってしまいます。
Scratchは日本人だけでなく多くの外国の方が使用していて、お互いに作ったプログラムの中身を確認できるようになっています。
もし外国の方が、あなたの作ったプログラムが気に入って、どうやって動いているのか確認したいと思ったとしても、日本語が読めないとわからない部分が出てくるかもしれません。

また、職業としてプログラマを目指すのであれば尚更です。
仕事で皆でプログラムを作っていくとき、チームのメンバーは日本人だけとは限りません
一部のプログラムを海外で作ってもらうこともあるし、逆に海外の仕事を請けることもあると思います。そんなときに日本語でプログラムが書かれていたら困りますね。


また、変数などの場合、単に英語であれば良いというわけではなく、さらに細かいルールがあります。
例えば、プレイヤーのネコのライフを変数とするときにどんな名前を付けますか?
  • _catLife
  • cat_life
  • CatLife
  • NekoLife(ローマ字と英語)
  • neko_life(ローマ字と英語)
  • NokoriTairyoku(ローマ字)
  • ネコのライフ
  • 残り体力
人によって変数名をどう付けるのかは個性が出てくると思います。
プログラムはどの名前を付けてもちゃんと動いてくれます

ただ、チームでプログラムを作る場合に統一されていないと困ってきます。
作るプログラマによって「Neko」と「Cat」が混ざっていると後から読みにくいですよね?
また、一般的には最初の文字が大文字か、小文字かでも意味が違っていたりします。
ですので、チームでプログラムをする場合は名前の付け方やプログラムの書き方をまとめた命名規約コーディング規約というものが用意されています。
変数の名前を付けるときはチームでのルールに従って名前を付けるようにしましょう。

命名規約やコーディング規約は参加するプロジェクトや、使用するプログラム言語によって異なります
Scratchであっても、C#やJavaの規約に従っておいたほうが良いと思います。
興味ある方は参考にしやすい規約をマイクロソフトが提示されていますので参考にしてみてください。

この記事は日本語で書かれていて、読む人は日本人のプログラム初心者という想定です。
ですので日本語で名前を指定しています。
皆さんがプログラムするときは日本語をあまり使わないほうが良いと思いますよ~



2018年2月18日日曜日

Scratchでプログラミング その14 敵に当たると体力が減る(変数)

Scratchの使い方解説です、今回の難易度はEasy
前回までの記事についてこれていれば、簡単だと思います。

記事をまとめたページはこちら。

特に計画を立てて記事を書いているわけではないので、プログラムを勉強するのに大切なものが、なかなか紹介されなかったりします。

今回はプログラムの主役と言っても良い「変数」をやっと使います!

0.目次

  1. 変数の作成
  2. 初期ライフの設定
  3. ダメージを受けたときにライフを減らす


1.変数の作成

前回までの記事で敵を登場させましたが、ネコが痛がるだけで何度当たっても、ゲームオーバーにはなりません。

ですので、3回当たったらゲームオーバーにしようと思います。

前回、ネコに作成した当たり判定のコマンドです。

今回はここにダメージを受けたときの処理を追加します。

プレイヤーのネコは最初ライフを3持っていて
敵にぶつかるたびに、3→2→1→0と減っていくことにします。
この3から順に変わっていく数字を「変数」と言います。

Scratchではデータの「変数を作る」ボタンから作成します。

今回は変数の名前を「Life」としました。
「すべてのスプライト」と「このスプライトのみ」の選択は
「すべてのスプライト」を選択しておいてください。

変数を作成すると、下の図のようなコマンドが追加されます。


追加された「Life」のチェックボックスをチェック状態にすると、画面上に「Life」が表示されるようになります。

今回は簡易的に画面に表示された「Life」をそのまま使用します。


2.初期ライフの設定

いま表示されている「Life」は0です。
ゲームの開始時点ではライフを3にする必要があります。


ネコの初期設定に「Lifeを3にする」を追加しました。
ついでに、位置の指定もx座標だけでなくy座標の指定まで行うように変更しています。
これは、ジャンプしたままゲームオーバーになったときに、キャラクターが空中に浮きっぱなしになることへの対策です。


3.ダメージを受けたときにライフを減らす


次にネコの当たり判定に「ライフを減らす」コマンドを追加しました。
ライフを減らす」コマンドの次にライフがが0になっていないか」判定をしています。
ゲームオーバーの判定は「Life=0」ではなく「Life<1」にしています。
これは連続でダメージを受けたときにLifeがマイナスになるかもしれないためです。
Lifeがもしもマイナスになってしまうと「Life=0」の判定では判断できなくなります。

そして、ゲームオーバー時には制御の「すべて止める」を使用しました。
これで、3回ダメージを受けるとプログラムがストップするようになりました。


今回は画面に変数のLifeを直接表示しましたが、Scratchでは数字を表示しやすいイラストが用意されています。
次回は、Lifeの表示を少しオシャレにしてみようと思います。

2018年2月17日土曜日

Scratchでプログラミング その13 前後でネコの移動する速さを変える(相対速度を考える)

Scratchの使い方解説です、今回の難易度はNormal
前回までの記事についてこれていれば、簡単だと思います。

記事をまとめたページはこちら。

前の記事でネコの左右への移動速度を変えているという説明をしました。
少し説明が長くなりそうなので、ここで説明しておきます。


これは、ネコが左右に動くためのコマンドです。

先に説明したとおり、右へ進むときはネコは5の速さで前へ進むのに、左へ進むときは7の速さで進んでいます。
つまり、左へ移動する時のほうがネコが早く移動していることになります。

でも、普通はどちらへ移動するときも同じ速さにすべきだとは思いませんか?
左右で移動速度を変えているのは背景との相対速度を意識しているためです。



ここまでのサンプルでは、背景の木がずっと左から右へ流れています。
でも、実際の世界で考えると、背景の木は動くわけがないですね。
ですので、操作しなくても猫が前へ進んでるように見えていると思います。
木の動く速さが左方向へ2だとするなら、ネコは何もしなくても、右方向へ2で進んでいることになります。


では、ネコを操作して右へ5の速さで移動するとどうなるでしょうか?


ネコは何をしなくても右へ2の速さで移動しているため、合計で7の速さで移動していることになります。

逆に、ネコを左に5の速さで移動してみたらどうでしょう?
ネコはなにもしなくても右へ2の速さで移動しているため、実際には5-2で左へ3の速さで移動しているようにしか見えません。

今回は左右でネコの進む早さを同じに見せたいので、左側へネコを操作するときは、なにもしなくても移動してしまう2をネコの左向きの早さに追加して、7の速さでネコを移動させる必要があります。

プログラムで考えるとわかりにくいかもしれませんが、これって、単に相対速度の考え方を使っているだけなんです。
たしか中学か高校の物理の授業で習いましたよね??

もちろん、ゲームであれば厳密に速度を調整する必要はありません。
現実世界に忠実にあわせるよりも、キャラクターが面白く動くほうが大切だと思います。
また、背景がスクロールしない場合も、このような移動速度を考える必要なありません。

でも、今回のような調整をすることで、操作のときの違和感を減らすことが出来ます。
作ったプログラムの動きに何か違和感があれば、その都度原因を考えてみるのも面白いと思いますよ♪