「信長の野望 出陣」の遠征時間を探る

前回の記事に続いて、今度は「遠征」に要する時間を探ります。記事書くの疲れるのであっさりと。 schima.hatenablog.com

ℹ️注意

距離と時間の関係

横軸を遠征先までの距離(m)、縦軸を所要時間(秒)としたときのグラフが以下です。

信長の野望 出陣」遠征先の距離と所要時間

秒だとわかりにくいですが、以下の傾向が読み取れます。

  • 距離がほぼ0mでも最短2時間は要する
  • およそ11km、45kmで傾向が変わる
  • 11kmまでは急激に時間が増していく
  • 11km(15時間半)から45km(21時間半)まではゆるく線形に時間が増加
  • 45km以上では時間が増えない
    • 50km以上先にはおそらく遠征不可能

以上のデータは、私の探れる範囲で、遠征先ごとの距離と所要時間をたくさん集めたものです。石高よりはだいぶ集めやすいです。

遠征先選択画面  ©コーエーテクモゲームス

曲線・直線近似

ここからは、任意の距離から所要時間を求められるように、所要時間を決定する方程式を見出してみたいと思います。今回はPythonを書いていきます。

先に結論

遠征の所要時間(秒)を t 、遠征先までの距離(m)を d として、

  • 11km以下:  t(d) = 0.0005.36765222d^{1.96912686} + 7200
  • 11km~45km:  t(d) = 0.636141912d + 49145.5490
  • 45km以上:  t(d) \risingdotseq 77500

環境

Python 3.11.1

matplotlib==3.8.0
pandas==2.1.1
scikit-learn==1.3.1

11km以下

まず入力データを以下のようなTSVで用意します。(TSVなのは、スプレッドシートからコピペしたというだけの由来です。)

距離[m]    時間(秒換算)
1539    8256
1844    8668
2156    9179
2163    9190
2271    9382
2377    9589
...

曲線近似には、scipy.optimize.curve_fit を使いました。使い方は巷にたくさんあるので省略します。 docs.scipy.org

curve_fit の第1引数には、近似モデルとなる関数を指定します。たぶん2次式か何かの多項式ではなかろうかと、以下のような関数にしました。xには距離(m)が入ります。ほかのa, b, cの値を推測してもらいます。

def nonlinear_fit(x, a, b, c):
    return b*(x**a) + c

これを使っての曲線近似とグラフ描画です。決定係数も求めてみています。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
from sklearn.metrics import r2_score


def nonlinear_fit(x, a, b, c):
    return b*(x**a) + c


df = pd.read_csv("data1.tsv", sep="\t")

x = df["距離[m]"]
y = df["時間(秒換算)"]
p_opt, cov = curve_fit(nonlinear_fit, x, y)

y_fit = np.vectorize(nonlinear_fit)

fig, ax = plt.subplots()
ax.set_xlabel("distance[m]")
ax.set_ylabel("time[s]")
ax.plot(x, y, marker="o", label="input data")
ax.plot(x, y_fit(x, *p_opt), label="curve fitting")
ax.grid(axis="both")
ax.legend()
plt.savefig("fig1.png")

r2 = r2_score(y, y_fit(x, *p_opt))
print(f"{r2=}")  # r2=0.9996614210697053

きれいにフィットできました。

curve_fitによる11km以下の遠征時間推定

p_opt の要素として、推定したa b c の値が入っています。

print(p_opt)
[1.96912686e+00 5.36765222e-04 7.19442529e+03]

従ってこれを使えば、任意の距離について遠征時間をいつでも求められるようになりました。以下は5000mのときの所要時間を求める例で、約17510秒 (4時間51分50秒) と求まります。

from datetime import timedelta

sec = nonlinear_fit(5000, *p_opt)
td = timedelta(seconds=sec)
print(f"{sec=}, {str(td)=}")
sec=17510.7628634274, str(td)='4:51:50.762863'

11km~45km

11km以下のときと全く同様の手順を使えます。見た感じ明らかに直線なので、モデルは1次式にしました。

def linear_fit(x, a, b):
    return a*x + b

推定したa b の値はこうなりました。

[6.36141912e-01 4.91455490e+04]

