最終更新日 2024-09-25

城 - 城の位置、城Aから城Bへの方向

城の位置

城のグリッド位置

城は、いずれかのグリッドの中に入っています。
上下・斜めに隣接したグリッドに位置する城は、戦争で攻めることが出来る「隣接城」です。

とある城の周辺城を求める

城グリッド位置型
void カスタム::On_プレイヤ担当ターン《メイン画面》() {

	int iCastleID_A = 城配列番号::観音寺城;
	城グリッド位置型 位置a = Get_城グリッド位置(iCastleID_A);

	デバッグ出力("観音寺:(X,Y):(%d,%d)", 位置a.X, 位置a.Y);

	int iCastleID_B = 城配列番号::二条城;
	城グリッド位置型 位置b = Get_城グリッド位置(iCastleID_B);

	デバッグ出力("二条城:(X,Y):(%d,%d)", 位置b.X, 位置b.Y);

	番号リスト型 城番号リスト = {
		位置b.北西【城番号】,
		位置b.北【城番号】,
		位置b.北東【城番号】,
		位置b.西【城番号】,
		位置b.東【城番号】,
		位置b.南西【城番号】,
		位置b.南【城番号】,
		位置b.南東【城番号】,
	};

	デバッグ出力 << "二条城の周辺の城は..." << endl;
	for (int 城番号 : 城番号リスト) {
		int iCastleID = 城番号 - 1; // 城番号→城番号【配列用】

		if (0 <= iCastleID && iCastleID < 最大数::城情報::配列数) {
			デバッグ出力 << Get_城名(iCastleID) << Get_城称(iCastleID) << endl;
		}
	}
}

とある城が隣接しているかどうかの判定

bool Is_隣接城(int 城A番号【配列用】, int 城B番号【配列用】);

斜めの隣接も含まれます。どちらかの城で戦争が起きれば、互いに戦争に巻き込まれる城か、と考えればよいでしょう。
街道でつながっているかどうかは考慮されません。

void カスタム::On_プレイヤ担当ターン《メイン画面》() {
	int iCastleID_A = 城配列番号::二条城;
	int iCastleID_B = 城配列番号::観音寺城;

	if (Is_隣接城(iCastleID_A, iCastleID_B)) {
		デバッグ出力 << "2つの城は隣接している" << endl;
	}
	else {
		デバッグ出力 << "2つの城は隣接していない" << endl;
	}
}

城グリッド位置型にも対応

bool Is_隣接城(城グリッド位置型 &位置1, 城グリッド位置型 &位置2);
void カスタム::On_プレイヤ担当ターン《メイン画面》() {
	int iCastleID_A = 城配列番号::二条城;
	int iCastleID_B = 城配列番号::観音寺城;

	城グリッド位置型 APOS = Get_城グリッド位置(iCastleID_A);
	城グリッド位置型 BPOS = Get_城グリッド位置(iCastleID_B);

	if (Is_隣接城(APOS, BPOS)) {
		デバッグ出力 << "2つの城は隣接している" << endl;
	}
	else {
		デバッグ出力 << "2つの城は隣接していない" << endl;
	}
}

城A → 城Bのグリッドベースでの方向ベクトルを得る

城グリッドベクトル型
2Dベクトル型
void カスタム::On_プレイヤ担当ターン《メイン画面》() {

	int iCastleID_A = 城配列番号::観音寺城;
	城グリッド位置型 位置a = Get_城グリッド位置(iCastleID_A);

	デバッグ出力("観音寺:(X,Y):(%d,%d)", 位置a.X, 位置a.Y);

	int iCastleID_B = 城配列番号::二条城;
	城グリッド位置型 位置b = Get_城グリッド位置(iCastleID_B);

	デバッグ出力("二条城:(X,Y):(%d,%d)", 位置b.X, 位置b.Y);

	// 観音寺城 → 二条城 方向へのベクトル
	城グリッドベクトル型 my方向;
	my方向 = 位置b - 位置a;

	デバッグ出力("観音寺⇒二条城は (Vx,Vy):(%d,%d)の方向にある。", my方向.X, my方向.Y);

	2Dベクトル型 v(my方向.X, my方向.Y);
	string 方向文字列 = Get_8方位文字列(v);

	デバッグ出力 << "それは日本語でいうところの" << 方向文字列 << "である" << endl;
}
観音寺:(X,Y):(14,7)
二条城:(X,Y):(13,7)
観音寺⇒二条城は (Vx,Vy):(-1,0)の方向にある。
それは日本語でいうところの西である
    

メイン画面での城アイコンの移動

void Set_城位置(int 城番号【配列用】, int X位置, int Y位置)
通常この関数を使うことはない通常、「城」のアイコンを移動させても無意味であるため、この関数を利用することはないが、
戦場グリッドマップ や、HD版風の全国マップ のようなModを制作する際には、
この城を微小に移動させて背景とうまく合わせる、といった作業が必要となります。
void カスタム::On_プレイヤ担当ターン《メイン画面》() {

	int iCastleID = 城配列番号::二条城;

	// 二条城は元々 (X:66, Y:21にある)
	// 
	// X位置を右に4移動
	Set_城位置(iCastleID, 68, 21);

	画面更新();
}

「同じ城グリッド内」で移動すること。グリッドをはみ出すと、城をクリックしても反応しなくなってしまう。

より詳細を知るには...

「城 - 城の位置、城Aから城Bへの方向」に関する主な所は以上となります。 詳しくは「城情報型.h」や「城情報列挙.h」などを参照してください。