Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016/10/29 (土)

ジョイパッドを使うよ!

| 05:32 | ジョイパッドを使うよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ジョイパッドを使うよ! - 雪乃☆雫のなでしこ日和 ジョイパッドを使うよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 ファイターズが10年ぶりの日本一!

 いや~、めでたいね、こりゃ\(^▽^)/



 さて・・・

 とりあえず、なでコラをジョイパッドで遊べるようにすること自体は、簡単でした。

 まえに、サンプルのなでりすでやってみたように、「キー処理」のサブルーチンをコピペして、「JOYキー処理」とでもして、「キー状態」を「JOYキー状態」に書き換えてやったらふつーに動きます。

 でもなあ、んなことでいいのか、本当に?!?!(汗)

 ・・・だけど、「または」で、一つにまとめようとすると、ジョイパッドがつながってる時はいいんだけど、つながっていない時のキーボードでの動きが、異常に悪くなるんだよね。

 なんでーなるのか、よく分からん(--;;;

 ・・・とゆうわけで、ものすごく無駄っぽく、ほとんど同じ風味なコードで行数を使ってしまうけど・・・取りあえず動けばOK!

 ・・・ってことにしておく。むむむ。



 さて、の、前のなでりすを試しに改造してみた時には、知恵が足りなくて、十字キーの状態をお手軽に別関数にしてしまっていたんだけど・・・

 ・・・「ほんっとバカだよなー、こいつ(爆)」・・・みたいな感じで、一つにまとめたwww

 文字列「U,R,D,L」の代わりに数値「$1000,$2000,$4000,$8000」を与えることにしただけです。

 ついでに、単にジョイパッドが接続されてるかどうかを返す関数と、JOYキー状態とは逆に、押されているジョイパッドのボタンのキーを返す関数追加して、のワタシの知恵ではこれが限度だけど、とりあえずキーコンフィグようの準備は整った・・・かもしない

 取りあえず、こんな感じ。

#-----------------------------------------------------------------------
# ジョイパッドの使用
#-----------------------------------------------------------------------
#『JOYパッド接続状態』
#・ジョイパッドが接続されてるかどうかをオン(1)かオフ(0)で返す。
#『JOYキー状態』
#・なでしこの「キー状態」と同じ感じで、ジョイパッドのボタン入力状態を調べ、オンオフを返す。
#『JOYキー取得』
#・押されているジョイパッドのボタンを返す。
#-----------------------------------------------------------------------
#※肝心のWindowsAPI部分は「なでしこ質問掲示板」の一般人さまの答による。
#http://nade.jp-pro.net/bbs/bbs/cbbs.cgi?mode=one&number=7435&type=7400&space=45&no=0
#-----------------------------------------------------------------------
!JOYERR_NOERROR = 0 //情報取得時にエラーがないときに返される値
!JOY_RETURNALL = 255 //Joystickの情報を全て取り込む値
//Joystickの情報を取り込む関数
●joyGetPosEx(uJoyID,{参照渡し}pji) =DLL("winmm.dll","UINT joyGetPosEx(UINT uJoyID,LPJOYINFOEX pji)")
//Joystickの最大サポート数(?)は未使用
●joyGetNumDevs =DLL("winmm.dll","UINT joyGetNumDevs(VOID)")

//JOYINFOEXの構造体をグループで構成
■JOYINFOEXとは
 ・dwSize
 ・dwFlags
 ・dwXpos
 ・dwYpos
 ・dwZpos
 ・dwRpos
 ・dwUpos
 ・dwVpos
 ・dwButtons
 ・dwButtonNumber
 ・dwPOV
 ・dwReserved1
 ・dwReserved2
#-----------------------------------------------------------------------
●JOYパッド接続状態
  もし、joyGetPosEx(0, POINTER(B))=JOYERR_NOERRORならばオン戻る。
  違えばオフ戻る。
#-----------------------------------------------------------------------
●JOYキー状態(Sで|Sの)
  AとはJOYINFOEX
  A.dwSize = 52 //Cで言うsizeof()がわからなかったためマジックナンバー
  A.dwFlags = JOY_RETURNALL
  Bとは文字列
  PACK(A,B,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
  もし、joyGetPosEx(0, POINTER(B))=JOYERR_NOERRORならば
    UNPACK(B,A,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
    もし、S=A.dwButtonsならばオン戻る。
    # $2777とか$D888とかの数値は暫定。アナログジョイスティックのための措置。
    違えばもし、S=$1000ならば、
      もし、(A.dwYpos<$2777)ならばオン戻る。  # UP (A.dwYpos=0)
      違えばオフ戻る。
    違えばもし、S=$2000ならば、
      もし、(A.dwXpos>$D888)ならばオン戻る。  # RIGHT (A.dwXpos=$FFFF)
      違えばオフ戻る。
    違えばもし、S=$4000ならば、
      もし、(A.dwYpos>$D888)ならばオン戻る。  # DOWN (A.dwYpos=$FFFF)
      違えばオフ戻る。
    違えばもし、S=$8000ならば、
      もし、(A.dwXpos<$2777)ならばオン戻る。  # LEFT (A.dwXpos=0)
      違えばオフ戻る。
    違えばオフ戻る。
  違えばキャンセル戻る。
#-----------------------------------------------------------------------
●JOYキー取得
  AとはJOYINFOEX
  A.dwSize = 52 //Cで言うsizeof()がわからなかったためマジックナンバー
  A.dwFlags = JOY_RETURNALL
  Bとは文字列
  PACK(A,B,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
  もし、joyGetPosEx(0, POINTER(B))=JOYERR_NOERRORならば
    UNPACK(B,A,`DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD`)
    JOY_KEY=A.dwButtons
    もし、(A.dwYpos<$2777)ならば、JOY_KEY=JOY_KEY+$1000      # UP (A.dwYpos=0)
    違えばもし、(A.dwYpos>$D888)ならば、JOY_KEY=JOY_KEY+$4000  # DOWN (A.dwYpos=$FFFF)
    もし、(A.dwXpos<$2777)ならば、JOY_KEY=JOY_KEY+$8000      # LEFT (A.dwXpos=0)
    違えばもし、(A.dwXpos>$D888)ならば、JOY_KEY=JOY_KEY+$2000  # RIGHT (A.dwXpos=$FFFF)
    もし、JOY_KEY=0ならばオフ戻る。
    違えば、JOY_KEYで戻る。
  違えばオフ戻る。
#-----------------------------------------------------------------------

#以下はテスト
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」
//!「ジョイパッドの使用.nako」を取り込む。

#---キー定義------------------
!JOY_UPとは整数=$1000
!JOY_RIGHTとは整数=$2000
!JOY_DOWNとは整数=$4000
!JOY_LEFTとは整数=$8000
!JOY_Aとは整数=$01
!JOY_Bとは整数=$02
#-----------------------------

#---母艦------------
母艦中央移動
母艦の可視はオン
#-----------------------------------------------------------------------

AとはエディタCX=母艦のクライアント幅/2-24/2
CY=母艦のクライアント高さ/2-24/2
文字書体は「MS ゴシック|24|太字」
母艦CX,CYへ「●」を文字表示。

#---動作テスト------------

# 『JOYパッド接続状態』
もし、JOYパッド接続状態=オンならば、「ジョイパッドを認識しました」を言う違えば、「ジョイパッドが接続されていません」を言う終わる。

# 『JOYキー状態オン
  もし(JOY_UPのJOYキー状態オン)ならば
    もし、(JOY_RIGHTのJOYキー状態オン)ならばCX=CX+3。CY=CY-3。
    違えばもし、(JOY_LEFTのJOYキー状態オン)ならばCX=CX-3。CY=CY-3。
    違えば、CY=CY-3。
  違えばもし(JOY_DOWNのJOYキー状態オン)ならば
    もし、(JOY_RIGHTのJOYキー状態オン)ならばCX=CX+3。CY=CY+3。
    違えばもし、(JOY_LEFTのJOYキー状態オン)ならばCX=CX-3。CY=CY+3。
    違えば、CY=CY+3。
  違えばもし(JOY_RIGHTのJOYキー状態オン)ならばCX=CX+3。
  違えばもし(JOY_LEFTのJOYキー状態オン)ならばCX=CX-3。

  もし、(JOY_AのJOYキー状態オン)ならば文字色赤色。
  違えばもし、(JOY_BのJOYキー状態オン)ならば文字色青色。
  違えば文字色黒色。
  母艦白色画面クリア
  母艦CX,CYへ「●」を文字表示。
//  0.01秒待つ

# 『JOYキー取得』
  もし、JOYキー取得=0でなければ、
    Aのテキストは、「${HEX(JOYキー取得)}」。
  0.01秒待つ
#-----------------------------------------------------------------------

 ジョイパッドがつながっていないと、接続されていませんと言って終わるだけだけどね;


※2017/01/29

 ちょっと修正しました。

 十字キーの割り当てですが、「U,L,R,D=$1000,$2000,$4000,$8000」としていましたが、パッドによっては、十字キーも「A.dwXpos」「A.dwYpos」を使わず、「A.dwButtons」を割り当てているヤツがあり、それ数値がどうやら、「U,R,D,L=$1000,$2000,$4000,$8000」となっているようだったので、のように。

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

2016/10/25 (火)

別フォームの位置が・・・

| 16:16 | 別フォームの位置が・・・ - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 別フォームの位置が・・・ - 雪乃☆雫のなでしこ日和 別フォームの位置が・・・ - 雪乃☆雫のなでしこ日和 のブックマークコメント

 ちょっと、キーコンフィグ画面っぽいものを作って表示してみようとしただけなのにぃ~。しくしくしくしくしく。

 まだ、内容は無くて、表示用のフォームだけなんですよ。見た目から作る人だからさーw

 この、位置の設定が上手くいかないのさ~。

 どうしても、あらぬところに表示されてしまう。

#キーコンフィグ画面の実験
#-----------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#---母艦------------
母艦中央移動

#---キー設定画面--------------
設定窓とはフォーム。
設定窓をウィンドウ背景色画面クリアこれについて
  可視はオフ。幅は300。高さは310。
  スタイルは「枠固定」
  タイトルは「キーボードの設定」
//  位置は"{母艦のX},{母艦のY}"

タイトルラベルとはラベル
これについて
  親部品は設定窓。
  文字書体は「|11|太字」
  テキストは「キーボードの設定」

キー割当とはグループボックス。
これについて
  親部品は設定窓。位置は"10,40"。
  幅は(設定窓の幅-25)。高さは(設定窓の高さ-100)。

#---ボタン--------------------
OKボタンとはボタンこれについて
  親部品は設定窓。
  位置は"{設定窓の幅-180},{設定窓の高さ-55}"
  クリックした時は~
    設定窓を閉じる。

キャンセルボタンとはボタンこれについて
  親部品は設定窓。
  位置は"{設定窓の幅-90},{設定窓の高さ-55}"
  クリックした時は~
    設定窓を閉じる。

#---ラベルエディタを動的作成----
# ラベルのテキスト,X,Y,
配置とは配列=「上(転),100,20{~}左,40,60{~}右,160,60{~}下(落下),100,100{~}転,45,155{~}落下,155,155」
キー数とは整数=配置の要素数。

(キー数)
  Cとは整数。C=回数-1
  KEYラベル[C]をラベルとして作成。
  KEYラベル[C]→親部品はキー割当。
  KEYラベル[C]→文字位置は中央。
  KEYラベル[C]→テキストは配置[C,0]
  KEYラベル[C]→幅は80
  KEYラベル[C]→位置は"{配置[C,1]},{配置[C,2]}"

  KEYエディタ[C]をエディタとして作成。
  KEYエディタ[C]→親部品はキー割当。
  KEYエディタ[C]→幅は80
  KEYエディタ[C]→位置は"{配置[C,1]},{配置[C,2]+15}"
  KEYエディタ[C]→ポケットはC
#------------------------------------------------------------

母艦の可視はオン
キー設定開く

*キー設定開く
  設定窓の位置は"{母艦のX},{母艦のY}"
  設定窓をモーダル表示。
//  設定窓の可視はオン
#-----------------------------------------------------------

 色々試した結果、変になるのはスタイル指定のあるフォームだけで、可視をオンにした後設定すると、設定が正しく反映されるけど、オフのうちに設定したものは無視されちゃうっぽい。

 でも、可視をオンにした後に位置の設定をしたら、一瞬ちらっともとの位置にフォーム表示されるのが見えちゃうんだよね~。

 ーゆう、細かいことが気になっちゃうタイプなんだよね。別に、たいして誰かに見せるわけでも無いんだけどw

#スタイル指定のフォームの実験
#-----------------------------------------------------------
!母艦設計=「母艦の可視はオフ」
Fとはフォーム。
Fについて
  可視はオフ。
  スタイルは「枠固定」

//Fを中央移動     #A
//Fの位置は"10,10"   #A

Fの可視はオン

//Fを中央移動     #B
//Fの位置は"10,10"   #B
#-----------------------------------------------------------

 えー、んな感じだったかなあと、以前作った「ちょぼいち」を開いてみたところ・・・

https://nadesiko.g.hatena.ne.jp/snowdrops89/20160227/1456582078

 なんと、お金を賭けるフォームが、あらぬところに表示されるわ~;

 これを作った頃はまだ、だいぶ古いバージョンを使ってたんだよね。(2011年頃からしばらくナデシコちょしてなかったんだけど、丁度の頃使ってたバージョンが、や安定版と言われているらしいことが分かったので)

 っち(1.5332)使ったら、ちょぼいちはもとよりキーコンフィグの画面も、ちゃんと希望の場所に表示されました。

 最近治った、母艦中央移動が利かなかった件と同じような現象におもえるけど、やっぱり母艦とふつーのフォームは、違うんだねー。

 なんか、やっぱりまたバージョン戻すかなーw

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

2016/10/12 (水)

早速ミスってるし!(--;

| 00:11 | 早速ミスってるし!(--; - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 早速ミスってるし!(--; - 雪乃☆雫のなでしこ日和 早速ミスってるし!(--; - 雪乃☆雫のなでしこ日和 のブックマークコメント

 でも、こっりなおしといた(爆)

 一遊んだ後、新規ゲームをしても、前のスコアやレベルの表示が画面に残ったままだった;

 数値自体はクリアしてるから、一石を消せば、ちゃんとなるんですが、画面に反映し忘れてた;;

 こはちゃんと見たつもりだったのに、全然見らさって無かったラシイ;;;

 まったく、しょーもないねえ┐( ̄ヘ ̄)┌

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

  #↓↓↓
  スコア表示。
  レベル表示。
  消去数表示。
  レベルアップメータークリア。

  次石決定。
  次石落下。
  落下処理。
  メインループ。
#-----------------------------------------------------------------------

 

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

2016/10/10 (月)

ひとまずの完成と、ダメらしい話し

| 09:08 | ひとまずの完成と、ダメらしい話し - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ひとまずの完成と、ダメらしい話し - 雪乃☆雫のなでしこ日和 ひとまずの完成と、ダメらしい話し - 雪乃☆雫のなでしこ日和 のブックマークコメント

 ・・・とゆうわけで(?)発覚した、問題点について。

 問題点は、天井近くまでみ上がっている時の挙動です。

 ワタシはね、んなんなったらもう、早々にあきらめですよw

 だから、考えもしなかったんだけど、石が消えた時点で、まだメイン画面に見えていない、天井より上の位置にも落下石があった場合に、それが消滅してしまう。

 また、石固定処理時に、石落下位置の天井に落下石の上端が達していると、こに消せる石があっても石を消去する前に、ゲームオーバーとなってしまう・・・など。

 後者は、なるほど確かに、石落下位置の上の方に同じ色が二個まさっていて、後一個同じ色が欲しい・・・というところへ望みの色の石が落ちてきたとしても、消えずに同色の石が3つくっついた物が表示された状態の画面でゲームオーバーになってしまうっていうのは、の分のスコアも当然入らないわけだから、ちょっともやもやしてしまうね。

 これは、たぶん連鎖まで終わらせた後にゲームオーバー判定を移動させれば、いいんだろう。

 しかし・・・

 天井より上の石が消滅してしまうっていうのは・・・なんかダメなの? むしろ、助かるような気が・・・と言ったら、「当たり前でしょ。こで、連鎖を起こして持ちこたえてこじゃん」っと言われてしまった。

 うえぇ~、マヂか?! 奥が深いな。ワタシには到底ムリだが;;;

 して、これを直すにはどうしたらいいんだ?

 固定石と消去石の配列を2段分大きくするとか・・・?



 ・・・なにげに直せそうではあるんだけど、なんかもう面倒だから、ひとまずこーいう仕様だと言い張る(えっ?!)

 天井の上にヨユウはなく、オーバーした石は消え失せるし、石落下位置があふれたら即アウトってことでっ;;;

 なぜなら、ちょっと忘れかけていたけど、ジョイパッドに対応したゲームでも作ってみようと思い立ったのがもの発端だったことを思い出したのです!(爆)

 っと言うわけで、気が向いたら、いずれこの問題は解決するかも知れないし、の際には、教えを頂いたことを元に、石消去の部分も全面的に見直すかも知れないけれど、とりあえずこのまま先に進みます~(ええぇっ;)



 でっ、取りあえずはこんな感じ~。

#-----------------------------------------------------------------------
# なでこらキーボード版 ダメっぽいけどver1.00
#-----------------------------------------------------------------------
# INI
設定ファイル名とは文字列=「{母艦パス}なでこら.ini」

#-----母艦設計----------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#---メニュー----
『#親部品名,部品名,テキスト,ショートカット,オプション,イベント
なし,ファイルメニュー,ファイル(&F),,,
 -,新規メニュー,新しいゲーム(&N),Ctrl+N,,新規ゲーム
 -,-,,,,
 -,成績表メニュー,成績表(&S),Ctrl+S,,成績表表示
 -,成績リセットメニュー,成績リセット(&D),Ctrl+D,,成績リセット
 -,-,,,,
 -,閉じるメニュー,閉じる(&X),Ctrl+X,,終わる
なし,設定メニュー,設定(&O),,,
 -,選択メニュー,コントローラー選択(&C),,,
 --,キーボード選択メニュー,キーボード(&K),,チェック,
 --,ジョイパッド選択メニュー,ジョイパッド(&J),,,
 -,-,,,,
 -,キーボード設定メニュー,キーボードのキー設定(&K),,,
 -,ジョイパッド設定メニュー,ジョイパッドのキー設定(&J),,,
なし,ヘルプメニュー,ヘルプ(&H),,,
 -,ルールメニュー,遊び方(&R),Ctrl+R,,遊び方
 -,-,,,,
 -,バージョンメニュー,バージョン情報(&A),Ctrl+A,,バージョン
』をメニュー一括作成。

設定メニューの有効はオフ。

#---母艦----
母艦のタイトルは「なでこら」
母艦を$FFBBAAで画面クリア母艦のスタイルは「枠固定」
母艦オフに最大化ボタン有効変更。
母艦のクライアント幅は330。母艦のクライアント高さは480。
母艦中央移動
#-----------------------------------------------------------------------

#-----宣言--------------------------------------------------------------
マス目とは整数=32。

石落下位置Xとは整数=マス目*3。
石落下位置Yとは整数=0-マス目*2。
落下Xとは整数=石落下位置X
落下Yとは整数=石落下位置Y

メインXとは整数=30。
メインYとは整数=50。
スコアXとは整数=メインX/2
スコアYとは整数=メインY/3
右辺ラベルXとは整数=メインX+マス目*6+25
ネクストXとは整数=メインX+マス目*6+40
ネクストYとは整数=メインY+30
レベルYとは整数=メインY+マス目*3+80
消去数Yとは整数=メインY+マス目*3+160
連鎖Yとは整数=メインY+マス目*12-50

石とは配列    #石の種類(形状,色)
石=「●,$DD0000
◆,$FF7700
■,$0077FF
★,$EEEE00
▲,$EE00EE
▼,$00DD00」
#-----------------------------------------------------------
次石とは配列   #次に落下する石
落下石とは配列  #落下中の石
固定石とは配列  #落下し終わり固定された石
消去石とは配列  #消去する予定の石
石消去フラグとは整数オフ。

# 移動可能かどうかを調べる
縦移動フラグとは整数オフ。
右移動フラグとは整数オフ。
左移動フラグとは整数オフ。

# 移動中かどうか
右移動中とは整数オフ。
左移動中とは整数オフ。

# 押しっぱなしかどうかを調べる
右キー押下状態とは整数オフ。
左キー押下状態とは整数オフ転キー押下状態とは整数オフ。

# キー設定
左移動キーとは整数=$25 #VK_LEFT
右移動キーとは整数=$27 #VK_RIGHT
落下キーとは整数=$28 #VK_DOWN
//転キーとは整数=$26 #VK_UP
転キーとは整数=$20 #VK_SPACE

# カウンター
消去数とは整数=0
連鎖数とは整数=1

# スコア・レベル表示
レベルとは整数=0
スコアとは整数=0

終了フラグとは整数オフ
#-----------------------------------------------------------
#---裏画面----
石用とはイメージ。
石用について。
  可視はオフ。
  幅はマス目*6。高さはマス目

マス目用とはイメージ
マス目用について
  可視はオフ。
  幅はマス目。高さはマス目。
  $332211で画面クリア。

石転用とはイメージ。
石転用について。
  可視はオフ。
  幅はマス目。高さはマス目*3。

メイン合成用とはイメージ
メイン合成用について
  可視はオフ。
  幅はマス目*6。高さはマス目*13。

#---画面----
表画面とはイメージ
表画面について
  Xは0。Yは0。
  幅は母艦のクライアント幅。高さは母艦のクライアント高さ。
  $FFBBAAで画面クリア。

メイン画面とはイメージ
メイン画面について
  可視はオフ。
  幅はマス目*6。高さはマス目*13。

次石表示用とはイメージ
次石表示用について。
  可視はオフ。
  幅はマス目。高さはマス目*3。

落下用とはイメージ
落下用について。
  可視はオフ。
  幅はマス目。高さはマス目*3。
#-----------------------------------------------------------
# 成績表
ハイスコア表示件数とは整数=10
成績とは整数。
成績読み込み
#-----------------------------------------------------------------------

#-----メインルーチン----------------------------------------------------
画面準備
母艦の可視はオン。

*新規ゲーム
  固定石初期化。
  メイン画面初期化。
  消去数=0。レベル=0。スコア=0
  スコア表示。
  レベル表示。
  消去数表示。
  レベルアップメータークリア。

  次石決定。
  次石落下。
  落下処理。
  メインループ。
#-----------------------------------------------------------------------
*メインループ
  終了フラグはオフ
  (終了フラグ=オフ)の
    0.01秒待つ
    もし、縦移動フラグ=オンならば
      落下処理。
    違えば
      石固定処理。
      次石落下。
#-----------------------------------------------------------------------
*次石決定
  3
    r=6の乱数。次石¥(回数-1)=r。
    x=r*マス目。y=0。
    石用のx,y,マス目,マス目を次石表示用の0,(回数-1)*マス目へ画像部分コピー。
    次石表示用を表画面のネクストX,ネクストYへ画像コピー。

*次石落下
  連鎖表示クリア。
  次石表示用を落下用の0,0へ画像コピー
  落下石=次石。
  次石決定
  落下X=石落下位置X。落下Y=石落下位置Y

  縦移動フラグ=オン

*落下処理
  LSとは整数=レベル*0.01   # 落下速度は「{(0.1-LS)*10}秒」
  10
    キー処理
    落下用をメイン合成用の落下X,落下Yへ画像コピー。
    メイン合成用を表画面のメインX,メインYへ画像コピー
    メイン画面をメイン合成用の0,0へ画像コピー。
    # 落下キーを押していない時のウェイト
    もし、落下フラグがオンでなければ、
      (0.1-LS)秒待つ。
    # 左右キーは押し続けた時は一気に動くが、連打した時は一マスごと動くようにする。
    もし、(左移動中=オン)かつ(左キー押下状態=オフならば、
      左キー押下状態=オン。
      0.1秒待つ。
    もし、(右移動中=オン)かつ(右キー押下状態=オフならば、
      右キー押下状態=オン。
      0.1秒待つ。

  落下Y=落下Y+マス目
  移動判定
#-----------------------------------------------------------------------
*キー処理
  # 左移動。
  もし(左移動キーのキー状態=オン)ならば
    移動判定
    もし、左移動フラグ=オンならば
      落下X=落下X-マス目。
      左移動中=オン。
  違えば、
    左キー押下状態=オフ。
    左移動中=オフ。

  # 右移動。
  もし(右移動キーのキー状態=オン)ならば
    移動判定
    もし、右移動フラグ=オンならば
      落下X=落下X+マス目。
      右移動中=オン。
  違えば、
    右キー押下状態=オフ。
    右移動中=オフ。

  # 石を落とす
  もし、(落下キーのキー状態=オン)ならば
    落下フラグ=オン
  違えば
    落下フラグ=オフ

  # 石を転
  もし、(転キーのキー状態=オンならば
    もし転キー押下状態=オフならば  # 押しっぱなしでは転し続けない
     転キー押下状態=オン。
     A=落下石¥0。B=落下石¥1。C=落下石¥2。
     落下石¥0=C。
     落下石¥1=A。
     落下石¥2=B。
     3
       x=落下石¥(回数-1)*マス目。y=0。
       石用のx,y,マス目,マス目を石転用の0,(回数-1)*マス目へ画像部分コピー。
       落下用クリア。
       石転用を落下用の0,0へ画像コピー。
  違えば転キー押下状態=オフ移動判定
  # はみ出しの処理。
  # 石が壁、床、他の石にぶつからずに動けるかどうかを判定。
  落下マスXとは整数=落下X/マス目
  落下マスYとは整数=落下Y/マス目+2  # 一番下の石があるマス目

 # 縦方向
  # 床
  もし、落下Y>=マス目*11ならば、縦移動フラグ=オフ。
  # 他の石
  違えばもし、固定石¥(落下マスX),(落下マスY)=-1ならば、縦移動フラグ=オン。
  違えば、縦移動フラグ=オフ。

 # 横方向
  # 左の壁
  もし、(落下X-マス目<0)ならば、
    左移動フラグ=オフ。
    左移動中=オン。
  # 他の石
  違えばもし、固定石¥(落下マスX-1),(落下マスY)=-1でなければ、
    左移動フラグ=オフ。
    左移動中=オン。
  違えば、左移動フラグ=オン。
  # 右のカベ
  もし、(落下X+マス目>=マス目*6)ならば、
    右移動フラグ=オフ。
    右移動中=オン。
  # 他の石
  違えばもし、固定石¥(落下マスX+1),(落下マスY)=-1でなければ、
    右移動フラグ=オフ。
    右移動中=オン。
  違えば、右移動フラグ=オン。
#-----------------------------------------------------------------------
*石固定処理
  # 落下しきった石をメイン画面に固定する。
  # 固定石配列の書き換えと、メイン画面への石画像表示。
  落下マスXとは整数=落下X/マス目
  落下マスYとは整数=落下Y/マス目-1  # 一番上の石があるマス目

  もし、((落下マスY)<0)かつ(落下マスX=3)ならば、ゲームオーバー。
  違えば、
    xxとは整数。yyとは整数。
    3
      xx=(落下マスX)。yy=(落下マスY)+(回数-1)
      もし、yy>=0ならば
        固定石¥xx,yy=落下石¥(回数-1)

    固定石描画。
    落下フラグ=オフ。
    0.3秒待つ

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

*固定石描画
    xxとは整数。yyとは整数。
    メイン画面初期化。
    メイン合成用の0,0へメイン画面を画像コピー。
    6
      xx=(回数-1)
      13
        yy=(回数-1)
        x=固定石¥xx,yy。y=0。
        石用のx*マス目,y,マス目,マス目をメイン合成用のxx*マス目,yy*マス目へ画像部分コピー。
    メイン画面の0,0へメイン合成用を画像コピー。
    メイン画面をメイン合成用の0,0へ画像コピー。
    メイン合成用を表画面のメインX,メインYへ画像コピー。
#-----------------------------------------------------------------------
*消去判定(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

*石消去
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、消去石¥xx,yy=1ならば、
        固定石¥xx,yy=-1。
        消去数=消去数+1
        スコア=スコア+10*(レベル+1)*(連鎖数^2)
        スコア表示。
        レベル表示。
        消去数表示。
        レベルアップメーター表示。
  固定石描画。0.3秒待つ。

*隙埋め
  xxとは整数。yyとは整数。Cとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、消去石¥xx,yy=1ならば、
        Cでyyから0まで繰り返す
          もし、C=0ならば、
            固定石¥xx,C=-1
          違えば、
            固定石¥xx,C=固定石¥xx,(C-1)
  固定石描画。0.3秒待つ。

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

  もし、石消去フラグ=オンならば、
    連鎖数=連鎖数+1
    連鎖表示。0.5秒待つ
    石消去。隙埋め。連鎖
  違えば、
    連鎖数=1
#-----------------------------------------------------------------------
*画面準備
  # マス目を描く
  線太さは0。線色は$443322。塗り色は$443322。
  マス目用の0,0から2,マス目-4へ四角。
  マス目用の0,0からマス目-4,2へ四角。
  線太さは0。線色は$221100。塗り色は$221100。
  マス目用のマス目-2,4からマス目,マス目へ四角。
  マス目用の4,マス目-2からマス目,マス目へ四角。

  #マス目をコピー。
  3
    C=回数-1
    マス目用を次石表示用の0,C*マス目へ画像コピー。

  メイン画面初期化
  メイン画面をメイン合成用の0,0へ画像コピー。

  # 表画面
  文字書体は「MS Pゴシック|14|太字」。文字色は$FFFFFF。
  表画面のスコアX+1,スコアY+2へ「すこあ」を文字描画。
  表画面の右辺ラベルX+1,ネクストY-25+2へ「ねくすと」を文字描画。
  表画面の右辺ラベルX+1,レベルY-25+2へ「れべる」を文字描画。
  表画面の右辺ラベルX+1,消去数Y-25+2へ「じゅえる」を文字描画。
  文字色は$CC3322。
  表画面のスコアX,スコアYへ「すこあ」を文字描画。
  表画面の右辺ラベルX,ネクストY-25へ「ねくすと」を文字描画。
  表画面の右辺ラベルX,レベルY-25へ「れべる」を文字描画。
  表画面の右辺ラベルX+1,消去数Y-25へ「じゅえる」を文字描画。

  メイン画面を表画面のメインX,メインYへ画像コピー。
  次石表示用を表画面のネクストX,ネクストYへ画像コピー。
  スコア表示。
  レベル表示。
  消去数表示。
  レベルアップメータークリア。

  # 石用に石を描く
  6
    C=回数-1
    マス目用を石用のC*マス目,0へ画像コピー。
    文字書体は「MS ゴシック|23|太字」。文字色は石¥C,1。
    石用のC*マス目,0へ石¥C,0を文字表示。

*メイン画面初期化
  6
    マス目用をメイン画面のマス目*(回数-1),0へ画像コピー。
  13
    メイン画面の0,0,マス目*6,マス目をメイン画面の0,マス目*(回数-1)へ画像部分コピー。

*スコア表示
  文字書体は「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へレベルを中央,中央で枠内文字描画。

*消去数表示
  線色は$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へ四角。

#-----------------------------------------------------------------------
*固定石初期化
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      固定石¥xx,yy=-1

*消去石初期化
  石消去フラグ=オフ。
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      消去石¥xx,yy=-1
#-----------------------------------------------------------------------
*ゲームオーバー
  「ゲームオーバー」と言う。
  終了フラグはオン。
  成績記録。
#-----------------------------------------------------------------------

#-----成績表------------------------------------------------------------
*成績記録
  設定ファイル名の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閉じる
#-----ヘルプメニュー----------------------------------------------------
*遊び方
  ダイアログタイトルは「なでこらについて」
  「【いわゆるコラ○スのルール】
  フィールドに上から縦1列3個1組で落ちてくるブロックを、
  左右に動かしたり転させたりしながら、同色同型のものを
  縦・横・斜めに3つ以上揃えるとのブロックが消えます。
  連鎖すると、得られる得点が高くなります。
  左から4列目の上端までブロックがみ上がってしまったら、
  ゲームオーバーです。
  なお、魔法石は出現しませんw

【キー設定】
  ←・→ で左右に動かす。
   ↓  で落下。
  スペースで転。」を言う。
#-----------------------------------------------------------
*バージョン
  ダイアログタイトルは「バージョン情報」
  「{二重カッコ}なでこら{二重カッコ閉じ}{改行} Version 1.00{改行}{改行} by 雪乃☆雫」と言う。
#-----------------------------------------------------------------------

#-----------------------------------------------------------------------
●枠内文字描画({グループ=?}OBJのX,Y,W,HへSをA,Vで)
  xxとは整数。yyとは整数。
  もし、A=左ならば
    xx=X
  違えばもし、A=中央ならば
    xx=X+(W-(Sの文字幅取得))/2
  違えばもし、A=右ならば
    xx=(X+W)-(Sの文字幅取得)
  もし、V=上ならば
    yy=Y
  違えばもし、V=中央ならば
    yy=Y+(H-(Sの文字高さ取得))/2
  違えばもし、V=下ならば
    yy=(Y+H)-(Sの文字高さ取得)
  OBJのxx,yyへSを文字描画。
#-----------------------------------------------------------------------

 どうかな? 一応それっぽく遊べはすると、思うんだけど・・・

hanatai001hanatai0012016/10/12 03:55すごいですね!!
ちゃんと遊べて楽しいです!!

雪乃☆雫雪乃☆雫2016/10/12 18:01>hanatai001さん
 ありがとうございます☆
 遊んで下さったんですね!
 うれし~(≧▽≦)
 もし記事にあげた問題点のほかに、バグってるとか、本家の動作はこうじゃないよ!とかあったら、教えて下さいね~(直すかどうかは不明デスがっ;;;;)

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

2016/10/07 (金)

レベルとともにスピードアップ

| 22:44 | レベルとともにスピードアップ - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - レベルとともにスピードアップ - 雪乃☆雫のなでしこ日和 レベルとともにスピードアップ - 雪乃☆雫のなでしこ日和 のブックマークコメント

 これまでは、落下ボタンを押してない時のウェイトを1秒(20*0.05秒)ってことにしてたけど、レベルが上がるごとそれを短くしていきたいって事で、ウェイトからレベルを引いて行くことにしただけ。

#-----------------------------------------------------------------------
*落下処理
  LSとは整数=レベル*0.01   # 落下速度は「{(0.1-LS)*10}秒」
  10
    キー処理
    落下用をメイン合成用の落下X,落下Yへ画像コピー。
    メイン合成用を表画面のメインX,メインYへ画像コピー
    メイン画面をメイン合成用の0,0へ画像コピー。
    # 落下キーを押していない時のウェイト
    もし、落下フラグがオンでなければ、
      (0.1-LS)秒待つ。
    # 左右キーは押し続けた時は一気に動くが、連打した時は一マスごと動くようにする。
    もし、(左移動中=オン)かつ(左キー押下状態=オフならば、
      左キー押下状態=オン。
      0.1秒待つ。
    もし、(右移動中=オン)かつ(右キー押下状態=オフならば、
      右キー押下状態=オン。
      0.1秒待つ。

  落下Y=落下Y+マス目
  移動判定
#-----------------------------------------------------------------------

 ちなみに、秒待つ命令は、0秒待つになってもウェイトがかかるんだけど、マイナスになると、ほぼかからなくなる感じで、特にエラーとかにはならないようなので、レベルが10えたときの処理は設けていません。

 ってわけで、11レベル以降は、ワタシにはムリな感じになっています;


 これで基本的な部分は完成で一段落~・・・っとおもったら、どうやら、ダメらしい。

 思わぬ落とし穴が発覚なのですよ?!

 どうするか、考え中・・・(@_@)

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

2016/09/22 (木)

INIファイルで成績表

| 04:16 | INIファイルで成績表 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - INIファイルで成績表 - 雪乃☆雫のなでしこ日和 INIファイルで成績表 - 雪乃☆雫のなでしこ日和 のブックマークコメント

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

 なでしこで、一番最初に作ったプログラム、『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