AX

電霊ログ

私のやってるサイト、電子の言霊の活動ログ

カテゴリークラウド

タグリスト

最近のトラックバック

月別アーカイブ(タブ)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • [HSP超入門] 繰り返し3

繰り返し」を使えば色々面白い事が出来ますが、
ここでは今まで覚えた知識だけでやってみる事にしましょう。

と、その前に、
システム変数について少しだけ説明しておきます。
システム変数とはHSPが内部で使用している変数のことです。
このシステム変数はいくつかあって、それぞれに色々便利な情報が格納されていてHSPのプログラミングではよく使うのですが、私達が勝手にこの変数に代入する事は出来ませんので、注意が必要です。

では話を「繰り返し」に戻します。
次のプログラムを実行してみて下さい。

repeat 10

mes cnt

loop


「実行結果」
20061127165913.png


なぜか0~9までの数字が表示されましたね。でもどうしてこうなったのでしょう?
repeat 命令中に mes 命令がありますが、その引数に cnt が指定されています、どうやらこのcntがあやしそうですね。
実はこの cnt がさっき説明したシステム変数なのです。
この cnt には 「今何回目の繰り返しか」という情報が入っています。
なので繰り返し命令の外で使用すると中身はずっと0のままです。

それはそうと10回繰り返しているのになんで9までなの?10でしょ?と思うかもしれませんね。
なぜこうなるのかと言うと repeat を通った時はまだ cnt が0のままで、loop 命令を通過した時に cnt が1プラスされるからです。
なので0~9の10個が表示されたんですね。

ここまで散々cntについて説明しておきながらなんですが、実は自分で変数を管理する事でcntを使わなくても同じ事が出来ます。
実行してみて下さい。

repeat 10

mes count

count = count + 1

loop


「実行結果」
20061127165925.png


何をしたかというと、ループ中でカウント変数を作ってそれを自分で1ずつ増やしています。
count 変数には「自分自身に1をプラス」した計算結果を上書きします。

順を追って言うと、
HSPでは プログラム中に新しい変数が出てきたら中身が0になるので、最初の mes count は0になりますね。
2回目以降は ループするごとに count に1が足されて行き、この調子で10回繰り返された頃には count は9になった言う事です。

ただこの2つには違いがあります。
その違いを確かめる為にこの下のプログラムを実行してみて下さい。

repeat 10
mes cnt
loop

mes "cntの中身は"+cnt+"です。"

repeat 10
mes count
count = count + 1
loop

mes "countの中身は"+count+"です。"


「実行結果」
20061127165931.png


これはループを抜けた後に 各カウント変数を表示させていますが、
まず cnt はループを抜けた後 中身は0になっていますね、先ほど「繰り返し命令の外で使用すると0になる」と説明していたので、これは思った通りの結果だったと思います。

次に count はループを抜けた後でも0になっていませんね、これは count 変数は自分で管理している変数なので、ループを抜けても0にはならなかったのです。
ところが 何故かループ中では count は9までしか表示されていないのに、ループを抜けたら10になっています、なぜ~?。
これはちょっとした引っ掛けみたいな物です。(そこまで大げさな物ではないですが)
下の矢印が書いてある行を見てみてください。

 repeat 10
   mes count
   count = count + 1 ←ここの行
 loop

mes で最後の9が表示されたあと 次の行で1プラスされています、
つまり表示してから 足されていたのです!。


ここまで読んできて0~9なんて感覚的じゃない!とか、日常では0から数えないとか 思った方、安心してください。
repeat 命令の2番目の引数に cnt の初期値を指定する事で、ちゃんと好きな数からカウントさせる事が出来ます。

repeat 10,1
mes cnt
loop


「実行結果」
20061127165936.png



自分で変数を管理した時にも好きな数からカウントする事が出来ます。

count=1

repeat 10
mes count
count=count+1
loop


「実行結果」
20061127165941.png



count 変数に予め1を代入して置けば、そこから加算されるので、1,2,3,4・・・となります。

これまで表示をしてから加算していましたが、加算してから表示をすると どうなるのか見てみましょう。

repeat 10
count=count+1
mes count
loop


「実行結果」
20061127170814.png


もうここまで読んできた方なら なんでこうなるのか説明しなくても分かりますよね。

今回はここまで、
次回はもう少し進んだ応用編をしたいと思います。

スポンサーサイト
  • [HSP超入門] 繰り返し2

