この夢から出られない

「知らん人の書いてるよくわからないブログ」を目指します

10/29『田中美海の高知ロケに山崎エリイがついてきちゃいました』DLカード発売記念イベント

オタクっぽい人についていったら無事イベント会場に着けた。

イベントに行くのが3か月ぶりとかだし、懐かしい感覚だ。

番組イベントというと2年ちょっと前まで遡るんじゃないのかな……?

 

コナンミリしらエリイちゃんが面白かった。元太と光彦は特徴でしか話せないのに、あゆみちゃんはすっと出てくるのか......。ジャイアンスネ夫ではない。

 

桂浜水族館の話が良かった。食えない顔した入口のペンギンなど。ウツボが司会に入った瞬間に「見ちゃだめなモノ」判定するの賢い。ウツボの揚げ物食べてアレがあんなに!?となっているのも良い。オフショット、ガンガン使ってくれ。うわめっちゃ木せり出してる。

 

坂本竜馬記念館はスタンプラリーのスタンプが一箇所に集約されているらしい。イライラしなくてすごい。

 

エリイちゃんの俠気メロン事件すごいな。みにゃみと仲が良すぎる。

 

東京の空気は濁ってる。

マネージャーさんに言われて公園にあるどうぶつのアレに乗ったのに、即座に「次メイクあるから行かないと」と言われて怒った話。そこからマネージャーKさんとの戦いの様子が一部明かされた。

最近はエリイちゃんが良く言い返しているとのことだが、そもそも昔からマネージャーさんはその態度なのか……。

山崎エリイでし"た"」で最後の挨拶が一瞬で終わってしまいそうになった話など。

 

メール読まれた衝撃で割と記憶が混乱した。前日の深夜に書いた甲斐がありましたね。

普段の番組とかはそもそも放送日をチェックしておらずに当日になっていたり。

あと、普段使っているメールは高校だか大学のころから使ってて、アドレスがスパムっぽいから迷惑メール扱いされている説ある。

今度からは就活用につくって放置してたアドレスから送るか。

 

一応行くイベントでメール募集していたりすると1通は送っておくようにしているんだけど、かなり読まれる可能性が高い記憶。名前呼ばれたときは汗ぶわぶわですよ。

 

まとめ

2人は本当に仲が良いんだな~と再確認。番組も面白かったので、続編希望。

HTML5プロフェッショナル認定試験 レベル2 合格したという話

今日朝にテストセンターで受験してきたのだが、合格点ジャストで合格していた。*1ギリギリセーフ。

 

なんか仕事で急に休日に駆り出されたり、そもそも普段の仕事もなかなか状況が良くないので十分勉強時間確保できていない中受かったのは良いことでしょう。

テストセンター形式は即座に結果がわかるし、時間も柔軟に選べるしいいこと尽くめだ。

 

資格としてどうなのか?

有用だと思う。

勉強している内容は中級者への入り口といったところ。入門書とかだとWeb StorageとかWeb Workerまではやらないんじゃないかな?*2

存在を知らなかったAPIについて知れたのは良い点。

 

自分はフロントエンドの人間ではないのだが、このご時世Webシステムが多い=HTMLやJavaScriptを使うことも多いということで受験した。フロントだけ専用のコーダーがいますよ、なんて会社じゃないので。

フロント側について勉強する機会としてちょうどよかった。

 

勉強

そんなにやっていないかも。真面目に勉強したのは1か月ちょっとか?

下記の本を買ったのは6月ぐらいだった気がするが、読むのにしばらくかかっていたし。範囲の一覧として役には立つが、この本の内容で理解するのは難しい。合格も困難だと思う。

HTML5プロフェッショナル認定試験 レベル2 対策テキスト&問題集 Ver.2.5対応版 | 右寺 隆信, 立川 敬行, 石井 博幸 |本 | 通販 | Amazon

 

9月に入ってからはPolaristationという下記サイトで勉強していた。レベル1の時にも使っていたし、30日コースが値段的に良かったので。

https://app.polaristation.com/

ちなみにレベル1のときはサービス開始直後だったせいでたまに回答が誤ったりしていた。逐一指摘していたせいかご協力いただいたみなさまっていうページの先頭に名前が載っていたりする。自慢。