距離が増えるにつれ、明らかにデータがガタガタしており誤差がどうしてもあります。ちなみに今回省略しますが45km以上だと、距離が増えるのに時間が減る例も観察されます。

11km~45kmでの所要時間の直線近似

今回はゲーム画面表示をそのままデータ採取しており、そんなに大きな誤差を考えづらいです。もしかすると、これまで距離のみによって所要時間が定まると仮定していましたが、第2、第3のファクターがあるのかもしれませんね。

「信長の野望 出陣」の石高を探る

ℹ️注意

遠征に関する記事はこちら:

schima.hatenablog.com

先に結論・成果物

石高算出式

対象エリアの面積[㎡]をAとして、石高Kは、

 \displaystyle
K = \frac{1}{30}A^{0.497}

※私が調査した範囲での石高・面積からの回帰分析による結果であり、誤差があろうかと思います。小数点以下は四捨五入したのが実際の値と推測します。

Streamlit

各エリアを地図上にプロットしました。石高・面積も見られます。手作業なので少ししかありませんが。

nobunaga-area-map.streamlit.app

背景

信長の野望 出陣」は、2023年8月31日にリリースされた位置情報ゲームです。

www.gamecity.ne.jp ​ 歴代作品同様に領地を広げるのが1つの目標ですが、攻め取るには実際に日本全国の町丁*1を基準に設置されている「拠点」を訪れる必要があります*2

ja.wikipedia.org

​ ​

今回のネタ

「エリアごとの石高はどのように決まっているのか?」

拠点ごとの領域(領地)を本記事では「エリア」と呼ぶことにします。プレイしていれば誰しも気付くはずですが、以下の特徴があります。

  • エリアごとに石高が定められていて、広いエリアほど石高が多い
  • 1つのエリアは、1つまたは複数の町丁で構成されている。
    • 最低でも1エリアあたり10石以上になるよう区分けされている模様。 ​

以下の画像の例では、左は「札幌市厚別区上野幌二条2丁目」と「同 上野幌二条3丁目」の2つを合わせて1エリアとなっています。右は「江別市江別太」が広大なため、単独で1エリアとなっているようです。

石高の少ない狭いエリア(左)と石高の多い広大なエリア(右) ©コーエーテクモゲームス

ここで上記の疑問が出てきました。エリアごとの石高はどのように決まっているのでしょうか?

環境・確認バージョン

streamlit==1.26.0
shapely==2.0.1
more-itertools==10.1.0
pydantic==2.3.0

*1:「東京都千代田区 "九段南4丁目"」のような、市区町村の下に置かれる行政区画を指します。

*2:遠征もできます。

続きを読む

札幌圏の車で行ける公園レビュー

背景

子供を車で公園に連れて行って遊ばせる、ということを最近ちょくちょくやっており、公園を調べまくった成果を書き残しておきます。

家のそばが幹線道路で歩かせにくいとか、小さな公園は大きな子が走り回っていて危ないといった事情です。

当ブログご無沙汰の間に子供が2人できました。コロナだったり雪深い冬だったりで、主に家の中で過ごすことが多かったものの、どうも発育がよろしくない気がします。春の訪れかつ育休ということで、無理にでも外に連れ出している次第です。

地図

Google Mapsのマイマップにまとめました。基本的に無料縛りです。

駐車場のある公園 - Google マイマップ

私の土地勘にプラスし、未踏の公園については衛星写真などで駐車場を判断しました。ですので間違いがあるかもしれません。過半数は行ったことがあると思います。正規の駐車場が無くても路駐で事足りてしまう場所はぶっちゃけあるかと思いますが、今回は外しました。

地図についてぼんやり感想

  • まんべんなく駐車場付き公園が設けられた手稲区の盤石ぶりが際立ちます。
  • 北区・東区も、地下鉄から遠いエリアは大規模公園が目白押し。やはり子育ては郊外が良いと今さら再認識しています。
  • 白石区が一番乏しい結果に。ただし大正義川下公園があります。意外と清田区もそんなにありません。大正義平岡公園。
    • 乏しいというのはあくまで、駐車場付きの公園についての話です。
  • 小樽は、Googleマップにはあるけど廃墟にしか見えない公園がちょいちょいあるような・・・。まとめ地図からは外しました。ちなみに小樽では朝里ダムが好きです。
  • さすが花の町恵庭、よく整備された印象です。老後に住みたいと20年来思っています。