今回は繰り返しについてもう少し詳しく見ていくことにしましょう。

プログラムは上から下へ順番に実行されていきます。
今までの簡単なプログラムなら分かり易かったですが、繰り返しを使うとこれが一気に複雑になってきます。なぜなら同じ所を何回も通るからです。
ではこういうプログラムを書いた時どういう順番で実行されていくのか考えて見ましょう。
(説明するために行数を書いてあるのでそのままでは実行できません。実行するには最初の数字を消して下さい。)

1 pos 20,10
2 mes "3回繰り返してみる"
3
4 repeat 3
5 mes "文字が増える~"
6 loop
7

プログラムが実行されたらまず、1行目の pos 20,10 が実行され表示位置が設定されます
そして次は2行目の mes "3回繰り返してみる" が実行され画面に3回繰り返してみるが表示されます
ここまでは今まで通りなので分かりますね。
さらに次は3行目ですが、3行目には何も無いので次へ行きます。
問題はここからです。
4行目には repeat 3 があります。この repeat 命令によってHSPは「ここから3回繰り返すんだな」と言う事を記憶して次へ行きます。
5行目 mes "文字が増える~" を実行して次へ。
そして6行目で loop が実行される訳ですが、この時にこの loop 命令によって repeat のあった4行目に飛ばされます。
飛ばされたらそこに居る repeat 命令に「またお前か、もう用は無いから早く行け」と言われ次の5行目にいきます。
5行目では2度目の mes "文字が増える~" を実行して 次の行へ。
ここでさらに2回目の loop によってまた4行目へ飛ばされます。
そして同じ様にして4行目 5行目 が実行されて行き、3回目の loop が実行される時に、「お前は3回目か?と言う事は今日で卒業だな、元気で暮らせよ」と挨拶しそこで始めて7行目へ行き、それ以上何も無いのでプログラムは終了します。

よく分からない人のために実行される行だけを見ていきましょう。
スタート 1 → 2 → 3 → 4 → 5 → 6 → 4 → 5 → 6 → 4 → 5 → 6 → 7 終わり

なんだか長くて分かりにくかったですが 大事なのは1つだけ、実行している行がジャンプ出来ると言う事です。
次回からは今まで覚えた命令を使って、繰り返しを使えばどういうことが出来るのか紹介したいと思います。

  • [HSP超入門] 繰り返し1

はっきり行って今までの[HSP超入門]は何の役に立つのか分からない様な事を、
チマチマとやって、「ちぇっプログラムなんてつまんねージャン!」と思った事でしょう?
それは全てやこれからやって行くのに必要な基礎知識だったので無理も有りません。
今後は段々プログラミングらしくなり難易度も高くなって来るとは思いますが、
プログラムミングが好きなあなたならきっと大丈夫でしょう!。(ナニ言ってんだ自分(・_・))
では 前回書いた通り次のステップへ行きましょう。(パチパチパチ~)

普段何気なくやっている事でも、知らないうちに「繰り返し」をしている事がよくあります。
たとえばお金を数えるとか、食器を洗うとか。
パソコンをしている時なら、沢山あるファイルの名前を変えるとか、沢山のテキストファイルを置換(ちかん)するとかです。
でも、繰り返し作業は大抵退屈で出来れば自分ではやりたくない事ばかりです。
変わりにやってくれる人でも居れば楽なのですが、そんな人も居ません・・・ん・・・一人だけ居ました!・・・一人というか・・1つというか・・。
しかもそいつは 数千 数万 回の繰り返しでさえ文句1つ言わず 平然とやってのけます。
それは一体何ヤツでしょう? それはもちろんコンピューター君です!! チャンチャン。

てなわけで、さっそくコンピューターの得意技 「繰り返し」 をやってみましょう。
繰り返しをするには、
repeat 命令と(リピートと読む)
loop 命令の(ループと読む)
2つの命令を使います、これは必ず2つセットで使ってください。

「例」

repeat 10
mes "リピートで表示だオ!"
loop


「実行結果」
kurikaesi_01.png


たった3行のプログラムで10個の 「リピートで表示だオ!」 が表示されましたね。
これこそが repeat の力です。

repeat の後に 10 という引数がありますが、これが繰り返しの回数になります。これを20にすれば20回実行されます。
「repeat と loop はセットで」と書きましたが。上のサンプルを見て何となく理由は分かったと思います。
それは repeat から loop の間を 繰り返すという事です。
なので どちらか片方でも無くなると HSPは、どこからどこまでを繰り返すのかが分からなくなってしまいます。(実際にはエラーが出ます)

