Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016-09-22

INIファイルで成績表

| 04:16

 久々の、新しい学習・・・かもしない

 なでしこで、一番最初に作ったプログラム、『15パズル』を作った時には、まだINIファイルってものを、よく知らなかった。

 の命令があるのは見ていても、何するもんだか分かってなかった。

 だから、ハイスコアの表示を作った時も、うだうだ考えた挙げ句、手数やタイムの数値を単にテキストファイルに保存して、配列として扱っていたんだけど、あの頃よりはワタシも色々とひらめいて、だいぶ賢くなったんだからね!

 ハイスコアだけじゃなくて、ゆくゆくはキーコンフィグなどの設定情報なども、INIファイルに保存しておけるようにしたいとゆう希望なんだケド、まあとにかく手始めに、ハイスコアの表示をINIファイルでやってみる。

#-----------------------------------------------------------
# INI
設定ファイル名とは文字列=「{母艦パス}なでこら.ini」
ハイスコア表示件数とは整数=10
成績とは整数。
#-----------------------------------------------------------

#-----成績表------------------------------------------------------------
*成績記録
  設定ファイル名のINI開いてコンフィグに代入。
  Cとは整数。記録とは整数。順位とは整数=0
  Cをハイスコア表示件数から1まで繰り返す。
    記録=(成績[C-1,1])を整数変換。
    もし、記録<スコアならば、順位=C。
  Cをハイスコア表示件数から1まで繰り返す。
    もし、順位=0でなければ、
      もし、順位=Cならば、
        コンフィグで「ハイスコア」の「Date_{C-1}」に今日INI書く。
        コンフィグで「ハイスコア」の「Score_{C-1}」にスコアをINI書く。
        コンフィグで「ハイスコア」の「Level_{C-1}」にレベルをINI書く。
      違えばもし、順位<Cならば、
        コンフィグで「ハイスコア」の「Date_{C-1}」に成績[C-2,0]をINI書く。
        コンフィグで「ハイスコア」の「Score_{C-1}」に成績[C-2,1]をINI書く。
        コンフィグで「ハイスコア」の「Level_{C-1}」に成績[C-2,2]をINI書く。
  コンフィグのINI閉じる。
  成績読み込み。
  もし、順位=0でなければ、
    ダイアログタイトルは「新記録!」
    「おめでとうございます。{改行}ハイスコアが出ました☆{改行}{改行}歴代{順位を2で文字列右寄せ}位のスコアです。」と言う。
    成績表表示。

*成績読み込み
  もし、設定ファイル名が存在するならば
    設定ファイル名のINI開いてコンフィグに代入。
    (ハイスコア表示件数)
      Cとは整数。C=回数-1
      コンフィグで「ハイスコア」の「Date_{C}」をINI読んで成績[C,0]に代入。
      コンフィグで「ハイスコア」の「Score_{C}」をINI読んで成績[C,1]に代入。
      コンフィグで「ハイスコア」の「Level_{C}」をINI読んで成績[C,2]に代入。
    コンフィグのINI閉じる。
  違えば
    成績クリア
#-----------------------------------------------------------
*成績表表示
  文字書体は「MS ゴシック」
  HSとは文字列=「   ★☆★ ハイスコア ★☆★」&改行&改行
  (ハイスコア表示件数)
    Cとは整数回数-1。
    Dとは文字列。D=(成績[C,0])を文字列変換もし、D=0ならば、D=「----/--/--」
    Sとは文字列。S=(成績[C,1])を文字列変換もし、S=0ならば、S=「-------」
    Lとは文字列。L=(成績[C,2])を文字列変換もし、L=0ならば、L=「--」
    HS=HS&「{回数を2で文字列右寄せ}位 {Sを7で文字列右寄せ}点 {Lを2で文字列右寄せ}レベル {D}」&改行
  ダイアログタイトルは「成績表」
  HSを言う。

*成績リセット
  ダイアログタイトルは「成績表リセット」
  「リセットしてもいい?」と二択。
    もしそれはいならば、成績クリア