レベル2はそんなことなかったので、質は向上している。量も分野別に20~40問と結構あるのでおすすめ。

 

次はどうするか

しばらく休憩というか、仕事も忙しいので資格勉強なんてやる気にならないな。落ち着いたら挫折したネットワークスペシャリストにもう一度挑戦するか、微妙な点数で終わったTOEICを再度受けてみるとか……?

今仕事で使っているフレームワークの知識もなんか中途半端だし、ちゃんと勉強するべきと思い始めている。

 

*1:一応合格点は非公開なので、伏せておく

*2:巷間にはたくさん入門書があふれているので、そこまでやっていたらすみません

HTML5プロフェッショナル認定試験 レベル2 あやふや点メモ③

来週末に受験するが、受かるのかどうか。

 

LocalStorage/SessionStorage

セッションストレージとローカルストレージがある

セッションストレージはタブやブラウザを閉じた時点で削除される。ローカルストレージはブラウザを閉じたとしても半永久的に残る。

どちらもKeyとValueの組み合わせで保存する。わりと簡単だ。

LocalStorageへの保存

localStorage.setItem('text', 'テスト用テキスト');

LocalStorageからの取りだし

const text = localStorage.getItem('text');

LocalStorageからの削除

localStorage.removeItem('text');

 

indexedDB

イマイチ例がないとよくわかんなかったので、気が付いたらいろいろ頑張って画面を作っていた。理解はできた気がする。

ただ、htmlのコードをブログに載せるのが難しいのでJavaScriptのみ。

indexedDBは非同期処理だから注意とよく見るし、実際に現在のバージョン取得→当該バージョンのDBをopenって単純にしようとするとエラーになる。

じゃあどう回避するんだ?というのはわからず。

js

const newopen = document.getElementById('newopen');
const createObjectStore = document.getElementById('createObjectStore');
const openAndDataAdd = document.getElementById('openAndDataAdd');
const openAndDataPut = document.getElementById('openAndDataPut');
const getItem = document.getElementById('getItem');

newopen.addEventListener('click', ()=> {
  const dbName = document.getElementById('dbName').value;
  const storeName  = document.getElementById('storeName').value;

  const openReq  = indexedDB.open(dbName);
  const result = document.getElementById('returnText');

  // DB名を指定して接続。DBがなければ新規作成される。
    openReq.onupgradeneeded = function(event){
    //onupgradeneededは、DBのバージョン更新(DBの新規作成も含む)時のみ実行
      console.log('db upgrade');
    }
    openReq.onsuccess = function(event){
    //onupgradeneededの後に実行。更新がない場合はこれだけ実行
      console.log('db open success');
      result.innerText = "db open success";
      const db = event.target.result;
      // 接続を解除する
      db.close();
    }
    openReq.onerror = function(event){
    // 接続に失敗
      console.log('db open error');
    }

});

createObjectStore.addEventListener('click', ()=> {
  const dbName = document.getElementById('dbName').value;
  const storeName  = document.getElementById('storeName').value;

  const openReq = indexedDB.open(dbName,10);
  // オブジェクトストアの作成・削除はDBの更新時しかできないので、バージョンを指定して更新
    openReq.onupgradeneeded = function(event){
      const db = event.target.result;
      db.createObjectStore(storeName, {keyPath : 'id'})
      console.log('createObjectStore success');
      const result = document.getElementById('returnText');
      result.innerText = "createObjectStore success";
    }
});

openAndDataAdd.addEventListener('click', ()=> {
  const dbName = document.getElementById('dbName').value;
  const storeName  = document.getElementById('storeName').value;
  const result = document.getElementById('returnText');
  const data = {id : document.getElementById('Key').value, name : document.getElementById('Value').value};
  const openReq = indexedDB.open(dbName, 10);
  
  openReq.onsuccess = function(event){
      const db = event.target.result;
      const trans = db.transaction(storeName, 'readwrite');
      const store = trans.objectStore(storeName);
      const putReq1 = store.add(data);
  
      putReq1.onsuccess = function(){
        console.log('add data success');
        result.innerText = "add data success";
      }

      trans.oncomplete = function(){
      // トランザクション完了時(putReq.onsuccessの後)に実行
        console.log('transaction complete');
      }
  
   }
  
});

