Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2009-03-24

バージョンアップするよ!

| 21:07

 昨日ので、普通に15パズルが遊べるようになりました☆

 あと他に、追加していきたい機能について。

 後の目標と言うか、抱負と言うか?


①手数のカウント

 やっぱり、ただ完成させるだけじゃ、だんだん飽きてきますからねー。

 何か目標がないと。

 これは、なんとなくすぐにでも実装できそうな気が。


②タイムトライアル

 タイマーについて学ぶのが目的です。

 ワタシの勝手な思い込みによれば、ゲームには乱数の次にタイマー必要(笑)

 何秒で出来たか計測するのと、時内に完成しないとアウトにするのと、どっちがいいかな?

 ちなみに、子どものころにアナログの15パズルで遊んでたときは前者で、誰が一番早くできるか競争。慌てるあまりに駒を飛び散らかしてアウトになってたりしてましたね(汗)


③成績表

 よい成績があれば、残したくなるのが人情。

 ハイスコア表示って、どうやんだ?

 ファイルにデータを残しておいて読み書きする、みたいな?

 ファイル入出力みたいなことを学べばいいのかな?


④好きな画像を使う

 数字の駒は、プログラムするときも考えやすくて楽でしたが、パズルを完成させるのも割りと簡単です。画像になると、難易度がUPします。

 画像のリサイズとか、ダイアログボックスとか? いろいろ学べそうな気が。


 このくらいできたら、十分かな?

 いろいろ違うことが勉強できそうな予感ですね☆

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

2009-03-23

『15パズル』 Ver.1 だよ!

| 20:40

 一応、課題? を解決して、バージョン1になったよ!

 DLしてから2週経たないのに、これだけ出来たよ!

 なでしこ、すごい!!

 というわけで、ここまでのソースの全文を公開。

 ついでに、この画像も拾っていってくれたら、15パズルで暇つぶしが出来ます(笑)

 それはさておき、何か突っ込みどころがあったら、教えてくれたらうれしいかな? かな?

 あと、あんまりいい内容でもないけど、いつか誰かの役にちょっとでも立ったらうれしいかな・・・なんて。


f:id:snowdrops89:20090323203902j:image

#-------------------------------------------------------------
#  15パズル   ver.1.00
#-------------------------------------------------------------

#-----母艦設計------------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「15パズル」
母艦のWは440。母艦のHは480。
母艦を$FFBBBBで画面クリア母艦のスタイルは「枠固定」
母艦オフに最大化ボタン有効変更。

#--メニュー設定----
『#親部品名,部品名,テキスト,ショートカット,オプション,イベント
なし,ファイルメニュー,ファイル(&F),,,
 -,新規メニュー,新しいゲーム(&N),Ctrl+N,,新規ゲーム
 -,-,,,,
 -,閉じるメニュー,閉じる(&X),Ctrl+X,,終わる
なし,ヘルプメニュー,バージョン(&A),,,
 -,バージョンメニュー,バージョン情報(&A),Ctrl+A,,「{二重カッコ}15パズル{二重カッコ閉じ}{改行} Version 1.00{改行}{改行} by 雪乃☆雫」と言う。
』をメニュー一括作成母艦の可視はオン。
#-------------------------------------------------------------

#-----宣言----------------------------------------------------
パズル画像は「15パズル.jpg」。
裏画面とはイメージの可視はオフ。
アキとは整数。
駒とは配列。
新規ゲーム待ちとは文字列。
問題作成中とは文字列。

#--定数----
盤サイズとは整数。盤サイズは400。
駒サイズとは整数。駒サイズは100。
左マージンとは整数。左マージンは15。
上マージンとは整数。上マージンは15。
#-------------------------------------------------------------

#-----メインルーチン------------------------------------------
裏画面の画像はパズル画像。
新規ゲーム。
マウス判定。
#-------------------------------------------------------------

#-----新規ゲーム----------------------------------------------
*新規ゲーム
  #---初期化------
  アキは15。            #アキ位置を初期化。
  数を0から15まで繰り返す。                      #駒位置を初期化
    駒¥数は数。

  #---問題作成------
  問題作成中は「オン」
  乱数初期化。
  1000
    rは4の乱数
    もし、rが0ならば
      駒入れ替え_上。

    もし、rが1ならば
      駒入れ替え_下。

    もし、rが2ならば
      駒入れ替え_左。

    もし、rが3ならば
      駒入れ替え_右。

  #---画面描画------
  線色は$AAAAAA。線太さは5。塗り色は$DDDDDD。  #画面のクリア
  母艦の10,10から420,420へ四角。

  数を0から15まで繰り返す。         #ゲーム画面描画
    x=駒¥数%4。y=駒¥数/4。y=yを切り下げ。
    x=x*駒サイズ。y=y*駒サイズ。

    x2=数%4。y2=数/4。y2=y2を切り下げ。
    x2=左マージン+x2*駒サイズ。y2=上マージン+y2*駒サイズ

    もし、駒¥数<15ならば
      裏画面のx,y,駒サイズ,駒サイズを母艦のx2,y2へ画像部分コピー。

  新規ゲーム待ちは「オフ」
  問題作成中は「オフ」