*成績クリア
    設定ファイル名のINI開いてコンフィグに代入。
    (ハイスコア表示件数)
      Cとは整数。C=回数-1
      コンフィグで「ハイスコア」の「Date_{C}」に0をINI書く。
      コンフィグで「ハイスコア」の「Score_{C}」に0をINI書く。
      コンフィグで「ハイスコア」の「Level_{C}」に0をINI書く。
      コンフィグで「ハイスコア」の「Date_{C}」をINI読んで成績[C,0]に代入。
      コンフィグで「ハイスコア」の「Score_{C}」をINI読んで成績[C,1]に代入。
      コンフィグで「ハイスコア」の「Level_{C}」をINI読んで成績[C,2]に代入。
    コンフィグのINI閉じる
#-----------------------------------------------------------------------

 成績読み込みは、起動時に行い、成績記録は、ゲームオーバー時に行う。

 表示のものは、相変わらずの「言う」であるwww


 あと、さらですけど、これまでは起動するといきなりゲームが始まってて、メニューの新規ゲームはダミーで、ゲームオーバーするごといちいち再起動必要だったんだけど、ようやくちゃんとしました;

#-----------------------------------------------------------------------
*新規ゲーム
  固定石初期化。
  メイン画面初期化。
  消去数=0。レベル=0。スコア=0

  次石決定。
  次石落下。
  落下処理。
  メインループ。
#-----------------------------------------------------------------------
トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160922

2016-09-16

消去数、連鎖数の表示とレベルアップメーター

| 23:15

 夏のは、なでしこ自体ほとんど開いてもなくって、当然なでこらも未着手でした。

 ですが、前の記事に書いてた消去数と連鎖数の表示については、UPしてなかったけど予定どうりさくっと追加出来ていたので、一応念のため載せておく。

 ちなみに、消去数の表示タイトルを何にしようか・・・という、どーでもいいことに一番無駄に時を使った(爆)

(タイトルを「すこあ」とか「れべる」とか、無意味にひらがな表記にしてたせいです。スペースの都合上、あんまり長くもできないし・・・; 結局、昔のコラムスで、JEWELSと表示されていたことから「じゅえる」にしてみたんだけど、どうかねえ;;;)

 ついでに、次レベルアップするまであとどのくらいかを示す、メーター表示をつけてみたよ。

 たいした機能じゃないけど、なんかこういう視覚的な表示あると、ゲームっぽさがUPするような気がするんだよね~w

#-----------------------------------------------------------------------
*消去数表示
  線色は$FFDDCC。塗り色は$FFDDCC。文字書体は「MS Pゴシック|18|太字」。文字色は$882211。
  表画面の右辺ラベルX,消去数Yから右辺ラベルX+65,消去数Y+30へ四角。
  表画面の右辺ラベルX,消去数Y,65,30へ消去数を中央,中央で枠内文字描画。

*連鎖表示
  線色は$FFDDCC。。塗り色は$FFDDCC。。
  表画面の右辺ラベルX,連鎖Yから右辺ラベルX+60,連鎖Y+60へ。

  文字書体は「MS Pゴシック|14|太字」。文字色は$FFFFFF。
  表画面の右辺ラベルX+5+1,連鎖Y+65+2へ「れんさ!」を文字描画。
  文字色は$CC3322。
  表画面の右辺ラベルX+5,連鎖Y+65へ「れんさ!」を文字描画。

  文字書体は「MS Pゴシック|28|太字」。文字色は$882211。
  表画面の右辺ラベルX,連鎖Y,60,60へ連鎖数を中央,中央で枠内文字描画。

*連鎖表示クリア
  線色は$FFBBAA。塗り色は$FFBBAA。
  表画面の右辺ラベルX,連鎖Yから母艦のクライアント幅,母艦のクライアント高さへ四角。

*レベルアップメーター表示
  レベルアップメータークリア。
  線色黄色塗り色黄色。
  表画面の右辺ラベルX+5,スコアY+5から右辺ラベルX+5+(消去数%10)*5,スコアY+20へ四角。

*レベルアップメータークリア
  線色は背景色。塗り色は背景色。
  表画面の右辺ラベルX+5,スコアY+5から右辺ラベルX+55,スコアY+20へ四角。