if の時にも言った事ですが、repeat ~ loop の間はインデントします。
別に無くても実行するのに問題ありませんが、見ただけで ここは繰り返しの部分だにゃ~ と言う事が分かるので忘れずに と言うよりも もはやクセにしてしまった方が楽です。

この 「繰り返し」 命令はプログラムにとってものすごく重要で便利な物なので、必ずマスターしましょう。
とはいえ、繰り返しは 頭が結構こんがらがる事が多いので、ジックリあせらずに行きましょう。
では repeat の詳しい事は次回。
  • HSPコンテスト1次審査結果発表でし

1次審査の結果が出ました。
どうだろう?自分の入ってるかな?と思いながら・・・
見てみる・・・・ドキドキ・・・・
 ・
 ・
 ・
 ・
・・・ななんと、入ってたーーー!ワイワイ!
しかも2つとも!すごいねー、シンジラレナーイ!
とくに虫コンが入ってるってのが。。。なんとも。
ようし次は最終選考だ!どうなる事やら。何とかは寝て待て!って違う?
  • [HSP超入門] 条件分岐9

いままで if 命令を 単品として使ってきましたが
if 命令の中で if 命令を重ねて使う事も出来ます。
たとえばこんな風に、

a=5
b=500
if a=5 :if b=500 :mes "aは5でbは500"


これは a=5 で b=500 の時だけ mes が実行されます。
なので a や b のどちらか片方が1つでも違えば、それ以降は実行されません。

もちろん if に対して else を使う事も出来ます。

a=5
b=500
if a=5 :if b=500 :mes "aは5でbは500" :else :mes "aは5でbは500じゃない"


そのほか

a=1
b=1
if a=1 {
if b=1 :mes "aもbも1" :else :mes "aは1だけどbは1じゃない"
} else {
if b=1 :mes "aは1じゃないけどbは1" :else :mes "aもbも1じゃない"
}



a=1
b=1
if a=1 {
if b=1 {
mes "aもbも1"
} else {
mes "aは1だけどbは1じゃない"
}
} else {
if b=1 {
mes "aは1じゃないけどbは1"
} else {
mes "aもbも1じゃない"
}
}


のようにブレース中で使う事も出来ます。
変数a,b の数を変えて実行し 処理の流れを確認して見てください。

こういう if などを重ねて書く事を「ネスト」や「入れ子」と呼びます。
ネストするなどと良く言うので覚えておいて下さい。

しばらく条件分岐を続けて書いて来ましたが、大体の事は紹介しましたので、
次回からようやく次のステップへ進みたいと思います。
ではお楽しみに。

  • [HSP超入門] 条件分岐8

いままでは数値を比較していましたが、文字列を比較する事も出来ます。
文字列を比較するとはどういう事かと言うと2つの文字列が同じかどうかを調べます。
例えば

a="みかん"
if a="みかん" :mes "a はみかんです(喜)"
if a="りんご" :mes "a はりんごです(嬉)"


「実行結果」
a はみかんです(喜)

これは、変数a に みかん を入れて if で 変数a が みかん か りんご かを判定しています。
なので 変数a に りんご を入れれば a はりんごです(嬉) と表示されます。

文字列変数同士も同様に比較する事が出来ます。

a="みかん"
b="りんご"
if a=b {mes "a と b は同じだよ"}
else {mes "a と b は別物だね"}


「実行結果」
a と b は別物だね

これで数値も文字列も自由自在ですね!
色々と試して遊んでみて下さい。

  • [HSP超入門] 条件分岐7

今まで何の説明もせずに、if 命令のブレース内をインデントしていましたので説明します。(気付かなかっただけ・・・)
下のプログラムを見てください。

a=1
if a=1 {
pos 100,100
color 255,255,0
mes "a は1でござる。"
}


{ }(ブレース)内の命令の前にスペース(実際にはタブ)がいくつか入っていますが、
これは簡単に言うと 見やすくするためにあります。
と言っただけでは、あまりこのインデントのありがたみが分からないかも知れませんね
では さっきのプログラムからインデントを取り去ったらどうなるか見てみましょう。

a=1
if a=1 {
pos 100,100
color 255,255,0
mes "a は1でござる。"
}


