武将 - 2人の武将の関係2人の武将(姫を含む)の関係を判定することはよくあることです。 そういったことは、もちろん2人の武将の「p武将情報」や「p武将戸籍情報」の中身を比較していけば判定できますが、 2人の武将の相性を判定する相性差は円環状のリング各武将には「0~15」の相性値が用意されています。 値が一致する時、相性は最高で、相性差は0、一番遠いとき(例えば、2と10)は相性が最悪で相性差は8となります。 メモリエディタ上での位置メモリエディタ上で言えば、p武将情報の相性という列です。 int Get_武将相性差(int 武将A番号【配列用】, int 武将B番号【配列用】)
対象の2人の武将の相性の違いを得る。最小0(相性最高) 最大8(相性最悪) void カスタム::On_プレイヤ担当ターン《メイン画面》() { int i謙信BushouID = Get_武将番号【配列用】(顔番号::長尾景虎); int i信玄BushouID = Get_武将番号【配列用】(顔番号::武田晴信); if (0 <= i謙信BushouID && i謙信BushouID < 最大数::武将情報::配列数) { if (0 <= i信玄BushouID && i信玄BushouID < 最大数::武将情報::配列数) { // 謙信と信玄の相性差を得る int 二人の相性の差 = Get_武将相性差(i謙信BushouID, i信玄BushouID); デバッグ出力 << "二人の相性の差:" << 二人の相性の差 << endl; } } } int Get_相性差(int 相性値A, int 相性値B) 単純に2つの相性の値同士の差を計算する関数も提供している。 int sa = Get_相性差(2, 11); // 相性差は7。(9ではない) // 相性は円環状。下図で「2」の位置から「最短でいくつ動けば」「11」に到達するのか? それが相性差) 1年に一度、春に、仕えている大名の相性値へと1つ近づくという、やや複雑な例void カスタム::On_相場変更直前() { // 1年に一度、春に、仕えている大名の相性値へと1つ近づく処理 if (p年情報.季節 == 季節::春) { for (int iBushouID = 0; iBushouID < 最大数::武将情報::配列数; iBushouID++) { // 相性が問題となる、現役や軍団長ならば... if (p武将戸籍情報[iBushouID].状態 == 状態::現役 || p武将戸籍情報[iBushouID].状態 == 状態::軍団長) { // 自分自身の大名を得る int iDaimyoID = p武将情報[iBushouID].所属大名【大名番号】 - 1; if (0 <= iDaimyoID && iDaimyoID < 最大数::大名情報::配列数) { int 大名のBushouID = p大名情報[iDaimyoID].大名【武将番号】 - 1; if (0 <= 大名のBushouID && 大名のBushouID < 最大数::武将情報::配列数) { int 大名の相性値 = p武将情報[大名のBushouID].相性; int 自分の相性値 = p武将情報[iBushouID].相性; if (大名の相性値 != 自分の相性値) { // プラスとマイナス、どちらかに1つ動かして、大名との相性に近づくほうへと移動する // 0~15の循環になっているのだから、「16で割った余り」とすることで常に循環に出来る int 相性値↑ = (自分の相性値 + 1) % 16; int 相性値↓ = (自分の相性値 - 1) % 16; // 相性値に+1 してみた場合と、相性値に-1してみた場合の相性差の変化を探る int 相性値↑の場合の差 = Get_相性差(大名の相性値, 相性値↑); int 相性値↓の場合の差 = Get_相性差(大名の相性値, 相性値↓); // +1した場合、と-1した場合で、+1した方が大名と相性が良くなるなら if (相性値↑の場合の差 < 相性値↓の場合の差) { p武将情報[iBushouID].相性 = 相性値↑; } else { p武将情報[iBushouID].相性 = 相性値↓; } } } } } } } } 2人が血縁かを判定する例えば、2人が血縁かを判定してみましょう。 void カスタム::On_プレイヤ担当ターン《メイン画面》() { int i信長BushouID = Get_武将番号【配列用】(顔番号::織田信長); int i五徳BushouID = Get_武将番号【配列用】(顔番号::織田五徳); if (0 <= i信長BushouID && i信長BushouID < 最大数::武将情報::配列数) { if (0 <= i五徳BushouID && i五徳BushouID < 最大数::武将情報::配列数) { if (Is_自分は相手の血縁(i信長BushouID, i五徳BushouID)) { デバッグ出力 << "二人は血縁です。" << endl; } else { デバッグ出力 << "二人は血縁ではありません。" << endl; } } } } 2人が兄弟か、夫婦か、同じ大名傘下か、などを判定するこれ以外にも、特別な関係を判定する様々な関数が用意されています。 // 以下は「A武将」と「B武将」との「特別な人間関係の真偽を簡単に判定」するための関数となる。 bool Is_自分は相手の娘( int 自分武将番号【配列用】, int 相手武将番号【配列用】 ); bool Is_自分は相手の息子(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の子(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の親(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の父(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_相手は自分の父(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の母(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_相手は自分の母(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の弟(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_相手は自分の弟(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の妹(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_相手は自分の妹(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の兄(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_相手は自分の兄(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の姉(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_相手は自分の姉(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分と相手は兄弟( int 自分武将番号【配列用】, int 相手武将番号【配列用】 ); bool Is_自分と相手は姉妹( int 自分武将番号【配列用】, int 相手武将番号【配列用】 ); bool Is_自分と相手は姉弟( int 自分武将番号【配列用】, int 相手武将番号【配列用】 ); bool Is_自分と相手は兄妹( int 自分武将番号【配列用】, int 相手武将番号【配列用】 ); bool Is_自分は相手の夫(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の妻(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分は相手の血縁(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_相手は自分の家臣( int 自分武将番号【配列用】, int 相手武将番号【配列用】 ); bool Is_相手は自分の大名(int 自分武将番号【配列用】, int 相手武将番号【配列用】); bool Is_自分と相手は同じ大名家所属( int 自分武将番号【配列用】, int 相手武将番号【配列用】 ); より詳細を知るには...
「武将 - 2人の武将の関係」に関する主な所は以上となります。 |