#-----------------------------------------------------------------------

 連鎖表示は「*連鎖」の中で、消去数とレベルアップメーター表示は「*石消去」の中から呼んで、表示を反映させている。

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

2016-07-06

レベルとスコア表示と、その他もろもろ

| 00:40

 異議ありも一段落したところで・・・www

 通り道さま、とけいさまのお二方から、コラ○スのあるごりずむ?について教えを頂いた。

 しろーとが思いつきでなんだかんだとやっつけただけの現状でも、なでしこのありがたさで、一応それらしく動くようになってはいるのだけれど、やっぱ見る人が見たら、定石を知らずに囲碁を打ってる的な感じなんだろうね~。

(囲碁だって、ヒカ碁が流行った時にゲームをなんとかクリアしただけだから、定石なんて知らねッス;)

 ・・・とにかく、ここは一番肝心の部分となり、要研究ですよね。


 でもまあ、はとりあえず、最初から表示するところは作ってあったのに放置になってた、スコアとレベルの表示を反映させます(爆)

 レベルについては、ホントにただ単に表示に反映してなかっただけでしたw

 確か、レベルアップの要件はスコアではなく、単純に宝石を消した数だったハズ。

 たしか、50個ずつくらいだったかしらと思っていたんだけど・・・それとも、レベルアップするごと、次にレベルアップするために消さなきゃならない石の数が増えるんだったかなあ?

 それは最終的にまた考えるとして、とりあえずテストの段階では、「消去数/10を切り下げ」くらいにしておくw


 あと、レベルアップすると、スピードもアップするんだよねぇ~。

 ワタシが無能だから、落下処理でかなり長めに取っているウェイトを、レベル分引いてだんだん短くしていくようにすればいいんだろうけど、自分でテストが出来なくなりそうだから、この機能の追加は一番最後だwww


 スコアは、レベルが上がると消した宝石一個につきもらえる点数が増で、連鎖をすればするほど、点数がうなぎ登りなんだよね。

 基本の点数にレベルと連鎖数を掛ける感じ?

 「10*(レベル+1)*(連鎖数^2)」*石の個数分みたいな。

 連鎖は、うなぎ登り感を出すように、2乗にしてみた。

 それとも、消した石が三個以上の時も得点が増加するんだったっけ?

 全消しで得点が入るのはぷよ?

 ・・・とりあえず、ーゆう難しいことは考えないでおく;;;

 石消去時にこの計算を行い、同時に、表示にも反映させる。

 スコア表示も、レベル表示も、画面設計時に作成済みだったので、これを石消去するごと呼び出して表示を書き換えるようにしただけ。

#-----------------------------------------------------------
*石消去
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、消去石¥xx,yy=1ならば、
        固定石¥xx,yy=-1。
        消去数=消去数+1
        スコア=スコア+10*(レベル+1)*(連鎖数^2)
        スコア表示。
        レベル表示。
        母艦のタイトルは「なでこら  {消去数}」
  固定石描画。0.3秒待つ。

#-----------------------------------------------------------
*スコア表示
  文字書体は「MS Pゴシック|14|太字」
  XXとは整数=「すこあ」の文字幅取得+スコアX+2
  線色は$FFDDCC。塗り色は$FFDDCC。文字書体は「MS Pゴシック|18|太字」。文字色は$882211。
  表画面のXX,スコアY-5からメインX+マス目*6,スコアY+23へ四角。
  表画面のXX,スコアY-5,145,28へスコアを右,中央で枠内文字描画。

*レベル表示
  レベル=消去数/10を切り下げ
  線色は$FFDDCC。塗り色は$FFDDCC。文字書体は「MS Pゴシック|18|太字」。文字色は$882211。
  表画面の右辺ラベルX,レベルYから右辺ラベルX+65,レベルY+30へ四角。
  表画面の右辺ラベルX,レベルY,65,30へレベルを中央,中央で枠内文字描画。
