表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
39/61

ionicを試す 20日目 ゲームブックアプリ:データの概要

まず最初に書いておきたいのが、ゲームブックと言うのモノはある程度シンプルであるべきという事です。


実際にコードを書いていて、この調子なら"Wizardry"位なら実装できるとは思いました。


しかし、所持アイテムの管理とか戦闘での特殊能力の使用とか取り入れていくことはゲームブックらしさがなくなる気がします。(面白そうなので、そのうちダンジョン物も作ってみたいですが)


ですので制約として


・プレイヤーのステータスは以下の3種類

・HP:ヒットポイント・体力値

・AP:アタックポイント・攻撃力

・GP:所持金

・所持アイテムの概念はない(必要ならばフラグで疑似的に実装)

・戦闘はサイコロの目と基準値を比較して先攻・後攻を決めた後は交互に攻撃

・戦闘の終了は自他いずれかのHPが0で終了。(シナリオ設定でゲームを続けることは可能)


を設けました。(ステータスの表記名はBook.jsonで変更可能)


また、各ページには以下のページタイプがあります。


・'Select':選択肢を選んで次のページを決める

・'Judgement':サイコロを振り、基準値との大小比較で次のページが決まる

・'Multiple':サイコロの出目により、それぞれ次のページが決まる

・'Attack':”敵”と戦い、その勝敗により次のページが決まる

・'Flagcheck':所持しているフラグの有無により次のページが決まる

・'Statuscheck':HP、AP、GPの値と基準値を比較して次のページが決まる

・'Ending':エンディング。1ページ目に戻るのみ可能。


これは7種類ですが、実際はステータスチェックにHP、AP、GPの3種類があり9種類です。


---------------------余談-----------------------------------------

前のデータを今回のデータにコンバート(変換)する時にどのステータスのチェックかを決めるデータを作り忘れたので、手短に'Type'の方を増やして対応しました。

こういう場合、正規表現で変換したり簡単な関数を作ってconsole.logで書き出しますが、今回は'Type'を増やす方が、楽過ぎましたのでそちらで行いました。

正規表現も毎回あんちょこ見るレベルですが、文字列のチェックならば強力な援軍です。

ソースコードの検索などにも使えます。

テスト一例:

 let PatternN = /^[1-9][0-9]*$/; //テスト文字列は正の10進数のみ許容

 if(!PatternN.test(テスト文字列)){alert('エラーです。')}

-------------------------------------------------------------------


セーブやコンティニュー用に保持すべきデータはPage.jsonのデータに比べて多くは無く、下記のデータと配列に保持されているフラグ情報で事足ります。

---------------------

 //StoryData コンティニューや保存、ページ変更時にセット

 StoryData = {

  "ThisPage":"",

  "myHP":"",

  "myAP":"",

  "myGP":"",

  "myMaxHP":"",

  "myMaxAP":"",

  "myMaxGP":"",

  "myInitHP":"",

  "myInitAP":"",

  "myInitGP":"",

  "myMaxInitHP":"",

  "AttackerName":"",

  "AttackerHP":"",

  "AttackerMaxHP":"",

  "AttackerAP":""

 };

---------------------


このデータは各ページの先頭の処理で再セットされます。


これとは別に、戦闘中などのデータも持ちますが、コンティニューやセーブデートのロード時には、あくまでそのページの最初のデータ使用します。

(結果が出ても、次のページの移行前なら再起動して再挑戦可能ですね。)


JSONデータの仕様上、各データは文字列として保持されます。


これはPage.jsonにも当てはまりますので、数値として処理したいデータを使う際は十分な注意が必要です。


一例:

99と100の比較

数値99 < 数値100

文字列100 < 文字列99 (先頭の文字のチェックですでに大小が決まるケース)


ですのでゲームブックの最初のページを読み込む前に、Page.jsonを全件を見て数値チェックや整合性チェック(行先のページが無いなど)を行う事をお勧めします。


チェックの一例

---------------------------------------------------------------

   if(sFlagOn!=""&&sFlagOn!="1"&&sFlagOn!="2"){

    this.FatalErrorText = "\n致命的なエラーが発生しました\n";

    this.FatalErrorText += "Page : " + key + "\n";

    this.FatalErrorText += "PageData[key]['FlagOn'] は''、'1'、'2'のみが許されます。\n";

    this.FatalErrorText += "PageData[key]['FlagOn'] : " + PageData[key]['FlagOn'];


    this.intCountError++;

    this.strCountError += this.FatalErrorText;

   }

---------------------------------------------------------------


上記の例では、エラーの数をintCountErrorで数え、10を超えるか全件チェックしてエラーがあれば、エラー内容strCountError(複数のエラー内容がありうる)をエラー表示用画面に出力します。


細かいことを言えば、まだまだあるのですが、チェックとデータの定義でかなりのコードになっています。転ばぬ先の杖ですね。


Import等   :12 (1%)

データ定義  :143(12.6%)

読込     :105(9.3%)

データチェック:340(30.0%)

プログラム処理:534(47.1%)


次回は、各タイプごとの処理を簡単にまとめていきたいと思います。

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