Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2009-03-19

マウスクリックは落とし穴だよ!

| 19:19

 昔作ったVBの15パズルは、単に本のとおりにやっただけだったせいもあり、操作性に違和感があり、不満でした。

 やっぱり、実際と同じように、動かしたい駒をクリックして、動かすようにしたいですね。

#-----マウス判定--------------------------------------------------------

母艦のマウス押した時は

  x=(母艦のマウスX-左マージン)/駒サイズ。y=(母艦のマウスY-上マージン)/駒サイズ。

  x=xを切り下げ。y=yを切り下げ

 #確認用

  「{x}、{y}」を表示

  x+y*4を表示

#-----------------------------------------------------------------------

 マウスクリックでは、マウスの座標を取得しないことを知るまで、延々泥沼に~~~~~~。しくしくしく(;_;)


 昔、クリックは、ボタンを押して離さないと発生しないんで、違ったところを押した時、のままボタンを離さずスライドさせて、枠外にカーソルを出したらセーフっていう裏技があったけど、これだとの裏技は使えないのね;

 たぶん、マウス離した時と組み合わせたら、の裏技も再現できるんでしょうけど・・・別に必要ないかも(笑)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20090319

2009-03-18

今度こそプログラムだよ!

| 21:18

 とりあえず、こんな感じです。

 起動時に、駒を分解してランダムに入れ替えて、表示するところまで。

 まだ不十分かもしれませんが、昨日の3行と組み合わせて、とりあえず見た目上は、希望通りの動作をしています。

#---問題作成------------------------------------------------------------

乱数初期化

1000

  rは4の乱数

  もし、rが0ならば

    もし、(き/4≧1)ならば         #きが一番上でなければ

      駒のきと(き-4)を配列入れ替え。   #上の駒と入れ替え

      き=き-4。

  もし、rが1ならば

    もし、(き/4<3)ならば         #きが一番下でなければ

      駒のきと(き+4)を配列入れ替え。   #下の駒と入れ替え

      き=き+4。

  もし、rが2ならば

    もし、(き%4>0)ならば        #きが左端でなければ

      駒のきと(き-1)を配列入れ替え。   #左の駒と入れ替え

      き=き-1。

  もし、rが3ならば

    もし、(き%4<3)ならば        #きが右端でなければ

      駒のきと(き+1)を配列入れ替え。   #右の駒と入れ替え

      き=き+1。

#---画面描画------

線色は$AAAAAA。線太さは5。塗り色は$DDDDDD。     #画面のクリア

母艦の10,10から420,420へ四角

数を0から15まで繰り返す。            #ゲーム画面描画

  x=駒¥数%4。y=駒¥数/4。y=yを切り下げ

  x2=数%4。y2=数/4。y2=y2を切り下げ

  もし、駒¥数<15ならば               #きの部分はコピーない

    裏画面のx*100,y*100,100,100を母艦の15+x2*100,15+y2*100へ画像部分コピー

#-----------------------------------------------------------------------

 とうとう乱数

 乱数を使うと、ゲームって感じがしてうれしくなるよね♪

 ふだんは、ランダムじゃ困ることのほうが多いけど、ゲームはランダムが無いとつまらないですもんね。

 ところで、まえにVBで作ったときに学んだ、重要なこと。