#-----------------------------------------------------------

 ここまで作って思ったけど、、は確認のためにタイトルバー表示させてる連鎖数とか消去数も、画面上に表示出来るようにしたいね。

 レベル表示の下はいているから、こに欄を作って反映するだけのことで、そう難しいことでもなさそう

 むしろ、連鎖数の表示がうまく働いてるかどうかを確認するのが難しい!(爆)

 あと、一応あらかじめメニューに入れ込んである成績表(ハイスコア表示)も作る予定。

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

2016-06-16

連鎖!連鎖!連鎖!

| 22:37

 落とした石を起点に消せる石を探索して消すだけでも一苦労だったのに、次々に連鎖が起こるなんて、なんかもう具合悪くなる・・・と思ったけど、何のことはない、固定石のデータを元に、全てのマス目を消去判定してやれば良いだけだった(^▽^;

#-----------------------------------------------------------------------
*連鎖
  消去石初期化。
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、固定石¥xx,yy<0でなければ
        xx,yyで消去判定。

  もし、石消去フラグ=オンならば、
    連鎖数=連鎖数+1
    母艦のタイトルは「なでこら  {消去数} {連鎖数}れんさ」
    石消去。隙埋め。連鎖
  違えば、
    連鎖数=1
    母艦のタイトルは「なでこら  {消去数}」
#-----------------------------------------------------------------------

 しかし、狙っては二連鎖しか作れない無能なワタシなので、これが正常に動いているかどうかを調べるのは至難!

 のテストの方に、よっぽど時かかった;;;

 とりあえず、三連鎖までは見た(爆)


 ここまできたら、もう出来たよーなもんじゃないですか?(喜)

 ・・・しかし!

 クライン王国のナゾを解明・・・じゃなかった、ムジュンを暴いて異議あり!しなきゃならないとゆう新たな任務が発生したため、当分は、なでこらどころじゃないのさ~~~(なにそれ;)

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

2016-06-12

石の消去判定

| 19:56

 前、実際に石を消すのは、上下左右斜めの八方向全てに対して、石を消すかどうかの調査を完了させた後でないとうまくないいうことを学んだんだけど、いっこの石の調査を完了させただけではまだ不足で、落下石全部について先に調査を完了させないと、同じように、次の石を調べる時こに石がないことになってしまい、上手くいかないのでした。

 とにかく、判定中には石を消さず、調査を全部完了させてから、やっと石が消せるようになるってわけ。


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

#-----------------------------------------------------------------------
*消去判定(x,yで)
  Cとは整数=1。
  f1とは整数オンf2とは整数オン。
  # 左右
  5
    もしf1=オフでなければ
      もし、(x-回数<0)ならばf1オフ   # 左の壁
      違えばもし、(固定石¥(x-回数),y)=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥(x-回数),y=1でなければ、消去石¥(x-回数),y=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(x+回数>5)ならばf2オフ   # 右の壁
      違えばもし、(固定石¥(x+回数),y)=(固定石¥x,y)ならば
        C=C+1。
        もし、消去石¥(x+回数),y=1でなければ、消去石¥(x+回数),y=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

  C=1。f1=オンf2=オン。
  # 上下
  12
    もしf1=オフでなければ
      もし、(y-回数<0)ならばf1オフ   # 上端
      違えばもし、(固定石¥x,(y-回数))=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥x,(y-回数)=1でなければ、消去石¥x,(y-回数)=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(y+回数>12)ならばf2オフ   # 床
      違えばもし、(固定石¥x,(y+回数))=(固定石¥x,y)ならば
        C=C+1。
        もし、消去石¥x,(y+回数)=1でなければ、消去石¥x,(y+回数)=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

  C=1。f1=オンf2=オン。
  # 斜め\
  5
    もしf1=オフでなければ
      もし、(x-回数<0)または(y-回数<0)ならばf1オフ   # 左の壁 または 上端
      違えばもし、(固定石¥(x-回数),(y-回数))=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥(x-回数),(y-回数)=1でなければ、消去石¥(x-回数),(y-回数)=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(x+回数>5)または(y+回数>12)ならばf2オフ   # 右の壁 または 床
      違えばもし、(固定石¥(x+回数),(y+回数))=(固定石¥x,y)ならば
        C=C+1。
        もし、消去石¥(x+回数),(y+回数)=1でなければ、消去石¥(x+回数),(y+回数)=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

  C=1。f1=オンf2=オン。
  # 斜め/
  5
    もしf1=オフでなければ
      もし、(x-回数<0)または(y+回数>12)ならばf1オフ   # 左の壁 または 床
      違えばもし、(固定石¥(x-回数),(y+回数))=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥(x-回数),(y+回数)=1でなければ、消去石¥(x-回数),(y+回数)=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(x+回数>5)または(y-回数<0)ならばf2オフ   # 右の壁 または 上端
      違えばもし、固定石¥(x+回数),(y-回数)=固定石¥x,yならば
        C=C+1。
        もし、消去石¥(x+回数),(y-回数)=1でなければ、消去石¥(x+回数),(y-回数)=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

*消去フラグ設定(Aに)
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、消去石¥xx,yy=0ならば、
        もし、A=オンならば、消去石¥xx,yy=1
        違えばもし、A=オフならば、消去石¥xx,yy=-1
#-----------------------------------------------------------------------

 0でマークし、一方向を調査し終えるごと、消す判定だったら1でマークし直し、消さない判定だったら-1に戻す。

 既に消す予定になっている石(1)には、もう0は付けない

 消すかどうかはマークの数ではなく「C」でカウント。

 「f1」と「f2」は、「上・下」「左・右」など、落とした石を中心に2方向に向かって調べるので、違う石とかが出たらもうっち方向は調べなくていいよとゆうフラグ。

 繰り返しは無駄にの向きのマス目全部の最大数を設定しているけど、両方がオフになった時点で抜けるようになっている。


 して、「石固定処理」の下に、これ追加

#-----------------------------------------------------------------------
    消去石初期化
    3
      もし、落下マスY+(回数-1)<0でなければ、		#の石が画面外でなければ
        落下マスX,落下マスY+(回数-1)で消去判定
    もし、石消去フラグ=オンならば、石消去。隙埋め。連鎖
#-----------------------------------------------------------------------

 3つの石全てについて消去判定を行った後に、石の消去を行います。


 これで、いちおう上手くいってると思うんだけど・・・

 まだ、連鎖はしないけどね~。

通り道通り道2016/06/13 21:33連鎖のことも考えると、指定された範囲を走査するようにして消す場所を判定するのも手かも。
中心から伸ばしてゆくと複雑な感じですが、(指定された範囲の)端から流して数える方法なら結構簡単です。
アクションゲームの場合、早い時は最速 よりも、必要な処理の時差が少ない方が安定させやすいという面もあります。

雪乃☆雫雪乃☆雫2016/06/16 22:24通り道 さん、ありがとうございます。
とりあえず、あとでUPするけど、連鎖についてはそれこそ、どこで連鎖してるかなんてことは考えずに、全部のマス目について消去判定をするだけで、わりとカンタンにできちゃいました☆
・・・が、あれですかね~。
ワタシの方法だと、指定したマス目を元にして、八方向に向かって調査する感じだけど、そもそもそうじゃなくて、はじめから全部のマスを端から調査する・・・とゆうようなことですか?(@_@)

通り道通り道2016/06/19 19:44消去判定はリンク先のような感じです。
全体が無いので、ロジックのイメージだけでも伝われば。

http://www.weyk.jp/files/nadekora-ro.zip

とけいとけい2016/06/23 02:02こんばんは!

ブロックを置いた時も「全てのマスから調べる」ならば
・チェックは8方向ではなく、4方向だけでよい
・連なりは3つ以上ではなく、3つだけ調べればよい
となって、かなりすっきりします。

こんな感じ。
http://bugloderunner.my.land.to/up/co_del.txt

雪乃☆雫雪乃☆雫2016/07/07 00:14通り道さま、とけいさま、ありがとうございます☆!
しかも、コードまで!!
レスがとてもとてもおそくなってしまいまして、スミマセンm(_ _)m
いや~、なにしろ、ゲーム作るのはお休みして、ゲームする方に熱中していたものですからっ;;;
とゆうわけで、本当なら、コードの内容をよく学んでから返信したいところでしたが、取り急ぎお礼まで☆

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