#-------------------------------------------------------------

#-----マウス判定----------------------------------------------
*マウス判定
  母艦のマウス押した時は
    もし、(新規ゲーム待ち=「オフ」)かつ
    (母艦のマウスX>左マージン)かつ  #マウスが盤の中で
    (母艦のマウスY>上マージン)かつ  #押されたか確認
    (母艦のマウスX<左マージン+盤サイズ)かつ
    (母艦のマウスY<上マージン+盤サイズ)ならば

      mx=(母艦のマウスX-左マージン)/駒サイズ。my=(母艦のマウスY-上マージン)/駒サイズ。
      mx=mxを切り下げ。my=myを切り下げ。
      m=mx+my*4。       #どの駒を押したか?

      x=駒¥m%4。y=駒¥m/4。y=yを切り下げ。
      x=x*駒サイズ。y=y*駒サイズ。  #クリックした駒が裏画面に実際にある位置
      
      x2=アキ%4。y2=アキ/4。y2=y2を切り下げ。
      x2=左マージン+x2*駒サイズ。y2=上マージン+y2*駒サイズ   #のときのアキの座標→クリックした駒と入れ替わる
      
      mx=左マージン+mx*駒サイズ。my=上マージン+my*駒サイズ。  #マウスで押した駒の座標→アキに入れ替わる。

      もし、駒¥m<15ならば
        もし、m+4=アキならば
          駒入れ替え_上。

        もし、m-4=アキならば
          駒入れ替え_下。

        もし、m+1=アキならば
          駒入れ替え_左。

        もし、m-1=アキならば
          駒入れ替え_右。
#-------------------------------------------------------------

#-----駒入れ替え----------------------------------------------
*駒入れ替え_上
  もし、(アキ/4≧1)ならば      #アキが一番上でなければ
    駒のアキと(アキ-4)を配列入れ替え。#上の駒と入れ替え
    アキ=アキ-4。駒入れ替え_描画。

*駒入れ替え_下
  もし、(アキ/4<3)ならば      #アキが一番下でなければ
    駒のアキと(アキ+4)を配列入れ替え。#下の駒と入れ替え
    アキ=アキ+4。駒入れ替え_描画。

*駒入れ替え_左
  もし、(アキ%4>0)ならば     #アキが左端でなければ
    駒のアキと(アキ-1)を配列入れ替え。#左の駒と入れ替え
    アキ=アキ-1。駒入れ替え_描画。

*駒入れ替え_右
  もし、(アキ%4<3)ならば     #アキが右端でなければ
    駒のアキと(アキ+1)を配列入れ替え。#右の駒と入れ替え
    アキ=アキ+1。駒入れ替え_描画。

*駒入れ替え_描画
  もし、問題作成中が「オフならば   #問題作成はいちいち描画しない
    裏画面のx,y,駒サイズ,駒サイズを母艦のx2,y2へ画像部分コピー。
    線色は$DDDDDD。線太さは0。塗り色は$DDDDDD。
    母艦のmx,myから(mx)+駒サイズ,(my)+駒サイズへ四角。
    完成判定。
#-------------------------------------------------------------

#-----完成判定------------------------------------------------
*完成判定
  完成は整数。完成は0。
  数を0から15まで繰り返す。
    もし、駒¥数が数ならば
      完成は完成+1
  もし、完成=16ならば
    「おめでとう!」と言う。
    裏画面を母艦の15,15へ画像コピー。 #16コマ目表示

    新規ゲーム待ちは「オン」      #完成したら新規ゲーム開始までマウスで駒を動かさない。
#-------------------------------------------------------------

上下左右の駒配列入れ替え部分が、問題作成時と、ゲーム中のマウスクリック時と、処理がかぶっていたのを、別ルーチンにしただけです。

 もっとスマートに書けるのかも知れないけど・・・


 あと、母艦設計の頭に、「!母艦設計=「母艦の可視はオフ」」てのを追加

 起動時に、母艦がチラッとちらつくのを防ぐまじないのようです。

 単に、「母艦の可視はオフ」にしても、の前に一瞬ちらっと母艦表示されちゃうんですけど、こうするとOK。

 意味はわかんないけど、後も役に立ちそうなおまじないです。

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

2009-03-22

いよいよ完成! ・・・かな?

