短時間で作れそうなゲームの構想

フリーのゲーム素材を探してたら最近は豊富によい素材が公開されているようです。
グーグルの画像検索で『ゲーム素材』などの検索すると結構あります。

ふと思ったのが短時間で楽しいゲームは作れないかなと入浴中に少し考えてみました。

①マップを正方形にしてドラクエのようにランダムで敵を出現させ別ウィンドウでバトルさせることで当り判定のアルゴリズムは必要なくなる。
マップの切替は画面の端に来たら切り替えタイルも平原だけ。

②町なんてめんどうなのはやめて敵の出現と同じように行商人がランダムに出現して武器と食料を売ってくれる。

③スタート地点からの乖離距離と言う概念を用いてスタート地点から離れる程敵が強くなる。敵画像は1種類のみの使いまわし。

④ステータスは体力とお金と武器の攻撃力のみ。

⑤アイテム名を100個集めたらエンディング。
アイテムは使用できない収集のみの仕様。

⑥上記のルールだけではプレイヤーの技量が問われることがなく、ゲーム性が低いのでネットワークで他のプレイヤーと武器やアイテムを取引出来る。グレードアップ前の武器は商人に売るよりもネットで売った方が得重複アイテムも販売する以外の使い道は無いので売買が成り立つ。(TCPを用いたP2Pよりも極単純な掲示板程度の仕組みをもったハイブリッド型のサーバーを立てる方が向いてそう。しかし生IPさらすのもどうか・・・ちょっと面倒)

ごく基本部分のメイン画面は以下のサンプルコードのようなシンプルなイメージ。

※サンプルコードの動作には素材を以下のサイトから別途ダウンロードしてください。

ヤマンチュゲーム研究所さまのページ
http://www.ob2.aitai.ne.jp/~owl/material/index.html
この画像をダウンロード解凍たパスをサンプルコードの1行目のパスに指定してください。

サンプルコード

画像パス=「R:\TEMP\fantasy\fantasy\」//←実際に素材を解凍したフォルダ指定してください。

母艦のW=320。母艦のH=480。母艦を最前面

画像情報とは画像情報グループ。これについてパス=画像パス。画像設定する。
勇者情報とは勇者情報グループ。

背景画像とはイメージ。これについて可視=オフ。画像=画像情報の背景
平原背景とはイメージ。これについてレイアウト=全体。可視=オフ。
伽羅とはイメージ。これについて可視=オフ。レイアウト=全体。画像=画像情報の伽羅
勇者画像とはイメージ。これについてW=32。H=32。X=0。Y=0。可視=オフ。
伽羅の0,192,32,224を勇者画像の0,0へ画像部分コピー。

母艦のキー押した時は〜

 ((システム時間-前回入力時間)<100)ならば、戻る。//キーバッファの消化
 前回入力時間=システム時間。

 母艦の押された仮想キーで条件分岐
  "37"ならば、
  	勇者情報のX=勇者情報のX-16。
    平原勇者再描画
    敵商人遭遇イベントへ

  "38"ならば、
  	勇者情報のY=勇者情報のY-16。
    平原勇者再描画
    敵商人遭遇イベントへ

  "39"ならば、
  	勇者情報のX=勇者情報のX+16。
		平原勇者再描画
    敵商人遭遇イベントへ

  "40"ならば、
  	勇者情報のY=勇者情報のY+16。
    平原勇者再描画
    敵商人遭遇イベントへ
		
    
主処理へ




●主処理
 平原勇者再描画

●平原勇者再描画
 平原描画。
 勇者画像を平原背景の勇者情報のX,勇者情報のYへ画像合成。
 母艦反映
 
●母艦反映
 平原背景を母艦の0,0へ画像コピー
 描画処理反映 
 平原背景を画面クリア

●平原描画
 20回
  I=(回数-1)×32
  10回
   背景画像の0,0,32,32を平原背景の(回数-1)×32,Iへ画像部分コピー。

●敵商人遭遇イベント
  乱数値=1000の乱数。
  (乱数値<50)ならば、戦闘処理へ
 (乱数値>998)ならば、商人処理へ

●商人処理
 「商人処理を書きます」と言う。

●戦闘処理
 「戦闘処理を書きます」と言う。



