古い Colorchess (ChessHighlight) プログラムをリファクタリングしようとしています。初心者がゲームを理解するのを助けるために、各ターンでチェスマンの影響力を高めることを目的としたチェス盤です。
特定のターンでの船内の圧力バランスに応じて、タイルは次のように色付けされます。
- 緑 = 圧力なし
- 白 = 白のプレイヤーがタイルを所有
- 黒 = 黒のプレイヤーがタイルを所有
- 緑 - 黄 - オレンジ - 赤のグラデーションから選択された色: このタイルの競合状況
AI のプロジェクトは進んでいますが、現時点では、タブレットでのテーブル ゲームとネットワーク ゲームの両方の状況で、このゲームをデバイスで正しくプレイできるようにすることに焦点を当てています。
クライアント側を JavaScript でコーディングすることにしました。私の実際のホスティング環境は下にあるため、サーバーの同期はPHPになります。
私の質問ですが、すべてをまとめようとすると発生します。
(クライアント側ライブラリ) - RequireJS --> ファイルの読み込み - KnockoutJS --> UI イベントのバインド - ICanHaz --> テンプレート作成 - Zepto --> DOM 操作 - ユーティリティ用の underscoreJS
スパゲッティ コードを作成することについて心配しています。理解しにくく、維持するのが困難です。
古いプログラムである ChessHighlight には、多くのインターレース構造宣言とプロトタイプ拡張がありました。たとえば、次のようになります。
// file board.js
function Board() { ... }
function Tile() { ... }
// next included file :
function Chessman() { ... }
// again in a third included file
// since board and chessmen are defined
Tile.prototype.put(chessman) { ... }
Tile.prototype.empty() { ... }
ゲームの高度に結合された性質により、スタック内の各ファイル インクルードはますます多くの定義を保持し、コードが乱雑になりました...
問題は、次のようなセッターを実行したため、ゲームにトランザクションの実装が必要なことです。
// both... (think ACID commit in a RDBMS)
tile_h8.chessman = rook_white_1;
rook_white_1.tile = tile_h8;
ここで、保存することを目的とした「オブジェクトリレーショナルプールマネージャー」を作成することにより、この問題を部分的に解決します。
- あらゆる種類のオブジェクトへの参照 (ボード、チェスマン、タイル、インフルエンス...)
- オブジェクト間の関係
- そしてかなりの型チェックとカーディナリティ/アリティの合計
(現時点でコードを焼いています)
いくつかの質問 :
- コードの基本的な原子を定義する方法で拡張可能なコード (エレガントに、クラスとインターフェイスのシミュレーションではなく、プロトタイプとクロージャ) を作成する方法: タイル、ボード、チェスマンを非常に短いファイルで定義し、それらを別の部分で結合します。コールバックで動作を追加しますか?
注 : ゲーム エンジンのコード (Crafty、Quintus...) を読み込もうとしていますが、これらのエンジンのコア (1600 行のコード) は十分に文書化されていますが、理解するのは困難です (開始点はどこですか? ランタイム フローはどこですか? ??)
UML : 古典的な方法論は、クロージャ、コールバック、およびネストされたスコープで急速に失敗する可能性があると感じています。私は本能的に書いて理解しているようですが、ドラッググラムを描くのはトリックのようです...優れたJS開発者が安全ロープとして使用するもの1500以上のコード行のピークを登るために?
- そして最後: GUI の KnockOut ViewModels である計算されたオブザーバブルに簡単にプラグインするエンジン API "jquery-like" が必要です。このようなもの
[コード]
var colorchess = new Colorchess( my_VM_for_this_DIV_part );
colorchess.reset( "standard-game" );
colorchess("a1") --> a wrapper for "a1" tile
colorchess("h8").chessman() --> a wrapper for "h8" tile's chessman (rook)
// iterate on black chessman
colorchess("black").each( function( ref, chessman) {})
// a chainable example
colorchess("white").chessman("queen").influences()
[/コード]
...しかし、しばらくの間、この種の可変オブジェクトをモデル化、作成、およびテストする方法が正確にはわかりません。
提案は大歓迎です。手伝ってくれてありがとう。