私見・各区のおすすめ公園

定番・有名な公園はもちろん良いですがあえてできるだけ外して、それ以外で各区1つずつ選んでみます。

前提として、うちの子はまだやっと歩く程度でほぼ走らず、遊具もほぼ不要です。歩いて楽しければ充分です。

北区:新琴似グリーン公園

北区では百合が原公園屯田公園などがメジャーと思いますが、あえて外して選定です。

真ん中を野球場が占め、周りに遊歩道などがあるという、まあ「さもない」公園ですが、1周歩くのがちょうどよいサイズ感であること、遊歩道にそこまでほかの子供が多くなく落ち着いていること、といったところが個人的に好感触の公園です。

注意として、ここに限りませんが広い公園にはかなりの割合で野球場が用意されており、試合があると一気に駐車場が埋まります。収まりきらずに路駐天国になり果てている公園もしばしば(美香保公園とか特に!)。出くわしてしまうと大変です。

南側には牧場が隣り合っていて、住宅街にぽっかりと草原が広がっている風景もまた好きですね。

新琴似グリーン公園 (2022/5/12)

東区:丘珠空港緑地

marumi-plus.jp

モエレ沼公園さとらんどといったド定番をあえて外すと、ここですね。見渡す限りの草原で、広々とした感じは札幌一ではないかとおもいます。

丘珠空港の北西側と南東側にそれぞれあります。また、つどーむにも広場がありますから、空港の周りには公園だらけです。紛らわしいことに、「丘珠空港緑地」のすぐそばに「丘珠緑地」もあります。

広々としているというのは言い換えると木があまりないので、日陰が無く真夏は暑いです。

丘珠空港緑地[南東側] (2022/5/23)

白石区:川下公園

www.sapporo-park.or.jp

ど定番ですが、白石区はほぼここ一択なので仕方なし。

リラックスプラザ(屋内施設)が大正義で、特に雨の日遊ばせたいとなればうってつけです。プール・浴室・食堂もあります。外も充実しているのですが、ここにしかないリラックスプラザだけで大体満足してしまって帰ることが多いですね・・・。

白石区と言っても北のはずれにあり、厚別や大麻などからも狙いやすい立地です。ここを子育てでフル活用すると当て込んで家を決めるのもありかもというくらい評価しています。

駐車場はかなり多数用意されているので心配いらないと思います。

川下公園リラックスプラザ (2022/5/17)

厚別区:熊の沢公園

parkful.net

定番が厚別山本公園か百年記念塔かなと思いつつまた変わった候補を出します。

森と坂です。ぐるっと一周歩くことができます。遊具が無いせいか子供がほぼおらず、歩ければ充分なうちの子に合っています。高齢化が著しいと言われるもみじ台にあるということも、子供を見かけなかった一因かもしれません。近所の方に珍しそうに話しかけられました。

以下、あまりろくな写真を撮れていませんが・・・

熊の沢公園 (2022/5/21)

清田区:平岡樹芸センター

www.sapporo-park.or.jp

特殊公園(植物公園)でありほかのところと雰囲気は一線を画します。樹木や日本庭園・西洋(フランス風?)庭園を見られます。正直あまり子供向けではなく、中高年の人が多い印象です。だからこそ小さい子連れとしては落ち着いて過ごしやすいです。

春や紅葉の時期が特にきれいで、混み合います。その他の時期でも駐車場が結構埋まり気味なような気がしますね。南側の道路にたくさん路駐されているのを目にします。

見通しは前後以外には効かず、やや迷路にも似た場所ですので、子供とはぐれないように注意です。

平岡樹芸センター (2017/10/14)

豊平区:西岡公園

www.sapporo-park.or.jp

普通に有名どころですが、やっぱりここですね。水源池で有名です。池の周りをぐるっと歩けます。池を見ながら落ち着けます。

公園管理事務所があり自由に入れます。スルーされがちかもしれませんが、いくらか見るものがあるので立ち寄ってみましょう。