| 20:19

 いよいよ、完成近だよ!

 前バグったところは、忘れていたはみ出しのチェックを加えて、あっさり解決したけど、これって・・・問題作成のコードとほとんど同じじゃん~(汗)

 ワタシ的には動けば全然問題ないですが、ありとあらゆる本(ってほど知ってるわけじゃないけどね)に、こーいうプログラムはイカーン! と書いてあるのでした。む~。

 ・・・ま、それはとりあえず置いといて(コラ)


 「き」は「アキ」に変えてみました(笑)

 あと、初期化~問題作成~画面描画までを「*新規ゲーム」というサブルーチンにして、メニューの「新規ゲーム」から呼び出せるようになりました♪

 それ以外で追加したのが、完成のチェック

 まあ、15パズルが完成したかどうかくらい、自分で見た目に分かりますけど、完成したよ~って言う達成感が欲しいっていうか?

#-----完成判定----------------------------------------------------------

  完成は整数。完成は0。

  数を0から15まで繰り返す

    もし、駒¥数が数ならば

      完成は完成+1

  もし、完成=16ならば

    「おめでとう!」と言う

    裏画面を母艦の15,15へ画像コピー。      #16コマ目表示

    新規ゲーム待ちは「オン」          #完成したら新規ゲーム開始までマウスで駒を動かさない

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

 駒入れ替えのあとに、駒の配列が順番どおりになったかをチェックするようにしました。

 これで、15パズルが遊べて、完成したら「おめでとう!」って言ってもらえます。

 完成! 完成! やた~♪


 調子に乗って、メニューバージョン情報を表示するようにしました(爆)

 若干の課題が残ったので、とりあえず0.9ってことにしときますか。

 これからも、なでしこ勉強しながら機能を追加していくつもりです!

 ・・・って、あれ? 課題が残ったのでVer.0.9ってことは、やっぱそれ解決しない限り、バージョンアップできないんじゃ?!(汗)

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

2009-03-21

ゴトとゴスブだよ?!

| 19:57

 マウスの位置を取得できたら、後の話は意外と簡単。

 クリックした駒の上下左右にきがあるかどうかを調べて、あればこと入れ替えるだけです。

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

母艦のマウス押した時は

  もし、(新規ゲーム待ち=「オフ」)かつ

  (母艦のマウスX>左マージン)かつ      #マウスが盤の中で

  (母艦のマウスY>上マージン)かつ      #押されたか確認

  (母艦のマウスX<左マージン+盤サイズ)かつ

  (母艦のマウスY<上マージン+盤サイズ)ならば

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

    mx=mxを切り下げ。my=myを切り下げ

    m=mx+my*4。               #どの駒を押したか?

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

    x=x*駒サイズ。y=y*駒サイズ。       #のときのきの座標

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

    x2=左マージン+x2*駒サイズ。y2=上マージン+y2*駒サイズ  #マウスで押した駒の座標

    mx=左マージン+mx*駒サイズ。my=上マージン+my*駒サイズ。 #マウスで押した駒の座標→きに入れ替わる。

    もし、駒¥m<15ならば

      もし、m+4=ならば

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

        き=き-4。

      もし、m-4=ならば

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

        き=き+4。

      もし、m+1=ならば

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

        き=き-1。

      もし、m-1=ならば

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

        き=き+1。

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

      裏画面のx,y,駒サイズ,駒サイズを母艦のx2,y2へ画像部分コピー

      線色は$DDDDDD。線太さは0。塗り色は$DDDDDD。

      母艦のmx,myから(mx)+駒サイズ,(my)+駒サイズへ四角

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

 これでいけるかと思ったら、いかなかった。

 やっぱり、画面描画のコードは、もしもしの下に、それぞれ入らないとダメっぽい。

 同じコードを4つ貼るのはあれなんで、この部分をサブルーチン化したいですね。

 っていうか、までもよく分からないからスルーしていただけで、問題作成のところもそうないと、メニューから呼び出せないんじゃ? みたいな。

 発見したのは「飛ぶ」という命令と、「ユーザー定義関数」っていうのがあるいうこと。

 「飛ぶ」は「ジャンプポイントへ処理を移す」という説明を見ると、たぶん「goto」と同じで、飛んだらそれっきり戻ってこないと思われ。

 ユーザー定義関数は、調べ方も足りてませんけど、あんまりよく分かる解説が無い。っていうか、関数のものが理解できてないのが問題?

 別に、関数じゃなくっていいんだよね~。「gosub」みたいに、行って処理して、帰ってきてくれさえすれば!

 とりあえず、行頭に「●」か「*」付けるらしいのは分かったので、以下のようにしたら動きました。

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

   :

   :

      もし、m-1=ならば

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

        き=き+1。

        駒入れ替え。