createObjectStore.addEventListener('click', ()=> {
  const dbName = document.getElementById('dbName').value;
  const storeName  = document.getElementById('storeName').value;

  const openReq = indexedDB.open(dbName,10);
  // オブジェクトストアの作成・削除はDBの更新時しかできないので、バージョンを指定して更新
    openReq.onupgradeneeded = function(event){
      const db = event.target.result;
      db.createObjectStore(storeName, {keyPath : 'id'})
      console.log('createObjectStore success');
      const result = document.getElementById('returnText');
      result.innerText = "createObjectStore success";
    }
});

openAndDataPut.addEventListener('click', ()=> {
  const dbName = document.getElementById('dbName').value;
  const storeName  = document.getElementById('storeName').value;
  const result = document.getElementById('returnText');
  const data = {id : document.getElementById('Key').value, name : document.getElementById('Value').value};
  const openReq = indexedDB.open(dbName, 10);
  
  openReq.onsuccess = function(event){
      const db = event.target.result;
      const trans = db.transaction(storeName, 'readwrite');
      const store = trans.objectStore(storeName);
      const putReq1 = store.put(data);
  
      putReq1.onsuccess = function(){
        console.log('put data success');
        result.innerText = "put data success";
      }

      trans.oncomplete = function(){
      // トランザクション完了時(putReq.onsuccessの後)に実行
        console.log('transaction complete');
      }
  
   }
  
});

// 値の取得
getItem.addEventListener('click', ()=> {
  const tableElement = document.getElementById('getItemList');
  const dbName = document.getElementById('dbName').value;
  const storeName  = document.getElementById('storeName').value;
  const openReq = indexedDB.open(dbName, 10);
  
  openReq.onsuccess = function(event){
      const db = event.target.result;
      const trans = db.transaction(storeName);
      const store = trans.objectStore(storeName);
      const getCursor = store.openCursor();
      
      getCursor.onsuccess = function(event){
        const cursor = event.target.result;
        //ここから取得
        if(cursor){
          console.log(`Key:${cursor.key}`);
          console.log(`Value:${cursor.value.name}`);
          // tbody要素にtr要素(行)を最後に追加
          const trElement = tableElement.tBodies[0].insertRow(-1);
          // td要素を追加
          const cellElement0 = trElement.insertCell(0);
          cellElement0.appendChild(document.createTextNode(cursor.key));
          const cellElement1 = trElement.insertCell(0);
          cellElement1.appendChild(document.createTextNode(cursor.value.name));

          // const output = document.getElementById(cursor.key);
          // output.innerHTML = `Key:${cursor.key}, Value:${cursor.value.name}`;
         cursor.continue();
        }
       } 

      trans.oncomplete = function(){
      // トランザクション完了時(putReq.onsuccessの後)に実行
        console.log('transaction complete');
      }
   }
  
});

独ソ電撃戦

人とウォーゲームをやるのは久しぶりだった。ソ連でプレイ。

独ソ電撃戦自体はサークルでやって以来なので8年ぶりだと思われる。新版を買ったのは何年も前だったはずだが……。

開始時

7ターン目終了時。ドイツ投了。

久しぶりすぎてプレイが拙かったが、終盤まで予備部隊を確保しながら戦線を引き続けられたので満足。戦線を引き続けられるなら反撃は不要の精神で、一度も自分から攻撃は行わなかった。戦線を引く際、予備部隊をどこに配置するかが難しい。

反省点として南端を放棄するのが遅かった。南部はドイツが歩兵ばっかりになっていたので、早々に放棄しても地形が悪すぎて包囲とかはされなかったはず。

また、ミンスクに初期配置した奴らは歩兵でもちゃんと動かすべきだった。どうせドイツ軍がミンスクに迫るのはソ連の増援が来た後だ。それより早く来るならもう負けてる。

コマンドマガジンのなんかの号で、初期セットアップはこうしろみたいなのがあったが全て忘れたね。自分で模索していくのが本来の楽しみなはずなので、それでよいのだが。

 

今度はドイツ側もやりたいな。いつになるかわからないが。

HTML5プロフェッショナル認定試験 レベル2 あやふや点メモ②

html編集で<pre><code></code></pre>つかう→みたまま編集です~ぐコードが崩れるのでキレてます、今。