『駒をただランダムに入れ替えると、解けないゲームが出来ることがある

 たしかに、アナログの15パズル、どうしても解けないことがあったような気がする。

 なので、ばらばらにしたピースを盤においていくのではなく、駒を逆順にいっぱいいっぱい動かすようにするといいんですと。

 というのを思い出して書いた、問題作成のコード。

 さくっと書けたつもりが、途中で何かを勘違いしたために変になってしまって少し苦労した。15パズルの実物が欲しかった(汗)



 ランダムに「き」を上下左右のどっちにうごかすかを決めます。

 「き/4」は、縦の列のどこにきがあるのかを、「き%4」は、横の列のどこにきがあるのかを調べています。端にあったらそれ以上っちには行けないですからね。

 行けることが分かったら、きと隣の駒を入れ替えます。



 これだけだと、まだ画面が変わるわけじゃないので、駒の配列表示してうまく入れ替わったか何度も確認しました。

 よさそうなので、これを画面に反映します。

 まず、母艦設計のところに入れてあった、盤面の下塗りの部分をここにつれてきました。

 本当は、の部分だけこの色で塗ればいいんですけど、とりあえず楽を;


 x、yは、実際の駒に書いてる数(配列の中身)を、完成した画像から切り取ってくるための位置。

 x2、y2は、単に母艦の盤面に、左上から順番に駒を置くための位置。

 たったこれだけのことが、こんがらかって泥沼に!(--;

 わかっても、やっぱりうまく説明書けないし・・・


 画像部分コピーの座標は、何気に数字を直接ぶっ込んでますけど、本当は定数を宣言したほうが良かったですね。って言うかむしろこの計算も終えて、x、y、x2、y2にすればよかったですね。あとでなおしましょう。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20090318

2009-03-17

たった3行かよ(爆)

| 23:24

 ようやく、単なる設定みたいなところから、プログラムらしいことに着手。

 とりあえず、以下のとおり(笑)

#---初期化---------------------------------------------------------------

は15。                      #き位置を初期化。

数を0から15まで繰り返す。             #駒位置を初期化。

  駒¥数は数。

#-----------------------------------------------------------------------

 「」とは、駒を動かす為のきスペースのことをあらわす変数で、15の駒の後ろの駒を抜いてるわけですから、当然初期値は16ですね? とおもったら、配列は0から始まるので、-1して15にしないとなのです。

 ややこやしい・・・

 いまの段階では別に、全然ふつーなんですが、後で色々考える時には絶対こんがらかっちゃうんですよねー(汗)

 「駒」は、もちろん1~15まである数字の駒(+き位置)をあらわすもので、配列変数です。最初は当然、1から順番に並んでます。

 べつに、マニュアルのプログラミング講座の配列変数の項のように、

駒¥0は、0

駒¥1は、1

駒¥2は、2

 ・

 ・

 ・

駒¥15は、15

 と地道に順番に代入していってもワタシ的には一向に構わないんですが、こういうことばかりやってると、じゃあじゃあ1000とか10000繰り返す時にはどうすんの?! と言われてしまうので、『繰り返す』構文を使います。

 なでしこのは、分かりやすくてGOOD☆

 これも、0のところに1と書いた駒があり、1のところには2の駒が、というように一個づつずれてます。

※重要(個人的にw)

 違えてはいないのは、「駒¥0」とか「駒¥1」とかは、ゲーム盤のマス目の位置みたいなもので、それ代入されている数が、のマス目にどの駒があるかを表すということ。

 これがこんがらかって、次の行程でエラーを出しまくってさっきまで死んでいたのは内緒(汗)

 駒って言う変数名にしたのが悪かったのかな?

そちゃそちゃ2009/03/18 08:28えーと・・・
「空」という変数は、すでになでしこが定義している予約語なんです。

なでしこでは、空(から)の中身はカラッポです。

たとえば、

空を言う。

とすると、何も表示されません。

それから、変数の文字列を初期化するときに、

テストは「」

の代わりに、

テストは空。

を使います。
そして、変数の内容がカラッポであるかどうか判断するときも、

もしテストが空ならば
  「何もありません」と表示。

という具合に使用します。

ですので、

空は15。

という使い方は避けるべきです。
(カラッポ判定に使わないのであれば大丈夫かも)

空き箱は15。
空欄は15。

など、別の変数名にしたほうがいいと思いますよ。

雪乃☆雫雪乃☆雫2009/03/18 18:34そちゃさま、重ね重ねありがとうございます☆
なんと!「空」にはそんな意味が~!
たしかに、テストは「」より、テストは空のほうが日本語らしいですもんね。
そして、エディタの命令検索でためしに検索したら、システム基本変数としてちゃんと出ました!
なるほど。
それでも怒られずにスルーして動いてくれるのもすごいけど、やはりこれは変数名を変更したほうがよさそうですね。
・・・「空き」にしてみますか。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20090317

2009-03-16

ところで、母艦のサイズ固定ってどうやんだ?

| 22:04

 昨日は忘れてましたが、やっぱりこういうゲームは、勝手にウィンドウサイズ変えられると、見た目が悪くなって、いやですもんね。

 というわけで、以下の二行を母艦設計に追加

 勝手に検索しただけだからレスって無いけど、掲示板の皆さんサンクス!

#---------------------------------

母艦の最大化ボタン有効変更(オフに)

母艦のスタイルは「枠固定」

#---------------------------------

 ところで、びみょーに記載に統一感が無いよね。

 ()とか「」って、何のまじないなの?

 ためしに、

母艦のスタイルは枠固定。

 としたら、成功した。

 さらに、ためしに、

母艦のスタイルは(枠固定)

 としても、うまくいった。

 おおぉ?!

 何? これは単に見やすくする為のカッコなの?

 調子に乗って、

母艦の最大化ボタン有効変更オフ

 としたら、エラー。

 「」でくくったり、「は」とか「を」を挿入してみたりしても、やっぱエラー。

 エラーの内容を見ると、「最大化ボタン有効変更」は関数で「オフに」は引数関数引数は()でくくらなきゃダメってことなのかな? それはしようが無いね。納得!

 ・・・と思った直後に、こんな記載を発見。

母艦オフに最大化ボタン有効変更

 これ、変。日本語としておかしいっすよ?

 でも、さりげなく動いてる~(汗)

 色々試したら、緑の助詞なら何を入れてもOK、みたいな?

 まあ、「あなたの助詞の使い方は違ってる」みたいな指摘をされても、嫌ですが(汗)

 さて、先の2行は以下のとおりに書き換えました。

 これで、若干の統一感が生まれた(かな?;)

#---------------------------------

母艦オフに最大化ボタン有効変更。

母艦のスタイルは枠固定。

#---------------------------------

そちゃそちゃ2009/03/17 12:11母艦のスタイルは「●●」のように、
「 」を付けるべきです。

スタイルに設定できるのは文字列です。
「枠なし」「枠固定」「枠可変」のように
きちんと文字列で指定しなければなりません。

母艦のスタイルは枠固定。

これが正常に動作するのは、
枠固定という変数の中身が「枠固定」だからです。

ためしに、

枠固定は「テスト」
母艦のスタイルは枠固定。

とすると、枠が固定されません。
さらに、

枠固定は「枠なし」
母艦のスタイルは枠固定。

とすると、枠が表示されません。
(タスクバーを右クリックして終了)

雪乃☆雫雪乃☆雫2009/03/17 19:47おおぉ! そちゃさま、ありがとうございます!!
何でも書いてみるものだ;

>枠固定という変数の中身が「枠固定」だからです。
 すごく理解!
 宣言も代入もしてない変数には、変数名が文字列として最初から入ってるというわけなんですね。

>枠固定は「枠なし」
>母艦のスタイルは枠固定。
 別に疑り深くないけど、早速試しました。
 ほんとだ!(^o^)

 というわけで、

母艦のスタイルは「枠固定」

 になおしました。

mr-80bmr-80b2009/03/18 01:19まあ、実際のなでしこの仕様としてはそちゃさんの言うとおりなんですが、どうもこの辺りの仕様がスッキリ飲み込めない感じは僕もあったりします(^^;

日本語プログラミング言語として、なでしこの文法の仕組みをある程度勉強すれば、だいたい事情は理解できる、という感じではあるのですが。

じゃあどうあるべきか、というと、上手い仕様が思いつくわけでもないんですけど。

とりあえず最初は、慣れるしかない部分・・かなぁ・・?

雪乃☆雫雪乃☆雫2009/03/18 18:17mr-80bさまありがとうございます☆
文法の仕組みというより、記述の約束事をまだ全然覚えてないという、根本的な問題と思われ(汗)
こういうふうにかかねばならない、というお約束事がはっきり分かっていれば、それに則って書いていけばいいだけなんでしょうけど、なでしこは、わりとゆるい感じで、さりげなく書いたらなんとなく動いてくれちゃったりして、ありがたい反面このまま流されちゃうと、後でひどい目に?! みたいな予感も;

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20090316

2009-03-15

なでしこで15パズルを作るよ!

| 19:16

f:id:snowdrops89:20090315191243j:image

 の昔、VBで初めて動くプログラムを作ったのが15パズルでした。

 ちなみに、本のとおりにやったら動いたよ! というだけのことですが(汗)

 というわけで、なでしこでも15パズルを作るのを目標に、勉強していこうと思います。

 まだ公式マニュアルのプログラミング講座を読んだだけで、なでしこ本もまだ手に入れてないけど、できるかな?

 とりあえず、それっぽい画面を表示するところまで。

 メニューエディタのおかげで、簡単にメニューも作れてご満悦♪

 っていうか、むしろこんな画像に半日かけてしまった。ダメダメ(汗)

#-----------------------------------------------------------------------

#  15パズル

#-----------------------------------------------------------------------

#-----母艦設計----------------------------------------------------------

母艦のタイトルは「15パズル」。

母艦のWは640。母艦のHは480。

母艦を$FFBBBBで画面クリア

線色は$AAAAAA。線太さは5。塗り色は$DDDDDD。

母艦の10,10から420,420へ四角

『#親部品名,部品名,テキスト,ショートカット,オプション,イベント

なし,ファイルメニュー,ファイル(&F),,,

-,新規メニュー,新しいゲーム(&N),Ctrl+N,,

-,-,,,,

-,閉じるメニュー,閉じる(&X),Ctrl+X,,終わる

』をメニュー一括作成

#-----------------------------------------------------------------------

#-----宣言--------------------------------------------------------------

パズル画像は「15パズル.jpg」。

裏画面とはイメージの可視はオフ

#-----------------------------------------------------------------------

裏画面の画像はパズル画像。

裏画面を母艦の15,15へ画像コピー

#-----------------------------------------------------------------------

mr-80bmr-80b2009/03/15 22:20いらっしゃいませ。
ぼちぼちがんばりましょう。

snowdrops89snowdrops892009/03/16 01:24ありがとうございます♪
これからよろしくお願いします☆

takken123takken1232009/03/16 20:36あらぁ、おもしろそうですね。
がんばってください。

snowdrops89snowdrops892009/03/16 20:52ありがとうございます。
がんばりま~す☆

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20090315