■勇者情報グループ
 ・X ←X設定 →X取得
 ・Y ←Y設定 →Y取得
 ・X値
 ・Y値
 
 ・作る〜
  X=96
  Y=128   

 ・X設定(V)〜
  X値=V。
  (X値<0)ならば、X値=280。
  (X値>280)ならば、X値=0。
 ・Y設定(V)〜
  Y値=V。
  (Y値<0)ならば、Y値=416。
  (Y値>416)ならば、Y値=0。
  
 ・X取得〜_=X値。
 ・Y取得〜_=Y値。
  
■画像情報グループ
 ・パス
 ・伽羅
 ・背景
 
 ・画像設定〜
  背景=パス&「その他.bmp」
  伽羅=パス&「歩行ドットキャラ.bmp」

気がつけば、構想→慣れないゲームコーディング→ブログ書き終わるまで3時間
完成させるとすれば数日かかりそうです。短時間なんて夢物語でしたw

バウンディングBOX

曲が終わるまでにプログラミングを完成させる
ライブコーディングをニコニコ動画で見てまねて挑戦してみました。

内容は箱が画面の端にぶつかり跳ねるプログラムです。

ちなみに本家はJAVAを使用して2曲終わるまでに(1曲ごとに完結)
余裕のコメント付きでこれくらいまで完成してました。

なでしこで使う命令は予め調べていたにも関わらず
私の結果は5曲以上流れてしまいました。

挑戦終了後
衝突処理つけたいと思ってましたが途中でギブアップ。

『たまむれ』には辿りつけそうにありません。

/////////////////////////////////////////////////
箱個数=50//表示する個数
描画速度=0.02//小さいほどスピードが速い。
形=丸//(丸、四角、角丸)から選択
透明度=100//残像効果(MAX100)
/////////////////////////////////////////////////

!丸=30。
!四角=0。
!角丸=15。

(箱個数)回、A[回数]を箱情報として作成
裏画面とはイメージ。これについてレイアウト="全体"。可視=オフ。
母艦のサイズ変更した時は〜
 裏画面のH=母艦のH。
 裏画面のW=母艦のW。
 
オンの間
 (箱個数)回
  A[回数]→移動
  塗り色=A[回数]→箱色
  線色=塗り色
  裏画面の(A[回数]→X値),(A[回数]→Y値)から(A[回数]→X値+30),(A[回数]→Y値+30)へ形,形で角丸四角
 裏画面を母艦の0,0へ透明度で画像半透明コピー
 描画処理反映
 裏画面を画面クリア
 描画速度、秒待つ


■箱情報
 ・X値
 ・Y値
 ・箱色
 ・X速度{=10}
 ・Y速度{=10}
 
 ・作る〜
  色名="黒,赤,青,黄,緑,紫,水"
  色名を","で区切ってそれを配列シャッフル  
  箱色=(それ[0]&"色")をナデシコ
  X値=(母艦のWの乱数/10)を切り上げ×10
  Y値=(母艦のHの乱数/10)を切り上げ×10
  (X値>母艦のW-30)ならば、X値=母艦のW-30
  (Y値>母艦のH-50)ならば、Y値=母艦のH-50
  X方向 = "1,-1"を","で区切ってそれを配列シャッフルしてそれ[0]
  Y方向 = "1,-1"を","で区切ってそれを配列シャッフルしてそれ[0]
  X速度=X速度×X方向
  Y速度=Y速度×Y方向

 ・移動〜
  X値にX速度を直接足す
  Y値にY速度を直接足す
  X値範囲チェック
  Y値範囲チェック
  
 ・X値範囲チェック〜
  (X値>母艦のW-30)ならば、X速度=X速度×-1
  (X値=0)ならば、X速度=X速度×-1
   
 ・Y値範囲チェック〜
  (Y値>母艦のH-50)ならば、Y速度=Y速度×-1 
  (Y値=0)ならば、Y速度=Y速度×-1

ワイルドカード全マッチ(高速版)

なでしこのワイルドカードの全マッチは、複数マッチに対応していないため

今まで
抽出文字列を一つずつ、
マッチしない文字列に置換えしながら反復するなどの処理を書いていました。

配列等でデータが多くなると、時間が掛かるので
試行錯誤して以下のように反復を使わずマッチできました。

●ワイルドカード全マッチ(Sが,PTに)
 Sの"("&PT&")"を"<match>$1</match>"にワイルドカード置換して"match"のタグ切り出してタグ削除して戻る。

