Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2009-03-31

いよいよ完成! かな?

| 21:01

 まずは課題の解決から。

 表示順位数を先に宣言しておくことで、何位まで表示するかを後から容易に変更できるようになりました!

 「言う」では8位以上表示しきれずに、詳細ってボタン表示されてしまいますけどね(汗)

 調子に乗って5位まで表示させるようにしました。

#-----成績表表示-----------------------------------------------
*成績表表示
  s=「★☆★成績表★☆★{改行}{改行}◎手数のハイスコア{改行}」
  数を1から表示順位数まで繰り返す
    もし、成績¥数がならば
      s=「{s} {数}位  ---手{改行}」
    違えば
      s=「{s} {数}位  {成績¥数}手{改行}」
  s=「{s}{改行}◎タイムのハイスコア{改行}」
  数を(表示順位数+1)から(表示順位数*2)まで繰り返す
    分=成績¥数/60を切り下げ。
    秒=成績¥数%60。
    分=分を2でゼロ埋め。秒=秒を2でゼロ埋め
    もし、成績¥数がならば
      s=「{s} {数-表示順位数}位  --分--秒{改行}」
    違えば
      s=「{s} {数-表示順位数}位  {分}分{秒}秒{改行}」
  ダイアログタイトルは「成績表」
  sを言う。

