将棋の対局 | play syougi
盤面 (board)
情報 (info)
結果 (result)
共有 (share)
再接続 (re-connect)
![]() |
||
|
";
strPopup += "Your Victory !
";
strPopup += "対戦相手が投了しました。あなたの勝ちです。
"; // 活躍した駒を称える if( katuyakuKoma >= 0 ) { strPopup += "";
strPopup += "![]() | ";
strPopup += "立会人いわく、 「この対局では、" +strKatuyaku + " の駒が最も活躍しました。」"; strPopup += " |
⇒ 先後入換え再対局 ( OrderChange-Match )
"; } else { //strPopup += ""; strPopup += ""; } // 相手の投了の続きをダメ子と指す if( document.frmMain.op.value != "dameko" && g_countSyougiKifu >= 3 ) { var strTudukiDameko = ""; strTudukiDameko += location.pathname +"?"; strTudukiDameko += "pl=b&"; // ユーザさんの番から指す strTudukiDameko += "op=" +"dameko" +"&"; //定数化したい strTudukiDameko += "bd=" +g_arSyougiKifu[g_countSyougiKifu-1-2].get_bd_webprm() +"&";// 棋譜データの投了手の前に戻す strTudukiDameko += "rf=" +"play"; // 定数化したい strPopup += ""; strPopup += "⇒ 相手の投了の直前から、ダメ子と指す
"; } } else if( result == "lose" ) { strPopup += "";
strPopup += "Your Lose..
";
strPopup += "あなたの負けです。ありがとうございました。
"; // 活躍した駒を称える if( katuyakuKoma >= 0 ) { strPopup += "";
strPopup += "![]() | ";
strPopup += "立会人いわく、 「この対局では、" +strKatuyaku + " の駒が頑張りました。」"; strPopup += " |
"; strPopup += "
"; } else { //strPopup += "
"; strPopup += "
"; } // strPopup += "
"; strPopup += ""; strPopup += DEF_AD_TEST; // strPopup += "
"; strPopup += "
閉じる (close)"; document.getElementById( "view_popup" ).innerHTML = strPopup; document.getElementById( "view_popup" ).style.display = "block"; // ゲームエンドメニュー再表示用にhtmlを残しておく g_viewPopup_gameend__strGameend = strPopup; } // Lint出力 function clickOutLint() { // 結果出力 wk = getStrLint(g_mainBoard); document.getElementById( "view_dbgmsg" ).innerHTML += wk +"
"; } // Lint出力 function getStrLint( sb ) { var DEF_KOMASUM_MAX = 60; ////どこかに定数を移動したい var DEF_KOMASUM_MIN = 6; ////どこかに定数を移動したい var DEF_KOMABETU_MAX = 20; //駒種類別の最大値 ////どこかに定数を移動したい var DEF_KOMABETU_MIN = 0; //駒種類別の最低値 ////どこかに定数を移動したい var DEF_SUM_OU = 1; ////どこかに定数を移動したい var lintStr = ""; var q; var vBoard = new Array(); vBoard = sb.boardTbl.slice(); //////////////////////////////デバッグメッセージは別の場所に出力するようにしたい // エラーチェック::全体の駒の数 var sumKoma = 0; for( q = 11; q < 100; q++ ) { if( vBoard[q] == sb.KOMA_PLX_KABE ) { continue; } if( vBoard[q] == sb.KOMA_PLX_NASI ) { continue; } sumKoma++; } for( q = 112; q <= 118; q++ ) { sumKoma += vBoard[q]; } for( q = 120; q <= 126; q++ ) { sumKoma += vBoard[q]; } if ( sumKoma >= DEF_KOMASUM_MIN && sumKoma <= DEF_KOMASUM_MAX ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ok :sumKoma=" +sumKoma +"
"; } else { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :sumKoma=" +sumKoma +"
"; return; } // エラーチェック::王の数 var countOu_pl1 = 0; var countOu_pl2 = 0; for( q = 11; q < 100; q++ ) { if( vBoard[q] == sb.KOMA_PLX_KABE ) { continue; } if( vBoard[q] == sb.KOMA_PL1_OUSY ) { countOu_pl1++; } if( vBoard[q] == sb.KOMA_PL2_OUSY ) { countOu_pl2++; } } if( countOu_pl1 != DEF_SUM_OU ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :countOu_pl1=" +countOu_pl1 +"
"; return; } if( countOu_pl2 != DEF_SUM_OU ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :countOu_pl2=" +countOu_pl2 +"
"; return; } // エラーチェック::駒の種類別の数 var cntSyubetu = new Array(); for( q = 0; q < 128; q++ ) { cntSyubetu[q] = 0; } for( q = 11; q < 100; q++ ) { if( vBoard[q] == sb.KOMA_PLX_KABE ) { continue; } //cntSyubetu[vBoard[q]]++; cntSyubetu[(vBoard[q] &103)]++; //成駒、plの違いを(val&103)をすることで吸収 } var wkKoma = 1; for( q = 112; q <= 118; q++ ) { cntSyubetu[wkKoma] += vBoard[q]; wkKoma++; } wkKoma = 1; for( q = 120; q <= 126; q++ ) { cntSyubetu[wkKoma] += vBoard[q]; wkKoma++; } for( q = 0; q <= sb.KOMA_PL1_HOHE; q++ ) { if ( cntSyubetu[q] < DEF_KOMABETU_MIN || cntSyubetu[q] > DEF_KOMABETU_MAX ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :cntSyubetu[" +q +"]=" +cntSyubetu[q] +"
"; return; } } // ワーニングチェック::標準駒数のチェック var ckKomaNumTbl = new Array(); ckKomaNumTbl[0] = 2 -cntSyubetu[0]; ckKomaNumTbl[1] = 2 -cntSyubetu[1]; ckKomaNumTbl[2] = 2 -cntSyubetu[2]; ckKomaNumTbl[3] = 4 -cntSyubetu[3]; ckKomaNumTbl[4] = 4 -cntSyubetu[4]; ckKomaNumTbl[5] = 4 -cntSyubetu[5]; ckKomaNumTbl[6] = 4 -cntSyubetu[6]; ckKomaNumTbl[7] = 18 -cntSyubetu[7]; for( q = 0; q <= 7; q++ ) { if( ckKomaNumTbl[q] != 0 ) { document.getElementById( "view_dbgmsg" ).innerHTML += "war!!! :cntSyubetu[" +q +"]=" +cntSyubetu[q] +"
"; } else { document.getElementById( "view_dbgmsg" ).innerHTML += "ok :cntSyubetu[" +q +"]=" +cntSyubetu[q] +"
"; } } // エラーチェック::2歩 var countHu_pl1 = 0; var countHu_pl2 = 0; for( q = 11; q < 100; q++ ) { if( vBoard[q] == sb.KOMA_PLX_KABE ) { countHu_pl1 = 0; countHu_pl2 = 0; continue; } if( vBoard[q] == sb.KOMA_PL1_HOHE ) { countHu_pl1++; if( countHu_pl1 >= 2 ) { // pl1 二歩 document.getElementById( "view_dbgmsg" ).innerHTML += "ng :2hu_point=" +q +"
"; return; } } if( vBoard[q] == sb.KOMA_PL2_HOHE ) { countHu_pl2++; if( countHu_pl2 >= 2 ) { // pl2 二歩 document.getElementById( "view_dbgmsg" ).innerHTML += "ng :2hu_point=" +q +"
"; return; } } } // エラーチェック::移動できない駒(着手禁止位置にある桂、香、歩の制限) for( q = 11; q < 100; q++ ) { if( vBoard[q] == sb.KOMA_PLX_KABE ) { continue; } // pl1桂のチェック if( vBoard[q] == sb.KOMA_PL1_KEIM ) { if( q%10 <= 2 ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :kei_point=" +q +"
"; return; } } // pl1香のチェック if( vBoard[q] == sb.KOMA_PL1_KYOU ) { if( q%10 == 1 ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :kyou_point=" +q +"
"; return; } } // pl1歩のチェック if( vBoard[q] == sb.KOMA_PL1_HOHE ) { if( q%10 == 1 ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :hu_point=" +q +"
"; return; } } // pl2桂のチェック if( vBoard[q] == sb.KOMA_PL2_KEIM ) { if( q%10 >= 8 ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :kei_point=" +q +"
"; return; } } // pl2香のチェック if( vBoard[q] == sb.KOMA_PL2_KYOU ) { if( q%10 == 9 ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :kyou_point=" +q +"
"; return; } } // pl2歩のチェック if( vBoard[q] == sb.KOMA_PL2_HOHE ) { if( q%10 == 9 ) { document.getElementById( "view_dbgmsg" ).innerHTML += "ng :hu_point=" +q +"
"; return; } } } // エラーチェック ///// 未実装 // 先手番が、王手をかけられていないか。。 // 詰め局面からの開始 // 標準駒数のチェック(はずれててもokだけど、ワーニングは出したい) // その他。。。 // 結果出力 lintStr = sb.get_bd_webprm(); if( lintStr == "" ) { lintStr = "err"; } return lintStr; } // lintの読み込み function clickReadLint() { var lintStr = String(document.frmMain.bd.value); // エラーチェック if( lintStr.length != 95 ) { // エラー alert( "err clickReadLint" ); ////// 未実装 } ////// 実装中 // Lint読込 g_mainBoard.clearBoard( lintStr ); // 画面更新 document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard ); document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard ); //////↓未実装リスト /* 文字数エラーチェック 禁止文字のチェック 各種局面チェック ライブラリ化 */ } //////------------------------------------------------- // csa形式の棋譜コンバータウィンドウを開く。 function clickOpenKifuConverter() { /////未実装 コンバータページを開けばok document.getElementById( "view_actlog" ).innerHTML = "未実装です。。
" + document.getElementById( "view_actlog" ).innerHTML; } //////------------------------------------------------- // ----------------- // javascript思考エンジン:くらげ // ----------------- var g_ai_kuraria_moto; var g_ai_kuraria_toko; var g_ai_kuraria_aa; function ai_kuraria_sub_teaa( moto, toko ) { // 着手可能かをチェック if( g_mainBoard.isCheckRulePl2( moto, toko ) == false ) { return; } // 準備 var wk = new QinoaSyougiBoard( g_mainBoard.get_bd_webprm() ); wk.clearBoard_webprm( g_mainBoard.get_bd_webprm(), g_mainBoard.get_pl_webprm(), g_mainBoard.get_zn_webprm() ); // 成れる着手の時は必ず成る if( moto < 100 ) { var wkKoma = wk.boardTbl[moto]; if( wkKoma == wk.KOMA_PL2_HISY || wkKoma == wk.KOMA_PL2_KAKU || wkKoma == wk.KOMA_PL2_GINN || wkKoma == wk.KOMA_PL2_KEIM || wkKoma == wk.KOMA_PL2_KYOU || wkKoma == wk.KOMA_PL2_HOHE ) { if( toko%10 >= 7 || moto%10 >= 7 ) { toko += 100; } } } // 指した後の局面生成 wk.movePl2( moto, toko, 0 ); // 指した後の効き情報生成 wk.makeKikimap(); // 指した後に自王に効きが残っていれば、その手は指せない if( wk.kikimap_pl1[ wk.kikimap_ou_pl2 ] != 0 ) { return; } // 打ち歩の王手は、しない (いい加減な打ち歩詰回避) if( wk.boardTbl[toko%100] == wk.KOMA_PL2_HOHE ) { if( moto > 100 ) { if( wk.boardTbl[(toko%100)+1] == wk.KOMA_PL1_OUSY ) { return; } } } var wkaa = 10000; if( g_mainBoard.get_zn_webprm() == toko%100 ) { wkaa = wkaa *6;// 直前の駒を取る補正 } if( g_mainBoard.boardTbl[toko%100] != g_mainBoard.KOMA_PLX_NASI ) { wkaa = wkaa *2;// 何かの駒を取る補正 } if( g_mainBoard.boardTbl[toko%100] != g_mainBoard.KOMA_PL1_HOHE ) { wkaa = wkaa *0.6;// 歩を取る補正 } if( g_mainBoard.boardTbl[toko%100] != g_mainBoard.KOMA_PL1_NRHO ) { wkaa = wkaa *0.8;// 歩を取る補正 } if( g_mainBoard.boardTbl[toko%100] == g_mainBoard.KOMA_PL1_HISY || g_mainBoard.boardTbl[toko%100] == g_mainBoard.KOMA_PL1_KAKU || g_mainBoard.boardTbl[toko%100] == g_mainBoard.KOMA_PL1_NRHI || g_mainBoard.boardTbl[toko%100] == g_mainBoard.KOMA_PL1_NRKA ) { wkaa = wkaa *3.0; //大駒を取る補正 } if( g_mainBoard.boardTbl[(toko%100)+1] == g_mainBoard.KOMA_PL1_HOHE ) { wkaa = wkaa *0.5; // 相手の歩の前に移動させる補正 } if( wk.kikimap_pl1[ toko%100 ] > wk.kikimap_pl2[ toko%100 ] ) { wkaa = wkaa *0.5; // 相手の効きの方が強いところに移動させる補正 } if( wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_HOHE ) { wkaa = wkaa *1.1; //歩の補正 } if( moto < 100 ) { if( g_mainBoard.kikimap_pl1[ moto ] > g_mainBoard.kikimap_pl2[ moto ] ) { wkaa = wkaa *2; // 相手の効きから逃れる補正 } if( wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_HOHE ) { if( wk.boardTbl[moto-1] == g_mainBoard.KOMA_PL2_HISY ) { wkaa = wkaa *1.6; //歩の補正(飛車先) } if( wk.boardTbl[moto-11] == g_mainBoard.KOMA_PL2_KAKU || wk.boardTbl[moto+9] == g_mainBoard.KOMA_PL2_KAKU ) { wkaa = wkaa *1.6; //歩の補正(角道) } if( wk.boardTbl[moto-1] == g_mainBoard.KOMA_PL2_KAKU ) { wkaa = wkaa *0.8; //歩の補正(飛車先) } } if( wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_KYOU ) { if( g_mainBoard.boardTbl[toko%100] == g_mainBoard.KOMA_PLX_NASI ) { if( g_mainBoard.kikimap_pl1[ moto ] == 0 ) { wkaa = wkaa *0.7; //意味のない香走りを抑制 } } } if( wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_HISY || wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_KAKU || wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_NRHI || wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_NRKA ) { if( g_mainBoard.kikimap_pl1[ moto ] > 0 ) { wkaa = wkaa *2.0; //大駒を相手の効きから逃がす補正 } } } if( wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_HISY || wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_KAKU || wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_NRHI || wk.boardTbl[toko%100] == g_mainBoard.KOMA_PL2_NRKA ) { if( g_mainBoard.kikimap_pl1[ toko%100 ] > 0 ) { wkaa = wkaa *0.3; //大駒を相手の効きがあるところに移動させるのを避ける補正 } } if( toko > 100 ) { wkaa = wkaa *1.6; //成る手の補正 } var rnd = Math.floor( wkaa * Math.random() ); if( g_ai_kuraria_aa < rnd ) { g_ai_kuraria_aa = rnd; g_ai_kuraria_moto = moto; g_ai_kuraria_toko = toko; } } function ai_kuraria_main() { var objDate = new Date(); var tmStart = objDate.getTime(); // 手の初期化 g_ai_kuraria_moto = g_mainBoard.SPMOVE_MOTO; g_ai_kuraria_toko = g_mainBoard.SPMOVE_TOKO_TORYO; g_ai_kuraria_aa = -1; g_mainBoard.makeKikimap(); // 相手の王様に効きが残っていれば if( g_mainBoard.kikimap_pl2[ g_mainBoard.kikimap_ou_pl1 ] != 0 ) { var objDate = new Date(); var sec = Math.floor( (objDate.getTime()-tmStart) /1000 ); if( sec < 1 ) { sec = 1; } // 勝ち宣言 var ret = ""; ret += "!ret.moto=" +String(g_mainBoard.SPMOVE_MOTO) +"\n"; ret += "!ret.toko=" +String(g_mainBoard.SPMOVE_TOKO_KACHI) +"\n"; ret += "!ret.aa=" +String(0) +"\n"; ret += "!time=" +String(sec) +"\n"; ret += "!end=1\n"; return ret; } // 手の生成 var q; for( q = 11; q < 100; q++ ) { if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PLX_KABE ) { continue; } if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PLX_NASI ) { // 空マスを発見 if( g_mainBoard.boardTbl[120] > 0 ) {// 飛 ai_kuraria_sub_teaa( 120, q ); } if( g_mainBoard.boardTbl[121] > 0 ) {// 角 ai_kuraria_sub_teaa( 121, q ); } if( g_mainBoard.boardTbl[122] > 0 ) {// 金 ai_kuraria_sub_teaa( 122, q ); } if( g_mainBoard.boardTbl[123] > 0 ) {// 銀 ai_kuraria_sub_teaa( 123, q ); } if( g_mainBoard.boardTbl[124] > 0 ) {// 桂 ai_kuraria_sub_teaa( 124, q ); } if( g_mainBoard.boardTbl[125] > 0 ) {// 香 ai_kuraria_sub_teaa( 125, q ); } if( g_mainBoard.boardTbl[126] > 0 ) {// 歩 ai_kuraria_sub_teaa( 126, q ); } } else if( g_mainBoard.boardTbl[q] <= g_mainBoard.KOMA_PL2_NRHO && g_mainBoard.boardTbl[q] >= g_mainBoard.KOMA_PL2_OUSY ) { // pl2側の駒を発見 var w; if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_HOHE ) {// 歩 ai_kuraria_sub_teaa( q, q+1 ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KYOU ) {// 香 ai_kuraria_sub_teaa( q, q+1 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+w] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q+w+1 ); } } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KEIM ) {// 桂 ai_kuraria_sub_teaa( q, q+2+10 ); ai_kuraria_sub_teaa( q, q+2-10 ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_GINN ) {// 銀 ai_kuraria_sub_teaa( q, q -9 ); ai_kuraria_sub_teaa( q, q +1 ); ai_kuraria_sub_teaa( q, q +11 ); ai_kuraria_sub_teaa( q, q -11 ); ai_kuraria_sub_teaa( q, q +9 ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRHO || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKY || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKE || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRGI || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KINN ) {// と金 成香 成桂 成銀 金 ai_kuraria_sub_teaa( q, q -9 ); ai_kuraria_sub_teaa( q, q +1 ); ai_kuraria_sub_teaa( q, q +11 ); ai_kuraria_sub_teaa( q, q -10 ); ai_kuraria_sub_teaa( q, q +10 ); ai_kuraria_sub_teaa( q, q -1 ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KAKU || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKA ) {// 角 馬 if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKA ) { ai_kuraria_sub_teaa( q, q -1 ); ai_kuraria_sub_teaa( q, q +10 ); ai_kuraria_sub_teaa( q, q -10 ); ai_kuraria_sub_teaa( q, q +1 ); } ai_kuraria_sub_teaa( q, q-11 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-(w*11)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q-(w*11)-11 ); } ai_kuraria_sub_teaa( q, q+11 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+(w*11)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q+(w*11)+11 ); } ai_kuraria_sub_teaa( q, q-9 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-(w*9)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q-(w*9)-9 ); } ai_kuraria_sub_teaa( q, q+9 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+(w*9)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q+(w*9)+9 ); } } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_HISY || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRHI ) {// 飛 龍 if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRHI ) { ai_kuraria_sub_teaa( q, q +9 ); ai_kuraria_sub_teaa( q, q -11 ); ai_kuraria_sub_teaa( q, q +11 ); ai_kuraria_sub_teaa( q, q -9 ); } ai_kuraria_sub_teaa( q, q-1 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-w] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q-w-1 ); } ai_kuraria_sub_teaa( q, q+1 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+w] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q+w+1 ); } ai_kuraria_sub_teaa( q, q-10 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-(w*10)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q-(w*10)-10 ); } ai_kuraria_sub_teaa( q, q+10 ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+(w*10)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_kuraria_sub_teaa( q, q+(w*10)+10 ); } } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_OUSY ) {// 王 ai_kuraria_sub_teaa( q, q +9 ); ai_kuraria_sub_teaa( q, q -1 ); ai_kuraria_sub_teaa( q, q -11 ); ai_kuraria_sub_teaa( q, q +10 ); ai_kuraria_sub_teaa( q, q -10 ); ai_kuraria_sub_teaa( q, q +11 ); ai_kuraria_sub_teaa( q, q +1 ); ai_kuraria_sub_teaa( q, q -9 ); } } } // 最後の処理 var objDate = new Date(); var sec = Math.floor( (objDate.getTime()-tmStart) /1000 ); if( sec < 1 ) { sec = 1; } var ret = ""; ret += "!ret.moto=" +String(g_ai_kuraria_moto) +"\n"; ret += "!ret.toko=" +String(g_ai_kuraria_toko) +"\n"; ret += "!ret.aa=" +String(0) +"\n"; ret += "!time=" +String(sec) +"\n"; ret += "!end=1\n"; return ret; } // ----------------- // javascript思考エンジン:ざざわむし // ----------------- var g_ai_zazaruo_moto; var g_ai_zazaruo_toko; var g_ai_zazaruo_aa; function ai_zazaruo_sub_teaa( moto, toko, zente ) { // 着手可能かをチェック if( g_mainBoard.isCheckRulePl2( moto, toko ) == false ) { return; } // 準備 var wk = new QinoaSyougiBoard( g_mainBoard.get_bd_webprm() ); wk.clearBoard_webprm( g_mainBoard.get_bd_webprm(), g_mainBoard.get_pl_webprm(), g_mainBoard.get_zn_webprm() ); // 成れる着手の時は必ず成る if( moto < 100 ) { var wkKoma = wk.boardTbl[moto]; if( wkKoma == wk.KOMA_PL2_HISY || wkKoma == wk.KOMA_PL2_KAKU || wkKoma == wk.KOMA_PL2_GINN || wkKoma == wk.KOMA_PL2_KEIM || wkKoma == wk.KOMA_PL2_KYOU || wkKoma == wk.KOMA_PL2_HOHE ) { if( toko%10 >= 7 || moto%10 >= 7 ) { toko += 100; } } } // 指した後の局面生成 wk.movePl2( moto, toko, 0 ); // 指した後の効き情報生成 wk.makeKikimap(); // 指した後に自王に効きが残っていれば、その手は指せない if( wk.kikimap_pl1[ wk.kikimap_ou_pl2 ] != 0 ) { return; } // 打ち歩の王手はしない (いい加減な打ち歩詰回避) if( wk.boardTbl[toko%100] == wk.KOMA_PL2_HOHE ) { if( moto > 100 ) { if( wk.boardTbl[(toko%100)+1] == wk.KOMA_PL1_OUSY ) { return; } } } // 指した駒がタダ捨てのとき if( wk.kikimap_pl1[ toko%100 ] != 0 && wk.kikimap_pl2[ toko%100 ] == 0 ) { if( g_mainBoard.boardTbl[toko%100] == wk.KOMA_PLX_NASI ) { //駒取りだったかをチェック return; } } // 指した駒がすぐとられるとき // if( wk.kikimap_pl1[ toko%100 ] != 0 ) { // wk.boardTbl[111 + (wk.boardTbl[toko%100]&7)] += 1; // wk.boardTbl[toko%100] = wk.KOMA_PLX_NASI; // wk.makeKikimap(); // } // 局面評価準備 var tblKoma = [ [10,25,40,55,70,85,100,115,130,145,10,25,40,55,70,85,100,115,130,145,10,25,40,55,70,85,100,115,130,145,10,25,40,55,70,85,100,115,130,145,10,9,24,55,70,85,100,115,130,145,10,22,40,55,70,85,100,115,130,145,10,41,56,55,70,85,100,115,130,145,10,25,68,55,70,85,100,115,130,145,10,25,40,55,70,85,100,115,130,145,10,25,40,55,70,85,100,115,130,145], [1176,1180,1176,1180,1176,1180,1176,1180,1176,1180,1180,1176,1180,1176,1180,1176,1180,1176,1180,1176,1196,1200,1214,1200,1196,1200,1196,1200,1196,1200,1200,1196,1214,1196,1200,1196,1200,1196,1200,1196,1196,1200,1208,1200,1196,1200,1196,1200,1196,1200,1200,1196,1195,1196,1200,1196,1200,1196,1200,1196,1196,1200,1191,1200,1196,1200,1196,1200,1196,1200,1200,1196,1195,1196,1200,1196,1200,1196,1200,1196,1196,1200,1170,1200,1196,1200,1196,1200,1196,1200,1200,1176,1180,1176,1180,1176,1180,1176,1180,1176], [1030,1010,1030,1010,1030,1010,1030,1010,1030,1010,1010,1030,1010,1030,1010,1030,1010,1030,1010,1030,1050,1030,1050,1030,1050,1030,1050,1030,1050,1030,1030,1050,1030,1062,1030,1050,1030,1050,1030,1050,1050,1030,1050,1030,1050,1030,1050,1030,1050,1030,1030,1050,1030,1050,1030,1050,1030,1050,1030,1050,1050,1030,1050,1030,1050,1030,1050,1030,1050,1030,1030,1050,1030,1050,1030,1050,1030,1050,1030,1050,1050,1030,1050,1030,1050,1030,1050,1030,1050,1030,1030,1030,1010,1030,1010,1030,1010,1030,1010,1030], [770,765,760,755,750,745,740,735,710,665,770,765,760,755,750,745,740,735,710,665,800,795,782,785,780,775,770,765,740,695,800,787,790,785,780,775,770,765,740,695,800,790,790,785,780,775,770,765,740,695,800,795,802,785,780,775,770,765,740,695,800,795,802,785,780,775,770,765,740,695,800,787,782,785,780,775,770,765,740,695,800,795,782,785,780,775,770,765,740,695,800,765,760,755,750,745,740,735,710,665], [670,676,682,688,694,700,706,712,698,664,670,676,682,688,694,700,706,712,698,664,700,706,712,718,724,730,736,742,728,694,700,700,712,721,724,730,736,742,728,694,700,706,712,718,724,730,736,742,728,694,700,706,712,718,724,730,736,742,728,694,700,706,712,718,724,730,736,742,728,694,700,706,712,718,724,730,736,742,728,694,700,706,712,718,724,730,736,742,728,694,700,676,682,688,694,700,706,712,698,664], [430,425,420,415,410,405,400,395,390,385,430,425,420,415,410,405,400,395,390,385,450,445,440,435,430,425,420,415,410,405,450,445,440,435,430,425,420,415,410,405,450,445,440,435,430,425,420,415,410,405,450,445,440,435,430,425,420,415,410,405,450,445,440,435,430,425,420,415,410,405,450,445,440,435,430,425,420,415,410,405,450,445,440,435,430,425,420,415,410,405,450,425,420,415,410,405,400,395,390,385], [395,385,375,365,355,345,335,325,315,305,395,385,375,365,355,345,335,325,315,305,400,390,380,370,360,350,340,330,320,310,400,390,380,370,360,350,340,330,320,310,400,390,380,370,360,350,340,330,320,310,400,390,380,370,360,350,340,330,320,310,400,390,380,370,360,350,340,330,320,310,400,390,380,370,360,350,340,330,320,310,400,390,380,370,360,350,340,330,320,310,400,385,375,365,355,345,335,325,315,305], [100,103,106,109,112,115,118,121,124,127,100,103,106,109,112,115,118,121,124,127,100,103,106,109,112,115,118,121,124,127,100,103,106,49,112,115,118,121,124,127,100,103,106,84,112,115,118,121,124,127,100,103,106,109,112,115,118,121,124,127,100,103,106,109,112,115,118,121,124,127,100,103,106,109,112,115,118,121,124,127,100,103,106,109,112,115,118,121,124,127,100,103,106,109,112,115,118,121,124,127], [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,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,0,0,0,0,0,0,0,0,0,0], [1426,1430,1426,1430,1426,1430,1426,1430,1426,1430,1430,1426,1430,1426,1430,1426,1430,1426,1430,1426,1446,1450,1446,1450,1446,1450,1446,1450,1446,1450,1450,1446,1450,1446,1450,1446,1450,1446,1450,1446,1446,1450,1446,1450,1446,1450,1446,1450,1446,1450,1450,1446,1450,1446,1450,1446,1450,1446,1450,1446,1446,1450,1446,1450,1446,1450,1446,1450,1446,1450,1450,1446,1450,1446,1450,1446,1450,1446,1450,1446,1446,1450,1446,1450,1446,1450,1446,1450,1446,1450,1450,1426,1430,1426,1430,1426,1430,1426,1430,1426], [1230,1220,1230,1220,1230,1220,1230,1220,1230,1220,1220,1230,1220,1230,1220,1230,1220,1230,1220,1230,1250,1240,1250,1240,1250,1240,1250,1240,1250,1240,1240,1250,1240,1250,1240,1250,1240,1250,1240,1250,1250,1240,1250,1240,1250,1240,1250,1240,1250,1240,1240,1250,1240,1250,1240,1250,1240,1250,1240,1250,1250,1240,1250,1240,1250,1240,1250,1240,1250,1240,1240,1250,1240,1250,1240,1250,1240,1250,1240,1250,1250,1240,1250,1240,1250,1240,1250,1240,1250,1240,1240,1230,1220,1230,1220,1230,1220,1230,1220,1230], [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,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,0,0,0,0,0,0,0,0,0,0], [770,760,750,740,730,720,710,700,670,620,770,760,750,740,730,720,710,700,670,620,800,790,780,770,760,750,740,730,700,650,800,790,780,770,760,750,740,730,700,650,800,790,780,770,760,750,740,730,700,650,800,790,780,770,760,750,740,730,700,650,800,790,780,770,760,750,740,730,700,650,800,790,780,770,760,750,740,730,700,650,800,790,780,770,760,750,740,730,700,650,800,760,750,740,730,720,710,700,670,620], [720,710,700,690,680,670,660,650,620,570,720,710,700,690,680,670,660,650,620,570,750,740,730,720,710,700,690,680,650,600,750,740,730,720,710,700,690,680,650,600,750,740,730,720,710,700,690,680,650,600,750,740,730,720,710,700,690,680,650,600,750,740,730,720,710,700,690,680,650,600,750,740,730,720,710,700,690,680,650,600,750,740,730,720,710,700,690,680,650,600,750,710,700,690,680,670,660,650,620,570], [670,660,650,640,630,620,610,600,570,520,670,660,650,640,630,620,610,600,570,520,700,690,680,670,660,650,640,630,600,550,700,690,680,670,660,650,640,630,600,550,700,690,680,670,660,650,640,630,600,550,700,690,680,670,660,650,640,630,600,550,700,690,680,670,660,650,640,630,600,550,700,690,680,670,660,650,640,630,600,550,700,690,680,670,660,650,640,630,600,550,700,660,650,640,630,620,610,600,570,520], [570,560,550,540,530,520,510,500,470,420,570,560,550,540,530,520,510,500,470,420,600,590,580,570,560,550,540,530,500,450,600,590,580,570,560,550,540,530,500,450,600,590,580,570,560,550,540,530,500,450,600,590,580,570,560,550,540,530,500,450,600,590,580,570,560,550,540,530,500,450,600,590,580,570,560,550,540,530,500,450,600,590,580,570,560,550,540,530,500,450,600,560,550,540,530,520,510,500,470,420] ]; var tblKiki = new Array( 1.0, 0.3, 1.0, 0.9 ); var tblAte = new Array( 1.0, 0.3, 0.7, 0.8 ); var tblMoti = new Array( 0, 1220, 1070, 820, 720, 470, 420, 120 ); // 局面評価 var main_aa = 0; ////document.getElementById( "test" ).innerHTML = ""; // 盤面評価 var kyoui_aa = 0; var q; for( q = 11; q < 100; q++ ) { if( wk.boardTbl[q] == wk.KOMA_PLX_KABE ) { continue; } if( wk.boardTbl[q] == wk.KOMA_PLX_NASI ) { continue; } // 評価用データ生成 var prm4_kiki = 0; if( wk.boardTbl[q] > wk.KOMA_PL1_NRHO ) { if( wk.kikimap_pl1[ q ] != 0 ) { prm4_kiki += 1; } if( wk.kikimap_pl2[ q ] != 0 ) { prm4_kiki += 2; } } else { if( wk.kikimap_pl2[ q ] != 0 ) { prm4_kiki += 1; } if( wk.kikimap_pl1[ q ] != 0 ) { prm4_kiki += 2; } } var prm4_ate = 0; if( wk.boardTbl[q] > wk.KOMA_PL1_NRHO ) { if( wk.boardTbl[q-1] == wk.KOMA_PL1_NRHO || wk.boardTbl[q+1] == wk.KOMA_PL1_NRHO || wk.boardTbl[q-9] == wk.KOMA_PL1_NRHO || wk.boardTbl[q+11] == wk.KOMA_PL1_NRHO || wk.boardTbl[q-10] == wk.KOMA_PL1_NRHO || wk.boardTbl[q+10] == wk.KOMA_PL1_NRHO || wk.boardTbl[q+1] == wk.KOMA_PL1_HOHE ) { prm4_ate = 1; } else { if( wk.boardTbl[q-1] == wk.KOMA_PL1_NRKY || wk.boardTbl[q+1] == wk.KOMA_PL1_NRKY || wk.boardTbl[q-9] == wk.KOMA_PL1_NRKY || wk.boardTbl[q+11] == wk.KOMA_PL1_NRKY || wk.boardTbl[q-10] == wk.KOMA_PL1_NRKY || wk.boardTbl[q+10] == wk.KOMA_PL1_NRKY || wk.boardTbl[q+1] == wk.KOMA_PL1_KYOU ) { prm4_ate = 2; } if( prm4_ate == 0 ) { var w = 0; for( w = 1; w < 8; w++ ) { if( wk.boardTbl[q+w] == wk.KOMA_PLX_NASI || wk.boardTbl[q+w] == wk.KOMA_PL2_OUSY ) { if( wk.boardTbl[q+w+1] == wk.KOMA_PL1_KYOU ) { prm4_ate = 2; //// document.getElementById( "test" ).innerHTML += "!";////// break; } } else { break; } } } if( prm4_ate == 0 ) { if( wk.boardTbl[q+1] != wk.KOMA_PLX_KABE ) { if( wk.boardTbl[q-8] == wk.KOMA_PL1_KEIM || wk.boardTbl[q+12] == wk.KOMA_PL1_KEIM ) { prm4_ate = 3; } } } if( prm4_ate == 0 ) { if( wk.boardTbl[q-1] == wk.KOMA_PL1_NRKE || wk.boardTbl[q+1] == wk.KOMA_PL1_NRKE || wk.boardTbl[q-9] == wk.KOMA_PL1_NRKE || wk.boardTbl[q+11] == wk.KOMA_PL1_NRKE || wk.boardTbl[q-10] == wk.KOMA_PL1_NRKE || wk.boardTbl[q+10] == wk.KOMA_PL1_NRKE ) { prm4_ate = 3; } } } //// document.getElementById( "test" ).innerHTML += "(" +q +":" +prm4_ate +") ";////// } else { if( wk.boardTbl[q+1] == wk.KOMA_PL2_NRHO || wk.boardTbl[q-1] == wk.KOMA_PL2_NRHO || wk.boardTbl[q+9] == wk.KOMA_PL2_NRHO || wk.boardTbl[q-11] == wk.KOMA_PL2_NRHO || wk.boardTbl[q+10] == wk.KOMA_PL2_NRHO || wk.boardTbl[q-10] == wk.KOMA_PL2_NRHO || wk.boardTbl[q-1] == wk.KOMA_PL2_HOHE ) { prm4_ate = 1; } else { if( wk.boardTbl[q+1] == wk.KOMA_PL2_NRKY || wk.boardTbl[q-1] == wk.KOMA_PL2_NRKY || wk.boardTbl[q+9] == wk.KOMA_PL2_NRKY || wk.boardTbl[q-11] == wk.KOMA_PL2_NRKY || wk.boardTbl[q+10] == wk.KOMA_PL2_NRKY || wk.boardTbl[q-10] == wk.KOMA_PL2_NRKY || wk.boardTbl[q-1] == wk.KOMA_PL2_KYOU ) { prm4_ate = 2; } if( prm4_ate == 0 ) { var w = 0; for( w = 1; w < 8; w++ ) { if( wk.boardTbl[q-w] == wk.KOMA_PLX_NASI || wk.boardTbl[q-w] == wk.KOMA_PL1_OUSY ) { if( wk.boardTbl[q-w-1] == wk.KOMA_PL2_KYOU ) { //// document.getElementById( "test" ).innerHTML += "#" +q +" ";////// prm4_ate = 2; break; } } else { break; } } } if( prm4_ate == 0 ) { if( wk.boardTbl[q-1] != wk.KOMA_PLX_KABE ) { if( wk.boardTbl[q+8] == wk.KOMA_PL2_KEIM || wk.boardTbl[q-12] == wk.KOMA_PL2_KEIM ) { prm4_ate = 3; } } } if( prm4_ate == 0 ) { if( wk.boardTbl[q+1] == wk.KOMA_PL2_NRKE || wk.boardTbl[q-1] == wk.KOMA_PL2_NRKE || wk.boardTbl[q+9] == wk.KOMA_PL2_NRKE || wk.boardTbl[q-11] == wk.KOMA_PL2_NRKE || wk.boardTbl[q+10] == wk.KOMA_PL2_NRKE || wk.boardTbl[q-10] == wk.KOMA_PL2_NRKE ) { prm4_ate = 3; } } } } // 各評価 var masu_aa = 0;//tblKoma[ wk.boardTbl[q] ]; if( wk.boardTbl[q] > wk.KOMA_PL1_NRHO ) { masu_aa = tblKoma[ wk.boardTbl[q] -16 ][ q ]; } else { masu_aa = -tblKoma[ wk.boardTbl[q] ][ 110-q ]; } var kiki_aa = tblKiki[ prm4_kiki ]; var ate_aa = tblAte[ prm4_ate ]; // 評価集計 main_aa += masu_aa *kiki_aa *ate_aa; // 最大脅威 if( wk.boardTbl[q] > wk.KOMA_PL1_NRHO ) { var kyoui_wk = 0; if( wk.kikimap_pl1[ q ] != 0 ) { if( wk.kikimap_pl2[ q ] == 0 ) { kyoui_wk = masu_aa *1.2; } else if( wk.kikimap_pl2[ q ] < wk.kikimap_pl1[ q ] ) { kyoui_wk = masu_aa *1.0; } else if( prm4_ate == 1 ) { kyoui_wk = masu_aa *1.0; //歩のあたり } else if( prm4_ate == 2 ) { kyoui_wk = masu_aa *0.5; //香のあたり } else if( prm4_ate == 3 ) { kyoui_wk = masu_aa *0.6; //桂のあたり } } if( q == toko%100 ) { kyoui_wk *= 1.5; } if( kyoui_aa < kyoui_wk ) { kyoui_aa = kyoui_wk; } } } // 最大脅威を反映 main_aa -= kyoui_aa; // 持ち駒評価 main_aa += -tblMoti[ 1 ] * wk.boardTbl[112]; main_aa += -tblMoti[ 2 ] * wk.boardTbl[113]; main_aa += -tblMoti[ 3 ] * wk.boardTbl[114]; main_aa += -tblMoti[ 4 ] * wk.boardTbl[115]; main_aa += -tblMoti[ 5 ] * wk.boardTbl[116]; main_aa += -tblMoti[ 6 ] * wk.boardTbl[117]; main_aa += -tblMoti[ 7 ] * wk.boardTbl[118]; main_aa += tblMoti[ 1 ] * wk.boardTbl[120]; main_aa += tblMoti[ 2 ] * wk.boardTbl[121]; main_aa += tblMoti[ 3 ] * wk.boardTbl[122]; main_aa += tblMoti[ 4 ] * wk.boardTbl[123]; main_aa += tblMoti[ 5 ] * wk.boardTbl[124]; main_aa += tblMoti[ 6 ] * wk.boardTbl[125]; main_aa += tblMoti[ 7 ] * wk.boardTbl[126]; // 王へのプレッシャー評価 main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 ] * 60; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 -1 ] * 40; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 -11 ] * 40; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 +9 ] * 40; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 -10 ] * 36; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 +10 ] * 36; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 +1 ] * 20; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 -9 ] * 20; main_aa += wk.kikimap_pl2[ wk.kikimap_ou_pl1 +11 ] * 20; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 ] * 60; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 +1 ] * 40; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 +11 ] * 40; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 -9 ] * 40; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 +10 ] * 36; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 -10 ] * 36; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 -1 ] * 20; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 +9 ] * 20; main_aa += -wk.kikimap_pl1[ wk.kikimap_ou_pl2 -11 ] * 20; // 直前の着手に対する評価 if( zente > 0 ) { // 直前を取る手 if( zente%100 == toko%100 ) { main_aa += 300; } // 直前に歩でアテル手 if( wk.boardTbl[toko%100] == wk.KOMA_PL2_HOHE ) { if( wk.kikimap_pl1[toko%100] == 0 || wk.kikimap_pl2[toko%100] > 0 ) { if( (zente-1)%100 == toko%100 ) { main_aa += 50; } } } } // 乱数を加味 // main_aa += Math.floor( 101 * Math.random() ) -50; main_aa += Math.floor( 21 * Math.random() ) -10; main_aa += Math.floor( 21 * Math.random() ) -10; // 最大を格納 main_aa = Math.floor( main_aa ); if( g_ai_zazaruo_aa < main_aa ) { g_ai_zazaruo_aa = main_aa; g_ai_zazaruo_moto = moto; g_ai_zazaruo_toko = toko; } } function ai_zazaruo_main() { var objDate = new Date(); var tmStart = objDate.getTime(); // 手の初期化 g_ai_zazaruo_moto = g_mainBoard.SPMOVE_MOTO; g_ai_zazaruo_toko = g_mainBoard.SPMOVE_TOKO_TORYO; g_ai_zazaruo_aa = -999999; g_mainBoard.makeKikimap(); // 相手の王様に効きが残っていれば if( g_mainBoard.kikimap_pl2[ g_mainBoard.kikimap_ou_pl1 ] != 0 ) { var objDate = new Date(); var sec = Math.floor( (objDate.getTime()-tmStart) /1000 ); if( sec < 1 ) { sec = 1; } // 勝ち宣言 var ret = ""; ret += "!ret.moto=" +String(g_mainBoard.SPMOVE_MOTO) +"\n"; ret += "!ret.toko=" +String(g_mainBoard.SPMOVE_TOKO_KACHI) +"\n"; ret += "!ret.aa=" +String(0) +"\n"; ret += "!time=" +String(sec) +"\n"; ret += "!end=1\n"; return ret; } // 直前の着手を取得 var zente = Number(g_mainBoard.get_zn_webprm()); // 手の生成 var q; for( q = 11; q < 100; q++ ) { if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PLX_KABE ) { continue; } if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PLX_NASI ) { // 空マスを発見 if( g_mainBoard.boardTbl[120] > 0 ) {// 飛 ai_zazaruo_sub_teaa( 120, q, zente ); } if( g_mainBoard.boardTbl[121] > 0 ) {// 角 ai_zazaruo_sub_teaa( 121, q, zente ); } if( g_mainBoard.boardTbl[122] > 0 ) {// 金 ai_zazaruo_sub_teaa( 122, q, zente ); } if( g_mainBoard.boardTbl[123] > 0 ) {// 銀 ai_zazaruo_sub_teaa( 123, q, zente ); } if( g_mainBoard.boardTbl[124] > 0 ) {// 桂 ai_zazaruo_sub_teaa( 124, q, zente ); } if( g_mainBoard.boardTbl[125] > 0 ) {// 香 ai_zazaruo_sub_teaa( 125, q, zente ); } if( g_mainBoard.boardTbl[126] > 0 ) {// 歩 ai_zazaruo_sub_teaa( 126, q, zente ); } } else if( g_mainBoard.boardTbl[q] <= g_mainBoard.KOMA_PL2_NRHO && g_mainBoard.boardTbl[q] >= g_mainBoard.KOMA_PL2_OUSY ) { // pl2側の駒を発見 var w; if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_HOHE ) {// 歩 ai_zazaruo_sub_teaa( q, q+1, zente ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KYOU ) {// 香 ai_zazaruo_sub_teaa( q, q+1, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+w] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q+w+1, zente ); } } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KEIM ) {// 桂 ai_zazaruo_sub_teaa( q, q+2+10, zente ); ai_zazaruo_sub_teaa( q, q+2-10, zente ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_GINN ) {// 銀 ai_zazaruo_sub_teaa( q, q -9, zente ); ai_zazaruo_sub_teaa( q, q +1, zente ); ai_zazaruo_sub_teaa( q, q +11, zente ); ai_zazaruo_sub_teaa( q, q -11, zente ); ai_zazaruo_sub_teaa( q, q +9, zente ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRHO || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKY || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKE || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRGI || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KINN ) {// と金 成香 成桂 成銀 金 ai_zazaruo_sub_teaa( q, q -9, zente ); ai_zazaruo_sub_teaa( q, q +1, zente ); ai_zazaruo_sub_teaa( q, q +11, zente ); ai_zazaruo_sub_teaa( q, q -10, zente ); ai_zazaruo_sub_teaa( q, q +10, zente ); ai_zazaruo_sub_teaa( q, q -1, zente ); } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_KAKU || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKA ) {// 角 馬 if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRKA ) { ai_zazaruo_sub_teaa( q, q -1, zente ); ai_zazaruo_sub_teaa( q, q +10, zente ); ai_zazaruo_sub_teaa( q, q -10, zente ); ai_zazaruo_sub_teaa( q, q +1, zente ); } ai_zazaruo_sub_teaa( q, q-11, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-(w*11)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q-(w*11)-11, zente ); } ai_zazaruo_sub_teaa( q, q+11, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+(w*11)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q+(w*11)+11, zente ); } ai_zazaruo_sub_teaa( q, q-9, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-(w*9)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q-(w*9)-9, zente ); } ai_zazaruo_sub_teaa( q, q+9, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+(w*9)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q+(w*9)+9, zente ); } } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_HISY || g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRHI ) {// 飛 龍 if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_NRHI ) { ai_zazaruo_sub_teaa( q, q +9, zente ); ai_zazaruo_sub_teaa( q, q -11, zente ); ai_zazaruo_sub_teaa( q, q +11, zente ); ai_zazaruo_sub_teaa( q, q -9, zente ); } ai_zazaruo_sub_teaa( q, q-1, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-w] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q-w-1, zente ); } ai_zazaruo_sub_teaa( q, q+1, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+w] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q+w+1, zente ); } ai_zazaruo_sub_teaa( q, q-10, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q-(w*10)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q-(w*10)-10, zente ); } ai_zazaruo_sub_teaa( q, q+10, zente ); for( w = 1; w < 9; w++ ) { if( g_mainBoard.boardTbl[q+(w*10)] != g_mainBoard.KOMA_PLX_NASI ) { break; } ai_zazaruo_sub_teaa( q, q+(w*10)+10, zente ); } } else if( g_mainBoard.boardTbl[q] == g_mainBoard.KOMA_PL2_OUSY ) {// 王 ai_zazaruo_sub_teaa( q, q +9, zente ); ai_zazaruo_sub_teaa( q, q -1, zente ); ai_zazaruo_sub_teaa( q, q -11, zente ); ai_zazaruo_sub_teaa( q, q +10, zente ); ai_zazaruo_sub_teaa( q, q -10, zente ); ai_zazaruo_sub_teaa( q, q +11, zente ); ai_zazaruo_sub_teaa( q, q +1, zente ); ai_zazaruo_sub_teaa( q, q -9, zente ); } } } // 最後の処理 var objDate = new Date(); var sec = Math.floor( (objDate.getTime()-tmStart) /1000 ); if( sec < 1 ) { sec = 1; } var ret = ""; ret += "!ret.moto=" +String(g_ai_zazaruo_moto) +"\n"; ret += "!ret.toko=" +String(g_ai_zazaruo_toko) +"\n"; ret += "!ret.aa=" +String(g_ai_zazaruo_aa) +"\n"; ret += "!time=" +String(sec) +"\n"; ret += "!end=1\n"; return ret; } // ----------------- var g_responseText = ""; function actionComPlayer_delay() { actionComPlayer( g_responseText ); } function actionComPlayer( strThinkResult ) { document.getElementById( "view_thinklog" ).innerHTML = strThinkResult; var keyVal = new Object(); /////keyValの名前 // 実行結果のデータをkeyごとに、連想配列に格納。 var line = strThinkResult.split( "\n" ); var lineCount; for( lineCount = 0; lineCount < line.length; lineCount++ ) { var items = line[lineCount].split( "=" ); /////#で始まるのは、データを取得しない。。未実装。 if( items.length >= 2 ) { keyVal[items[0]] = items[1]; } } // 接続エラーテスト用 // var wk = Math.floor(Math.random()*4); // if( wk == 0 ) { // keyVal["!end"] = "0"; // } // エラーチェック if( keyVal["!end"] ) { if( Number(keyVal["!end"]) != 1 ) { // エラー////もう少しちゃんとしたい g_strBoardMode = "err"; g_strGameUserResult = "err-net"; if( g_mainBoard.get_tesuu() >= 2 ) { document.getElementById( "view_msg" ).innerHTML = "対戦相手の着手の受信に失敗しました。
"; document.getElementById( "view_msg" ).innerHTML += "ネット接続を確認後、
「再接続 (re-connect) 」を押すと復帰できるかもしれません。"; } else { document.getElementById( "view_msg" ).innerHTML += "
\n対戦相手 はおかしくなりました。(end)"; } return; } } else { // エラー////もう少しちゃんとしたい g_strBoardMode = "err"; g_strGameUserResult = "err-net"; if( g_mainBoard.get_tesuu() >= 2 ) { document.getElementById( "view_msg" ).innerHTML = "対戦相手の着手の受信に失敗しました。
"; document.getElementById( "view_msg" ).innerHTML += "ネット接続を確認後、
「再接続 (re-connect) 」を押すと復帰できるかもしれません。"; } else { document.getElementById( "view_msg" ).innerHTML += "
\n対戦相手 はおかしくなりました。(end)"; } return; } // 思考結果の設定 //// if( g_gamekey === "unknown" ) { //// g_gamekey = String(keyVal["!ret.gamekey"]); //// // gamekeyをcookieに保存 //// q_setCookie( "lg", g_gamekey, 864000, "/" );// 864000sは、10日//////////// //// } g_strGameEndDateTime = q_getDateTime(new Date());/////この位置でいいのか? keyVal["!ret.moto"] = Number(keyVal["!ret.moto"]); keyVal["!ret.toko"] = Number(keyVal["!ret.toko"]); keyVal["!ret.aa"] = Number(keyVal["!ret.aa"]); keyVal["!ret.tm"] = Number(keyVal["!time"]);////! 「!time」の変数名を整理したい。 // エラーチェック if( keyVal["!ret.moto"] < 0 || keyVal["!ret.toko"] < 0 ) { g_strBoardMode = "watch"; g_strGameUserResult = "err-ai"; document.getElementById( "view_msg" ).innerHTML = "対戦相手はおかしくなりました。(err)
" +keyVal["!ret.moto"] +"/" +keyVal["!ret.toko"]; return; } // AIログを残す g_aiLog[g_aiLogLen] = ""; g_aiLog[g_aiLogLen] += g_mainBoard.get_bd_webprm(); g_aiLog[g_aiLogLen] += " " +String(keyVal["!ret.moto"]) +" " +String(keyVal["!ret.toko"]) + " " +g_mainBoard.get_zn_webprm(); g_aiLogLen++; // var hyouka = 1; if( g_mainBoard.pl == "b" ) { hyouka = keyVal["!ret.aa"]; } else { hyouka = -keyVal["!ret.aa"]; } if( keyVal["!ret.moto"] == g_mainBoard.SPMOVE_MOTO ) { // 特殊な着手 g_mainBoard.movePl2( keyVal["!ret.moto"], keyVal["!ret.toko"], keyVal["!ret.tm"] ); setKifuData( keyVal["!ret.moto"], keyVal["!ret.toko"], keyVal["!ret.tm"] ); if( keyVal["!ret.toko"] == g_mainBoard.SPMOVE_TOKO_KACHI ) { // コンピュータの勝ち宣言 g_strBoardMode = "watch"; g_strGameUserResult = "lose"; // ローカルストレージに保存 addLocalStorage_gh( g_strGameStartDateTime, document.frmMain.pl.value, document.frmMain.bd.value, document.frmMain.op.value, g_mainBoard.get_tesuu(), g_strGameUserResult ); document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard ); document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard ); ////document.getElementById( "view_dbgmsg" ).innerHTML = g_mainBoard.get_dbgMsg(); addGraph( hyouka ); document.getElementById( "view_graph" ).innerHTML = viewGraph( g_mainBoard, g_mainBoard.get_tesuu() ); document.getElementById( "view_msg" ).innerHTML = "対戦相手の勝ち。
あなたの負け。
\n You Lose..."; viewPopup_gameend(); return; } if( keyVal["!ret.toko"] == g_mainBoard.SPMOVE_TOKO_TORYO ) { // コンピュータの投了で終局 g_strBoardMode = "watch"; g_strGameUserResult = "win"; // ローカルストレージに保存 addLocalStorage_gh( g_strGameStartDateTime, document.frmMain.pl.value, document.frmMain.bd.value, document.frmMain.op.value, g_mainBoard.get_tesuu(), g_strGameUserResult ); document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard ); document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard ); ////document.getElementById( "view_dbgmsg" ).innerHTML = g_mainBoard.get_dbgMsg(); addGraph( hyouka ); document.getElementById( "view_graph" ).innerHTML = viewGraph( g_mainBoard, g_mainBoard.get_tesuu() ); document.getElementById( "view_msg" ).innerHTML = "対戦相手が投了しました。
あなたの勝ち!
\n Opponent Resign!"; //viewPopup_gameend(); // ポップアップを出す前に、少しだけ間を開けて詰み形を確認できるようにする。 setTimeout( viewPopup_gameend, 600 ); if( g_soundMode == "on" ) { document.getElementById( "fanfare" ).play(); } return; } } // 対局が終了しない着手 g_mainBoard.movePl2( keyVal["!ret.moto"], keyVal["!ret.toko"], keyVal["!ret.tm"] ); setKifuData( keyVal["!ret.moto"], keyVal["!ret.toko"], keyVal["!ret.tm"] ); // ローカルストレージに保存 addLocalStorage_gh( g_strGameStartDateTime, document.frmMain.pl.value, document.frmMain.bd.value, document.frmMain.op.value, g_mainBoard.get_tesuu(), g_strGameUserResult ); document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard );//////// document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard );////// document.getElementById( "view_msg" ).innerHTML = "あなたの番です。
Your Turn!";////viewMsg( g_mainBoard ) document.getElementById( "view_dbgmsg" ).innerHTML = g_mainBoard.get_dbgMsg(); addGraph( hyouka ); document.getElementById( "view_graph" ).innerHTML = viewGraph( g_mainBoard, g_mainBoard.get_tesuu() ); // 追加メッセージ document.getElementById( "view_msg" ).innerHTML += "
▼対戦相手の考えている形勢"; document.getElementById( "view_msg" ).innerHTML += getAddMsg_hyouka( g_viewGraph_aaSpot ); // 盤面描写後に着手許可のステータスに変更しないと、相手着手位置を予想してその上の自石を打てる g_strBoardMode = "play"; // 思考時間計測用 { var objDate = new Date(); g_timeStart = objDate.getTime(); } // もしAI側が指した手のあとユーザさんに手がなければ、投了扱いとする。 if( isCheck_userTumasareta() == true ) { // 対局終了にステータス変更 g_strBoardMode = "watch"; g_strGameUserResult = "lose"; g_pntSelect = 0; // 対局終了時間 g_strGameEndDateTime = q_getDateTime(new Date()); // 着手時間の記録 var objDate = new Date(); g_useSec = 1; if( g_timeStart != -1 ) { g_useSec = Math.floor( (objDate.getTime()-g_timeStart) /1000 ); if( g_useSec < 1 ) { g_useSec = 1; // 最低1秒とする } } // 手を進める g_mainBoard.movePl1( g_mainBoard.SPMOVE_MOTO, g_mainBoard.SPMOVE_TOKO_TORYO, g_useSec ); setKifuData( g_mainBoard.SPMOVE_MOTO, g_mainBoard.SPMOVE_TOKO_TORYO, g_useSec ); // ローカルストレージに保存 addLocalStorage_gh( g_strGameStartDateTime, document.frmMain.pl.value, document.frmMain.bd.value, document.frmMain.op.value, g_mainBoard.get_tesuu(), g_strGameUserResult ); // 後処理 document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard ); document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard ); document.getElementById( "view_msg" ).innerHTML = "詰みました。"; // ポップアップを出す前に、少しだけ間を開けて詰み形を確認できるようにする。 setTimeout( viewPopup_gameend, 600 ); return; } // 追加メッセージ2 // g_mainBoard.makeKikimap(); // if( g_mainBoard.kikimap_pl2[ g_mainBoard.kikimap_ou_pl1 ] != 0 ) { // document.getElementById( "view_msg" ).innerHTML += "
王手されています。"; // } { //var rndVal = (0.2+1)/2; //if( g_exp_case == "cs2" || g_exp_case == "cs3" ) { // rndVal = Math.random() +0.2; // if( rndVal > 1 ) { // rndVal = 1; // } //} if( g_soundMode == "on" ) { document.getElementById( "put-block" ).volume = 0.5;//rndVal; document.getElementById( "put-block" ).play(); } } } // 思考エンジンの呼出し var g_callAI__op_retry = 0;//////////// function callAI( sb ) { g_strBoardMode = "wait";////////// if( document.frmMain.op.value == "kuraria" || document.frmMain.op.value == "zazaruo" ) { // javascript思考エンジンの場合、サーバ問合せしない document.getElementById( "view_msg" ).innerHTML = "対戦相手の思考中。。
"; delayTime = 400; if( Number(sb.get_tesuu()) < 10 ) { delayTime = 400; } /*if( g_useSec > 5 ) { if( g_exp_case == "exp20191222-cs0" ) { delayTime += 500 *0; } else if( g_exp_case == "exp20191222-cs1" ) { delayTime += 500 *1; } else if( g_exp_case == "exp20191222-cs2" ) { delayTime += 500 *2; } else if( g_exp_case == "exp20191222-cs3" ) { delayTime += 500 *3; } }*/ //setTimeout( actionComPlayer, delayTime, ai_kuraria_main() ); // ↑このコードだと、古いIEで動作しないのでグローバル変数を媒介する。 if( document.frmMain.op.value == "kuraria" ) { g_responseText = ai_kuraria_main(); } else { g_responseText = ai_zazaruo_main();////ザザワムシ } setTimeout( actionComPlayer_delay, delayTime ); return; } var objDate = new Date(); /* var url = "/cmd/thinker-game"; url += "?gamekey=" +g_gamekey; url += "&bd=" +sb.get_bd_webprm(); url += "&sz=" +sb.get_sz_webprm(); url += "&tb=" +sb.get_tb_webprm(); url += "&tw=" +sb.get_tw_webprm(); url += "&pl=" +sb.get_pl_webprm(); url += "&zn=" +sb.get_zn_webprm(); url += "&op=" +document.frmMain.op.value; url += "&mc=" +sb.get_tesuu(); url += "&tm=" +String(g_useSec); url += "&md5_ua=" +document.frmMain.md5_ua.value; url += "&dummy=" + String(objDate.getTime()); */ var url = "/cmd/thinker-game";///////////connectSyougiGameOnWebFree url += "?gamekey=" +g_gamekey;////// url += "&op=" +document.frmMain.op.value; url += "&tm=" +String(g_useSec); url += "&pl=" +sb.get_pl_webprm();/////url += "&pl=w";// url += "&bd=" +sb.get_bd_webprm(); url += "&mc=" +sb.get_tesuu(); url += "&md5_ua=" +document.frmMain.md5_ua.value; url += "&dummy=" + String(objDate.getTime()); if( g_callAI__op_retry != 0 ) { url += "&retry=1"; g_callAI__op_retry = 0; } /////document.getElementById( "view_msg" ).innerHTML = url;return; var objReq = new XMLHttpRequest(); if( null == objReq ) { document.getElementById( "view_msg" ).innerHTML = "申し訳ありません。
\n現在、XMLHttpQequestに未対応のブラウザでは動作しません。"; } objReq.open( "GET", url, true ); objReq.onreadystatechange = function() { document.getElementById( "view_msg" ).innerHTML = "対戦相手の思考中。。
"; if( objReq.readyState == 0 ) { document.getElementById( "view_msg" ).innerHTML += "wait :0"; } else if( objReq.readyState == 1 ) { document.getElementById( "view_msg" ).innerHTML += "wait :1"; } else if( objReq.readyState == 2 ) { document.getElementById( "view_msg" ).innerHTML += "wait :2"; } else if( objReq.readyState == 3 ) { document.getElementById( "view_msg" ).innerHTML += "wait :3"; } else if( objReq.readyState == 4 ) { if( objReq.status == 200 ) { var objDateEnd = new Date(); document.getElementById( "view_msg" ).innerHTML += "wait :4"; document.getElementById( "view_msg" ).innerHTML += "
\n ( return time:" +String( objDateEnd - objDate ) +"ms )"; // 思考結果を反映 //actionComPlayer( objReq.responseText ); // ユーザのうっかり抑止などのため、ディレイ。 /*var delayTime = DEF_DELAY_TIME_BASE -(objDateEnd - objDate); if( sb.get_sz_webprm() == 9 ) { delayTime = delayTime -(DEF_DELAY_TIME_CUTDOWN*2); } else if( sb.get_sz_webprm() == 13 ) { delayTime = delayTime -DEF_DELAY_TIME_CUTDOWN; } if( sb.get_tesuu() <= 4 ) { delayTime = delayTime -DEF_DELAY_TIME_CUTDOWN; } if( delayTime < DEF_DELAY_TIME_MIN ) { delayTime = DEF_DELAY_TIME_MIN; }*/////////// // 2019/12/22コメントアウト //delayTime = 1000; //if( Number(sb.get_tesuu()) < 10 ) { // delayTime = 500; //} delayTime = 800; if( Number(sb.get_tesuu()) < 10 ) { delayTime = 400; } if( g_stressCheck != "ok" ) { delayTime += 800; } /*if( g_useSec > 5 ) { if( g_exp_case == "exp20191222-cs0" ) { delayTime += 500 *0; } else if( g_exp_case == "exp20191222-cs1" ) { delayTime += 500 *1; } else if( g_exp_case == "exp20191222-cs2" ) { delayTime += 500 *2; } else if( g_exp_case == "exp20191222-cs3" ) { delayTime += 500 *3; } ////document.getElementById( "view_msg" ).innerHTML += "
add delayTime
"; }*/ ////document.getElementById( "view_msg" ).innerHTML += "
g_exp_case="+g_exp_case+"
delayTime=" +delayTime +"
"; //{ // var rndVal = 200 +((1000)/2); // if( g_exp_case == "cs1" || g_exp_case == "cs3" ) { // rndVal = 200 +(Math.random() *1000); // } // // delayTime = rndVal; //} //setTimeout( actionComPlayer, delayTime, objReq.responseText ); // ↑このコードだと、古いIEで動作しないのでグローバル変数を媒介する。 g_responseText = objReq.responseText; setTimeout( actionComPlayer_delay, delayTime ); /////参考 :https://developer.mozilla.org/ja/docs/Web/API/window.setTimeout } else { document.getElementById( "view_msg" ).innerHTML = "対戦相手の着手の受信に失敗しました。
"; document.getElementById( "view_msg" ).innerHTML += "ネット接続を確認後、
「再接続 (re-connect) 」を押すと復帰できるかもしれません。"; // ↓再接続ボタンを押せるようにステータス変更////←再接続ボタンを実装したい //document.getElementById( "view_msg" ).innerHTML += "
\nネットにつながっていれば、 [ re-connect ] のボタンを押して再接続できるかも。"; g_strBoardMode = "err"; g_strGameUserResult = "err-net"; } } }; objReq.send( null ); /////参考 :http://hakuhin.jp/js/xmlhttprequest.html /////参考 :http://www.ajaxtower.jp/ini/http/index4.html } function actionHint( strThinkResult ) { document.getElementById( "view_thinklog" ).innerHTML = strThinkResult; var keyVal = new Object(); // 実行結果のデータをkeyごとに、連想配列に格納。 var line = strThinkResult.split( "\n" ); var lineCount; for( lineCount = 0; lineCount < line.length; lineCount++ ) { var items = line[lineCount].split( "=" ); if( items.length >= 2 ) { keyVal[items[0]] = items[1]; } } // エラーチェック if( keyVal["!end"] ) { if( Number(keyVal["!end"]) != 1 ) { // エラー document.getElementById( "view_msg" ).innerHTML += "
\アドバイザ の呼び出しに失敗しました。(end)"; return; } } else { // エラー document.getElementById( "view_msg" ).innerHTML += "
\nアドバイザ の呼び出しに失敗しました。(end)"; return; } keyVal["!ret.moto"] = Number(keyVal["!ret.moto"]); keyVal["!ret.toko"] = Number(keyVal["!ret.toko"]); keyVal["!ret.aa"] = Number(keyVal["!ret.aa"]); // 指し手情報の エラーチェック if( keyVal["!ret.moto"] < 0 || keyVal["!ret.toko"] < 0 ) { document.getElementById( "view_msg" ).innerHTML += "
\nアドバイザ の呼び出しに失敗しました。(err)
" +keyVal["!ret.moto"] +"/" +keyVal["!ret.toko"]; return; } // 評価値のセット var hyouka = 1; if( g_mainBoard.pl == "b" ) { hyouka = keyVal["!ret.aa"]; } else { hyouka = -keyVal["!ret.aa"]; } var wkZibunn = "私"; if( g_hint_adviser.indexOf("ahiru") === 0 ) { wkZibunn = "オレ"; } else if( g_hint_adviser.indexOf("miuka") === 0 ) { wkZibunn = "私"; } var wkGobi = "です"; if( g_hint_adviser.indexOf("ahiru") === 0 ) { wkGobi = "だな"; } else if( g_hint_adviser.indexOf("miuka") === 0 ) { wkGobi = "かな"; } var wkstr = ""; // wkstr += String(keyVal["!ret.moto"]) + " →"; // wkstr += String(keyVal["!ret.toko"]); // アドバイザ情報 if( g_hint_adviser.indexOf("dameko") === 0 ) { //wkstr += "/ja.img/character/dameko-icon.png"; } else if( g_hint_adviser.indexOf("ahiru") === 0 ) { wkstr += "
あひるがあがあじごく"; } else if( g_hint_adviser.indexOf("miuka") === 0 ) { wkstr += "
みう香"; } else if( g_hint_adviser.indexOf("gottani") === 0 ) { //wkstr += "/ja.img/character/gottani-icon.png"; } wkstr += " の考え..
"; // 特殊な着手 if( keyVal["!ret.moto"] == g_mainBoard.SPMOVE_MOTO ) { if( keyVal["!ret.toko"] == g_mainBoard.SPMOVE_TOKO_KACHI ) { // 勝ち宣言 wkstr += "「あなたの勝ちです。」"; } else if( keyVal["!ret.toko"] == g_mainBoard.SPMOVE_TOKO_TORYO ) { // 投了 if( g_hint_adviser.indexOf("ahiru") === 0 ) { wkstr += "「オレなら投了するぞ」"; } else if( g_hint_adviser.indexOf("miuka") === 0 ) { wkstr += "「ごめんなさい。私なら投了」"; } else { wkstr += "「自分なら、投了」"; } } } else { // 普通のアドバイス wkstr += "「" +wkZibunn +"なら、"; wkstr += String( keyVal["!ret.toko"]%100 ); if( keyVal["!ret.moto"] < 100 ) { var koma = g_mainBoard.boardTbl[ keyVal["!ret.moto"] ]; if( koma == g_mainBoard.KOMA_PL1_OUSY ) { wkstr += "王"; } else if( koma == g_mainBoard.KOMA_PL1_HISY ) { wkstr += "飛"; } else if( koma == g_mainBoard.KOMA_PL1_KAKU ) { wkstr += "角"; } else if( koma == g_mainBoard.KOMA_PL1_KINN ) { wkstr += "金"; } else if( koma == g_mainBoard.KOMA_PL1_GINN ) { wkstr += "銀"; } else if( koma == g_mainBoard.KOMA_PL1_KEIM ) { wkstr += "桂"; } else if( koma == g_mainBoard.KOMA_PL1_KYOU ) { wkstr += "香"; } else if( koma == g_mainBoard.KOMA_PL1_HOHE ) { wkstr += "歩"; } else if( koma == g_mainBoard.KOMA_PL1_NRHI ) { wkstr += "龍"; } else if( koma == g_mainBoard.KOMA_PL1_NRKA ) { wkstr += "馬"; } else if( koma == g_mainBoard.KOMA_PL1_NRGI ) { wkstr += "全"; } else if( koma == g_mainBoard.KOMA_PL1_NRKE ) { wkstr += "圭"; } else if( koma == g_mainBoard.KOMA_PL1_NRKY ) { wkstr += "杏"; } else if( koma == g_mainBoard.KOMA_PL1_NRHO ) { wkstr += "と"; } if( keyVal["!ret.toko"] > 100 ) { wkstr += "成"; } wkstr += "(" +String(keyVal["!ret.moto"]) +")"; } else { if( keyVal["!ret.moto"] == 112 ) { wkstr += "飛打"; } else if( keyVal["!ret.moto"] == 113 ) { wkstr += "角打"; } else if( keyVal["!ret.moto"] == 114 ) { wkstr += "金打"; } else if( keyVal["!ret.moto"] == 115 ) { wkstr += "銀打"; } else if( keyVal["!ret.moto"] == 116 ) { wkstr += "桂打"; } else if( keyVal["!ret.moto"] == 117 ) { wkstr += "香打"; } else if( keyVal["!ret.moto"] == 118 ) { wkstr += "歩打"; } } wkstr += " " +wkGobi +"」"; } ///// 評価値のアドバイスも掲載したい // 注意書き if( g_cntUseHint >= g_lmtUseHint ) { wkstr += "
※本対局ではもうヒントは使えません。"; } else { wkstr += "
※現在のヒント利用回数は、" +g_cntUseHint +"/" +g_lmtUseHint +" 回"; } document.getElementById( "view_msg" ).innerHTML = wkstr; //g_strBoardMode = "play"; } function callHintAI( sb ) { // g_strBoardMode = "wait"; var objDate = new Date(); var url = "/cmd/thinker-adviser"; url += "?gamekey=" +g_gamekey;////// url += "&op=" +g_hint_adviser; url += "&pl=b";//url += "&pl=" +sb.get_pl_webprm(); 手前側(先手側)の局面を渡すので手番は常に先手で渡しとする。 url += "&bd=" +sb.get_bd_webprm(); url += "&md5_ua=" +document.frmMain.md5_ua.value; url += "&dummy=" + String(objDate.getTime()); /////document.getElementById( "view_msg" ).innerHTML = url;return; var objReq = new XMLHttpRequest(); if( null == objReq ) { document.getElementById( "view_msg" ).innerHTML = "申し訳ありません。
\n現在、XMLHttpQequestに未対応のブラウザでは動作しません。"; } objReq.open( "GET", url, true ); objReq.onreadystatechange = function() { document.getElementById( "view_msg" ).innerHTML = "アドバイザの思考中。。
"; if( objReq.readyState == 0 ) { document.getElementById( "view_msg" ).innerHTML += "wait :0"; } else if( objReq.readyState == 1 ) { document.getElementById( "view_msg" ).innerHTML += "wait :1"; } else if( objReq.readyState == 2 ) { document.getElementById( "view_msg" ).innerHTML += "wait :2"; } else if( objReq.readyState == 3 ) { document.getElementById( "view_msg" ).innerHTML += "wait :3"; } else if( objReq.readyState == 4 ) { if( objReq.status == 200 ) { var objDateEnd = new Date(); // 成功 document.getElementById( "view_msg" ).innerHTML += "wait :4"; document.getElementById( "view_msg" ).innerHTML += "
\n ( return time:" +String( objDateEnd - objDate ) +"ms )"; // ヒントメッセージを出す actionHint( objReq.responseText ); } else { // 失敗 document.getElementById( "view_msg" ).innerHTML = "ネット接続の問題で、
ヒントの呼び出しに失敗しました。"; } } }; objReq.send( null ); } function setKifuData( moto, toko, time ) { g_arSyougiKifu[g_countSyougiKifu] = new QinoaSyougiBoard( document.frmMain.bd.value ); g_arSyougiKifu[g_countSyougiKifu].clearBoard_webprm( g_mainBoard.get_bd_webprm(), g_mainBoard.get_pl_webprm(), g_mainBoard.get_zn_webprm() ); g_arSyougiKifu[g_countSyougiKifu].tesuu = g_mainBoard.tesuu; g_arSyougiKifu[g_countSyougiKifu].useSecSumB = g_mainBoard.useSecSumB; g_arSyougiKifu[g_countSyougiKifu].useSecSumW = g_mainBoard.useSecSumW; g_arKifu_moto[g_countSyougiKifu] = moto; g_arKifu_toko[g_countSyougiKifu] = toko; g_arKifu_time[g_countSyougiKifu] = time; g_countSyougiKifu++; g_pointKifuRead = g_countSyougiKifu -1; } //function addLocalStorage_gh( prm_sd, prm_sz, prm_pl, prm_bd, prm_op, prm_mc, prm_ur ) { function addLocalStorage_gh( prm_sd, prm_pl, prm_bd, prm_op, prm_mc, prm_ur ) { //alert( "addLocalStorage_gh " +prm_sd ); if( g_flgRecoadGame != 1 ) { return false; } prm_bd = "";//特殊局面開始の時のは、対局記録につけないようにする。の安全弁 if( g_strGameStartDateTime == "unknown" ) { return false; } if( g_strGameStartDateTime == "" ) { return false; } if( window.localStorage ) { var num = 1; var indexUpdate = -1; // 開始日時が一致するデータがあれば、そのレコードをアップデートする for( num = 0; num < DEF_GH_LIST_MAX; num++ ) { if( window.localStorage.getItem("gh" +num +".sd") ) { if( prm_sd == window.localStorage.getItem("gh" +num +".sd") ) { indexUpdate = num; break; } } else { break; } } if( indexUpdate != -1 ) { var wk_ur = window.localStorage.getItem("gh"+indexUpdate+".ur"); window.localStorage.setItem( "gh"+indexUpdate+".sd", prm_sd );//開始日時 //window.localStorage.setItem( "gh"+indexUpdate+".ed", prm_ed );//終了日時 // window.localStorage.setItem( "gh"+indexUpdate+".sz", prm_sz );//サイズ window.localStorage.setItem( "gh"+indexUpdate+".pl", prm_pl );//先後 window.localStorage.setItem( "gh"+indexUpdate+".bd", prm_bd );//手合い window.localStorage.setItem( "gh"+indexUpdate+".op", prm_op );//対戦相手 //window.localStorage.setItem( "gh"+indexUpdate+".lv", prm_lv );//レベル window.localStorage.setItem( "gh"+indexUpdate+".mc", prm_mc );//手数 window.localStorage.setItem( "gh"+indexUpdate+".ur", prm_ur );//ステータス // 勝敗カウント if( wk_ur == "live" ) {//←呼び出し側ミスによる2重カウントの安全弁 if( prm_ur == "win" ) { var wkCount = Number(window.localStorage.getItem("gh.wc")) +1; window.localStorage.setItem( "gh.wc", wkCount ); } else if( prm_ur == "lose" ) { var wkCount = Number(window.localStorage.getItem("gh.lc")) +1; window.localStorage.setItem( "gh.lc", wkCount ); } else if( prm_ur == "drawn" || prm_ur == "stop" ) { var wkCount = Number(window.localStorage.getItem("gh.dc")) +1; window.localStorage.setItem( "gh.dc", wkCount ); } } return false; } // 開始日時が一致するデータがなければ、リストに追加する for( num = DEF_GH_LIST_MAX-1; num >= 1; num-- ) { var key_gh = "gh" +num; var key_m_gh = "gh" +(num-1); if( window.localStorage.getItem(key_m_gh +".sd") ) { if( window.localStorage.getItem(key_m_gh +".sd") == "" ) { continue; } } else { continue; } window.localStorage.setItem( key_gh+".sd", window.localStorage.getItem(key_m_gh +".sd") ); //window.localStorage.setItem( key_gh+".ed", window.localStorage.getItem(key_m_gh +".ed") ); window.localStorage.setItem( key_gh+".sz", window.localStorage.getItem(key_m_gh +".sz") ); window.localStorage.setItem( key_gh+".pl", window.localStorage.getItem(key_m_gh +".pl") ); window.localStorage.setItem( key_gh+".bd", window.localStorage.getItem(key_m_gh +".bd") ); window.localStorage.setItem( key_gh+".op", window.localStorage.getItem(key_m_gh +".op") ); //window.localStorage.setItem( key_gh+".lv", window.localStorage.getItem(key_m_gh +".lv") ); window.localStorage.setItem( key_gh+".mc", window.localStorage.getItem(key_m_gh +".mc") ); window.localStorage.setItem( key_gh+".ur", window.localStorage.getItem(key_m_gh +".ur") ); } window.localStorage.setItem( "gh0.sd", prm_sd );//開始日時 //window.localStorage.setItem( "gh0.ed", prm_ed );//終了日時 // window.localStorage.setItem( "gh0.sz", prm_sz );//サイズ window.localStorage.setItem( "gh0.pl", prm_pl );//先後 window.localStorage.setItem( "gh0.bd", prm_bd );//手合い window.localStorage.setItem( "gh0.op", prm_op );//対戦相手 //window.localStorage.setItem( "gh0.lv", prm_lv );//レベル window.localStorage.setItem( "gh0.mc", prm_mc );//手数 window.localStorage.setItem( "gh0.ur", prm_ur );//ステータス // 全カウント系 if( window.localStorage.getItem("gh.gc") ) { //ゲームカウント 加算 var wkGameCount = Number(window.localStorage.getItem("gh.gc")) +1; window.localStorage.setItem( "gh.gc", wkGameCount ); } else { //ゲームカウント 追加 window.localStorage.setItem( "gh.gc", 1 ); window.localStorage.setItem( "gh.wc", 0 ); window.localStorage.setItem( "gh.lc", 0 ); window.localStorage.setItem( "gh.dc", 0 ); window.localStorage.setItem( "gh.sd", prm_sd ); } if( prm_ur == "win" ) { var wkCount = Number(window.localStorage.getItem("gh.wc")) +1; window.localStorage.setItem( "gh.wc", wkCount ); } else if( prm_ur == "lose" ) { var wkCount = Number(window.localStorage.getItem("gh.lc")) +1; window.localStorage.setItem( "gh.lc", wkCount ); } else if( prm_ur == "drawn" || prm_ur == "stop" ) { var wkCount = Number(window.localStorage.getItem("gh.dc")) +1; window.localStorage.setItem( "gh.dc", wkCount ); } } else { // ストレージが動作しない時は何もしない。 } return false; } //////------------------------------------------------- // ▼初期処理 // パラメータのセット ////var g_op_name = "対戦相手"; { var prm_bd = String("![usr.get.bd]"); var prm_pl = String("b"); var prm_op = String("miuka-c3"); //////パラメータチェックをしたい if( prm_bd.length == 95 ) { document.frmMain.bd.value = prm_bd; } else { document.frmMain.bd.value = "HIRATE";//// } if( prm_pl == "b" || prm_pl == "w" ) { document.frmMain.pl.value = prm_pl; } if( prm_op.length < 32 ) { document.frmMain.op.value = prm_op; } } // 将棋盤を作成 var g_mainBoard = new QinoaSyougiBoard( document.frmMain.bd.value ); // 盤面モード var g_strBoardMode = "start"; // 操作中にて選択ポイントの保持 var g_pntSelect = 0; // ゲームキー var g_gamekey = "unknown"; //// var g_strName_b = "name b"; var g_strName_w = "name w"; //// var g_arSyougiKifu = new Array(); var g_arKifu_moto = new Array(); var g_arKifu_toko = new Array(); var g_arKifu_time = new Array(); var g_countSyougiKifu = 0; //棋譜データの数 var g_pointKifuRead = 0; //棋譜を再生する場合にて、その再生位置 //// var g_strGameStartDateTime = "unknown"; //開始日時 var g_strGameEndDateTime = "unknown"; //終了日時 var g_strGameUserResult = "live"; //// var g_playCheck = "ok"; // 対局可能チェック var g_stressCheck = "ok"; // サーバストレスチェック var g_timeStart = -1; // 思考時間計測用 var g_useSec = 1; var g_hint_adviser = "miuka-c2"; var g_flgUseUndo = 0; var g_cntUseHint = 0; var g_flgRecoadGame = 0; //記録モード var g_lmtUseHint = 1; //ヒントの利用可能数 var g_arActKoma = new Array(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); //駒の活躍カウント var g_aiLog = new Array(); var g_aiLogLen = 0; // exp var g_exp_case = ""; /*var g_exp_case = "cs0"; { var wk = Math.floor(Math.random()*4); if( wk == 0 ) { g_exp_case = "cs0"; } else if( wk == 1 ) { g_exp_case = "cs1"; } else if( wk == 2 ) { g_exp_case = "cs2"; } else if( wk == 3 ) { g_exp_case = "cs3"; } }*/ /*{ var wk = Math.floor(Math.random()*4); if( wk == 0 ) { g_exp_case = "exp20191222-cs0"; } else if( wk == 1 ) { g_exp_case = "exp20191222-cs1"; } else if( wk == 2 ) { g_exp_case = "exp20191222-cs2"; } else if( wk == 3 ) { g_exp_case = "exp20191222-cs3"; } }*/ // sound { if( window.localStorage ) { if( window.localStorage.getItem("snd") ) { g_soundMode = window.localStorage.getItem("snd"); if( g_soundMode != "on" ) { g_soundMode = "off"; } } } viewSoundMode(); } setKifuData( g_mainBoard.SPMOVE_MOTO, g_mainBoard.SPMOVE_TOKO_PASS, 0 ); // 盤面を描写 document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard ); document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard ); // 記録モードの設定 if( document.frmMain.bd.value === "" || document.frmMain.bd.value === "HIRATE" ) { g_flgRecoadGame = 1; } // アドバイザの設定 { var wk = document.frmMain.op.value; if( wk.indexOf("dameko") === 0 || wk.indexOf("kukkiee") === 0 || wk.indexOf("kuraria") === 0 || wk.indexOf("zazaruo") === 0 ) { // だめ子と、クッキー、クラリアの時は、あひるがアドバイス & ヒント利用制限をゆるめる g_hint_adviser = "ahiru-c2"; g_lmtUseHint = 7; } } // キーボードの動作を登録 window.document.onkeydown = eventKeydown; if( g_playCheck != "ok" ) { g_strBoardMode = "wait"; document.getElementById( "view_board" ).innerHTML = ""; document.getElementById( "view_board" ).innerHTML += "
";
document.getElementById( "view_board" ).innerHTML += "現在、サーバの負荷が高すぎます。
\n";
document.getElementById( "view_board" ).innerHTML += "大変申し訳ございませんが、
しばらく待ってから再度対局申し込みしてください。
\n";
document.getElementById( "view_board" ).innerHTML += "
\n"; document.getElementById( "view_board" ).innerHTML += "Sorry, Server is stress state.
\n"; document.getElementById( "view_board" ).innerHTML += "There are currently too many behalf.
\n"; document.getElementById( "view_board" ).innerHTML += "From the browser's back button,
please wait a moment and re-apply game.
\n"; document.getElementById( "view_board" ).innerHTML += ""; document.getElementById( "view_msg" ).innerHTML = "お手数かけますが、トップページから対局画面を起動してください。
\n Sorry for Server Err.."; } else if( 0 ) {//// //// パラメータエラー ////未実装 } else { if( document.frmMain.pl.value == "b" ) { g_strBoardMode = "play"; g_strName_b = "guest"; g_strName_w = document.frmMain.op.value; viewInfo_setImgTag( g_strName_b, "b" ); viewInfo_setImgTag( g_strName_w, "w" ); document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard ); document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard ); document.getElementById( "view_msg" ).innerHTML = "あなたの先手。
何か指すと対局開始されます。"; } else if( document.frmMain.pl.value == "w" ) { g_strBoardMode = "start"; g_strName_b = document.frmMain.op.value; g_strName_w = "guest"; viewInfo_setImgTag( g_strName_b, "b" ); viewInfo_setImgTag( g_strName_w, "w" ); document.getElementById( "view_board" ).innerHTML = viewBoard( g_mainBoard ); document.getElementById( "view_info" ).innerHTML = viewInfo( g_mainBoard ); document.getElementById( "view_msg" ).innerHTML = "あなたの後手。
[ start ] を押すと対局開始!"; } else { g_strBoardMode = "wait"; document.getElementById( "view_msg" ).innerHTML = "お手数かけますが、トップページから対局画面を起動してください。
\n Sorry for Parameter Err..(pl)"; } } //document.getElementById( "view_msg" ).innerHTML += "
g_exp_case = " +g_exp_case; // -->
この局面からの対局は、面白いまたは練習などになりましたか?
|
|
ヘルプ
- きのあ将棋は無料で対局して遊べます。
- 将棋のルールを知らない、知ってるけど自信がない人は、将棋入門遊び方講座 をどうぞ。
- 対局するには、cookie、javascriptを有効にする必要があります。
- うまく動作しないときは、トップページからページを再表示してください。
- それでも動作しないときは、最新のブラウザや別のブラウザをお試しください。
- ネット接続によるエラーが発生した時は、再接続ボタンで復帰できる可能性があります。
- good/bad投稿は、対局開始局面ごとに1日1回の投稿が有効となります。
- good/bad投稿は、匿名で扱われます。
- good/bad投稿は、投稿時のページ表示時間などの情報が送信されます。
- good/bad投稿は、思考エンジン研究やサービス改善のために利用します。
- 待ったは、1局1回のみ。
- ヒントアドバイスは「入門者向け」のみ1局7回。それ以外では1局1回使うことができます。
- マイページの「あなたの対局履歴」は、通常対局(平手)のみが記録対象です。
- マイページの「あなたの対局履歴」は、詰将棋、寄せ合い将棋などは記録されません。
- マイページの「あなたの対局履歴」は、ローカル(利用端末)に保存されます。
- マイページの「あなたの対局履歴」は、サーバに存在しません。
- マイページの「あなたの対局履歴」は、キャッシュクリアで削除される可能性があります。
- サーバ高負荷時には、相手の応手が遅くなることがあります。
- 相手の応手が遅くなったとしても、同じ対戦相手であれば強さや棋風に変化はありません。
キャラクタごとの思考エンジンについて詳しく知りたい方は、キャラクタたちの強さ設定を読んでね。
↑の情報は古いです。余力のある時に書き直します。2011/11/10からの対局棋譜は、サーバに研究・サービス利用などの目的で匿名保存されます。
↑の情報は古いです。現在はサーバ容量問題で棋譜保存はしていません。