自己のテストでは、従来の置換え方法よりも、倍以上速くなりました。


※追記、この関数は不完全です。
特にパターンに『()』が使えません。
その他、動作検証を行ってないので挙動は詳しく解りません。


●おまけ

どうしても、抽出文字列を得たい時は、
関数外で処理するか、
『\(\)』以外の『()』をエスケープしておき
全マッチ結果に対してエスケープ前のパターンで
再度マッチさせて抽出文字列を抽出します。

関数内での抽出文字列は、ローカル変数となりますので
システム:抽出文字列=抽出文字列
グローバル変数の抽出文字列に代入するとよいです。

とまあ、自身でも少しやってみたのですが

簡単にはいきませんでした。

検証等もろくに行っておらず
説明がうまくできないのでコードは載せられませんが

どなたか、高速でスッキリ動く全マッチをお願いしますmOm

ワイルドカード後方参照の使い方1


■問題
100509|田中|営業部|係長
↓↓
100509,田中|営業部|係長
のように変換する。

■条件
数値は、先頭列のみに半角のみで存在する。

データ=『100001|田中|営業部|係長
100002|鈴木|経理|部長』

結果とは配列=""。

データを反復
 位置=対象を『|』で区切ってそれ[0]のバイト数
 結果に(対象の『(#)\|』を"${位置},"にワイルドカード置換)を配列追加
結果を言う

メモ、

$#には順に、1、0、0、0、0、2が入ります。

上記コードの例では、
$6には2が入ります。

100002

『2|』の部分を『2,』に置換しています。

なでしこ、ワイルドカードのバグ回避(暫定)

なでしこのバグ報告版にも投稿しましたが
ワイルドカードのORパターンにした場合一部の文字で正しく処理できないのです。

問題の文字があるとそれ以降のパターンを無視してマッチしてしまいます。

SWinXさんに原因を究明して頂きなんとかすっきりしました。

2バイト目に『|』と同じバイナリコードが来る文字列が問題です。

まともな回避策がシンプルな方法では浮かばないのでとりあえず、
問題の文字以降の判定がなされるように以下のように暫定処理しています。

WCバグ文字とはワイルドカードバグ文字
S=「ポ掃」//バグが発生する文字2バイト目に"|"($7c)を含むポや掃を"?"に置換える
SをWCバグ文字の置換
Sを言う

■ワイルドカードバグ文字
 ・{配列}禁止文字
 ・作る〜Cを$80から$FFまで繰り返す、CHR(C*256+$7C)を禁止文字に配列追加
 ・置換({参照渡し}Sを|Sの)〜禁止文字を反復、S=Sの対象を"?"にシステム:置換


問題のある文字の抜き出しにSWinXさんのコードを流用しています。
余計な文字まで入るらしいですが今回は取りあえず動けばよいのでお構いなしです。

Sqliteではまったメモ

Sqlite3で日本語を使うには、Sqlite3自動変換をオンにしておく。
これをしないと以下の場合"鉢"と言う曖昧検索ができない。

『Sqlite3自動変換=オン』にするタイミングはSQL文発行前ならば、どこでも構わない。(グローバル変数ぽいっ)

F=テンポラリフォルダ&「test.db」
SQLITE3自動変換=オン。//ここが重要

FをSQLITE3開く
『CREATE TABLE ITEM (ID,NAME);』をSQLITE3実行
『INSERT INTO ITEM (ID,NAME) VALUES (100714,"浅鉢");』をSQLITE3実行
『SELECT * FROM ITEM WHERE NAME LIKE"%鉢%";』をSQLITE3実行
それを言う
SQLITE3閉じる

その他嵌った部分
文字列と数値の型判定があるため
検索時ID番号などの数値は""等で囲んでしまうと文字列として扱われ
マッチしなくなる。

なでしこのGUIイベントの動作について1

GUI部品の特徴とも言えるイベントについてのメモです。

Aとはボタン。
Aをクリックした時は、
 回数を表示//②

10回
 母艦=回数
 0.5秒待つ
 Aをクリックした時//①

イベントを任意のタイミングで発生させたい時は

①の様にAをクリックした時と発生させたい場所に書けば、
Aをクリックした時と同じ様にイベントが発生します。

この場合②のようにイベント割り込み直前の反復中の
変数、『回数』も取得できます。
もちろん『対象』も取得できます。

動作は関数と同じでようですね。