非同期処理

正直に言ってよくわかってない部分。参考書とか他の人の解説見ても難しい。非同期処理でなんかやるっていうのはサンプルでの数行のコードでは必要性が説明しきれず、実務とかでたくさんAPI呼びたいとかそのあたりで必要になるんだろな。

 

.thenと.catchで続ける場合


const promiseSample = () = return new Promise((resolve, reject) => {
        // APIの呼び出しなど 
        if (//呼び出し後の結果個数  0) {
            //(1)
            resolve("呼び出し完了");
        } else {
            //(2)
            reject(new Error("呼び出し失敗"));
        }
    });
}
promiseSample().then(value => { // (3) .thenでresolveが呼ばれた場合の処理 console.log(value); }).catch(error => { // (4) .catchでrejectが呼ばれた場合の処理 console.error(error); }); // ちなみに、.thenはいくらでもつなげられる promiseSample().then(value => { // 処理1 }).then(value => { // 処理2 }).then(value => { // 処理3 })

asyncとawaitを使う場合


async function sample() {
  let result = await new Promise ((resolve, reject) => {
    setTimeout(() => {
      resolve("成功");
    }, 5000);
  });
  return result;
};

sample().then(value => {
  console.log(value);
})

アロー関数

ややこしいが、いかにも問題で出そうな箇所。自分で書いてみるとなんとなくパターンもつかめてきた。

思ったより省略できないんだよな。


// そのまま
let func1 = function (a){
  return a + 100;
}
console.log(func1(10));

// functionを取り払い、パラメーターと処理の間を =>で連結
let func2 = (a) => {
  return a + 100;
}
console.log(func2(10));

// 処理が1文だけの場合、{},returnが不要
let func3 = (a) => a + 100;
console.log(func3(10));

// 引数が1つだけの場合のみ、かっこも取り外せる
let func4 = a => a + 100;
console.log(func4(10));

// ただし、引数がない場合は()がないとエラーになる
let func5 = () => "No Parameter";
console.log(func5());

// 引数を2つ以上取る場合も()が要る
let func6 = (a,b) => a + b +100;
console.log(func6(10,20));

// 処理が2文以上ある場合は{},returnが必要
let func7 = (a,b) => {
 console.log(`引数a:${a},引数b:${b}`);
 return a + b +100;
}
console.log(func7(10,20));

// 以下はErrorということだ
let err1 =  => "No Parameter";
console.log(err1());

let err2 = a,b => a + b +100;

let err3 = (a,b) => console.log(`引数a:${a},引数b:${b}`); a + b +100;

    

 

HTML5プロフェッショナル認定試験 レベル2 あやふや点メモ①

問題やっていても覚えられない気がしたので。②があるかは不明。

プリミティブ型とオブジェクト


      let str1 = "10";
      let str2 = new String("10");
      console.log(typeof str1);
      console.log(typeof str2);
  

結果1:string 結果2:object new Stringするとオブジェクト型になる。

String.substring(a,b)


      let origin = "あいうえお";
      let substring = origin.substring(2,4);
      console.log(substring);  
      

結果:うえ 第二パラメーターに指定された番地の文字は含まない。

等価演算子


      let a = "10";
      let b = new String("10");
      console.log(a == b);
  

結果:true リテラルとオブジェクトを比較する場合、オブジェクトはリテラルに変換されて比較。


      let a = new String("10")
      let b = new String("10");
      console.log(a == b);
  

結果:false オブジェクトの比較は、参照先があっているかを判定する。


      let a = "10";
      let b = 10;
      console.log(a == b);
  

結果:true 暗黙の型変換が実施される。

正規表現

※RexExpが試験範囲なので出るらしい。マジ?


      // String.matchを使う場合。チェック対象.match(パターン)
      let pattern = /^\d{3}-?\d{4}$/g;
      let checkTarget = "151-9088"; // ※郵便番号は適当だが、形式よし
      let checkResult = checkTarget.match(pattern);
      console.log(checkResult);// チェックOKであった場合、値がcheckResultに代入されている。"['151-9088']"
  

      // RexExpを使う場合 .exec→文字列内で一致するものの検索を実行します。結果情報の配列を返します。一致するものがなければ null を返します。
      let pattern = new RegExp(/^\d{3}-?\d{4}$/g); // ※""で囲まない。
      let checkTarget = "151-9088"; 
      let checkResult = pattern.exec(checkTarget);
      console.log(checkResult);// チェックOKであった場合、オブジェクトが返される。['151-9088', index: 0, input: '151-9088', groups: undefined]
      

      // RexExpを使う場合 .test→文字列内で一致するものがあるか検査します。 true または false を返します。
      let pattern = new RegExp(/^\d{3}-?\d{4}$/g);
      let checkTarget = "151-9088"; // ※郵便番号は適当だが、形式よし
      let checkResult = pattern.test(checkTarget);
      console.log(checkResult);// 当てはまっていればtrue そうでなければfalse
      

関数に引き渡された値

配列などのオブジェクト→参照先が渡される


      var hairetsu = [100, 200, 300, 400]; // 配列はオブジェクト型=参照先が渡される。
      console.log(hairetsu);
      function pushResult(val) {
          val.push(500); // ここで配列の中身が追加される。
	      return val; 
      }
      console.log(pushResult(hairetsu)); // 追加済みの値を出力
      console.log(hairetsu);             // すでに値は変わっているので追加済の値が出力
      

結果1:[100, 200, 300, 400] 結果2:[100, 200, 300, 400, 500] 結果3:[100, 200, 300, 400, 500]

<要確認>文字→基本型だから値渡し……ではないらしい。?。


      let moji = "あいうえお"; 
      console.log(moji);
      function pushResult(val) {
          moji += "かきくけこ"; 
	      return moji; 
      }
      console.log(pushResult(moji)); 
      console.log(moji);             
      

結果1:あいうえお 結果2:あいうえおかきくけこ 結果3:あいうえおかきくけこ

 

with文

・ナニコレ?と思ったらそもそも非推奨。そりゃ実務で見ないわけだ。

with - JavaScript | MDN (mozilla.org)

・strictモードでは利用不可。


    with ([200])
      console.log(toString());

Math小数点操作


    console.log(Math.round(3.5)); // 四捨五入 4
    console.log(Math.ceil(3.1));  // 切り上げ 4
    console.log(Math.floor(3.5)); // 切り捨て 3

信长包围网-谦信上洛 シナリオ「天下布武」

はじめに断っておくと、全10ターンあるうちの4ターン目で投了している。

 

↓謙信上洛そのものについて

wuhujiang.hatenablog.com

 

↓中国語版謙信上洛について

wuhujiang.hatenablog.com

 

↓やる前の考察

wuhujiang.hatenablog.com

 

初期配置はこんな感じ。

東海方面。勝頼は謙信上洛シナリオより兵力が増えている。なぜ?

毛利は織田軍が特定の城を取ったり特定の線より西に進出すると段階的に出陣。

春日山城の1へクス北東に御館登場。景虎についた部隊が立てこもる。


第1ターン

開始フェイズと反織田の行動をすっ飛ばし、織田の移動からスタート。

 

織田、徳川が前進。

初期配置が近江の織田軍内訳

・信長→東海へ。信長は戦闘力*1がやや低めなので、同じ総大将の家康と組ませる作戦。

・丹羽→北陸へ。大兵力を持たせて上杉を倒す算段。

・滝川、信雄→対本願寺へ。本願寺相手がいつも手薄なので、今回は手厚くしたつもり。

 

リアクションフェイズで景勝が行動力チェックに成功すればいきなり御館で戦いが始まるところだったが失敗。他リアクション、強行軍で概ね前進。

 

秀吉は包囲を竹中に任せて三木城から離れ丹波方面へ。毛利は初期配置だと小早川隆景しかおらず、圧力が少ないため。三木城は包囲しておくことに。やっぱり7VP*2を確実に取っておきたい。

掛川高天神城をいつも通り包囲。

丹波包囲もいつも通り

北陸はいつもと様子が違う。上杉は対景虎に兵力を割く必要あり。柴田が加賀一向一揆を包囲。

今見返して写真へたくそだなとなっています。

VP0

 

第2ターン

開始フェイズ

落城 遠江掛川城(+2vp)

 

反織田方移動

御館に交戦マーカーを配置。また、がら空きの姫路城を小早川隆景で包囲。

越中能登にいた上杉軍は魚津城に集結し、柴田の進出を食い止めつつ景勝を待つ。

 

このターンは両軍ともリアクション、強行軍ことごとくうまくいかない。進めない分織田のダメージがデカい。

 

反織田方戦闘

上杉景勝軍(4-4/24戦力)VS上杉景虎軍(3-3/14戦力/砦)in御館

景勝3損害/景虎5損害で景勝の勝ち。景虎は城内に籠城。

戦力差があったことを思えば、景虎が損害を与えつつ1ユニットも失わずに籠もれたのは予定通りと言える。包囲の成立には防御側ユニット数を超えるユニットが必要なため。上杉は補充がそこまで潤沢でない。*3

 

織田方移動

東海では信長が浜松まで前進。家康は派手な動きもできず勝頼とにらみ合い。

信忠は信濃に侵入し妻籠城を包囲。

丹羽は加賀へ到着。

丹波はすべての城が包囲状態へ。

近畿方面は本願寺から離れた場所に布陣。本願寺は囲んでいても意味がない*4上、荒木謀反の場合京都を突かれる恐れがあるため。

織田方戦闘

なし

東海に信長襲来。やたら足が速いのが本システムの特徴

雑賀衆海上にいるが、本来なら水軍はリアクションフェイズ、強行軍フェイズでチェックなしに移動できることを忘れている。次のターンそれに気が付いて雑賀衆を上陸させている。

御館を包囲できたが、見た目上は大きな進展なし。織田軍は続々加賀へ進出。

2VP

 

3ターン

開始フェイズ

落城 遠江高天神城(2VP) 信濃妻籠城(1VP)、加賀小松城2VP、丹波綾部城(1VP)、播磨三木城(7VP 城3VP+籠城部隊4VP)

 

想定よりだいぶ早い三木城の陥落。自動的に荒木謀反と吉川元春出陣が発生する。

チェックの結果、謀反したのは荒木のみ。高山中川は織田に踏みとどまる。有岡城と花隈城が反織田方に。荒木自身のVPも合わせて-7VP*5

三木城落とした分のVPが失われた上、吉川まで出陣してくる。意味あったか?

 

反織田方移動

出陣した吉川は海路で大坂へ。本願寺、荒木、雑賀連合軍は吉川を待たずに茨木城を包囲する。近畿は反織田の優勢だ。

景勝は御館包囲部隊を残して越中へ。8ユニットも残したので景勝直卒の戦力が心許ない。

 

反織田方戦闘

なし。本願寺からの軍は本当は戦力が減った滝川、佐久間を攻めたかったが、京にいた信雄が気合で行動力チェックを成功させて合流してきたので攻めかかれなかった。

 

織田方移動

東海では信長と家康が合流。リアクションフェイズで勝頼は駿河を諦めて甲斐防衛へ向かう。

信濃に進出した信忠に高坂、真田が向き合う。この2人はもっと早く到着する予定だったが、行動力チェックがうまくいっていなかった。

勝家が金沢包囲を丹羽に任せて越中進出。富山城を囲む。

三木城攻撃部隊が姫路包囲中の小早川を強襲。

近畿の織田軍は二手に別れ、滝川と信雄が京へ帰還。佐久間は単独で有岡城を包囲。これで茨木城攻撃する反織田軍の連絡線が途絶。*6

佐久間を追い払いにリアクションしようとした雑賀が行動力チェックと補給チェックに失敗して損耗。雑賀の行動力は低いのでやってはいけないことだった。

 

織田方戦闘

竹中半兵衛(5-0/10戦力)VS小早川隆景(3-5/8戦力)in姫路城

半兵衛1損害/小早川5損害 益田元祥討死1VP

元々交戦を想定していない上に、猛威を振るう竹中のダイスに小早川は敗走。姫路城の包囲は解かれた。

勝頼は守りやすい山地へ退却。駿河の城を見捨てる形に。もちろん実際にこんなことをしたら家中がバラバラになる。

吉川を待たずに進出する雑賀他連合軍。待てばよかったが、織田の態勢が整うのを嫌ったということで。

柴田が越中へ進出。しかし、景勝も越中防衛部隊に合流しようと急ぐ。

9VP

 

第4ターン

開始フェイズ

落城判定 末森城1のみ。かなりの城が包囲されているが、なかなか落城しない。特に金沢城が落ちてくれないせいで織田軍は足止めを食らっている。

 

損耗判定で雑賀討死(2VP)。

まあ、雑賀強いけど単騎だからこうなるリスクがあるよということで、、、ふつうはしちゃダメなことだ。*7

 

反織田方移動

景勝が魚津城へ急ぐも、道が丘陵でなかなか進めない。

それを見た柴田が魚津城部隊に交戦マーカーを配置。景勝が強行軍に失敗すれば各個撃破……。とはならずに強行軍チェックは成功。

吉川は雑賀を失った本願寺他と合流し、有岡城を包囲する佐久間と交戦。

信濃高坂昌信織田信忠と接敵。

 

反織田方戦闘

柴田勝家(4-4/12戦力VS上杉景勝(4-4/20戦力/砦)in 魚津城

勝家3損害/景勝1損害で景勝の勝ち。景勝の行動力チェックが成功した時点でこの戦闘は勝敗が決まっていた。

 

高坂昌信(4-4/8戦力)VS織田信忠(2-4/12戦力)in妻籠城北方

信忠3損害、高坂0損害で高坂の勝ち。信忠は別働隊と合流して兵力回復。

 

吉川元春(4-3/20戦力)VS佐久間信盛(2-3/6戦力)in有岡城

吉川0損害、佐久間6損害で佐久間信盛、佐久間信栄、村井貞勝討死。-4VP

雑賀を連絡線切れにしたのは良いが、吉川が6ゾロを出したことにより佐久間は粉砕された。連絡線切るだけだったら1ユニット単騎でよかったが、部隊再編制のタイミングが限られているので致し方ない。

 

3戦全て織田の敗退な上に、反織田に大したダメージも入らず。

 

織田方移動

織田、徳川連合軍が勝頼に交戦。信長が大軍を連れてきている以上、ただ駿河を取って勝頼と対峙するだけ……だと成果が少なすぎると判断したため。

損害を被った勝家は倶利伽羅峠まで撤退。越中進出は加賀を制圧してからが良いと判断。

竹中半兵衛が摂津へ方面へ。滝川と協同で吉川を封じ込める。

 

織田方戦闘

徳川家康(5-5/30戦力)VS武田勝頼(5-4/14戦力/山砦)in甲斐・駿河国

家康十数損害.....

勝頼2損害

 

話にならないほど互いのダイス目が隔離し、織田方涙目敗走となった。織田は7以下しか出ないのに武田はいきなり12を出すわその後も9以上連発など。山+砦でダイス目修正があっても、兵力差でトントンくらいの損失=戦力の多い織田方の勝利と思って攻撃したのだが。

 

ここで戦意喪失。4ターン時点で8VP。すでに包囲している城を全て取ったとしても+19VPで27VPにしかならない。勝利条件の30VPには到達しない。

 

4ターン目終了時の状況

東海→戦力半壊で甲斐への突破力なし。真田の侵入に対応する必要があるなど、取った城を維持するのも厳しい。信濃は武将修正の差で高坂に押され気味。

近畿→吉川のさらなる増援が大阪に到着することを考えると、反織田方優勢は続く。しかも苦しくなったら本願寺に逃げるという必殺技もあり。

北陸→景勝が越中へ進出したことにより、優位を失う。対峙は可能だが景勝を打ち崩して織田が勝つ未来も見えず。景勝も20戦力程度を越中に集めているため。

 

感想

想定通り織田方がだいぶ厳しいバランス。だいたい史実シナリオと銘打っているのに、30VP取るほど侵攻しなきゃいけないとは……?シナリオ期間は1578年6月~9月なので、史実通りなら開始時点から大きな動きは起こらず終わる。

参考までに、このゲームで発生しそうな状況が史実でいつ起こったかについて記す。

・荒木謀反→1578年10月

御館の乱終結→1579年3月

丹波平定→1579年9月

加賀一向一揆平定→1580年ごろ

・三木城陥落→1580年1月

本願寺光佐の石山退去→1580年4月

・荒木方城郭の陥落→1580年7月

高天神城陥落→1581年3月

史実を数年先取りするレベルで侵攻しないと勝てないのか……。

 

織田方の侵攻が頓挫してしまう理由として、織田方には謙信上洛における謙信のような、多少の兵力差なら悠々とひっくりかえせるバケモノ武将がいない。兵力も大して反織田より多くない上、侵攻しなくていい相手にも防衛用の兵力が必要になる。

このままのルールで戦っていく場合、織田方は兵力配分を洗練する必要があるだろう。内線防御だった謙信上洛ならば多少兵力の融通を行えたが、侵攻側となる本シナリオでは第1ターンに各地へ向かわせた兵力から融通するのは難しい。

改めて三木城攻めは行わない方がよいと思った。取得できる7VPが荒木謀反で減るVPで相殺される上、吉川まで出陣してくる。やるとしたら本願寺と毛利の海上補給線が切れる(であろう)8ターン目以降か?ただし、2ターンで落城することは期待できない。

対武田には膠着でよい?その分全力で上杉を叩き潰す必要がありそうだ。信長も対上杉へ向かってよいかもしれない。今回は信濃方面の兵力も微妙に足りなかったので、そこは増強する必要あり。膠着でよいと言ってもある程度兵力を割いてあげないと逆に侵攻されてしまう。徳川は武田の半分程度しか兵力がないので。

 

ルールを変えるとしたら

①入れ替えチットを使う

信長、秀吉、信忠の戦闘力が1上がっている入れ替えチットが付属品としてついている。これが公式のてこ入れ策となる。試していないがそんなに変わるものか?

一応、信長を北陸に突っ込ませても景勝と戦闘力差なしの互角で戦えるようになる。

 

②毛利軍行動制限の厳格化

今回史実シナリオということを考えると、吉川とかが近畿まで来て暴れるのはどう考えてもおかしい話。毛利は荒木への援軍すら結局送らなかったくらい織田との直接対決に消極的であったため。この時期は尼子氏の勢力ををようやく平定する時期であり、近畿に出兵できるわけがない。上月城にこもる尼子氏勢力を滅ぼしたのは1578年7月であり、このゲームの時期とかぶっている。

播磨以東には進出できないなどの条件が必要?

 

③武田軍の弱体化

毛利同様に対織田、徳川に全力で当たれた時期ではない。御館の乱には勝頼が自ら兵力を率いて越後まで出兵し、景勝と景虎の和平調停にあたっている。和平調停の不調に加えて徳川方の侵入もあり、越後から撤退するのが8月末。

徳川からの侵入を受けつつも、北条と同盟していたこの時期は問題なく守れていたようだ。遠江駿河の情勢が悪くなっていくのは北条からの侵入が始まった1579年から。

やはり徳川方に倍する兵力を持ち、かつ信濃からの侵入に対抗できるほど兵力が充実しているのはおかしい。謙信上洛シナリオではオプションだった3ユニットを削ってもよいのではないか?

 

④織田軍勝利に必要なVP減少orターンの長期化

史実とこのゲームで求められるVPの乖離を是正するならばこれ。ただし、あまりに必要VPが減ってしまうと丹波遠江、加賀を制圧するだけで良くなりゲームとして面白いのか?という疑問がある。ターン数を15ターンにするなどの長期化はゲームバランス的にはちょうどよいと思えるが、このゲーム1ターンに1時間弱かかるのでプレイしきれなさそう。*8

 

戦術なりルールなり変えてもう一度チャレンジしなくてはと思った。

*1:戦闘修正値

*2:三木城3VP+籠っている部隊4VP

*3:毎ターン1or2ステップ

*4:水上連絡線が通っていると包囲しても包囲レベルが上がらない

*5:荒木は侍大将なので2VP、有岡城が3VP、花隈城が2VP。ルールブックには特にVPの記載がないので。おそらくVP移動が発生するはず。

*6:他城のZOCがあった。

*7:損耗判定は部隊ごと。1部隊に複数ユニットが居ればどれか1ユニットが損害を被ればよい。ただし、雑賀は部隊を組めない=1ユニットでいるしかないのでこういう場面で弱い。

*8:GJの説明ではゲーム終了に3~6時間って書いてあるけど、早期投了しない限りもっとかかる。移動フェイズが1ターンに何度もあるので。