どうですか?
とても見やすいとは言えませんね。
これで少しはインデントの役割が分かったと思います、
でもどうして見やすくしなくてはいけないの?と思うかもしれません
それは何度も何度もプログラムを読み返すからです。
この位の数行の物なら別に入れなくても何が書いてあるか直ぐ分かりますが、
もっと大きいプログラムを書くようになると もう何が何だか分からなくなってしまいます。

この if 命令で言うと、 { } の中をインデントする事で「ああ!この一段右に寄っている所は
全部 if の処理なんだー」と言う事が見ただけで直ぐ分かります。(プログラムの構造も分かりやすくなります)
この見ただけで分かると言うのが、大事なのです。見ただけで分かると言う事は考えなくても分かると言う事です。
それは作ろうとしている新しい機能のプログラミングに専念できると言う事です。

そしてもう1つ、プログラミングをしばらくしていると いつか人に見せる時がきっと来るはずです
たとえば誰かと共同で1つのプログラムを作るかもしれませんし、あるいはHSPのBBSにて「ここまで作ったけど
どうしてもここがうまく動きません、これがそのプログラムです」などと言ったようにいつかは、人に見せる事になります。
そうなった時に恥ずかしい思いをしなくてすみます。
(ここで書いたBBSの質問の仕方は大変礼儀の悪い物ですので絶対に真似をしないように!)

インデントにスペースを使うか、タブを使うかは色々意見が分かれる所かも知れませんが
とりあえず今は自分にあったものを使ってください。(インデントのやり方に興味がわいたら検索してみてください)
しかしいつか共同で作る事になった時はどれかに統一しましょうね。

あっという間に今年のHSPコンテストの応募締め切り期間が過ぎました。
今年も何とか間に合って、ほっとしてます。
去年応募して小さいながらも入賞した 集中線メーカープレーン味は、
応募締め切りの4日前までまったく完成する気配がなく、インターネットで解決のヒントを見つけ試行錯誤して締め切りの直前まで作ってましたから、それに比べると今年は余裕があったなあ。
それなりに苦労しましたけどね。

それで最終的に応募した物は
虫コン と
エコペイント の2つ。

虫コンは殆ど遊び半分で作ったのだけれど、コメントが2つも入っていて正直驚きました。
コメントには「もっとゲーム性があればよかった」と書いてったんですが、これは私もそのつもりだったものの意外と虫のAIが難しくて挫折したんです(なので虫の頭が悪いのはそのせいです)。
虫に触覚が2本ありますが、内部でも2箇所触角の先あたりのチェックをしています。(まったく生かせてないけど)
始めは虫をキーボードの矢印キーで移動させるだけの物だったんですが、何となく擬似AIをやってみたくなり、今に至ります。
そのせいで挫折したんじゃ何してるか分かりませんね。
他にも付けたい効果があったのでゲーム性も含めて来年に持ち越しします。