#--------------------------------------------------------------
#-----成績表記録-----------------------------------------------
*成績表記録
  #手数のハイスコア
  手数順位=0
  数を表示順位数から1まで繰り返す。
    もし、(成績¥数>手数 または 成績¥数=ならば
      手数順位=数
  数を表示順位数から1まで繰り返す。
    もし、手数順位=0でなければ
      もし、手数順位=数ならば
        成績¥数=手数
      もし、手数順位<数ならば
        成績¥数=成績¥(数-1)


  #タイムのハイスコア
  タイム順位=0
  数を(表示順位数*2)から(表示順位数+1)まで繰り返す。
    もし、(成績¥数>経過 または 成績¥数=ならば
      タイム順位=数
  数を(表示順位数*2)から(表示順位数+1)まで繰り返す。
    もし、タイム順位=0でなければ
      もし、タイム順位=数ならば
        成績¥数=経過
      もし、タイム順位<数ならば
        成績¥数=成績¥(数-1)

  s=「」
  数を1から表示順位数まで繰り返す
    s=「{s}{成績¥数}{改行}」
  数を(表示順位数+1)から(表示順位数*2)まで繰り返す
    s=「{s}{成績¥数}{改行}」

  sを「成績表.txt」へ保存。
#--------------------------------------------------------------

 前のUD様にいただいたコメントから、「成績表.txt」を毎行読んで反復する時に、回数を-1すれば成績¥0から値が入っていくことを学びましたが、順位のところをまた全部+1しないとならないのが面倒で、のままになってます(汗)


 成績表読み書きの部分を作るにあたって、何度も成績表のテキストを手動でにした(笑)

 それはさておいても、成績表はリセットできたほうがいいと思うので、成績リセットをメニュー追加することに。

#-----成績リセット---------------------------------------------
*成績リセット
  ダイアログタイトルは「成績表リセット」
  「リセットしてもいい?」と二択。
    もしそれはいならば
      (表示順位数*2)
      成績¥回数
      を「成績表.txt」へ保存。
#--------------------------------------------------------------

 違いでいきなりリセットされるとショックなので、2択で確認メッセージを表示

 テキストをクリアするだけなら、保存すればいいだけだけど、それだと現在の成績表表示は変わらないので、成績配列の中身もにしないとね。


 あと追加で、前「15パズル.jpg」が存在しなかった場合の処理を追加しましたが、じゃあもし「15パズル.jpg」が違う画像にし変わってた場合は?

 もしかしたら毎自分の好きな画像でやりたいと思って、「15パズル.jpg」自体を違う画像にする場合があるもしない

 自分はわかってるからいいけど、人にあげた場合とか、400*400の画像にしてくれるとは思えないんだよね。


 実際に試してみると、予想通り大きな画像の端っこだけが表示される上、ギブアップしたら母艦が大変なことに!(滝汗)

 これ避するには、画像変更の時と同様、もし400*400の画像じゃなかったら、違う「15パズル.jpg」をリサイズして表示させられるようにしないとね。

#--------------------------------------------------------------
もし、パズル画像の存在が1ならば
  作業用の画像はパズル画像。
  もし、作業用のW=盤サイズ かつ 作業用のH=盤サイズでなければ  #画像ファイルがデフォルトの物と違う場合
    リサイズし変更
  違えば
    作業用を裏画面の0,0へ画像コピー。
    
違えば
  十五																	#画像ファイルが無かった場合	
#--------------------------------------------------------------

 「*画像変更」は、フォルダ選択から始まってしまうので、ルーチンを二つに分割して「*リサイズし変更」をつくり、ここへ飛ばすようにした。


 15パズル的には、このくらいでもう十分かなあ?

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

2009-03-30

ギブアップとヒント表示をつけよう!

| 21:44

 昨日は妹が遊びに来ていたので、成績表表示の確認を兼ねて15パズル大会を開催しました! 妹とはいえ、人にやらせるのは初めてだから、嬉しいね☆

 ちなみに、なかなか盛り上がっていた。

 ・・・なんと暇でバカで微笑ましい姉妹であろうか(汗)


 さて、昨日ので好きな画像で15パズルが遊べるようになったのはいいけど、難しすぎて解けない!という大問題が!!(汗)

 折角選んだ画像の完成形が見れないのは、悲しい・・・

 あと、完成図が見えていれば、パズルの難易度もぐっと下がるはず。


 というわけで、ヒントを見る機能と、ギブアップする機能を追加しようと思う。

 ギブアップは簡単。裏画面のを母艦コピーしてやればOKじゃん?

 メニューにギブアップの項目を追加する。

 バージョン情報のメニューをヘルプに変えて、の下にヒントとギブアップとバージョン情報をいれるよ。世の中の一般的なアプリケーションはこんな感じになってるはず!(ヘルプやヒントの意味が若干違うけどね;)

 折角だから(?)二択のダイアログでも使ってみよー。

 ギブアップを選択したら、「本当に?」とたずねて、はいのときだけ処理をする。

 もっと嫌味なことを言うと面白いかと思ったけど、使うのはどうせ自分なのに、なんかムカツクからやめた(爆)


 で、こんな感じ。

#-----ぎぶあっぷ-----------------------------------------------
*ギブアップ
  「本当に?」と二択。
    もしそれはいならば
      裏画面を母艦の15,15へ画像コピー。
      新規ゲーム待ちは「オン」
      初期化。
#--------------------------------------------------------------

 あれれ~? 書き換わらない

 マウスをクリックしたら変わるんだけど、おっかしいなあ。

 完成のときに同じように裏画面を母艦コピーしたときには問題なかったよ?

 意味わかんなーい!

 この機能を、実にスゥィ~トに考えていただけに、ドはまりしてしまってショック!!

 とりあえず、命令一覧をずっと眺めて「描画処理反映」を追加したら、正常動作しました。ちなみに、母艦再描画は、なぜかラベルが消えてしまってダメっぽい。

 問題は解決したけど、意はわからず・・・


 次に、ヒント機能です。

 これは、小さいサイズにリサイズした完成画像を、表示させる機能。

 手数とタイムの下が、無駄っぽく開いているから、こに表示させる。

 の学習内容は、メニューチェックオンオフで、ヒントの表示、非表示をトグルさせるよ!

#-----ヒント表示-----------------------------------------------
*ヒント表示
  もし、(ヒントメニューチェックオフ)ならば
    ヒントメニューチェックオン。
    作業用を盤サイズ,盤サイズで画像リサイズ。
    裏画面を作業用の0,0へ画像コピー。
    作業用を150,150で画像リサイズ。
    作業用を母艦の455,260へ画像コピー。
    文字サイズは18。文字色は$AA0000。
    母艦の478,230へ「☆ヒント☆」を文字描画。
    描画処理反映。
  違えば
    ヒントメニューチェックオフ。
    線色は$FFBBBB。塗り色は$FFBBBB。
    母艦の455,230から610,410へ四角。
    ラベル3の可視はオフ。
    描画処理反映。
#--------------------------------------------------------------

 これは、比較的簡単に出来たよ! 描画処理反映も忘れず!!

 最初「もし、(ヒントメニューチェックオフ)ならば」の行の書き方が、どこか悪かったのか、ちゃんと動作しなくてしばらく悩んだのは内緒(汗)

 いろいろ違うコト書いたりしてもダメで、も一度書いてみたらあっさり動いたという・・・


 前、画像変更機能を付けたときに、ファイル選択のときに「いいえ」を押したら、っ白になってしまう現象が発生し、避する処理を加えた。

 ーいえば、しょっぱなに「15パズル.jpg」を読み込んでますけど、これが万一なかったらどーなるんだ? と思い、ためしに消してみたら案の定エラー出て止まった;

 これ避するには、もし無かったら、画像変更機能へ飛ばして、任意の画像を選ぶようにするのが簡単そうだとおもったんだけど、やっぱりやめて以下のようにしてみた。

#-----しょぼい15パズル画面作成-------------------------------
*十五
  裏画面のWは盤サイズ。裏画面のHは盤サイズ。
  裏画面を$FFFFAAで画面クリア
  線色は$AAAAAA。線太さは0。
  数を0から15まで繰り返す
    x=数%4。
    y=数/4を切り下げ。
    yで条件分岐
      0ならば
        塗り色は$AAAAFF
      1ならば
        塗り色は$FFAAAA
      2ならば
        塗り色は$FFDDAA
      3ならば
        塗り色は$AAFFAA

    裏画面のx*駒サイズ,y*駒サイズからx*駒サイズ+駒サイズ,y*駒サイズ+駒サイズへ四角。
    文字サイズは42。文字色は$006600
    もし、(数>8)ならば
      x=20+(数%4)*駒サイズ。
    違えば
      x=35+(数%4)*駒サイズ。
    y=数/4を切り下げ。y=20+y*駒サイズ。
    もし、数=15ならば
      裏画面のx,yへ「★」を文字描画
    違えば
      裏画面のx,yへ(数+1)を文字描画
  
  裏画面を母艦の15,15へ画像コピー。
#--------------------------------------------------------------

 これで、何の画像も無くても、15パズルの画面が出ます。

 意外と簡単で、はまりどころも無くすぐできちゃったよ!

 ていうか、最初にしょぼい画像に半日かけたワタシって一体・・・?(哀)

 成績表のテキストも、無いときは自動生成出来るようにしないとダメだね。

#--------------------------------------------------------------
もし、「成績表.txt」が存在するならば
  「成績表.txt」を毎行読んで反復
    成績¥回数対象違えば
  「成績表.txt」に保存。     #成績表が無かったら作成する
#--------------------------------------------------------------

 今日ここまで。

 課題も大体解決してきてるけど、それは明日UPするよ!

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

2009-03-29

画像変更機能をつけよう!

| 17:53

 こっちのほうが難しそうに思っていたけど、案外簡単に出来そうな気がしてきたので、ハイスコア表示はいったん休んで、こちらに着手。


 メニューに、画像変更を追加して、コードは以下のとおり

#-----画像変更-------------------------------------------------
*画像変更
  マイピクチャー作業フォルダ変更。
  「*.jpg;*.jpeg;*.png;*.bmp」のファイル選択。
  裏画面の画像はそれ。
  
  裏画面を盤サイズ,盤サイズで画像リサイズ。
  新規ゲーム
#--------------------------------------------------------------

 これで、とりあえずは動きました。

 でも、世の中の画像はたいてい正方形じゃないので、比率が変になってしまいます。

 かといって、比率変えずにリサイズでは、余白が出来てしまうので、15パズルができません(汗)


 好きなところを好きなサイズで正方形にトリミングしてリサイズできるのが一番よさそうだけど、何気に難しそうな上、必要ないときにはいちいちんなの手だから、短いほうの辺にあわせて、長いほうの辺の両端を切って、盤サイズにリサイズするようにしようと思う。

#-----画像変更-------------------------------------------------
*画像変更
  マイピクチャー作業フォルダ変更。
  「*.jpg;*.jpeg;*.png;*.bmp」のファイル選択。
  作業用の画像はそれ。
  
  もし、作業用のW>作業用のHならば
    x=(作業用のW-作業用のH)/2。y=0。
    x2=作業用のH+x。y2=作業用のH。
  違えば
    x=0。y=(作業用のH-作業用のW)/2。
    x2=作業用のW。y2=作業用のW+y

  作業用のx,y,x2,y2を裏画面の0,0へ画像部分コピー

  裏画面を盤サイズ,盤サイズで画像リサイズ。
  裏画面を母艦の15,15へ画像コピー。
  新規ゲーム
#--------------------------------------------------------------

 これでいけるか? とおもったら、あれれ~?

 大きな画像の端っこが切り取られて表示されてる。

 一度400*400の画像が入った裏画面には、大きな画像をコピーしても、大きくならないらしい。むむむ。

 ーくるなら、裏画像を先に大きくしておくしかないね!

 裏では、15パズルの画像がおっきく引き伸ばされているだろうけど、見えないから問題なし!

 して、キャンセル押した時にっ白くなってしまう問題を解決する処理を追加

 折角だから「」を使う!

 「でなければ」何気に書いてみたら、使えた!!

 で、こんな感じ。

#-----画像変更-------------------------------------------------
*画像変更
  マイピクチャー作業フォルダ変更。
  「*.jpg;*.jpeg;*.png;*.bmp」のファイル選択。
  もしそれでなければ	#キャンセルした時は処理しない
    作業用の画像はそれ。

    もし、作業用のW>作業用のHならば	#横長の画像
      x=(作業用のW-作業用のH)/2。y=0。
      x2=作業用のH+x。y2=作業用のH。
      裏画面をy2,y2で画像リサイズ。	 #短いほうの辺に長さあわせて正方形
    違えば
      x=0。y=(作業用のH-作業用のW)/2。
      x2=作業用のW。y2=作業用のW+y
      裏画面をx2,x2で画像リサイズ。

    作業用のx,y,x2,y2を裏画面の0,0へ画像部分コピー。
    裏画面を盤サイズ,盤サイズで画像リサイズ。
    裏画面を母艦の15,15へ画像コピー。
    新規ゲーム
#--------------------------------------------------------------

 できた~♪

 ・・・だけど、難易度高すぎ(--;

 選んだ画像のせいもあるけど、ワタシには解けない・・onz

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

2009-03-28

ハイスコア表示機能をつけよう!

| 23:41

 文字列の操作とか、ファイルの読み書きとか、よくわかんにゃい(*_*)

 とりあえず成績の記録よりは、単にデータを読んで表示するのほうが圧倒的に楽そうな気がするので、まずっちをやってみる。

 メニューに「成績表」の項目を追加し、これを選択したら、ハイスコアが表示されるようにしよう。

 データがなければ話になんないので、「成績表.txt」というファイルを、メモ帳で作った。以下のような単純なものです。

#---------------
手数
98手
115手
159手
#---------------

 して、コードはこんな感じ。

#-----成績表表示----------------------------------------------
*成績表表示
  「成績表.txt」を毎行読んで反復
    成績¥回数対象。
  成績を改行配列結合していう。
#-------------------------------------------------------------

 なんか、反復で一行づつ読んだ意味なし(汗)

 見た目はともかく、ファイルの内容を言ってくれることはくれました。

 でも、なんでダイアログの背景白くなっちゃうんだ? わけわからん;


 見た目については置いといて(え;)

 度は記録の保存について考える。


 成績を記録させるのは、おめでとう!て出た時に出している手数とタイムの数値を、ファイルに書き込んでいけばいいんだろうけど、ただ追記していくんじゃなくて、過去の記録と比較して上っていた時だけ書き換える。

 しかも、ただ書き換えるんじゃなくて、過去の記録が一個づつ下がって、一番低い記録がトコロテン式に消える、みたいな?

 これはなんとなく、配列でなんとかなるかな?

 目的の状態になった配列を、一気にファイルに保存ってすれば、んなに難しくないかも??


 と思ったら、甘かった。

 毎行読んで反復回数は、1からスタートらしい。

 して、0には配列名が入ってるようで、単に「成績を保存」としたら、さっきのデータがこーなってしまう。

#---------------
成績
手数
98手
115手
159手
#---------------


 とゆーわけで、こうなった。

 ファイルの中には純粋に手数だけを保存し、表示するときに「手数」だの「**手」の「手」だのは追加すればいいかな。のほうが断然楽っぽい。

#---------------
98
115
159
#---------------
#-----成績表記録----------------------------------------------
*成績表記録
  s=「」
  数を1から3まで繰り返す
    s=「{s}{成績¥数}{改行}」

  sを「成績表.txt」へ保存。
#-------------------------------------------------------------

 あと、成績表.txtを読み込むのは、ゲーム起動時に行うことにする。

 成績の配列を参照すればいいんだから、成績表を見るたびにファイルを読む必要なんてないね?


 単に、ある成績を保存するのはいいけど、実際にはハイスコアが出たかを判定し、出ていたら、の順位の行は手数に書き換え、それ以下の順位の行は、いっこづつ下がっていくという処理が必要

 やりたいことは、以下のとおり

#-------------------------------------------------------------
  もし、成績¥3>手数ならば
    もし、成績¥2>手数ならば
      もし、成績¥1>手数ならば
        成績¥3=成績¥2
        成績¥2=成績¥1
        成績¥1=手数
      違えば
        成績¥3=成績¥2
        成績¥2=手数。
    違えば
      成績¥3=手数
#-------------------------------------------------------------

 これで、正常に動きます。OKですね!

 ・・・って、んなわけねー;

 ダメダメなプログラムの権化みたいなもんですねー。

 3位くらいまでだからいいけど、5位までとか、まかり違って10位くらいまで表示させたいなんて思ったときにはどーしたらいいんですかっ?!


 ひらめかないので、表示のほうでも手直ししてよう(汗)

#-----成績表表示-----------------------------------------------
*成績表表示
  s=「★☆★成績表★☆★{改行}{改行}◎手数のハイスコア{改行}」
  数を1から3まで繰り返す
    もし、成績¥数がならば
      s=「{s} {数}位  ---手{改行}」
    違えば
      s=「{s} {数}位  {成績¥数}手{改行}」
  s=「{s}{改行}◎タイムのハイスコア{改行}」
  数を4から6まで繰り返す
    分=成績¥数/60を切り下げ。
    秒=成績¥数%60。
    分=分を2でゼロ埋め。秒=秒を2でゼロ埋め
    もし、成績¥数がならば
      s=「{s} {数-3}位  --分--秒{改行}」
    違えば
      s=「{s} {数-3}位  {分}分{秒}秒{改行}」
  ダイアログタイトルは「成績表」
  sを言う。
#--------------------------------------------------------------

 タイムのほうも表示できるようになりました(笑)

 タイムの記録も、「経過」の数(つまり総秒数)のみ保存して、ここで分秒表示に直すのがいいね。

 あと、ダイアログが白くなるナゾは、プログラム上の問題ではなく「言う」と「いう」の違いによるものと判明(汗)

 にしても、「言う」で、全部表示させようって言うのがも無謀?

 別フォームをだしたほうがいいのかな。

 「言う」にすると、右クリックで、メモ画面が開く機能は消せないのかな?

 「いう」にしたら出なくなるけど、なんかダイアログボックスの背景が白くなっちゃうのが、気に入らない~。


 あと、完成したときに、ハイスコアが出ていたら、当然教えて欲しい。

 「手数順位」と「タイム順位」を記録時に取得させることにして、結局「言う」で無理矢理表示

#--------------------------------------------------------------
    成績表記録。
    
    #表示させる文字の設定
    もし、手数順位=0ならば
      手数成績=「{改行} 手数{手数}手です」
    違えば
      手数成績=「{改行} 手数{手数}手は{改行}   歴代{手数順位}位の成績です」
    
    もし、タイム順位=0ならば
      タイム成績=「{改行} タイム{分}分{秒}秒です」
    違えば
      タイム順位=タイム順位-3
      タイム成績=「{改行} タイム{分}分{秒}秒は{改行}   歴代{タイム順位}位の成績です」    

    #表示させる
    もし、(手数順位=0 かつ タイム順位=0)ならば
      ダイアログタイトルは「完成!」
      「おめでとう。完成です!{改行}{手数成績}{タイム成績}」と言う。
    違えば
      ダイアログタイトルは「ハイスコアが出ました!」
      「おめでとう。新記録です!{改行}{手数成績}{タイム成績}」と言う。
      成績表表示。
#--------------------------------------------------------------

 バカだから、表示を確認する為に、何度も15パズルやっちゃった(汗)

 無理やりの割には、まあまあの見た目になったかな?

 自分の環境意外では、崩れるのかな?

 ま、とりあえずいいけど。


 それにしても、また課題が持ち越しとなってしまった・・・

 U D U D 2009/03/29 00:42着々とLVUpしてますねー

\0に配列名が入るわけではなくて、きちんと宣言しなかった変数は初期値として変数名(文字列)がセットされます。
で、「回数」は1から始まるのに、配列のインデックスは0から始まるんですよね。
だからうっかり変数宣言せずに配列を使ってしかも反復とか~回で代入すると、
上手い具合に0番目に変数名が入るわけですf(^^;

テストとは配列
3回、テスト[回数]=回数
テストを『,』で配列結合して言う
5回、テスト[回数-1]=回数
テストを『,』で配列結合して言う

雪乃☆雫雪乃☆雫2009/03/29 12:05UDさま、ありがとうございます☆
しかも、見本のコードまで!

なるほど~。
宣言時に値を与えないでいると、空ではなくて変数名が代入されているわけなのですね。

・・・て、あれ?
「テストとは配列」と宣言するだけでよいのですか?
宣言・・・してなかったかな(汗)

雪乃☆雫雪乃☆雫2009/03/29 12:12UDさまへのレスの続き

 分かりました!
 宣言は、上のほうにまとめてしているのですが、一番初めのコードを書いた時には、とりあえず書いてみたせいで、ちゃんと宣言していなかった為に発生した現象のようです。

 いま確認してみたら、宣言してあったので、試しに言わせて見たら、成績¥0は空になっていました!
 おかげさまでだんだん知識が深まっていきますです。

 ありがとうございました。

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

2009-03-27

タイムトライアル機能をつけよう!

| 18:23

 いよいよタイマー

 普通に、何秒で出来たかを計るタイマーにします。


 まず、「トライアルタイマーとはタイマー隔は1。」でタイマー作成

 隔は秒数なので、1秒ごとにイベントが発生するようなイメージ

 あと、手数のときと同じように、表示用のラベルを配置。


 コードはこんな感じ。

 時満ちた時は~って、なんかとても素敵だ♪

 とりあえず、1秒ごとにここが実行され、ラベルの秒数を書き換えていく。

#-----タイムトライアル----------------------------------------
*タイムトライアル
  トライアルタイマーの時満ちた時は~
    経過=経過+1。
    分=経過/60を切り下げ。
    秒=経過%60。
    分=分を2でゼロ埋め。秒=秒を2でゼロ埋め。 #時を00:00で表示させる。
    タイムラベルのテキストは「{分}:{秒}」。のXは440。のYは140。のWは180。のHは50。
#-------------------------------------------------------------

 までずっと、「分=経過/60。分=分を切り下げ。」のように書いていたけど、「分=経過/60を切り下げ。」って書くことが出来るってわかった。このほうが日本語らしいし、みやすいね!


 あと、開始時からいきなり時計が動き出しているというのは、心理的によろしくないので、最初に盤の中をクリックした時をゲーム開始と判断して、タイマーを動かし始めることにする。

 というわけで、マウス判定の下に、タイマーを開始させるコードを入れる。

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

      もし、手数=0ならば       #はじめに盤をクリックした時から
        トライアルタイマーを開始。  #タイマーを動かす
        タイムトライアル。
#-------------------------------------------------------------

 完成の判定が出来たら、っ先にタイマーを止める。

 おめでとうの時に、の手数と秒数も言ってもらうことにする。

 あと、手数カウントのときと同じく、新規ゲームとやり直しの時ラベルをクリアする。

 これでOK?と思ったら、完成させずにやり直しや新規ゲームを選択したら、タイマーが動き続けてるよ!

 というわけで、新規ゲームとやり直しのはじめに、「トライアルタイマー停止」を追加

 タイマーを開始する前に停止、と言ってもいいのかな? と思いましたが、特に問題ないみたいだったので、タイマーが動いてるかどうかの判断はしてません。

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

2009-03-26

「このゲームをやり直す」機能をつけよう!

| 18:37

 予定には無かった機能ですが、手数カウント機能をつけて遊んでいたら、思いつきました。

 問題によって、解くための必要最小手数は異なるかも知れず、同じ問題何度も出来たら、より効率的に解けるようになったかどうかがちゃんと分かるってもんです。


 メニューに「このゲームをやり直す」を追加

 問題作成直後の、駒配列と、アキを、記憶配列とアキ記憶に覚えさせる。

 それで、やり直すが選択されたら、以下のとおり全部元に戻してやればOK。

#-----このゲームをやりなおす-----------------------------------
*やり直し
  手数は0。手数ラベルのテキストは「0」。のXは500。のYは30。のWは100。のHは30。        #手数も0に初期化。
  数を0から15まで繰り返す。
    駒¥数=記憶¥数。
  アキはアキ記憶。         #アキ位置を初期化。
  ゲーム画面描画。
  マウス判定。
#-------------------------------------------------------------

 意外と簡単だった☆


 あと、突然気づく。

 「手数」て表示するだけのラベル、何ゆえラベル

 VBは、ペタペタ貼るのが楽だったので、ちょっとした文字を書くのに何でもラベルを使っていたような気がするんですが、こんな座標指定するなら、表示でも別に良かった・・・

 ていうか、文字描画にしたら、アンチエイリアスされた文字が書けるので、こっちがいいかも!

 というわけで修正。

 なお、実際の手数を表示してくところは、ラベルのまま。

 書き換えの際に、消す処理が要らないからです。

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

2009-03-25

手数カウント機能をつけよう!

| 22:02

 というわけで、手数のカウント機能について考える。

 手数と言うのは、何駒を動かしたかと言うことだから、何駒入れ替えが発生したかを数えればいい。

 駒入れ替え_描画と完成判定は、見やすいように別ルーチンにしてるけどセット品なので、完成判定の中に入れてしまえ。

 手数は折角なので(?)ラベル表示することにした。

 ごちゃっとしてますけど、こんな感じね;

 いまさらながら、はてなのソースの表示の仕方を学んだ。

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

#手数カウント機能ようラベル
ラベル1とはラベルのテキストは「手数」。
のXは440。のYは33。のWは50。のHは30。
文字書体は「MSPゴシック」。文字サイズは18。文字色は$AA0000。

手数ラベルとはラベルのテキストは「0」
のXは500。のYは30。のWは100。のHは35。
文字書体は「MSPゴシック」。文字サイズは24。の文字位置は右。文字色は$550000。
の背景色は$FFDDDD。の透明はオフ。
#-------------------------------------------------------------

 こういうことだけは、VBのが楽だったねえ。

 新規ゲームで「手数」を0にして、完成判定の中で、手数=手数+1して、ラベル表示、でOKなはず!


 ・・・と思って実行したら、うえぇ~、手数が書き換わった途端にラベルのサイズが文字にあわせて変更されちゃった~。んなの頼んでないよ~!(汗)

 ラベルの背景色を使って、表示位置を作っていたので、これはよろしくありません。っていうか、こーいう使い方自体がよろしくない?(汗)


 とりあえず、手数表示のコードはこーなりました。

#-----手数表示------------------------------------------------
  手数=手数+1。手数ラベルのテキストは手数。のXは500。のYは30。のWは100。のHは35。
#-------------------------------------------------------------

 美しくないけど、いいんだい!

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

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

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