行こうと思えばかなり奥(池の南)まで歩けますが、下のようにやや幼子を連れていくには厳しい木道になるので、適当なところで引き返しましょう。

西岡公園 (2015/10/31)

南区:藻南公園

www.mit-ueki.com

まあ定番めな気がしますが。細長い公園で、川の両側にあります。行ったことがあっても意外と全部くまなく知っている人は少ないかもしれません。山の隣なせいか広い印象があまり無いのですが、野球場も遊具も原っぱも割と何でもあります。

私は下の写真に示す軟石ひろばがお気に入りです。細長い公園なので、それぞれの箇所の利用者があまり接しなくてのびのび過ごしやすいような印象です。

どうでもいい話ですが、軟石ひろばの向かいに最近できた納骨堂がとてもきれいそうに見え、今のところ最期に入ろうかと狙っています。

藻南公園 (2022/5/11)

西区:農試公園

noushi-park.jp

西区はどれを選ぶか一番迷いました。とはいえ、どれを選んでも定番になってしまうので、無難に農試公園にしましょう。

農試公園で目を引くのが交通コーナーで、本物の道路・信号・横断歩道などが再現されています。信号はちゃんと電気が付いていて、本物のように赤・青が切り替わります。もう少し大きくなったらここで交通ルールを学ばせるとよさそうですね(今のところは自転車の子に轢かれそうでやや歩かせにくい)。

また、トンカチ広場もここならではです。私も小さいころ何度も来て、木に釘を打ち付けてよくわからないガラクタを作り出したものです。

大都会琴似が近いからなのかわかりませんが、だいたいいつも人口密度が高めな気がします。西区の公園は割とどこも混んでますね。

農試公園 (2022/5/16)

手稲区:富丘西公園

parkful.net

森です。とにかく森です。好きで何度も来ています。夏でも涼しく過ごせます。

一部、西岡公園の奥のような木道エリアがあるので、小さい子には難しいかもしれません。また公園全体が相当な傾斜地なので、調子に乗って下ったあと最後に駐車場まで登る元気を残しておきましょう。

同じ森でも熊の沢公園と違い、いつ来てもそこそこ人とすれ違います。

富丘西公園 (2022/5/26)

中央区:札幌市水道記念館

www.swsa.jp

公園じゃないだろうと言われそうですが、広場・屋外展示があり駐車無料ですので中央区ではありがたい存在です。大正義旭山記念公園をあえて外して紹介します。

改修され、私の小さいころとは全然違う新しい施設になりました。高い場所にあるので、施設入口よりも上まで階段を登れば街並みが眺めよく見られます。外にも随所に巨大な水道管などがゴロゴロ飾ってあります。

下の写真のように広場はあるのですが、私が何度か来ている限りではあまりここを歩く人をみたことがありません。ここが公園っぽいので公園枠として紹介しました。

札幌市水道記念館 (2022/4/27)

鼻パッドがない眼鏡「NEOJIN」のレビュー

2年ぶりの更新。どうにか生きています。技術ネタは最近Zennに書きがちなので、ここはそれ以外のことで使っていくかもしれません。

いろいろあって、1か月ほど前に特殊な眼鏡 NEOJIN に新調しました。それほどネットに情報がなかったこともあり、感想や注意点を書き残そうかと思います。結論から言うと良い買い物でした。

続きを読む

.NET Core 3と2以下の混在下でWPF/WinFormを有効にする

また何年振りかという更新です。

課題

.NET Core 3.0から、WPFWindows Formsがサポートされました。WPFを使う場合のcsprojファイルの基本形は以下です。 (<UseWPF><UseWindowsForms> と置き換えればWindows Forms向けになります。)

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>

本記事は、ここで何らかの理由で TargetFrameworksnetcoreapp3.1 以外を入れたくなった場合の話です。

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFrameworks>netcoreapp3.1;netcoreapp2.1</TargetFrameworks>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>

netcoreapp2.1ではWPFは使えません。警告が出るだけなので無視を決め込んでも良いかもしれませんが、何とかしてみましょう。あくまでこういうことができるという話として。

続きを読む