ここでは、「かいがら島」を例に取り、座標の概念を使ったマップの管理の仕方を説明します。なお、この中では(x座標:y座標)という示し方をします(「:」は「半角のコロン」)。x座標、y座標の向きは→、↓です。
初期データ設定
マップの初期データを次のように設定します(初期データの詳しい書式などはこちら)。
マップのマスデータ
100,100,100,3,0,4,100,100,100
100,0,0,100,0,100,0,0,100
9,0,0,0,1,0,0,0,2
100,0,0,100,0,100,0,0,100
100,100,100,6,0,5,100,100,100
お店の初期値段のデータ
130,360,490,0,0,0,150,350,300
220,0,0,140,0,110,0,0,190
0,0,0,0,0,0,0,0,0
500,0,0,270,0,90,0,0,150
390,200,300,0,0,0,180,320,400
お店の初期買い物料のデータ
19,67,94,0,0,0,23,65,54
38,0,0,21,0,15,0,0,31
0,0,0,0,0,0,0,0,0
96,0,0,48,0,10,0,0,23
73,33,54,0,0,0,29,59,75
お店に増資された額のデータ(この説明では使いません)
0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0
更にそれぞれのプレイヤーの初期座標(=スタート地点の座標)を(5:3)と設定します。これで準備完了。
行動の再現
ゲームがスタートし、各プレイヤーがこのような行動を取ったとします。
「プレイヤー1が1を出し、左上に進んで、お店を買った。」
「プレイヤー2が5を出し、左上に進んで、お店を買った。」
「プレイヤー3が1を出し、左上に進んで、買い物料を払った。」
「プレイヤー4が2を出し、左上に進んで、チャンスカードを引いたが、スカだった。」
「プレイヤー1が1を出し、そのまま進んでチャンスカードを引き、ワープを引き当て、銀行の左下のお店(座標は(4:4))へ行き、お店を買った。」
「プレイヤー2が2を出し、そのまま進んで、休日に止まった。」
「プレイヤー3が4を出し、そのまま進んで、プレイヤー2のお店に止まったが、休日だった。」
この行動を座標を使って追ってみましょう。画面表示など、他の処理はされているものとします。
まず、プレイヤー1が1を出し、左上に移動します。座標の概念の中では、1マス左上に移動する、というのは、「x座標、y座標の値をそれぞれ−1する」ということになります。そこで、その様にすると、移動後のプレイヤー1の座標は(4:2)となります。これで移動が終わったので、止まったマスが何かを調べます。「マップのマスデータ」の(4:2)の地点を調べると「100」となっていて、これは「空き店」を表わします。プレイヤー1はここを買ったので、「マップのマスデータ」の(4:2)の地点に新たに「101」と書き込みます。これで、このお店がプレイヤー1のものになった事になります。いくらで買ったかを調べるために、「お店の初期値段のデータ」の(4:2)の地点も見ます。すると、「140」となっているので、プレイヤー1の現金を140G減らします。
次にプレイヤー2が5を出し、左上に移動します。これも同じように座標の値を操作していくと最終的な座標は(1:1)となります。ここもプレイヤー1と同じように「マップのマスデータ」を調べて、ここをプレイヤー2のお店にするために「102」と書き込みます。
次に、プレイヤー3が1を出し、左上に移動します。これはプレイヤー1と同じ行動ですので、座標の値は(4:2)になる事は分かりますね。同じように「マップのマスデータ」を調べます。すると、データは「101」になっていて、「プレイヤー1のお店」という事になります。この人はプレイヤー1ではないので、プレイヤー1に買い物料を支払います。いくら払うかを調べるために、「お店の初期買い物料のデータ」の(4:2)の地点を見ます。すると、「21」となっているので(本当はここで買い物料計算の過程がありますが、省略します)、プレイヤー1の現金を21G増やし、プレイヤー3の現金を21G減らします。
次にプレイヤー4が2を出し、左上に移動します。座標の値を操作すると最終的な座標は(4:1)となります。ここも同じように「マップのマスデータ」を調べると「スペード」のマスを示しています。ですので、チャンスカードの処理に移ります。スカを引いたので、何もせず次の人に移ります。
次のターン、プレイヤー1が1を出します。進める方向は1つしかないので、進みます。するとプレイヤー4と同じ「スペード」に止まった事になります。チャンスカード処理をします。その後、「チャンスカードでワープを引き、銀行の左下に行った」ので、プレイヤー1の現在座標を新たに(4:4)と設定します。これでプレイヤー1が銀行の左下のお店に行った事になります。今までと同じようにこの地点のマスを調べ、お店を買う処理をします。
次にプレイヤー2が2を出します。そのまま進んで、着いたマスを調べると「9」となっています。これは「休日」を示しているので、プレイヤー2は休日に入ります。
最後にプレイヤー3が4を出します。そのまま進んで、着いたマスを調べると「102」となっています。これはプレイヤー2のお店ですので、普通は買い物料を払います。しかし、今回は休日なので、買い物料の処理はしません。
後はこの調子でゲーム終了まで管理するのです。
座標管理法の発展
オブジェクト指向のプログラムができる言語(オブジェクトの画面位置の指定を数値でできる)の場合、別のデータとして「マスの画面上のx座標、y座標」を持たせれば、それを読み込むことで、画面上だけは正確なレイアウトが再現できます。内部処理は8方向でできるので、かなり楽になるのではないでょうか。
例えばかいがら島で、銀行を中心とした、次のような座標データを設定します(1マスは40ドット四方であるとします)。
マスの画面上のx座標
30,70,110,150,0,250,290,330,370
10,0,0,170,0,230,0,0,390
10,0,0,0,200,0,0,0,0
10,0,0,170,0,230,0,0,390
30,70,110,150,0,250,290,330,370
マスの画面上のy座標
120,100,100,120,0,120,100,100,120
160,0,0,160,0,160,0,0,160
200,0,0,0,200,0,0,0,200
240,0,0,240,0,240,0,0,240
280,300,300,280,0,280,300,300,300
このようなデータがある時、プレイヤー1がスペードのチャンスマスにワープしたとします。スペードのマスの内部座標は(4:1)ですので、「マスの画面上のx座標」、「マスの画面上のy座標」の(4:1)の部分を調べると「150」、「120」となります。そこで、プレイヤー1の画面座標を
(150,120)と設定すると、ちょうどスペードのマスの上に(画面上で)移動することになります。
画面をスクロールさせる、というような時は、どのくらいスクロールしたか、という情報を別に持たせ、読み込んだ座標を操作すれば良いでしょう。