*駒入れ替え

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

  裏画面のx,y,駒サイズ,駒サイズを母艦のx2,y2へ画像部分コピー

  線色は$DDDDDD。線太さは0。塗り色は$DDDDDD。

  母艦のmx,myから(mx)+駒サイズ,(my)+駒サイズへ四角

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

 とりあえず、「*」のほうが打ちやすいのでこっち使いましたが、マニュアルのユーザー定義命令のとこには「●」で説明されていて「*」についての言及が見られないけど、「●」がほんとなのかな?

 それとも、VBのプロシージャの「Sub」と「Function」みたいな使い分けが?

 でも、とりあえず動いたからOK!

 これで、いちおう完成~☆

 ……と思ったら、はみ出しのチェックをしていなかったため、バグっていることが判明。

 右端から左端(の逆も)へ、駒が飛んでしまうのでした(汗)

 U D 4 U D 42009/03/21 22:35むしろ後で追加された「飛ぶ」命令の方がリファレンスが少ない気がしますが…f(^^; なでしこではプロシージャという概念がありません。ユーザ定義命令でプロシージャも関数も表現します。

●と*と*は同じ意味で、どれもユーザ定義命令を定義するのに使います。なので、●を使うか*を使うかは好みですね。ひまわりから移ってきた人は見慣れている*を使う傾向にあるみたいですし、半角文字の方がよくて*を使う人もいます。そういえば不思議なことに、掲示板やマニュアル、サンプルでは割と●に統一されているようです。

あと、「空き」「空」は別の変数のように見えますが、実は全く同じ変数です。

空きは3
空を言う

なでしこは平仮名を無視するという名前規則が存在するため、これらは同じものとして扱われます。まぁ、粗茶さんが仰ったように、「空」を空文字列として利用しないなら、問題は起きませんがね。

着々と進んでいるようなので、頑張って完成させてください!ではでは

 U D U D 2009/03/21 22:36どうでもいいけどなぜ名前に4がついたしorz

雪乃☆雫雪乃☆雫2009/03/21 23:14UDさま、ありがとうございます♪
「飛ぶ」のほうも、命令検索で出る「ジャンプポイントへ処理を移す。ジャンプポイントは文字列で指定する」ってことしか分かってないです;
そもそも、関数とかプロシージャとか手続きとか、よく分かってないダメダメっぷりなので、ユーザ定義命令の理解できる道のりは遠そうですが、いくつか記載されてるところは見つけているので、ゆっくり学んでみますです。

●と*と*は同じ意味なんですね。
「●」は「まる」って打って変換しないとならないので、「*」のほうが楽なのでこっちをつかいましたが、掛けるの「*」とかぶるのでちょっと心配でした。
疑問がひとつ氷解です。ありがとうございました☆

っていうか、「空」と「空き」は同じなんですか?!
じゃじゃじゃあ、何にしよー(汗)

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

2009-03-20

もしもしもしもしぃ~~;

| 22:43

 昨日ので、マウスの座標を取得して、どの駒をクリックしたかが分かるようになりました。

 でも、パズルの盤の外をクリックしても、座標が入ってしまうのは、よろしくありません。盤の中をクリックした時だけ取得するように変更。

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

母艦のマウス押した時は                 #マウス位置が

  もし母艦のマウスX>左マージンならば        #盤の中にあるかを確認

    もし母艦のマウスY>上マージンならば

      もし母艦のマウスX<左マージン+盤サイズならば

        もし母艦のマウスY<上マージン+盤サイズならば

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

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

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

 もしもしもしもしぃ~~~~~~~~(汗)

 条件分岐のなかで、論理式?を使う方法がよく分からなかったので、てきとーに「かつ」とか「and」とか入れてみたけどうまくいかず。

 しょうがないからとりあえず書いたらこんなことに…;

 でも、一応これで動きますけどね。

 というわけで、とりあえずスルーして先に進もうかとも思いましたが、んなわけねーだろ?! と、学んだ結果以下のとおりに書き換え。

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

母艦のマウス押した時は

  もし、(新規ゲーム待ち=「オフ」)かつ

  (母艦のマウスX>左マージン)かつ         #マウスが盤の中で

  (母艦のマウスY>上マージン)かつ         #押されたか確認

  (母艦のマウスX<左マージン+盤サイズ)かつ

  (母艦のマウスY<上マージン+盤サイズ)ならば

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

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

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

 これは、一行に書いても大丈夫のようです。

 わかったのは、もしならばだけのときは特に必要ありませんでしたが、条件の式を()で囲まないとダメらしい。これは、「かつ」が白い文字なので、式の中の変数とはつながってしまうからだと思われます。

 あと、なぜか改行は「かつ」の後ろで入れなくてはならず、「かつ」を行頭に持ってくるような書き方は出来ないらしいです。

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