実はエコペイントが本命で殆どこっちに時間を使いました
期間中殆どこれ作ってたもん。
おかげで何とか思ってた機能は詰め込む事が出来ましたけどね。
でもいくつか削った機能や諦めた機能もあるので、サイト上で続きを作れたらと思います。かなり奇抜な機能なのでお楽しみに。
このエコペイントはサイズの限界を何回も超えました、何度もショート部門のサイズ制限をオーバーしましたがシェイプアップを繰り返し何とかこのサイズに収まりました。
実は地味~な隠れ機能がありまして、絵を保存する時拡張子を付けなくても勝手に付けてくれるという、すんばらし~い機能が搭載されています(笑
こんなショボイ機能を付けた為に命よりも大事な・・・命よりも1024番目に大事なサイズを圧迫してしまいましたよ。
個人的には「めくる」のシュルシュルって言うのを楽しんでほしいです。あと地味に苦労したマジックペンのブラシ選択とかも・・・

コメントをくれた方ありがとうございます。
結構うれしいです。なんというか作ってよかったと思えますし、
やる気が出ます。サンキュー!
  • [HSP超入門] 条件分岐6

前回、ブレースを使って if が満たされた時の処理をずーっと書いて行けると説明しましたが、 else でも同じようにブレースを使って書く事が出来ます。
早速見てみましょう。
	a=1
	if a=1	{
		mes "変数 a は1ですヨ"
	} else {
		mes "変数 a は1ではありませんゾ"
	}

まず if { } が必要なので最初に書きます、そしてすぐに else { } と続けて書きます
前にやった事ばかりなので難しい事は無いと思います。
心配なのは書き方の許容範囲でしょう。たとえば、
	a=1
	if a=1	{
		mes "変数 a は1ですヨ"
	}
	else {
		mes "変数 a は1ではありませんゾ"
	}

これはOKですが、
	a=1
	if a=1	{
		mes "変数 a は1ですヨ"
	}

	else {
		mes "変数 a は1ではありませんゾ"
	}
 
はエラーが出ます。これはHSPの仕様なので覚えておきましょう。
他にもこう言う書き方も出来ます。
	a=1
	if a=1	{ mes "変数 a は1ですヨ" } else { mes "変数 a は1ではありませんゾ" }

	a=1
	if a=1	{ mes "変数 a は1ですヨ" }
	else	{ mes "変数 a は1ではありませんゾ" }

	a=1
	if a=1	{ mes "変数 a は1ですヨ"} else 	:mes "変数 a は1ではありませんゾ"

	a=1
	if a=1	{
		mes "変数 a は1ですヨ"
	} else : mes "変数 a は1ではありませんゾ"

	a=1
	if a=1	: mes "変数 a は1ですヨ"	: else { mes "変数 a は1ではありませんゾ" }

	a=1
	if a=1	:mes "変数 a は1ですヨ" :else {
		mes "変数 a は1ではありませんゾ"
	}

他にも書こうと思えば、
	a=1
	if a=1	{ mes "変数 a は1ですヨ"
	} else {
		mes "変数 a は1ではありませんゾ" }

など、HSPのルールの中でなら好きなように書けてしまいますが、
やはりプログラムが読みにくくなるので、注意してくださいね。
あと、改行もブレース内なら自由に入れる事が出来ます。
適度に入れる事で見やすくなりますがここもやりすぎに注意ですよ!
どう書けば見やすくなるか研究してみて下さい。
	a=1
	if a=1	{


		mes "変数 a は1ですヨ"

	} else {

		mes "変数 a は1ではありませんゾ



	}

苦手意識を持たせない様にと、前回「ブレースを積極的に使ってね!」と言いましたが、
使わない方が 良く出来る時は無理に使う必要はないですよ!
では今回はここまで。
  • [HSP超入門] 条件分岐5

・else を使えば「そうじゃなければ」の処理が出来る!の続き・・・。

if を使っているとif 内の処理が増えて長くなってしまう事がよくあります、横に長く書いていくとプログラムが見づらくなるので困ってしまいますね。たとえばこんな感じで。

a=3
if a<5 :color 0,0,255 :pos 10,10 :mes "a は"+a+"です。"


そういう時にはこのような書き方をすると とても見やすくなります。

a=3
if a<5 {
color 0,0,255
pos 10,10
mes "a は"+a+"です。"
}


これは2つとも同じ意味ですが2番目の方が見やすいですね。
特徴は見ての通り { } で必要な処理を囲みます。(ちなみに { } の事をブレースと言います。中カッコとも言う見たい)
{ から } までが、if 内の処理として実行されますので、 } を書き忘れたり、多く書いたり、関係ないところで書いたりするとエラーが出るので注意して下さい。

ブレース内で、マルチステートメントを使う事も出来ます。

a=3
if a<5 {
color 0,0,255
pos 10,10 :mes "a は"+a+"です。"
color 255,0,0
pos 10,50 :mes "a は5未満どえす"
}


こんな風にも書ける!

a=3
if a<5 {color 0,0,255
pos 10,10 :mes "a は"+a+"です。"
color 255,0,0
pos 10,50 :mes "a は5未満どえす"}


ブレースを使った書き方とコロンを使った書き方を混ぜる事も出来ます。

a=3
if a<5 :color 0,255,0 :pos 30,0 :mes "a について"{
color 0,0,255
pos 10,30 :mes "a は"+a+"です。"
color 255,0,0
pos 10,50 :mes "a は5未満どえす"
}


でも見にくくなるので、どうしても書きたい時意外はやらない様に。

逆にブレースの後ろに書くと

a=3
if a<5 {
color 0,0,255
pos 10,10 :mes "a は"+a+"です。"
color 255,0,0
}pos 10,50 :mes "a は5未満どえす"


pos 10,50 :mes "a は5未満どえす" の部分は if に関係なく実行されてしまいますので気をつけて下さい

ブレース( {} )を使うと if の自由度が広がるので積極的に使ってみてくださいね。
では。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。