Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

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