ワンボタンで監督始点の高校野球の試合を楽しめる名将と呼ばれた者達。その試合中には、多くのアルゴリズムが活躍しています。
ここでは、試合の設計を理解することで強いチームを作る指針を記載しておきます。
ソースコードからMeisyoの基礎設計を学び、どこに確定・不確定要素があるのか把握することで一歩先のゲームが楽しめます。
全ソースコード(2018.09.22)
3000行近くあり長過ぎるので見るのはあまりおすすめしません。次の概要で説明します。
// 試合前ゲームデータ設定 $G = []; // ゲームデータ $G['id_o'] = $OD['id']; $G['id_u'] = $UD['id']; # 基礎係数 $G['c_g'] = 9.81; #重力加速度 $G['c_cor'] = 0.45; #反発係数 # 道具設定 $G['bl_r'] = 3.65; #ボール 半径(cm) $G['bl_wg'] = 142; #ボール 重量(g) $G['bt_r'] = 3.3; #バット 半径(cm) $G['bt_center'] = 95; #バット 根元から芯まで(cm) $G['bt_meet'] = 7; #バット ミートポイント幅(cm) $G['bt_wg'] = 900; #バット 重量(g) # ランナー $G['rn_c'] = 7; #ランナー打撃時リード基礎値(m) # 球場 $G['bp_name'] = '地方球場'; $G['bp_fe_c'] = 115; #フェンス センター(m) $G['bp_fe_w'] = 100; #フェンス 両翼(m) $G['bp_fe_h'] = 5; #フェンス 高さ(m) $G['bp_cor'] = 0.31; #グランド 反発係数 $G['bp_corf'] = 0.35; #フェンス 反発係数 $G['bp_corz'] = 0.95; #摩擦 # 守備位置(x,y)(m) $G['bp_dpos'] = [ '1' => '0,15', '2' => '0,-0.5', '3' => '15.40,17.40', '4' => '11.7,31.10', '5' => '-15.40,17.40', '6' => '-11.7,31.10', '7' => '-36.79,64.67', '8' => '0,80', '9' => '36.79,64.47' ]; # ベース位置(x,y)(m) $G['base_l'] = 27.431; $G['base_hdg'] = $G['base_l'] * cos(deg2rad(45)); $G['bp_base'] = [ '0' => '0,0', '1' => $G['base_hdg'] . ',' . $G['base_hdg'], '2' => '0,' . ($G['base_hdg']*2), '3' => (-$G['base_hdg']) . ',' . $G['base_hdg'] ]; $G['base'] = $G['baseH'] = $G['baseG'] = $G['base_no'] = $G['base_cid'] = [ '1' => '', '2' => '', '3' => '' ]; # 試合データ $G['in'] = 1; #イニング $G['side'] = 'o'; #攻撃サイド o,u $G['c_s'] = 0; #カウント ストライク $G['c_b'] = 0; #カウント ボール $G['c_o'] = 0; #カウント アウト $G['in_c'] = 0; #イニング開始確認用 $G['in_op'] = 'u'; #イニング反対 # 打順 $G['bt_o'] = $G['bt_u'] = $G['bt_n'] = 0; $G['pc_o'] = $G['pc_u'] = $G['pc_n'] = 0; # 得点等集計 $G['pt_o'] = $G['pt_u'] = 0; #得点(総) $G['pt_o_in'] = $G['pt_u_in'] = []; #得点(イニング) $G['hit_o'] = $G['hit_u'] = 0; #ヒット(総) $G['hit_o_in'] = $G['hit_u_in'] = []; #ヒット(イニング) $G['er_o'] = $G['er_u'] = 0; #エラー(総) # 動的データ定義 $G['pc'] = $G['bt'] = $G['df'] = $G['at'] = []; // 各データ格納 $G['at_ar'] = $G['df_ar'] = []; // カード情報 $G['at_b'] = $G['df_b'] = $G['at_bc'] = $G['df_bc'] = []; // 打順データ(基本、c:交代データ) $G['at_d'] = $G['df_d'] = []; // 守備位置データ $G['pc_id'] = null; $G['pt_oH'] = $G['pt_uH'] = 0; // 点数データ(以前) $G['j_bc'] = $G['get_pt'] = 0; $G['pc_pc'] = []; // 投手配球ログ $G['pc_hp'] = []; // HP対応 $G['pc_pc']['o'] = $G['pc_pc']['u'] = []; # BT $G['bt_res'] = $G['pc_res'] = []; $G['bt_res']['o'] = $G['bt_res']['u'] = []; $G['pc_res']['o'] = $G['pc_res']['u'] = []; $G['btr_o'] = $G['btr_u'] = 0; # その他 $G['sv_l_o'] = $G['sv_r_o'] = $G['sv_l_u'] = $G['sv_r_u'] = null; $G['win_side'] = $G['win_id'] = $G['lose_id'] = null; //------------------------------------------------------------// // 試合開始 //------------------------------------------------------------// $html .= "<div class=desc><b style='color:red;'>プレイボール!</b>"; $html .= "<table class='score_board' width=100% style='border:none;'>\n"; $html .= "<tr>"; $html .= "<td rowspan=2><img src='" . $this->_disp_flag($OD['team_flag']) . "' style='height:60px; width:60px; vertical-align:middle;'> <img src='" . $this->_disp_icon($OD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'></td>"; $html .= "<td colspan=3><font style='font-size:40px;'>{$G['pt_o']} - {$G['pt_u']}</font></td>"; $html .= "<td rowspan=2><img src='" . $this->_disp_icon($UD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'> <img src='" . $this->_disp_flag($UD['team_flag']) . "' style='height:60px; width:60px; vertical-align:middle;'></td></tr>"; $html .= "<tr><td width=100><<</td><td width=150>1回オモテ</td><td width=100> </td></tr>"; $html .= "</table></div>\n"; // while $G['i'] = 0; while($G['i'] < 1000) // $G['i'] < 1000 { //------------------------------------------------------------// // イニング開始 //------------------------------------------------------------// if(!$G['in_c']) { # 得点取得 $G['pt_oH'] = $G['pt_o']; $G['pt_uH'] = $G['pt_u']; # 選手読み込み if($G['side'] == 'o') { # 守備=>U $G['df'] = $UD; $G['df_ar'] = $UCs; $G['df_b'] = $UD_B; $G['df_bc'] = $UD_BC; $G['df_d'] = $UD_D; # 攻撃=>O $G['at'] = $OD; $G['at_ar'] = $OCs; $G['at_b'] = $OD_B; $G['at_bc'] = $OD_BC; $G['at_d'] = $OD_D; # 表示 $G['in_op'] = 'u'; # イニング反対 $html .= "<div class='game_o'>"; } else { # 守備=>O $G['df'] = $OD; $G['df_ar'] = $OCs; $G['df_b'] = $OD_B; $G['df_bc'] = $OD_BC; $G['df_d'] = $OD_D; # 攻撃=>U $G['at'] = $UD; $G['at_ar'] = $UCs; $G['at_b'] = $UD_B; $G['at_bc'] = $UD_BC; $G['at_d'] = $UD_D; # 表示 $G['in_op'] = 'o'; # イニング反対 $html .= "<div class='game_u'>"; } # 投手読み込み $G['pc'] = $G['df_ar'][$G['df_d'][1]]; $G['pc_id'] = $G['pc']['id']; # 打者読み込み $G['bt'] = $G['at_ar'][$G['at_b'][$G['bt_n']]]; $G['team_sb'] = $G['at']['team_sb']; # イニング交代チェックOK $G['in_c'] = 1; } //------------------------------------------------------------// // 投手設定 //------------------------------------------------------------// // 配球結果呼び出し $G['pc_bb'] = ['0'=>0, '1'=>0, '2'=>0, '3'=>0]; if(empty($G['pc_pc'][$G['in_op']][$G['pc_id']])){ $G['pc_pc'][$G['in_op']][$G['pc_id']] = ['0'=>0,'1'=>0,'2'=>0,'3'=>0]; } $G['pc_bb'] = $G['pc_pc'][$G['in_op']][$G['pc_id']]; // 起用法呼び出し $G['pc_ptype'] = explode(",", $G['pc']['pc_type']); // 投手HPパーセント計算 $G['pc_hp_per'] = $this->_game_pc_hpp($G['pc']['S_p_st'], $G['pc']['hp'], ($G['pc_bb'][0] + $G['pc_bb'][1] + $G['pc_bb'][2] + $G['pc_bb'][3])); //------------------------------------------------------------// // 塁設定 //------------------------------------------------------------// $G['baseH'] = $G['base']; // 移動前保存 for($i=1; $i<=3; $i++) { if(!empty($G['baseH'][$i])) { $G['baseG'] = explode(",", $G['baseH'][$i]); $G['base_no'][$i] = $G['baseG'][0]; $G['base_cid'][$i] = $G['baseG'][1]; # ランナー設定 $G['rn'][$i] = $G['at_ar'][$G['baseG'][0]]; //$html .= "({$i}){$G['rn'][$i]['name']}\n"; } else { $G['rn'][$i] = []; } } //------------------------------------------------------------// // 交代 / 打者・状況説明表示 //------------------------------------------------------------// if($G['c_s'] == 0 && $G['c_b'] == 0) { //------------------------------// // 継投 //------------------------------// $G['ch_pc'] = $G['ch_pc_ar'] = []; foreach($G['df_ar'] as $id => $CD) { if(!$CD['game'] && $CD['g_bench'] && $CD['type'] == 'P') { $CD_PTYPE = explode(",", $CD['pc_type']); // 起用法呼び出し $ch_pc_per = $this->_game_pc_hpp($CD['S_p_st'], $CD['hp']); if($G['in'] < $CD_PTYPE[3] || $G['in'] > $CD_PTYPE[5] || $ch_pc_per < $CD_PTYPE[2] || !$CD_PTYPE[0]){ continue; } // 条件一致(SV別) if($CD_PTYPE[0] == 'SV' && $G['side'] != $G['win_side'] && $G['win_side'] && ((abs($G['pt_o'] - $G['pt_u']) <= 3 && $G['c_o'] == 0) || (abs($G['pt_o'] - $G['pt_u']) < count($G['base']) + 2) || ((9 - $G['in']) * 3 + 3 - $G['c_o'] >= 9))) // SV { $html .= "<!--SV:{$CD['name']}-->"; } else { if($G['in'] >= $G['pc_ptype'][5] || $G['pc_hp_per'] <= $G['pc_ptype'][4]) // 交代投手確認 { // 条件一致 if($CD_PTYPE[0] == 'R') { $html .= "<!--継投:{$CD['name']}-->"; } elseif($CD_PTYPE[0] == 'P' && (!empty($G['base'][2]) || !empty($G['base'][3]))) { $html .= "<!--ピンチ:{$CD['name']}-->"; } elseif($CD_PTYPE[0] == 'L' && $G['side'] == $G['win_side'] && $G['win_side']) { $html .= "<!--敗戦:{$CD['name']}-->"; } elseif($CD_PTYPE[0] == 'W' && $G['side'] != $G['win_side'] && $G['win_side'] && abs($G['pt_o'] - $G['pt_u']) <= 3) { $html .= "<!--接戦:{$CD['name']}-->"; } else { continue; } } else { continue; } } $G['ch_pc_ar'][$CD_PTYPE[0]] = $CD['id']; // 継投リスト化 } } // 継投リストがあれば表示 if(count($G['ch_pc_ar']) > 0) { asort($G['ch_pc_ar']); foreach($G['ch_pc_ar'] as $ap => $ch_id) // 優先度=>id { $CD_C = $G['df_ar'][$G['pc']['id']]; // 交代id $CD_S = $G['df_ar'][$ch_id]; // 出場id $CD_S['g_pos'] = $CD_C['g_pos']; // PC $G['pc'] = $CD_S; $G['pc_id'] = $G['pc']['id']; $G['pc_ptype'] = explode(",", $G['pc']['pc_type']); $G['pc_hp_per'] = $this->_game_pc_hpp($G['pc']['S_p_st'], $G['pc']['hp'], 0); $html .= "<strong>ここで投手の交代です。" .$this->_disp_name($CD_C). "に代わり" .$this->_disp_name($CD_S). "。</strong><br>\n"; // 交代ログ $this->_game_pl_change($G, $G['df'], $G['df_ar'], $G['df_d'], $G['df_b'], $G['df_bc'], $CD_C, $CD_S, $G['in_op'], 'df', 'R'); break; } } //------------------------------// // 代打/代走 //------------------------------// $G['ch_bt'] = $G['ch_bt_ar'] = []; foreach($G['at_ar'] as $id => $CD) { if(!$CD['game'] && $CD['g_bench'] && !$CD['g_pos'] && $CD['type'] == 'B') { $CD_BTYPE = explode(",", $CD['bt_type']); // 起用法呼び出し if($G['in'] < $CD_BTYPE[3] || empty($CD_BTYPE[3])){ continue; } // 代打 if($CD_BTYPE[5] && ($G['bt']['id'] == $CD_BTYPE[4] || ($CD_BTYPE[4] == 'pitch' && $G['bt']['type'] == 'P'))) { if(!empty($G['ch_bt'][$G['bt']['id']])) // 優先度判定 { $G['ch_bt_ar'] = explode(",", $G['ch_bt'][$G['bt']['id']]); if($CD_BTYPE[2] < $G['ch_bt_ar'][1]) // 優先度優位 { $G['ch_bt'][$G['bt']['id']] = "{$CD['id']},{$CD_BTYPE[2]},bt"; } } else { $G['ch_bt'][$G['bt']['id']] = "{$CD['id']},{$CD_BTYPE[2]},bt"; // 交代対象 => 交代,優先度 } } // 代走 if($CD_BTYPE[6]) { // 1,2,3塁 for($i=1; $i<=3; $i++) { if(!empty($G['rn'][$i]) && ($G['rn'][$i]['id'] == $CD_BTYPE[4] || ($CD_BTYPE[4] == 'pitch' && $G['rn'][$i]['type'] == 'P'))) { if(!empty($G['ch_bt'][$G['rn'][$i]['id']])) // 優先度判定 { $G['ch_bt_ar'] = explode(",", $G['ch_bt'][$G['rn'][$i]['id']]); if($CD_BTYPE[2] < $G['ch_bt_ar'][1]) // 優先度優位 { $G['ch_bt'][$G['rn'][$i]['id']] = "{$CD['id']},{$CD_BTYPE[2]},rn,{$i}"; } } else { $G['ch_bt'][$G['rn'][$i]['id']] = "{$CD['id']},{$CD_BTYPE[2]},rn,{$i}"; } } } } } } // 代打 if(count($G['ch_bt']) > 0) { foreach($G['ch_bt'] as $ch_id => $str) { $G['ch_bt_ar'] = explode(",", $str); // 交代開始 $CD_C = $G['at_ar'][$ch_id]; // 交代 $CD_S = $G['at_ar'][$G['ch_bt_ar'][0]]; // 出場 $CD_S['g_pos'] = $CD_C['g_pos']; // 条件変更 if($G['ch_bt_ar'][2] == 'bt') // 代打 { $G['bt'] = $CD_S; // 打者交代 $html .= "<strong>ここで代打です。" .$this->_disp_name($CD_C). "に代わり" .$this->_disp_name($CD_S). "。</strong><br>\n"; $RS = '打'; } elseif($G['ch_bt_ar'][2] == 'rn') // 代走 { $G['rn'][$G['ch_bt_ar'][3]] = $CD_S; // 走者交代 $html .= "<strong>ここで代走です。{$G['ch_bt_ar'][3]}塁ランナー" .$this->_disp_name($CD_C). "に代わり" .$this->_disp_name($CD_S). "。</strong><br>\n"; $RS = '走'; } // 交代ログ $this->_game_pl_change($G, $G['at'], $G['at_ar'], $G['at_d'], $G['at_b'], $G['at_bc'], $CD_C, $CD_S, $G['side'], 'at', $RS); break; } } //------------------------------// // 守備固め //------------------------------// $G['ch_df'] = $G['ch_df_ar'] = []; foreach($G['df_ar'] as $id => $CD) { if(!$CD['game'] && $CD['g_bench'] && !$CD['g_pos'] && $CD['type'] == 'B') { $CD_BTYPE = explode(",", $CD['bt_type']); // 起用法呼び出し if($G['in'] < $CD_BTYPE[3] || empty($CD_BTYPE[3]) || empty($CD_BTYPE[7]) || empty($CD_BTYPE[4])){ continue; } // 対象者取得 for($i=1; $i<=9; $i++) { if($G['df_id'][$i] == $CD_BTYPE[4]) { if(!empty($G['ch_df'][$CD_BTYPE[4]])) // 優先度判定 { $G['ch_df_ar'] = explode(",", $G['ch_df'][$CD_BTYPE[4]]); if($CD_BTYPE[2] < $G['ch_df_ar'][1]) // 優先度優位 { $G['ch_df'][$CD_BTYPE[4]] = "{$CD['id']},{$CD_BTYPE[2]}"; } } else // そのまま登録 { $G['ch_df'][$CD_BTYPE[4]] = "{$CD['id']},{$CD_BTYPE[2]}"; // 交代対象 => 交代,優先度 } } } } } // 対象サーチ if(count($G['ch_df']) > 0) { $html .= "<strong>ここで守備を交代するようです。<br>\n"; foreach($G['ch_df'] as $ch_id => $str) { $G['ch_df_ar'] = explode(",", $str); // 交代開始 $CD_C = $G['df_ar'][$ch_id]; // 交代 $CD_S = $G['df_ar'][$G['ch_df_ar'][0]]; // 出場 $CD_S['g_pos'] = $CD_C['g_pos']; if($CD_C['type'] == 'P'){ continue; } // 投手は守備固めで交代できない // 交代ログ $this->_game_pl_change($G, $G['df'], $G['df_ar'], $G['df_d'], $G['df_b'], $G['df_bc'], $CD_C, $CD_S, $G['in_op'], 'df', '守'); // 表示 $PL = explode(",", $cf['pos_list'][$CD_S['g_pos']]); $html .= "{$PL[1]}を" .$this->_disp_name($CD_C). "から" .$this->_disp_name($CD_S). "に交代します。"; } $html .= "</strong><br>\n"; } //------------------------------// // 走者表示 //------------------------------// $html_run = null; for($i=1; $i<=3; $i++) { if(!empty($G['base'][$i])) { if($html_run){ $html_run .= "・";} $html_run .= $i; } } if($html_run) { if(!empty($G['base'][1]) && !empty($G['base'][2]) && !empty($G['base'][3])) { $html_run = "満塁"; } else { $html_run .= "塁"; } } else { $html_run = "なし"; } # アウト $html_out = null; if($G['c_o'] == 2){ $html_out = "ツー"; } elseif($G['c_o'] == 1){ $html_out = "ワン"; } else{ $html_out = "ノー"; } # 表示 $html .= "バッター" .$this->_disp_name($G['bt']). " {$html_out}アウトランナー{$html_run}<br>\n"; } //------------------------------------------------------------// // PC投球 //------------------------------------------------------------// // HP補正値計算 if($G['pc_hp_per'] >= 30) { $G['pc_hp_cor'] = $G['pc_hp_per'] / 700 + 6 / 7; } else { $G['pc_hp_cor'] = $G['pc_hp_per'] * 0.03; } if($G['pc_hp_cor'] < 0){ $G['pc_hp_cor'] = 0; } // 補正実行 $G['pc_hp_ar'] = ['S_p_sp', 'S_p_co', 'S_p_bb1n', 'S_p_bb2n', 'S_p_bb3n', 'p_bb0k', 'p_bb1k', 'p_bb2k', 'p_bb3k']; foreach($G['pc_hp_ar'] as $str) { $G['pc'][$str] = $G['pc'][$str] * $G['pc_hp_cor']; } # bag # $html .= "ピッチャー" .$this->_disp_name($G['pc']). "残りHP:" .floor($G['pc_hp_per']). ", 補正:" . $G['pc_hp_cor'] . "<br>\n"; //------------------------------// // コース選択 //------------------------------// # X $G['pc_xH'] = mt_rand(0, 75 * 1000)/10000 + 13.8; if(mt_rand(1,2) >= 2){ $G['pc_xH'] = -$G['pc_xH']; } # Y $G['pc_yH'] = mt_rand(0, 75 * 1000)/10000 + 22.5; if(mt_rand(1,2) >= 2){ $G['pc_yH'] = 75 + $G['pc_yH']; } else{ $G['pc_yH'] = 75 - $G['pc_yH']; } # Z $G['pc_zH'] = 43.2; //------------------------------// // 球種選択 //------------------------------// // 配球比率設定 if($G['pc']['pc_type']) // 手動 { $G['pc_brA'] = [$G['pc_ptype'][6], $G['pc_ptype'][7], $G['pc_ptype'][8], $G['pc_ptype'][9]]; } else // 自動(ランダム)# 3,1,1,1 { $G['pc_brA'] = [3,1,1,1]; } // 全体 $G['pc_br_all'] = $G['pc_brA'][0] + $G['pc_brA'][1] + $G['pc_brA'][2] + $G['pc_brA'][3]; $G['pc_brR'] = mt_rand(0, $G['pc_br_all']); for($i=0; $i<count($G['pc_brA']); $i++) { $G['pc_brR'] -= $G['pc_brA'][$i]; if($G['pc_brR'] <= 0) { $G['pc_br'] = $i; break; } } //------------------------------// // 投球座標設定 //------------------------------// $G['pcfm_xy'] = explode(",", $cf['pcfm_xy_list'][$G['pc']['type_p']]); # Z $G['pc_zS'] = 1844 - 120; # X if($G['pc']['side_p'] == 'R') { $G['pc_xS'] = -$G['pcfm_xy'][0]; } else { $G['pc_xS'] = $G['pcfm_xy'][0]; } # Y $G['pc_yS'] = $G['pcfm_xy'][1]; //------------------------------// // 初速設定 //------------------------------// $G['pc_spC'] = []; $G['pc_sp'] = $this->_disp_sp($G['pc']['S_p_sp'], $G['pc']['cond']); $G['pc_spC'][0] = $this->_disp_sp($G['pc']['S_p_sp'], $G['pc']['cond']); // 1球ごとに少し球威が違うのを再現 for($i=1; $i<=3; $i++) { $G['pc_spC'][$i] = $G['pc_spC'][0] + $this->_game_brk($G['pc']["p_bb{$i}k"], $G['pc']["p_bb{$i}"]); } // 変化球:変化量取得および速度計算 if($G['pc_br'] == 0) { $G['pc_bbC'] = $G['pc']["p_sp"]; } else { $G['pc_bbC'] = $G['pc']["p_bb{$G['pc_br']}n"]; $G['pc_sp'] += $this->_game_brk($G['pc']["p_bb{$G['pc_br']}k"], $G['pc']["p_bb{$G['pc_br']}"]); } //------------------------------// // キレ設定 //------------------------------// $G['pc_bbkC'] = []; for($i=0; $i<=3; $i++) { $G['pc_bbkC'][$i] = $G['pc']["p_bb{$i}k"]; } //------------------------------// // 変化量取得 //------------------------------// $G['pc_bb_x'] = $G['pc_bb_y'] = []; # 0 ストレート $G['pc_bb_x'][0] = $G['pc_bb_y'][0] = 0; # 各々変化方向,量取得 for($i=1; $i<=3; $i++) { $g_brk = $G['pc']["p_bb{$i}"]; // 変化方向 $g_brk_n = $G['pc']["p_bb{$i}n"] * 0.3; // 変化量 * 補正値(0.3) switch($g_brk) { case 1: $G['pc_bb_x'][$i] = $g_brk_n; $G['pc_bb_y'][$i] = 0; break; case 2: $G['pc_bb_x'][$i] = $g_brk_n * cos(deg2rad(45)); $G['pc_bb_y'][$i] = -$g_brk_n * sin(deg2rad(45)); break; case 3: $G['pc_bb_x'][$i] = 0; $G['pc_bb_y'][$i] = -$g_brk_n; break; case 4: $G['pc_bb_x'][$i] = -$g_brk_n * cos(deg2rad(45)); $G['pc_bb_y'][$i] = -$g_brk_n * sin(deg2rad(45)); break; case 5: $G['pc_bb_x'][$i] = -$g_brk_n; $G['pc_bb_y'][$i] = 0; break; default: $G['pc_bb_x'][$i] = 0; $G['pc_bb_y'][$i] = 0; break; } // 左投げの場合場合反転 if($G['pc']['side_p'] == 'L') { $G['pc_bb_x'][$i] = -$G['pc_bb_x'][$i]; } } // km/h→m/sに変更 $G['pc_sp_ms'] = $G['pc_sp']/3.6; # bag # $html .= "{$G['pc_br']}を投げます。(x".$G['pc_bb_x'][$G['pc_br']].")(y".$G['pc_bb_y'][$G['pc_br']].")へ球速{$G['pc_sp']}です。<br>\n"; //------------------------------// // 変化球:変化対応 //------------------------------// $G['pc_xE'] = $G['pc_xH'] - $G['pc_bb_x'][$G['pc_br']]; $G['pc_yE'] = $G['pc_yH'] - $G['pc_bb_y'][$G['pc_br']]; $G['pc_zE'] = $G['pc_zH']; //------------------------------------------------------------// // PC vs BT //------------------------------------------------------------// $G['j_btsw'] = 0; // 振ったかどうか判定 $G['bt_swsp'] = 0.118 * $G['bt']['S_b_pw'] + 20.25; // スイングスピード計算 # 0.118 * pw + 28.25 switch($G['bt']['type_b']) // ミートポイント設定 { case 'F': $G['bt_mtp'] = 150; break; case 'R': $G['bt_mtp'] = 50; break; default: $G['bt_mtp'] = 100; break; } //------------------------------// // 待ち球計算 //------------------------------// // 配球結果呼び出し $G['bt_bb'] = $G['pc_bb']; // 配球比率設定 $G['bt_brA'] = $G['bt_bb']; // 全体 $G['bt_br_all'] = $G['bt_brA'][0] + $G['bt_brA'][1] + $G['bt_brA'][2] + $G['bt_brA'][3]; // 少ない間のみ if($G['bt_br_all'] <= 20) { $G['bt_brA'] = [$G['pc']['S_p_sp'], $G['pc']['S_p_bb1n'], $G['pc']['S_p_bb2n'], $G['pc']['S_p_bb3n']]; $G['bt_br_all'] = $G['bt_brA'][0] + $G['bt_brA'][1] + $G['bt_brA'][2] + $G['bt_brA'][3]; } $G['bt_brR'] = mt_rand(0, $G['bt_br_all']); for($i=0; $i<=5; $i++) { $G['bt_brR'] -= $G['bt_brA'][$i]; if($G['bt_brR'] <= 0) { $G['bt_br'] = $i; break; } } # bag # $html .= "{$G['bt_br']}を打ちます。<br>\n"; //------------------------------// // コントロールミス計算 //------------------------------// if(mt_rand(1, 1000) <= (-0.036 * $G['pc']['S_p_co'] + 4)) { $html .= "ああっと、失投か?"; $G['pc_br'] = 0; $G['bt_br'] = 0; $G['pc_sp_ms'] = $G['pc_spC'][0] / 3.6; $G['pc_xE'] = 0; $G['pc_yE'] = 75; } else { $rand_co = mt_rand(1, (100 - $G['pc']['S_p_co']) * 1000) / 5000; $rand_co_dg = mt_rand(1, 360); $G['pc_xE'] += $rand_co * cos(deg2rad($rand_co_dg)); $G['pc_yE'] += $rand_co * sin(deg2rad($rand_co_dg)); } //------------------------------// // 投球集計 //------------------------------// if($G['side'] == 'o') { $G['pc_pc']['u'][$G['pc_id']][$G['pc_br']]++; } else { $G['pc_pc']['o'][$G['pc_id']][$G['pc_br']]++; } //------------------------------------------------------------// // 打者ストライク/スイング判定 //------------------------------------------------------------// # 初期位置設定 $G['bt_xS'] = $G['pc_xS']; $G['bt_xD'] = $G['pc_xS']; $G['bt_yS'] = $G['pc_yS']; $G['bt_yD'] = $G['pc_yS']; $G['bt_zS'] = $G['pc_zS']; $G['bt_zD'] = $G['pc_zS']; # スイング位置設定 $G['bt_xE'] = $G['pc_xE']; $G['bt_yE'] = $G['pc_yE']; $G['bt_zE'] = $G['pc_zE']; # 速度設定 $G['bt_ps_ms'] = $G['pc_spC'][$G['bt_br']] / 3.6; # ベクトル計算 $G['bt_xV'] = $G['bt_xE'] - $G['bt_xS']; $G['bt_yV'] = $G['bt_yE'] - $G['bt_yS']; $G['bt_zV'] = $G['bt_zE'] - $G['bt_zS']; # 絶対ベクトル $G['bt_absV'] = sqrt(pow($G['bt_xV'], 2) + pow($G['bt_yV'], 2) + pow($G['bt_zV'], 2)); //------------------------------// // 移動前計算 //------------------------------// # cm/s $G['bt_psp100'] = $G['bt_ps_ms'] * 100; # 投球にかかる時間 $G['bt_tt'] = $G['bt_absV'] / $G['bt_psp100']; //------------------------------// // 移動計算 投球-変化前間 //------------------------------// # 変化開始秒 $G['bt_tbb'] = $G['bt_tt'] * (0.007 * $G['pc_bbkC'][$G['bt_br']] + 0.2); # 変化開始秒 距離cm $G['bt_tbb_cm'] = $G['bt_tbb'] * $G['bt_psp100']; # 移動x,y,z $G['bt_xD'] += $G['bt_xV'] / $G['bt_absV'] * $G['bt_tbb_cm']; $G['bt_yD'] += $G['bt_yV'] / $G['bt_absV'] * $G['bt_tbb_cm']; $G['bt_zD'] += $G['bt_zV'] / $G['bt_absV'] * $G['bt_tbb_cm']; # ベクトル変化 $G['bt_xE'] += $G['pc_bb_x'][$G['bt_br']]; $G['bt_yE'] += $G['pc_bb_y'][$G['bt_br']]; # ベクトル変化に対応 $G['bt_xV'] = $G['bt_xE'] - $G['bt_xD']; $G['bt_yV'] = $G['bt_yE'] - $G['bt_yD']; $G['bt_zV'] = $G['bt_zE'] - $G['bt_zD']; # 絶対ベクトル再計算 $G['bt_absV'] = sqrt(pow($G['bt_xV'], 2) + pow($G['bt_yV'], 2) + pow($G['bt_zV'], 2)); //------------------------------// // 移動計算 変化-ミートポイント間 //------------------------------// # ミートポイントまでの時間比率 $G['bt_tt_mtp'] = ($G['bt_mtp'] - $G['bt_zD']) / ($G['bt_zE'] - $G['bt_zD']); # 変化-ミートまでにかかる時間 $G['bt_tt'] = $G['bt_tt_mtp'] * ($G['bt_absV'] / $G['bt_psp100']); # 移動x,y,z $G['bt_xD'] += $G['bt_xV'] * $G['bt_tt_mtp']; $G['bt_yD'] += $G['bt_yV'] * $G['bt_tt_mtp']; $G['bt_zD'] += $G['bt_zV'] * $G['bt_tt_mtp']; # 計算済み秒(投球-変化+変化-ミート) $G['bt_tD'] = $G['bt_tbb'] + $G['bt_tt']; # スイング判定 if(abs($G['bt_xD']) <= ($G['bl_r'] / 2 + 21.6) && $G['bt_yD'] >= (45 - $G['bl_r'] / 2) && $G['bt_yD'] < (105 - $G['bl_r'] / 2)) { $G['j_btsw'] = 1; } # bag # $html .= "計算(tbb_cm:". $G['bt_tbb'] ." + bt_tt:". $G['bt_tt'] ."=". $G['bt_tD'] . ")<br>"; # $html .= '('. $G['bt_xD'] .','. $G['bt_yD'] .','. $G['bt_zD'] .')<br>'; //------------------------------------------------------------// // スイング計算 //------------------------------------------------------------// if($G['j_btsw']) { //------------------------------// // ミートポイント計算 //------------------------------// # ミートポイント $G['bt_xMT'] = $G['bt_xD']; $G['bt_yMT'] = $G['bt_yD']; $G['bt_zMT'] = $G['bt_zD'] - ($G['bl_r'] + $G['bt_r']); # ミート時間計算 $G['bt_tMT'] = $G['bt_tD']; # bag #$html .= "<br>補正前(". floor($G['bt_xMT']) .",". floor($G['bt_yMT']) .",". floor($G['bt_zMT']) .")<br>"; #$html .= "ボール(". floor($G['bt_xD']) .",". floor($G['bt_yD']) .",". floor($G['bt_zD']) ."、秒". floor($G['bt_tMT']*100)/100 .")<br>"; //------------------------------// // 内外打ち分け設定 打球多様性 //------------------------------// if($G['bt']['side_b'] == 'R') { $G['bt_tMT'] += $G['bt_xMT'] / $G['bt_psp100']; } else { $G['bt_tMT'] -= $G['bt_xMT'] / $G['bt_psp100']; } //------------------------------// // スイング開始、終了計算 //------------------------------// $G['bt_tt_swD45'] = ($G['bt_center'] / 100) / $G['bt_swsp']; $G['bt_tt_swS'] = $G['bt_tMT'] - $G['bt_tt_swD45']; $G['bt_tt_swE'] = $G['bt_tMT'] + $G['bt_tt_swD45']; //------------------------------// // 振り遅れ計算 //------------------------------// // 現在なし //------------------------------// // ミートのずれ //------------------------------// $rand_str = 100 - $G['bt']['S_b_mt']; if($rand_str < 0){ $rand_str = 0; } $rand_mt = mt_rand($rand_str - 10, $rand_str) / 20; $rand_mt_dg = mt_rand(1, 360); $G['bt_xMT'] += $rand_mt * cos(deg2rad($rand_mt_dg)); $G['bt_yMT'] += $rand_mt * sin(deg2rad($rand_mt_dg)); //------------------------------// // コース補正 //------------------------------// $rand_str = sqrt(pow($G['bt_xMT'], 2) + pow(($G['bt_yMT'] - 75), 2)); $rand_mt = mt_rand($rand_str - 10, $rand_str) / 10; $rand_mt_dg = mt_rand(1, 360); $G['bt_xMT'] += $rand_mt * cos(deg2rad($rand_mt_dg)); $G['bt_yMT'] += $rand_mt * sin(deg2rad($rand_mt_dg)); //------------------------------// // 変化量 vs ミート 減少補正 //------------------------------// if($G['pc_bbC'] > $G['bt']['S_b_mt'] && $G['pc_br'] != 0) { $rand_mt = mt_rand(0, (($G['pc_bbC'] - $G['bt']['S_b_mt']) / 10 + 1) * 1000)/1000; // 変化量 vs ミート } elseif($G['pc_bbC'] > $G['bt']['S_b_ss'] && $G['pc_br'] == 0) { $rand_mt = mt_rand(0, (($G['pc_bbC'] - $G['bt']['S_b_ss']) / 10 + 1) * 1000)/1000; // 速球 vs 反応 } else { $rand_mt = 0; } $rand_mt_dg = mt_rand(1, 360); $G['bt_xMT'] += $rand_mt * cos(deg2rad($rand_mt_dg)); $G['bt_yMT'] += $rand_mt * sin(deg2rad($rand_mt_dg)); //------------------------------// // キレ vs ミート 減少補正 //------------------------------// if($G['pc_bbkC'][$G['pc_br']] > $G['bt']['S_b_mt']) { $rand_mt = mt_rand(0, (($G['pc_bbkC'][$G['pc_br']] - $G['bt']['S_b_mt']) / 10 + 1) * 1000)/1000; // 10 $rand_mt_dg = mt_rand(1, 360); $G['bt_xMT'] += $rand_mt * cos(deg2rad($rand_mt_dg)); $G['bt_yMT'] += $rand_mt * sin(deg2rad($rand_mt_dg)); } //------------------------------// // ストレート補正 //------------------------------// if($G['pc_br'] == 0) { $rand_mt = mt_rand(0, 1000)/1000; // 10 $rand_mt_dg = mt_rand(1, 360); $G['bt_xMT'] += $rand_mt * cos(deg2rad($rand_mt_dg)); $G['bt_yMT'] += $rand_mt * sin(deg2rad($rand_mt_dg)); } # bag # $html .= "補正後(". floor($G['bt_xMT']) .",". floor($G['bt_yMT']) .",". floor($G['bt_zMT']) .":". floor($G['bt_tMT']*100)/100 .")"; } //------------------------------------------------------------// // 盗塁計算 //------------------------------------------------------------// $G['j_sb'] = 0; // 企画判定 if($G['team_sb'] && ((!empty($G['base'][1]) && empty($G['base'][2])) || (!empty($G['base'][2]) && empty($G['base'][3])))) { // 確率判定 $mt_rand = mt_rand(0, 1000); if(($G['team_sb'] == 3 && $mt_rand < 500) || ($G['team_sb'] == 2 && $mt_rand < 400) || ($G['team_sb'] == 1 && $mt_rand < 300)) { // 2→3塁 if(!empty($G['base'][2]) && empty($G['base'][3])) { $G['sb_rn'] = $G['rn'][2]; } else // 1→2塁 { $G['sb_rn'] = $G['rn'][1]; } $SB_BTYPE = explode(",", $G['sb_rn']['bt_type']); // ランナー設定反映 if(($SB_BTYPE[0] && !empty($G['base'][1]) && empty($G['base'][2])) || ($SB_BTYPE[1] && !empty($G['base'][2]) && empty($G['base'][3]))) { // 走者データ取得 $G['sb_rn_sp'] = $this->_game_bsp($G['sb_rn']['S_b_sp']); // 速度 $G['sb_rn_rc'] = $G['sb_rn']['S_b_ss'] / 40 + 1.8; // リード $G['sb_rn_sec'] = ($G['base_l'] - $G['sb_rn_rc']) / $G['sb_rn_sp']; // かかる秒数 $G['sb_rn_sec095'] = $G['sb_rn_sec'] / 0.95; // 95%能力時 $G['sb_rn_sec100'] = $G['sb_rn_sec'] / 1.00; $G['sb_rn_sec105'] = $G['sb_rn_sec'] / 1.05; // 投手 $G['sb_pc_sec'] = (18.44 - 1.20) / ($G['pc_spC'][0] / 3.6); $G['sb_pc_rcs'] = 0.695; // モーション時間 // 捕手データ取得 $G['sb_df'] = $G['df_ar'][$G['df_d'][2]]; $G['sb_df_rcs'] = -0.0025 * $G['sb_df']['S_b_df'] + 0.9; $G['sb_df_sp'] = $this->_disp_sp($G['sb_df']['S_b_sf'], $G['sb_df']['cond']); // 守備計算 if(!empty($G['base'][2]) && empty($G['base'][3])) // 2→3塁 { $G['sb_df_sec_s'] = ($G['base_l'] + 0.6) / ($G['sb_df_sp'] / 3.6); # タッチ判定 $G['sb_df5'] = $G['df_ar'][$G['df_d'][5]]; $G['sb_df_sec_t'] = -0.001 * $G['sb_df5']['S_b_df'] + 0.15; } else // 1→2塁 { $G['sb_df_sec_s'] = ($G['base_l'] * sqrt(2) + 0.6) / ($G['sb_df_sp'] / 3.6); # タッチ判定 $G['sb_df4'] = $G['df_ar'][$G['df_d'][4]]; $G['sb_df6'] = $G['df_ar'][$G['df_d'][6]]; if($G['sb_df4']['S_b_df'] >= $G['sb_df6']['S_b_df']) { $G['sb_df_sec_t'] = -0.001 * $G['sb_df4']['S_b_df'] + 0.15; } else { $G['sb_df_sec_t'] = -0.001 * $G['sb_df6']['S_b_df'] + 0.15; } } // 秒数取得 $G['sb_df_sec'] = $G['sb_pc_sec'] + $G['sb_pc_rcs'] + $G['sb_df_rcs'] + $G['sb_df_sec_t']; // 投手投秒数+モーション+捕手モーション+守備タッチ $G['sb_df_sec095'] = $G['sb_df_sec_s'] / 0.95 + $G['sb_df_sec']; $G['sb_df_sec100'] = $G['sb_df_sec_s'] / 1.00 + $G['sb_df_sec']; $G['sb_df_sec105'] = $G['sb_df_sec_s'] / 1.05 + $G['sb_df_sec']; // 作戦ごとの傾向による設定 if($G['team_sb'] == 3 && $G['sb_rn_sec105'] <= $G['sb_df_sec100']) { $G['j_sb'] = 1; } elseif($G['team_sb'] == 2 && $G['sb_rn_sec100'] <= $G['sb_df_sec100']) { $G['j_sb'] = 1; } elseif($G['team_sb'] == 1 && $G['sb_rn_sec095'] <= $G['sb_df_sec105']) { $G['j_sb'] = 1; } // 表示 if($G['j_sb']) { $html .= "<strong>ランナースタート!</strong>"; } } } } //------------------------------------------------------------// // 実投球計算 //------------------------------------------------------------// # 経過時間設定 $G['bl_t'] = 0; # 位置座標 初期設定 $G['bl_x'] = $G['pc_xS']; $G['bl_y'] = $G['pc_yS']; $G['bl_z'] = $G['pc_zS']; # ベクトル設定 $G['bv_x'] = $G['pc_xE'] - $G['bl_x']; $G['bv_y'] = $G['pc_yE'] - $G['bl_y']; $G['bv_z'] = $G['pc_zE'] - $G['bl_z']; # 絶対ベクトル $G['bv_abs'] = sqrt(pow($G['bv_x'], 2) + pow($G['bv_y'], 2) + pow($G['bv_z'], 2)); # 各種判定 # $G['j_btsw'] = 1 or 0; // スイング $G['j_st'] = 0; // ストライク $G['j_bt'] = 0; // 打撃 $G['j_db'] = 0; // 死球 $G['j_ct'] = 0; // カット //------------------------------// // 初期移動計算 //------------------------------// # 移動速度 cm/s $G['bl_sp'] = $G['pc_sp_ms'] * 100; ## なんかおかしくない??? # 投球にかかる時間 $G['bl_tt'] = $G['bv_abs'] / $G['bl_sp']; # 変化開始秒数 $G['bl_tbb'] = $G['bl_tt'] * (0.007 * $G['pc_bbkC'][$G['pc_br']] + 0.2); //------------------------------// // カット //------------------------------// if($G['pc_br'] != $G['bt_br'] && $G['c_s'] >= 2 && $G['j_btsw']) { $G['j_ct'] = 1; } //------------------------------// // 投球-MTP //------------------------------// if($G['j_ct']) // カット { # 表示 $html .= $this->_game_bjg($G['bl_x'], $G['bl_y'], $G['bt']['side_b'])."の" . $this->_game_br($G['pc_br'], $G['pc']) . "、".floor($G['pc_sp'])."キロ!"; // ボール位置 $G['BL_X'] = 0; $G['BL_Y'] = 0.75; $G['BL_Z'] = 0.45; // 確率計算 $ct_cor = 1; # 変化量 if($G['pc_bbC'] > $G['bt']['S_b_mt'] && $G['pc_br'] != 0) { $ct_cor *= 1 - ($G['pc_bbC'] - $G['bt']['S_b_mt']) / 30; } elseif($G['pc_bbC'] > $G['bt']['S_b_ss'] && $G['pc_br'] == 0) { $ct_cor *= 1 - ($G['pc_bbC'] - $G['bt']['S_b_ss']) / 30; } # キレ if($G['pc_bbkC'][$G['pc_br']] > $G['bt']['S_b_mt']) { $ct_cor *= 1 - ($G['pc_bbkC'][$G['pc_br']] - $G['bt']['S_b_mt']) / 30; } // ランダム $mt_rand = mt_rand(1, 100); if($mt_rand * $ct_cor >= 70) // カット成功 { $G['j_bt'] = 1; // ボールベクトル $G['BT_X'] = 0; $G['BT_Y'] = 10; $G['BT_Z'] = -10; } elseif($mt_rand * $ct_cor >= 15) // カット失敗 { $G['j_bt'] = 1; // ボールベクトル $G['BT_X'] = mt_rand(-10, 10); $G['BT_Y'] = mt_rand(-10, 10); $G['BT_Z'] = mt_rand(0, 10); } else // 三振 { $G['j_st'] = 1; } } elseif($G['j_btsw'] == 1) // 通常スイング { //------------------------------// // スイング開始点までの移動計算 //------------------------------// # 変化開始 <= スイング開始 if($G['bl_tbb'] <= $G['bt_tt_swS']) { # 移動距離計算 $G['bl_mv'] = $G['bl_sp'] * $G['bl_tbb']; # 座標移動 $G['bl_x'] += $G['bv_x'] / $G['bv_abs'] * $G['bl_mv']; $G['bl_y'] += $G['bv_y'] / $G['bv_abs'] * $G['bl_mv']; $G['bl_z'] += $G['bv_z'] / $G['bv_abs'] * $G['bl_mv']; # 終点変化 if(mt_rand(1, 100) >= 80) // 変化量普通 { $G['pc_xE'] += $G['pc_bb_x'][$G['pc_br']] * mt_rand(95, 105) / 100; $G['pc_yE'] += $G['pc_bb_y'][$G['pc_br']] * mt_rand(95, 105) / 100; } elseif(mt_rand(1, 100) >= 50) // 変化量多い { $G['pc_xE'] += $G['pc_bb_x'][$G['pc_br']] * mt_rand(110, 120) / 100; $G['pc_yE'] += $G['pc_bb_y'][$G['pc_br']] * mt_rand(110, 120) / 100; } else // 変化量少ない { $G['pc_xE'] += $G['pc_bb_x'][$G['pc_br']] * mt_rand(80, 95) / 100; $G['pc_yE'] += $G['pc_bb_y'][$G['pc_br']] * mt_rand(80, 95) / 100; } # ベクトル変化 $G['bv_x'] = $G['pc_xE'] - $G['bl_x']; $G['bv_y'] = $G['pc_yE'] - $G['bl_y']; $G['bv_z'] = $G['pc_zE'] - $G['bl_z']; # 絶対ベクトル再計算 $G['bv_abs'] = sqrt(pow($G['bv_x'], 2) + pow($G['bv_y'], 2) + pow($G['bv_z'], 2)); # 経過時間設定 $G['bl_t'] = $G['bl_tbb']; # bag # $html .= "変化(". floor($G['bl_x']) .",". floor($G['bl_y']) .",". floor($G['bl_z']) .":". floor($G['bl_t']*100)/100 .")"; } # スイング開始点までの移動計算 $G['bl_mv'] = $G['bl_sp'] * ($G['bt_tt_swS'] - $G['bl_t']); # 座標移動 $G['bl_x'] += $G['bv_x'] / $G['bv_abs'] * $G['bl_mv']; $G['bl_y'] += $G['bv_y'] / $G['bv_abs'] * $G['bl_mv']; $G['bl_z'] += $G['bv_z'] / $G['bv_abs'] * $G['bl_mv']; # 経過時間設定 $G['bl_t'] = $G['bt_tt_swS']; # 表示 $html .= $this->_game_bjg($G['bl_x'], $G['bl_y'], $G['bt']['side_b'])."の" . $this->_game_br($G['pc_br'], $G['pc']) . "、".floor($G['pc_sp'])."キロ!"; //------------------------------// // 実計算 //------------------------------// # Y $dBLy1 = $G['bv_y'] / $G['bv_abs'] * $G['bl_sp']; $dBLy0 = $G['bl_y']; $dBTy1 = 0; $dBTy0 = $G['bt_yMT']; #$html .= "Y:BL1:{$dBLy1}, 0:{$dBLy0} BT1:{$dBTy1}, 0:{$dBTy0}<br>"; # Z $dBLz1 = $G['bv_z'] / $G['bv_abs'] * $G['bl_sp']; $dBLz0 = $G['bl_z']; $dBTz1 = $G['bt_swsp'] * 100; $dBTz0 = $G['bt_zMT'] - $G['bt_center']; #$html .= "Z:BL1:{$dBLz1}, 0:{$dBLz0} BT1:{$dBTz1}, 0:{$dBTz0}<br>"; # 係数計算 $dCA = $dBTy1 - $dBLy1; $dCB = $dBTy0 - $dBLy0; $dCC = $dBTz1 - $dBLz1; $dCD = $dBTz0 - $dBLz0; # 解の公式係数 y = at^2 + bt + c $dCa = pow($dCA, 2) + pow($dCC, 2); $dCb = 2 * ($dCA * $dCB + $dCC * $dCD); $dCc = pow($dCB, 2) + pow($dCD, 2) - pow(($G['bl_r'] + $G['bt_r']), 2); # 判別式 $dCd = pow($dCb, 2) - 4 * $dCa * $dCc; # 当たり判定 if($dCd >= 0) // 当たり { # t計算式 $dCt1 = (-$dCb + sqrt($dCd))/(2 * $dCa); $dCt2 = (-$dCb - sqrt($dCd))/(2 * $dCa); if($dCt1 > $dCt2){ $dCt = $dCt2; }else{ $dCt = $dCt1; } // $dCt = 的中時間 // 移動計算 # ミートポイント $G['MT_X'] = $G['bt_xMT']; $G['MT_Y'] = $G['bt_yMT']; $G['MT_Z'] = $G['bt_swsp'] * 100 * $dCt + $G['bt_zMT'] - $G['bt_center']; # ボール位置 $G['bl_x'] += $G['bv_x'] / $G['bv_abs'] * $G['bl_sp'] * $dCt; $G['bl_y'] += $G['bv_y'] / $G['bv_abs'] * $G['bl_sp'] * $dCt; $G['bl_z'] += $G['bv_z'] / $G['bv_abs'] * $G['bl_sp'] * $dCt; #$html .= "t = {$dCt}<br>"; #$html .= "BL座標(". floor($G['bl_x']) .",". floor($G['bl_y']) .",". floor($G['bl_z']) .") → "; #$html .= "BT座標(". floor($G['MT_X']) .",". floor($G['MT_Y']) .",". floor($G['MT_Z']) .")<br>"; //当たり判定・角度計算 $dANG = 1 / ($G['bt_tt_swD45'] / 45) * $dCt - 45; if(abs($G['MT_X'] - $G['bl_x']) <= $G['bt_meet'] && abs($dANG) <= 90) { # 打撃判定 $G['j_bt'] = 1; $G['MT_ANG'] = $dANG; # bag #$html .= "理論値(" .(floor(($G['bt_r'] + $G['bl_r'])*100)/100). ")=計算値(" .(floor(sqrt(pow(($G['MT_Y'] - $G['bl_y']), 2) + pow(($G['MT_Z'] - $G['bl_z']), 2)) * 100)/100). ")<br>"; # ボールベクトル解析 $G['d_bl_x'] = $G['bv_x'] / $G['bv_abs'] * $G['pc_sp']; $G['d_bl_y'] = $G['bv_y'] / $G['bv_abs'] * $G['pc_sp']; $G['d_bl_z'] = $G['bv_z'] / $G['bv_abs'] * $G['pc_sp']; #$html .= "BL_DIR:(x".floor($G['d_bl_x']).",y".floor($G['d_bl_y']).",z".floor($G['d_bl_z']).")座標(". floor($G['bl_x']) .",". floor($G['bl_y']) .",". floor($G['bl_z']) .")<br>"; # バットベクトル解析 $G['d_bt_x'] = $G['bt_swsp'] * sin(deg2rad($G['MT_ANG'])); $G['d_bt_y'] = 0; $G['d_bt_z'] = $G['bt_swsp'] * cos(deg2rad($G['MT_ANG'])); #$html .= "BT_DIR:" . (floor($G['bt_swsp']*100)/100) . "m/s(x".floor($G['d_bt_x']).",z".floor($G['d_bt_z']).")座標(". floor($G['MT_X']) .",". floor($G['MT_Y']) .",". floor($G['MT_Z']) .")<br>"; # ベクトル解析 $G['d_tl_ang'] = atan2(($G['bl_z'] - $G['MT_Z']), ($G['bl_y'] - $G['MT_Y'])); // ラジアン #$html .= "BL(Y".floor($G['bl_y']).",Z".floor($G['bl_z']).") vs BT(Y".floor($G['MT_Y']).",Z".floor($G['MT_Z']).")=".floor(rad2deg($G['d_tl_ang']))."度<br>"; $G['d_bl_ver'] = $G['d_bl_y'] * cos($G['d_tl_ang']) + $G['d_bl_z'] * sin($G['d_tl_ang']); // 衝突方向ベクトル $G['d_bl_par'] = -$G['d_bl_y'] * sin($G['d_tl_ang']) + $G['d_bl_z'] * cos($G['d_tl_ang']); // 平行方向ベクトル $G['d_bt_ver'] = $G['d_bt_y'] * cos($G['d_tl_ang']) + $G['d_bt_z'] * sin($G['d_tl_ang']); $G['d_bt_par'] = -$G['d_bt_y'] * sin($G['d_tl_ang']) + $G['d_bt_z'] * cos($G['d_tl_ang']); #$html .= "BL(Y" .floor($G['d_bl_y']). ",Z" .floor($G['d_bl_z']). ")→(衝" .floor($G['d_bl_ver']). ",平" .floor($G['d_bl_par']). ")<br>"; #$html .= "BT(Y" .floor($G['d_bt_y']). ",Z" .floor($G['d_bt_z']). ")→(衝" .floor($G['d_bt_ver']). ",平" .floor($G['d_bt_par']). ")<br>"; # 反発係数計算 $G['d_cor_x'] = 1 / (abs($G['MT_X'] - $G['bl_x']) + 1); $G['d_cor_y'] = 1 - abs($G['MT_Y'] - $G['bl_y']) * 0.2; $G['d_cor_MT'] = $G['d_cor_x'] * $G['d_cor_y'] * $G['c_cor']; # 正面衝突計算 YZ $m1 = $G['bl_wg']; $m2 = $G['bt_wg']; $s1 = $G['d_bl_ver']; $s2 = $G['d_bt_ver']; $ds_bl = ($m1*$s1 + $m2*$s2 - $m2*$G['d_cor_MT']*($s1-$s2))/($m1+$m2); $ds_bt = ($m1*$s1 + $m2*$s2 + $m1*$G['d_cor_MT']*($s1-$s2))/($m1+$m2); #$html .= "1:{$m1}g × {$s1}m/s vs 2:{$m2}g × {$s2}m/s<br>"; #$html .= "1:{$ds_bl}m/s × 2:{$ds_bt}m/s<br>"; #$html .= "後(" . floor($ds_bl) . "," . floor($G['d_bl_par']) . ")<br>"; # 計算完了 $G['BT_Y'] = $ds_bl * cos(-$G['d_tl_ang']) + $G['d_bl_par'] * sin(-$G['d_tl_ang']); $G['BT_Z'] = -$ds_bl * sin(-$G['d_tl_ang']) + $G['d_bl_par'] * cos(-$G['d_tl_ang']); // 左右打ち分け計算 # ベクトル解析 $G['dX_tl_ang'] = atan2(($G['MT_X'] - $G['bl_x']), ($G['MT_Z'] - $G['bl_z'])); // ラジアン $G['dX_bl_ver'] = $G['d_bl_x'] * cos($G['dX_tl_ang']) + $G['d_bl_z'] * sin($G['dX_tl_ang']); // 衝突方向ベクトル $G['dX_bl_par'] = -$G['d_bl_x'] * sin($G['dX_tl_ang']) + $G['d_bl_z'] * cos($G['dX_tl_ang']); // 平行方向ベクトル $G['dX_bt_ver'] = $G['d_bt_x'] * cos($G['dX_tl_ang']) + $G['d_bt_z'] * sin($G['dX_tl_ang']); $G['dX_bt_par'] = -$G['d_bt_x'] * sin($G['dX_tl_ang']) + $G['d_bt_z'] * cos($G['dX_tl_ang']); # 正面衝突計算 XZ $m1 = $G['bl_wg']; $m2 = $G['bt_wg']; $s1 = $G['dX_bl_ver']; $s2 = $G['dX_bt_ver']; $dsX_bl = ($m1*$s1 + $m2*$s2 - $m2*$G['d_cor_MT']*($s1-$s2))/($m1+$m2); $dsX_bt = ($m1*$s1 + $m2*$s2 + $m1*$G['d_cor_MT']*($s1-$s2))/($m1+$m2); # 計算完了 $G['BT_X'] = $dsX_bl * cos(-$G['dX_tl_ang']) + $G['dX_bl_par'] * sin(-$G['dX_tl_ang']); #$html .= "打(X" . floor($G['BT_X']) . ",Y" . floor($G['BT_Y']) . ",Z" . floor($G['BT_Z']) . ")係数:". (floor($G['d_cor_MT']*100)/100) ."<br>"; # 初期位置計算(m換算) $G['BL_X'] = $G['bl_x'] / 100; $G['BL_Y'] = $G['bl_y'] / 100; $G['BL_Z'] = $G['bl_z'] / 100; } } # 簡易ストライク判定 $G['j_st_zv'] = -$G['bv_z'] / $G['bv_abs'] * $G['bl_sp']; $G['j_st_t1'] = ($G['bl_z'] - 43.2) / $G['j_st_zv']; $G['j_st_t2'] = ($G['bl_z'] - 21.6) / $G['j_st_zv']; # 当たり判定 - 前 $G['j_st_x1'] = $G['bl_x'] + $G['bv_x'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t1']; $G['j_st_y1'] = $G['bl_y'] + $G['bv_y'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t1']; $G['j_st_z1'] = $G['bl_z'] + $G['bv_z'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t1']; # 当たり判定 - 後 $G['j_st_x2'] = $G['bl_x'] + $G['bv_x'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t2']; $G['j_st_y2'] = $G['bl_y'] + $G['bv_y'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t2']; $G['j_st_z2'] = $G['bl_z'] + $G['bv_z'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t2']; if((abs($G['j_st_x1']) <= (21.6 + $G['bl_r'] / 2) && $G['j_st_y1'] < (105 - $G['bl_r'] / 2) && $G['j_st_y1'] >= (45 - $G['bl_r'] / 2)) || (abs($G['j_st_x2']) <= (21.6 + $G['bl_r'] / 2) && $G['j_st_y2'] < (105 - $G['bl_r'] / 2) && $G['j_st_y2'] >= (45 - $G['bl_r'] / 2))) { $G['j_st'] = 1; } } else // 見た場合 { # 移動距離計算 $G['bl_mv'] = $G['bl_sp'] * $G['bl_tbb']; # 座標移動 $G['bl_x'] += $G['bv_x'] / $G['bv_abs'] * $G['bl_mv']; $G['bl_y'] += $G['bv_y'] / $G['bv_abs'] * $G['bl_mv']; $G['bl_z'] += $G['bv_z'] / $G['bv_abs'] * $G['bl_mv']; # 終点変化 $G['pc_xE'] += $G['pc_bb_x'][$G['pc_br']]; $G['pc_yE'] += $G['pc_bb_y'][$G['pc_br']]; # ベクトル変化 $G['bv_x'] = $G['pc_xE'] - $G['bl_x']; $G['bv_y'] = $G['pc_yE'] - $G['bl_y']; $G['bv_z'] = $G['pc_zE'] - $G['bl_z']; # 絶対ベクトル再計算 $G['bv_abs'] = sqrt(pow($G['bv_x'], 2) + pow($G['bv_y'], 2) + pow($G['bv_z'], 2)); # 経過時間設定 $G['bl_t'] = $G['bl_tbb']; # 表示 $html .= $this->_game_bjg($G['bl_x'], $G['bl_y'], $G['bt']['side_b'])."の" . $this->_game_br($G['pc_br'], $G['pc']) . "、".floor($G['pc_sp'])."キロ!見ました"; # 簡易ストライク判定 $G['j_st_zv'] = -$G['bv_z'] / $G['bv_abs'] * $G['bl_sp']; $G['j_st_t1'] = ($G['bl_z'] - 43.2) / $G['j_st_zv']; $G['j_st_t2'] = ($G['bl_z'] - 21.6) / $G['j_st_zv']; # 前側判定(1) $G['j_st_x1'] = $G['bl_x'] + $G['bv_x'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t1']; $G['j_st_y1'] = $G['bl_y'] + $G['bv_y'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t1']; $G['j_st_z1'] = $G['bl_z'] + $G['bv_z'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t1']; # 後ろ判定(2) $G['j_st_x2'] = $G['bl_x'] + $G['bv_x'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t2']; $G['j_st_y2'] = $G['bl_y'] + $G['bv_y'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t2']; $G['j_st_z2'] = $G['bl_z'] + $G['bv_z'] / $G['bv_abs'] * $G['bl_sp'] * $G['j_st_t2']; if((abs($G['j_st_x1']) <= (21.6 + $G['bl_r'] / 2) && $G['j_st_y1'] < (105 - $G['bl_r'] / 2) && $G['j_st_y1'] >= (45 - $G['bl_r'] / 2)) || (abs($G['j_st_x2']) <= (21.6 + $G['bl_r'] / 2) && $G['j_st_y2'] < (105 - $G['bl_r'] / 2) && $G['j_st_y2'] >= (45 - $G['bl_r'] / 2))) { $G['j_st'] = 1; } } //------------------------------------------------------------// // 判定 //------------------------------------------------------------// $G['get_pt'] = 0; if($G['j_btsw'] && !$G['j_bt']) { $html .= "空振り!"; $G['c_s']++; } elseif(!$G['j_btsw'] && $G['j_st']) { $html .= "ストライク"; $G['c_s']++; } elseif(!$G['j_btsw'] && !$G['j_st']) { $html .= "ボール"; $G['c_b']++; } elseif($G['j_btsw'] && $G['j_bt']) { $html .= "打った!"; # 初期位置等設定 # $G['BL_X'], $G['BL_Y'], $G['BL_Z'] // 位置(m) # $G['BT_X'], $G['BT_Y'], $G['BT_Z'] // ベクトル(m/s) #$html .= "(BL:".(floor($G['BL_X'] * 100)/100).",".(floor($G['BL_Y'] * 100)/100).",".(floor($G['BL_Z'] * 100)/100).")<br>"; #$html .= "(BT:".(floor($G['BT_X'] * 100)/100).",".(floor($G['BT_Y'] * 100)/100).",".(floor($G['BT_Z'] * 100)/100).")<br>"; # 変数設定 $G['RS_bt'] = $G['RS_df_pos'] = null; // 結果 $G['RS_sec'] = $G['RS_df_sec'] = $G['RS_er_sec'] = $G['RS_fe'] = $G['RS_bb'] = $G['RS_stop'] = $G['RS_hr'] = $G['RS_f'] = 0; // 経過時間, エラーwt時間, フェンス当たり判定, バウンド回数, ボール停止, ホームラン飛距離, フェア判定 # フェンス距離設定 $G['RS_fe_l'] = $G['bp_fe_c'] - ($G['bp_fe_c'] - $G['bp_fe_w']) / 45 * abs(rad2deg(atan2($G['BT_Z'], $G['BT_X'])) - 90); # 計算開始 $G['bb_stop'] = 10; while($G['RS_bb'] <= $G['bb_stop']) { // ベクトル解析 # X $G['d_Xa'] = $this->_game_air_res($G['BT_X']); $G['d_Xb'] = $G['BT_X']; $G['d_Xc'] = $G['BL_X']; # Y $G['d_Ya'] = -1/2 * 9.81 + $this->_game_air_res($G['BT_Y']); $G['d_Yb'] = $G['BT_Y']; $G['d_Yc'] = $G['BL_Y']; # Z $G['d_Za'] = $this->_game_air_res($G['BT_Z']); $G['d_Zb'] = $G['BT_Z']; $G['d_Zc'] = $G['BL_Z']; # 落球位置(y = 0m)計算 $G['d_drop_d'] = pow($G['d_Yb'], 2) - 4 * $G['d_Ya'] * ($G['d_Yc'] - $G['bl_r'] / 100); // 解の公式 $G['d_drop_t'] = (-$G['d_Yb'] - sqrt($G['d_drop_d'])) / (2 * $G['d_Ya']); # 捕球可能位置(y = 2.0m)計算 $G['d_ct_d'] = pow($G['d_Yb'], 2) - 4 * $G['d_Ya'] * ($G['d_Yc'] - 2.0); // 解の公式 if($G['d_ct_d'] >= 0) { $G['d_ct_t0'] = (-$G['d_Yb'] + sqrt($G['d_ct_d'])) / (2 * $G['d_Ya']); $G['d_ct_t1'] = (-$G['d_Yb'] - sqrt($G['d_ct_d'])) / (2 * $G['d_Ya']); #$html .= "(ct0:" . (floor($G['d_ct_t0'] * 100)/100) . "s)"; #$html .= "(ct1:" . (floor($G['d_ct_t1'] * 100)/100) . "s)"; } #$html .= "(d:" . (floor($G['d_drop_t'] * 10)/10) . "s)"; # ストップ if($G['d_drop_t'] <= 0.001) { $G['RS_stop'] = 1; } # 捕球計算(距離) #$html .= "bb:{$G['RS_bb']}=NEED" . (floor($G['d_drop_t']*100)/100) . "s"; $G['d_ct'] = []; for($i = 1; $i <= 9; $i++) { # 守備者/守備位置読み込み $G['df_man'] = $G['df_ar'][$G['df_d'][$i]]; $G['df_pos'] = explode(",", $G['bp_dpos'][$i]); # 距離計算 if($G['RS_stop'] || $G['RS_bb'] == $G['bb_stop']) // 静止 { # 距離計算 t = 0 $G['df_abs'] = sqrt(pow(($G['BL_X'] - $G['df_pos'][0]), 2) + pow(($G['BL_Z'] - $G['df_pos'][1]), 2)); } else // その他 { # t = 0~$G['d_drop_t'] $G['d_BL_T'] = $G['d_drop_t']; $G['d_BL_X'] = $G['d_Xa'] * pow($G['d_BL_T'], 2) + $G['d_Xb'] * $G['d_BL_T'] + $G['d_Xc']; $G['d_BL_Z'] = $G['d_Za'] * pow($G['d_BL_T'], 2) + $G['d_Zb'] * $G['d_BL_T'] + $G['d_Zc']; $G['df_abs'] = sqrt(pow(($G['d_BL_X'] - $G['df_pos'][0]), 2) + pow(($G['d_BL_Z'] - $G['df_pos'][1]), 2)); } // 空中守備 # 守備 $G['df_sp'] = 0.12 * ($G['df_man']['S_b_sp'] + $G['df_man']['S_b_df'] * 3) / 4 + 7; $G['df_ws'] = 0.2 - 0.002 * $G['df_man']['S_b_ss']; # 補正 if($i == 1){ $G['df_ws'] += 1; } if($i == 2){ $G['df_ws'] += 2; } $dA = pow($G['d_Xb'], 2) + pow($G['d_Zb'], 2) - pow($G['df_sp'], 2); $dB = 2 * ($G['d_Xb'] * $G['d_Xc'] - $G['d_Xb'] * $G['df_pos'][0] + $G['d_Zb'] * $G['d_Zc'] - $G['d_Zb'] * $G['df_pos'][1]); $dC = pow(($G['d_Xc'] - $G['df_pos'][0]), 2) + pow(($G['d_Zc'] - $G['df_pos'][1]), 2) + $G['df_sp'] * $G['df_ws']; $dD = pow($dB, 2) - 4 * $dA * $dC; # D >= 0 $df_flag = 0; if($dD >= 0) { $dT1 = (-$dB - sqrt($dD)) / (2 * $dA); $dT2 = (-$dB + sqrt($dD)) / (2 * $dA); if($G['d_ct_d'] >= 0 && ($G['d_ct_t0'] > 0 || $G['d_ct_t1'] > 0)) { if($this->_game_range($dT1, 0, $G['d_ct_t0']) || $this->_game_range($dT1, $G['d_ct_t1'], $G['d_drop_t'])) { $G['d_BL_T'] = $dT1; $df_flag = 1; } elseif($this->_game_range($dT2, 0, $G['d_ct_t0']) && $dT1 < 0) { $G['d_BL_T'] = 0; $df_flag = 1; } elseif($this->_game_range($dT2, $G['d_ct_t1'], $G['d_drop_t']) && $dT1 < $G['d_ct_t1']) { $G['d_BL_T'] = $G['d_ct_t1']; $df_flag = 1; } } else { if($this->_game_range($dT1, 0, $G['d_drop_t'])) { $G['d_BL_T'] = $dT1; $df_flag = 1; } elseif($this->_game_range($dT2, 0, $G['d_drop_t']) && $dT1 < 0) { $G['d_BL_T'] = 0; $df_flag = 1; } } } // 捕球可能 if($df_flag && !($i == 2 && $G['RS_bb'] == 0)) { $G['d_BL_X'] = $G['d_Xa'] * pow($G['d_BL_T'], 2) + $G['d_Xb'] * $G['d_BL_T'] + $G['d_Xc']; $G['d_BL_Y'] = $G['d_Ya'] * pow($G['d_BL_T'], 2) + $G['d_Yb'] * $G['d_BL_T'] + $G['d_Yc']; if($G['d_BL_Y'] < 0 || $G['d_BL_Y'] > 2.0 ){ continue; } # バウンド判定 if($G['RS_bb']) { $G['RS_bt'] = 'G'; } else { $G['RS_bt'] = 'F'; } # 位置座標特定 $G['RS_df_pos'] = $i; $G['BL_X'] = $G['d_Xa'] * pow($G['d_BL_T'], 2) + $G['d_Xb'] * $G['d_BL_T'] + $G['d_Xc']; $G['BL_Y'] = $G['d_Ya'] * pow($G['d_BL_T'], 2) + $G['d_Yb'] * $G['d_BL_T'] + $G['d_Yc']; $G['BL_Z'] = $G['d_Za'] * pow($G['d_BL_T'], 2) + $G['d_Zb'] * $G['d_BL_T'] + $G['d_Zc']; $G['RS_df_sec'] = $G['RS_sec'] + $G['d_BL_T']; break 2; } // 空中守備ここまで # 内外野判定 if(sqrt(pow($G['d_BL_X'], 2) + pow($G['d_BL_Z'], 2)) > 42 && $G['d_BL_Z'] > 0) // 外野 { if($i >= 1 && $i <= 6){ continue; } } else // 内野 { if($i >= 7 && $i <= 9){ continue; } } # 設定 $G['d_ct'][$i] = $G['df_abs']; #$html .= "<br>$i:(x".floor($G['d_BL_X']).",z".floor($G['d_BL_Z']).")DR".(floor($G['d_BL_T']*100)/100)."s,NE".(floor($G['df_abs']/$G['df_sp']*100)/100)."s,"; } # フェンス接触計算 if(!$G['RS_fe']) { $G['d_fe_a'] = pow($G['d_Xb'], 2) + pow($G['d_Zb'], 2); $G['d_fe_b'] = 2 * ($G['d_Xb'] * $G['d_Xc'] + $G['d_Zb'] * $G['d_Zc']); $G['d_fe_c'] = pow($G['d_Xc'], 2) + pow($G['d_Zc'], 2) - pow($G['RS_fe_l'], 2); $G['d_fe_d'] = pow($G['d_fe_b'], 2) - 4 * $G['d_fe_a'] * $G['d_fe_c']; # 判別式 if($G['d_fe_d'] >= 0) { # 接触秒数 $G['d_fe_t'] = (-$G['d_fe_b'] + sqrt($G['d_fe_d'])) / (2 * $G['d_fe_a']); #$html .= "(fe:" . (floor($G['d_fe_t'] * 100)/100) . "s)"; # HR判定等 if($G['d_fe_t'] > 0 && $G['d_fe_t'] < $G['d_drop_t']) { # 衝突探偵 $G['RS_fe'] = 1; # 位置計算 $G['RS_sec'] += $G['d_fe_t']; $G['BL_X'] = $G['d_Xa'] * pow($G['d_fe_t'], 2) + $G['d_Xb'] * $G['d_fe_t'] + $G['d_Xc']; $G['BL_Y'] = $G['d_Ya'] * pow($G['d_fe_t'], 2) + $G['d_Yb'] * $G['d_fe_t'] + $G['d_Yc']; $G['BL_Z'] = $G['d_Za'] * pow($G['d_fe_t'], 2) + $G['d_Zb'] * $G['d_fe_t'] + $G['d_Zc']; #$html .= "(".(floor($G['BL_X'] * 100)/100).",".(floor($G['BL_Z'] * 100)/100).",".(floor($G['BL_Z'] * 100)/100).")"; # ベクトル経時変化計算 d = a * 2t + b $G['BT_X'] = $G['d_Xa'] * $G['d_fe_t'] * 2 + $G['d_Xb']; $G['BT_Y'] = $G['d_Ya'] * $G['d_fe_t'] * 2 + $G['d_Yb']; $G['BT_Z'] = $G['d_Za'] * $G['d_fe_t'] * 2 + $G['d_Zb']; # 判定 if(!$G['RS_f'] && abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) > 45) { $G['RS_bt'] = 'FB'; // ファール break; } elseif($G['BL_Y'] > $G['bp_fe_h']) { if($G['RS_bb']) { $G['RS_bt'] = 'EN2'; // エンタイトル2ベース } else { $G['RS_bt'] = 'HR'; // ホームラン $G['RS_f'] = 1; $G['BL_X'] = $G['d_Xa'] * pow($G['d_drop_t'], 2) + $G['d_Xb'] * $G['d_drop_t'] + $G['d_Xc']; $G['BL_Y'] = $G['d_Ya'] * pow($G['d_drop_t'], 2) + $G['d_Yb'] * $G['d_drop_t'] + $G['d_Yc']; $G['BL_Z'] = $G['d_Za'] * pow($G['d_drop_t'], 2) + $G['d_Zb'] * $G['d_drop_t'] + $G['d_Zc']; $G['RS_hr'] = floor(sqrt(pow($G['BL_X'], 2) + pow($G['BL_Z'], 2)) + 5); } break; } else { $html .= "<b>フェンスに当たった!</b>"; $G['RS_f'] = 1; $G['RS_fe'] = 1; $G['RS_bb']++; #$html .= "(BT:".(floor($G['BT_X'] * 100)/100).",".(floor($G['BT_Y'] * 100)/100).",".(floor($G['BT_Z'] * 100)/100).")"; # クッション判定 $G['BT_X'] = $G['BT_X'] * $G['bp_corz']; $G['BT_Y'] = $G['BT_Y'] * $G['bp_corz']; $G['BT_Z'] = -$G['BT_Z'] * $G['bp_corf']; #$html .= "(WBT:".(floor($G['BT_X'] * 100)/100).",".(floor($G['BT_Y'] * 100)/100).",".(floor($G['BT_Z'] * 100)/100).")"; #$html .= "(WBL:".(floor($G['BL_X'] * 100)/100).",".(floor($G['BL_Y'] * 100)/100).",".(floor($G['BL_Z'] * 100)/100).")"; # 継続 continue; } } } } // 捕球計算 if(count($G['d_ct']) > 0) { # ソート asort($G['d_ct']); foreach($G['d_ct'] as $i => $abs) { # バウンド判定 if($G['RS_bb']) { $G['RS_bt'] = 'G'; } else { $G['RS_bt'] = 'F'; } # 守備者/守備位置読み込み $G['RS_df_pos'] = $i; $G['df_man'] = $G['df_ar'][$G['df_d'][$i]]; $G['df_pos'] = explode(",", $G['bp_dpos'][$i]); # 移動速度計算 $G['df_sp'] = 0.12 * ($G['df_man']['S_b_sp'] + $G['df_man']['S_b_df'] * 3) / 4 + 7; $G['df_ws'] = 0.2 - 0.002 * $G['df_man']['S_b_ss']; # 補正 if($i == 1){ $G['df_ws'] += 1; } if($i == 2){ $G['df_ws'] += 2; } # 守備秒計算 $G['df_sec'] = $abs / $G['df_sp'] + $G['df_ws']; # 秒数計算 if($G['RS_stop'] || $G['RS_bb'] == $G['bb_stop']) // 静止 { $G['RS_df_sec'] = $G['df_sec']; // ファウル if(!$G['RS_f'] && abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) > 45 || ($G['BL_Z'] < -10 && sqrt(pow($G['BL_X'], 2) + pow($G['BL_Z'], 2)) > 20)) { $G['RS_bt'] = 'FB'; break 2; } } elseif($G['df_sec'] < ($G['RS_sec'] + $G['d_drop_t'])) // 捕球可能 { $G['BL_X'] = $G['d_Xa'] * pow($G['d_drop_t'], 2) + $G['d_Xb'] * $G['d_drop_t'] + $G['d_Xc']; $G['BL_Y'] = $G['d_Ya'] * pow($G['d_drop_t'], 2) + $G['d_Yb'] * $G['d_drop_t'] + $G['d_Yc']; $G['BL_Z'] = $G['d_Za'] * pow($G['d_drop_t'], 2) + $G['d_Zb'] * $G['d_drop_t'] + $G['d_Zc']; if($G['BL_Y'] < 0){ continue; } $G['RS_df_sec'] = $G['RS_sec'] + $G['d_drop_t']; } else // 捕球不可 { continue; } # 終了 break 2; } } // バウンド計算 # 位置計算 $G['RS_sec'] += $G['d_drop_t']; $G['BL_X'] = $G['d_Xa'] * pow($G['d_drop_t'], 2) + $G['d_Xb'] * $G['d_drop_t'] + $G['d_Xc']; $G['BL_Y'] = $G['d_Ya'] * pow($G['d_drop_t'], 2) + $G['d_Yb'] * $G['d_drop_t'] + $G['d_Yc']; $G['BL_Z'] = $G['d_Za'] * pow($G['d_drop_t'], 2) + $G['d_Zb'] * $G['d_drop_t'] + $G['d_Zc']; #$html .= "B{$G['RS_bb']}:" . (floor($G['RS_sec']*100)/100) . "s(".(floor($G['BL_X'] * 100)/100).",".(floor($G['BL_Y'] * 100)/100).",".(floor($G['BL_Z'] * 100)/100).")<br>"; # ベクトル経時変化計算 d = a * 2t + b $G['BT_X'] = $G['d_Xa'] * $G['d_fe_t'] * 2 + $G['d_Xb']; $G['BT_Y'] = $G['d_Ya'] * $G['d_fe_t'] * 2 + $G['d_Yb']; $G['BT_Z'] = $G['d_Za'] * $G['d_fe_t'] * 2 + $G['d_Zb']; # バウンド計算 $G['BT_X'] = $G['BT_X'] * $G['bp_corz']; $G['BT_Y'] = abs($G['BT_Y'] * $G['bp_cor']); $G['BT_Z'] = $G['BT_Z'] * $G['bp_corz']; // 判定 if(!$G['RS_f'] && abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) > 45) { $G['RS_bt'] = 'FB'; // ファール break; } elseif(abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) <= 45 && sqrt(pow($G['BL_X'], 2) + pow($G['BL_Z'], 2)) >= $G['base_l']) { $G['RS_f'] = 1; } $G['RS_bb']++; } #$html .= "{$G['RS_bb']}回{$G['RS_bt']}(" . (floor($G['RS_sec']*10)/10) . "s)?{$G['RS_df_pos']}(". (floor($G['RS_df_sec']*10)/10)."s)"; #$html .= "(BL:".(floor($G['BL_X'] * 100)/100).",".(floor($G['BL_Y'] * 100)/100).",".(floor($G['BL_Z'] * 100)/100).")"; // 守備計算 if($G['RS_bt'] == 'G' || $G['RS_bt'] == 'F') { $G['df_man'] = $G['df_ar'][$G['df_d'][$G['RS_df_pos']]]; $G['df_pos'] = explode(",", $G['bp_dpos'][$G['RS_df_pos']]); $G['df_sp'] = $this->_disp_sp($G['df_man']['S_b_sf'], $G['df_man']['cond']) / 3.6; // m/s $G['RS_sec'] += 2 - $G['df_man']['S_b_df'] / 200; // 捕球から投げるまでの速度追加 if($G['RS_df_pos'] >= 7){ $G['RS_sec'] += 3.5; } // 外野補正 if($G['RS_fe']){ $G['RS_sec'] += 2; } // フェンス当たり補正 // ベース位置取得 $G['bp_base_l'] = []; $G['bp_base_ds'] = []; for($i=0; $i<=3; $i++) { $G['bp_base_lxz'] = explode(",", $G['bp_base'][$i]); $G['bp_base_l'][$i] = sqrt(pow(($G['bp_base_lxz'][0] - $G['BL_X']), 2) + pow(($G['bp_base_lxz'][1] - $G['BL_Z']), 2)); $G['bp_base_ds'][$i] = $G['RS_sec'] + $G['bp_base_l'][$i] / $G['df_sp']; $G['bp_base_fs'][$i] = $G['bp_base_l'][$i] / $G['df_sp'] + (3 - $G['df_man']['S_b_df'] / 50); } } // 守備判定 if($G['RS_bt'] == 'G') { // 表示 $PL = explode(",", $cf['pos_list'][$G['RS_df_pos']]); $html .= "<span style='background-color: {$PL[3]}; color: {$PL[2]};'>{$PL[1]}</span>への当たり!"; // チェック設定 $G['df_out'] = 0; // 打者走力計算 $G['bt_sp'] = $this->_game_bsp($G['bt']['S_b_sp']); $G['bt_rc'] = 0; // 打撃時位置 if($G['bt']['side_b'] == 'L'){ $G['bt_c'] = 1; }else{ $G['bt_c'] = -1; } $G['bt_nb1'] = $G['bp_base_ds'][1] * $G['bt_sp'] + $G['bt_rc']; // 移動距離 $G['bt_nb2'] = $G['bp_base_ds'][2] * ($G['bt_sp'] + 1) + $G['bt_rc']; $G['bt_nb3'] = $G['bp_base_ds'][3] * ($G['bt_sp'] + 1) + $G['bt_rc']; $G['bt_nb4'] = $G['bp_base_ds'][0] * $G['bt_sp'] + $G['bt_rc']; #$html .= "(X:{$G['BL_X']},Z:{$G['BL_Z']})1:{$G['bt_nb1']},2:{$G['bt_nb2']},3:{$G['bt_nb3']},4:{$G['bt_nb4']}"; // アウト判定 if($G['bt_nb1'] / $G['base_l'] < 1){ $G['df_out'] = 1; } // 1塁走力計算 if(!empty($G['base'][1])) { $G['rn1_sp'] = $this->_game_bsp($G['rn'][1]['S_b_sp']); $G['rn1_rc'] = $G['base_l'] * 1 + $G['rn'][1]['S_b_ss'] / 20 + $G['rn_c']; if($G['j_sb']){ $G['rn1_rc'] += $G['rn1_sp']; } $G['rn1_nb2'] = $G['bp_base_ds'][2] * $G['rn1_sp'] + $G['rn1_rc']; $G['rn1_nb3'] = $G['bp_base_ds'][3] * $G['rn1_sp'] + $G['rn1_rc']; $G['rn1_nb4'] = $G['bp_base_ds'][0] * $G['rn1_sp'] + $G['rn1_rc']; // アウト判定 if($G['rn1_nb2'] / $G['base_l'] < 2){ $G['df_out'] = 2; } #$html .= "rn1:" . (floor($G['rn1_nb2'] / $G['base_l']*100)/100) . ", "; } // 2塁走力計算 if(!empty($G['base'][2])) { $G['rn2_sp'] = $this->_game_bsp($G['rn'][2]['S_b_sp']); $G['rn2_rc'] = $G['base_l'] * 2 + $G['rn'][2]['S_b_ss'] / 20 + $G['rn_c']; if($G['j_sb']){ $G['rn2_rc'] += $G['rn2_sp']; } $G['rn2_nb3'] = $G['bp_base_ds'][3] * $G['rn2_sp'] + $G['rn2_rc']; $G['rn2_nb4'] = $G['bp_base_ds'][0] * $G['rn2_sp'] + $G['rn2_rc']; // アウト判定 if($G['rn2_nb3'] / $G['base_l'] < 3){ $G['df_out'] = 3; } #$html .= "rn2:" . (floor($G['rn2_nb3'] / $G['base_l']*100)/100) . ", "; } // 3塁走力計算 if(!empty($G['base'][3])) { $G['rn3_sp'] = $this->_game_bsp($G['rn'][3]['S_b_sp']); $G['rn3_rc'] = $G['base_l'] * 3 + $G['rn'][3]['S_b_ss'] / 20 + $G['rn_c']; if($G['j_sb']){ $G['rn3_rc'] += $G['rn3_sp']; } $G['rn3_nb4'] = $G['bp_base_ds'][0] * $G['rn3_sp'] + $G['rn3_rc']; // アウト判定 if($G['rn3_nb4'] / $G['base_l'] < 4){ $G['df_out'] = 4; } #$html .= "rn3:" . (floor($G['rn3_nb4'] / $G['base_l']*100)/100) . ""; } # bag #$html .= "<br>肩力:" . floor($G['df_sp']) ."m/s, 走力:" . floor($G['bt_sp']) . "m/s, "; #$html .= "距離:" . floor($G['bp_base_l'][1]) . "m, 経過時間:" . (floor($G['RS_sec']*100)/100) . "s, 必要時間:" . (floor($G['bp_base_ds'][0]*100)/100) . "<br>"; if($G['df_out']) { // $html_dp = null; if($G['df_out'] == 4) { $html .= "本塁へ!"; // アウト $G['base'][3] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!</b>"; // ランナー設定 $G['base'][3] = $G['base'][2]; $G['base'][2] = $G['base'][1]; $G['base'][1] = $G['bt']['id'] . ',' . $G['pc_id']; // 守備設定(捕手) if($G['RS_df_pos'] == 2) { $G['df_man'] = $G['df_ar'][$G['df_d'][1]]; } else { $G['df_man'] = $G['df_ar'][$G['df_d'][2]]; } $G['df_sp'] = $this->_disp_sp($G['df_man']['S_b_sf'], $G['df_man']['cond']) / 3.6; // m/s $G['bp_base_lxz0'] = explode(",", $G['bp_base'][0]); for($i=1; $i<=3; $i++) { $G['bp_base_lxz'] = explode(",", $G['bp_base'][$i]); $G['bp_base_l'][$i] = sqrt(pow(($G['bp_base_lxz'][0] - $G['bp_base_lxz0'][0]), 2) + pow(($G['bp_base_lxz'][1] - $G['bp_base_lxz0'][1]), 2)); $G['bp_base_ds'][$i] = $G['bp_base_l'][$i] / $G['df_sp'] + (1 - $G['df_man']['S_b_df'] / 200); } // 併殺計算 if($G['c_o'] <= 2) { # 秒計算 $G['df_sec'] = $G['bp_base_ds'][0]; $G['bt_nb1'] = ($G['bp_base_ds'][1] + $G['df_sec']) * $G['bt_sp'] + $G['bt_rc']; if(!empty($G['baseH'][1])){ $G['rn1_nb2'] = ($G['bp_base_ds'][2] + $G['df_sec']) * $G['rn1_sp'] + $G['rn1_rc']; } if(!empty($G['baseH'][2])){ $G['rn2_nb3'] = ($G['bp_base_ds'][3] + $G['df_sec']) * $G['rn2_sp'] + $G['rn2_rc']; } # 判定 if($G['rn2_nb3'] / $G['base_l'] < 3 && !empty($G['baseH'][2])) { $html .= "さらに3塁へ!"; // アウト $G['base'][3] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!ダブルプレー!</b>"; $html_dp = 1; } elseif($G['rn1_nb2'] / $G['base_l'] < 2 && !empty($G['baseH'][1])) { $html .= "さらに2塁へ!"; // アウト $G['base'][2] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!ダブルプレー!</b>"; $html_dp = 1; } elseif($G['bt_nb1'] / $G['base_l'] < 1) { $html .= "さらに1塁へ!"; // アウト $G['base'][1] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!ダブルプレー!</b>"; $html_dp = 1; } } // 併殺 if($html_dp) { $this->_game_reslut($G, $G['bt']['id'], 'DP', $G['pc_id']); } else { $this->_game_reslut($G, $G['bt']['id'], 'MH', $G['pc_id']); } } elseif($G['df_out'] == 3) { $html .= "3塁へ!"; // アウト $G['base'][2] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!</b>"; // ランナー設定 $G['base'][3] = $G['base'][2]; $G['base'][2] = $G['base'][1]; $G['base'][1] = $G['bt']['id'] . ',' . $G['pc_id']; // 守備設定(サード) if($G['RS_df_pos'] == 5) { $G['df_man'] = $G['df_ar'][$G['df_d'][6]]; } else { $G['df_man'] = $G['df_ar'][$G['df_d'][5]]; } $G['df_sp'] = $this->_disp_sp($G['df_man']['S_b_sf'], $G['df_man']['cond']) / 3.6; // m/s $G['bp_base_lxz3'] = explode(",", $G['bp_base'][3]); for($i=1; $i<=2; $i++) { $G['bp_base_lxz'] = explode(",", $G['bp_base'][$i]); $G['bp_base_l'][$i] = sqrt(pow(($G['bp_base_lxz'][0] - $G['bp_base_lxz3'][0]), 2) + pow(($G['bp_base_lxz'][1] - $G['bp_base_lxz3'][1]), 2)); $G['bp_base_ds'][$i] = $G['bp_base_l'][$i] / $G['df_sp'] + (1 - $G['df_man']['S_b_df'] / 200); } // 併殺計算 if($G['c_o'] <= 2) { # 秒計算 $G['df_sec'] = $G['bp_base_ds'][3]; $G['bt_nb1'] = ($G['bp_base_ds'][1] + $G['df_sec']) * $G['bt_sp'] + $G['bt_rc']; if(!empty($G['baseH'][1])){ $G['rn1_nb2'] = ($G['bp_base_ds'][2] + $G['df_sec']) * $G['rn1_sp'] + $G['rn1_rc']; } # 判定 if($G['rn1_nb2'] / $G['base_l'] < 2 && !empty($G['baseH'][1])) { $html .= "さらに2塁へ!"; // アウト $G['base'][2] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!ダブルプレー!</b>"; $html_dp = 1; } elseif($G['bt_nb1'] / $G['base_l'] < 1) { $html .= "さらに1塁へ!"; // アウト $G['base'][1] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!ダブルプレー!</b>"; $html_dp = 1; } } // 得点 if($G['c_o'] <= 2 && !empty($G['baseH'][3])) { $html .= "その間にランナーがホームに帰る!"; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][3]['id'], 'POINT', $G['base_cid'][3]); } // 併殺 if($html_dp) { $this->_game_reslut($G, $G['bt']['id'], 'DP', $G['pc_id']); } else { $this->_game_reslut($G, $G['bt']['id'], 'MH', $G['pc_id']); } } elseif($G['df_out'] == 2) { $html .= "2塁へ!"; // アウト $G['base'][1] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!</b>"; // ランナー設定 $G['base'][3] = $G['base'][2]; $G['base'][2] = $G['base'][1]; $G['base'][1] = $G['bt']['id'] . ',' . $G['pc_id']; // 守備設定(ショート or セカンド) if($G['RS_df_pos'] == 6) { $G['df_man'] = $G['df_ar'][$G['df_d'][4]]; } else { $G['df_man'] = $G['df_ar'][$G['df_d'][6]]; } $G['df_sp'] = $this->_disp_sp($G['df_man']['S_b_sf'], $G['df_man']['cond']) / 3.6; // m/s $G['bp_base_lxz2'] = explode(",", $G['bp_base'][2]); for($i=1; $i<=1; $i++) { $G['bp_base_lxz'] = explode(",", $G['bp_base'][$i]); $G['bp_base_l'][$i] = sqrt(pow(($G['bp_base_lxz'][0] - $G['bp_base_lxz2'][0]), 2) + pow(($G['bp_base_lxz'][1] - $G['bp_base_lxz2'][1]), 2)); $G['bp_base_ds'][$i] = $G['bp_base_l'][$i] / $G['df_sp'] + (1 - $G['df_man']['S_b_df'] / 200); } // 併殺計算 if($G['c_o'] <= 2) { # 秒計算 $G['df_sec'] = $G['bp_base_ds'][3]; $G['bt_nb1'] = ($G['bp_base_ds'][1] + $G['df_sec']) * $G['bt_sp'] + $G['bt_rc']; # 判定 if($G['bt_nb1'] / $G['base_l'] < 1) { $html .= "さらに1塁へ!"; // アウト $G['base'][1] = null; $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!ダブルプレー!</b>"; $html_dp = 1; } } // 得点 if($G['c_o'] <= 2 && !empty($G['baseH'][3])) { $html .= "その間にランナーがホームに帰る!"; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][3]['id'], 'POINT', $G['base_cid'][3]); } // 併殺 if($html_dp) { $this->_game_reslut($G, $G['bt']['id'], 'DP', $G['pc_id']); } else { $this->_game_reslut($G, $G['bt']['id'], 'MH', $G['pc_id']); } } else { $html .= "1塁へ!"; // アウト $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!</b>"; // ランナー設定 $G['base'][3] = $G['base'][2]; $G['base'][2] = $G['base'][1]; $G['base'][1] = null; // 得点 if($G['c_o'] <= 2 && !empty($G['baseH'][3])) { $html .= "その間にランナーがホームに帰る!"; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][3]['id'], 'POINT', $G['base_cid'][3]); } $this->_game_reslut($G, $G['bt']['id'], 'MH', $G['pc_id']); } } else // ヒット以上 { // 3塁ランナー if(!empty($G['baseH'][3])) { $G['base'][3] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][3]['id'], 'POINT', $G['base_cid'][3]); } // 2塁ランナー if(!empty($G['baseH'][2])) { if($G['rn2_nb4'] / $G['base_l'] >= 4) { $G['base'][2] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][2]['id'], 'POINT', $G['base_cid'][2]); } else { $G['base'][3] = $G['base'][2]; $G['base'][2] = null; } } // 1塁ランナー if(!empty($G['baseH'][1])) { if(empty($G['base'][3]) && $G['rn1_nb4'] / $G['base_l'] >= 4) { $G['base'][1] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][1]['id'], 'POINT', $G['base_cid'][1]); } elseif(empty($G['base'][3]) && $G['rn1_nb3'] / $G['base_l'] >= 3) { $G['base'][3] = $G['base'][1]; $G['base'][1] = null; } else { $G['base'][2] = $G['base'][1]; $G['base'][1] = null; } } // 打者 if(empty($G['base'][3]) && empty($G['base'][2]) && $G['bt_nb4'] / $G['base_l'] >= 4) { $html .= "<b style='color:pink;'>ランニングホームラン!</b>"; $G['get_pt']++; $this->_game_reslut($G, $G['bt']['id'], 'HR', $G['pc_id']); } elseif(empty($G['base'][3]) && empty($G['base'][2]) && $G['bt_nb3'] / $G['base_l'] >= 3) { $html .= "<b style='color:pink;'>スリーベース!</b>"; $G['base'][3] = $G['bt']['id'] . ',' . $G['pc_id']; $this->_game_reslut($G, $G['bt']['id'], '3B', $G['pc_id']); } elseif(empty($G['base'][2]) && $G['bt_nb2'] / $G['base_l'] >= 2) { $html .= "<b style='color:pink;'>ツーベース!</b>"; $G['base'][2] = $G['bt']['id'] . ',' . $G['pc_id']; $this->_game_reslut($G, $G['bt']['id'], '2B', $G['pc_id']); } else { $html .= "<b style='color:pink;'>ヒット!</b>"; $G['base'][1] = $G['bt']['id'] . ',' . $G['pc_id']; $this->_game_reslut($G, $G['bt']['id'], '1B', $G['pc_id']); } } // 計算 $G['j_bc'] = 1; } elseif($G['RS_bt'] == 'F') { // 表示 $PL = explode(",", $cf['pos_list'][$G['RS_df_pos']]); $html .= "<span style='background-color: {$PL[3]}; color: {$PL[2]};'>{$PL[1]}</span>"; // フライorライナー $bt_xz = sqrt(pow($G['BT_X'], 2) + pow($G['BT_Z'], 2)); $bt_rad = rad2deg(atan2($G['BT_Y'], $bt_xz)); if($bt_rad <= 15) { $html .= "ライナー!"; } else { $html .= "へのフライ!"; } // 計算 $G['c_o']++; $html .= "<b style='color:red;'>{$G['c_o']}アウト!</b>"; // ランナー進塁 $html_sf = null; if($G['c_o'] <= 2) { // 3塁 if(!empty($G['base'][3])) { $G['rn3_sp'] = $this->_game_bsp($G['rn'][3]['S_b_sp']); $G['rn3_rc'] = $G['base_l'] * 3 + $G['rn'][3]['S_b_ss'] / 40; $G['rn3_nb4'] = $G['bp_base_ds'][0] * $G['rn3_sp'] + $G['rn3_rc']; // 犠牲フライ if($G['rn3_nb4'] / $G['base_l'] >= 4) { $G['base'][3] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][3]['id'], 'POINT', $G['base_cid'][3]); $html_sf = 2; } } // 2塁 if(!empty($G['base'][2])) { $G['rn2_sp'] = $this->_game_bsp($G['rn'][2]['S_b_sp']); $G['rn2_rc'] = $G['base_l'] * 2 + $G['rn'][2]['S_b_ss'] / 40; $G['rn2_nb3'] = $G['bp_base_ds'][3] * $G['rn2_sp'] + $G['rn2_rc']; // 犠牲フライ if(empty($G['base'][3]) && $G['rn2_nb3'] / $G['base_l'] >= 3) { $G['base'][3] = $G['base'][2]; $G['base'][2] = null; if(!$html_sf){ $html_sf = 1; } } } // 1塁 if(!empty($G['base'][1])) { $G['rn1_sp'] = $this->_game_bsp($G['rn'][1]['S_b_sp']); $G['rn1_rc'] = $G['base_l'] * 1 + $G['rn'][1]['S_b_ss'] / 40; $G['rn1_nb2'] = $G['bp_base_ds'][2] * $G['rn1_sp'] + $G['rn1_rc']; // 犠牲フライ if(empty($G['base'][2]) && $G['rn1_nb2'] / $G['base_l'] >= 2) { $G['base'][2] = $G['base'][1]; $G['base'][1] = null; if(!$html_sf){ $html_sf = 1; } } } // 表示 if($html_sf) { $html .= "その間にランナーが進む!"; } } // 計算 $G['j_bc'] = 1; // 犠飛 if($html_sf == 2) { $this->_game_reslut($G, $G['bt']['id'], 'BF', $G['pc_id']); } else { $this->_game_reslut($G, $G['bt']['id'], 'MH', $G['pc_id']); } } elseif($G['RS_bt'] == 'FB') { $html .= "ファールボール!"; if($G['c_s'] <= 1) { $G['c_s']++; } } elseif($G['RS_bt'] == 'HR') { $html .= "大きい!いったか!"; if(abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) > 22.5) { $html .= "ライト"; $G['RS_df_pos'] = 9; } elseif(abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) < -22.5) { $html .= "レフト"; $G['RS_df_pos'] = 7; } else { $html .= "センター"; $G['RS_df_pos'] = 8; } $html .= "への<b style='color:pink;'>ホームラン!({$G['RS_hr']}m)</b>"; // 塁 if(!empty($G['baseH'][3])) { $G['base'][3] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][3]['id'], 'POINT', $G['base_cid'][3]); } if(!empty($G['baseH'][2])) { $G['base'][2] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][2]['id'], 'POINT', $G['base_cid'][2]); } if(!empty($G['baseH'][1])) { $G['base'][1] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][1]['id'], 'POINT', $G['base_cid'][1]); } // 計算 $G['get_pt']++; $G['j_bc'] = 1; $this->_game_reslut($G, $G['bt']['id'], 'HR', $G['pc_id']); } elseif($G['RS_bt'] == 'EN2') { $html .= "いい当たりだー!あっとバウンドしてそのままフェンスを超えた!<b style='color:green;'>エンタイトルツーベース!</b>"; // 結果 if(abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) > 22.5) { $G['RS_df_pos'] = 9; } elseif(abs(rad2deg(atan2($G['BL_Z'], $G['BL_X'])) - 90) < -22.5) { $G['RS_df_pos'] = 7; } else { $G['RS_df_pos'] = 8; } // 塁 if(!empty($G['baseH'][3])) { $G['base'][3] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][3]['id'], 'POINT', $G['base_cid'][3]); } if(!empty($G['baseH'][2])) { $G['base'][2] = null; $G['get_pt']++; $this->_game_reslut($G, $G['rn'][2]['id'], 'POINT', $G['base_cid'][2]); } if(!empty($G['baseH'][1])) { $G['base'][3] = $G['base'][1]; $G['base'][1] = null; } $G['base'][2] = $G['bt']['id'] . ',' . $G['pc_id']; // 計算 $G['j_bc'] = 1; $this->_game_reslut($G, $G['bt']['id'], '2B', $G['pc_id']); } else { $html .= "打撃コードエラー"; } } else // エラー { $html .= "error"; } //------------------------------------------------------------// // 変動 //------------------------------------------------------------// # 三振 if($G['c_s'] >= 3) { $G['c_o']++; $html .= "<b style='color:green;'>三振!</b><b style='color:red;'>{$G['c_o']}アウト!</b>"; $G['j_bc'] = 1; $this->_game_reslut($G, $G['bt']['id'], 'SO', $G['pc_id']); } #四球 if($G['c_b'] >= 4) { $html .= "<b style='color:blue;'>フォアボール!</b>"; $this->_game_bb($G, $html); $G['j_bc'] = 1; $this->_game_reslut($G, $G['bt']['id'], 'BB', $G['pc_id']); } //------------------------------------------------------------// // 盗塁結果 //------------------------------------------------------------// if($G['j_sb'] && !$G['j_bt'] && $G['c_o'] <= 2 && $G['c_b'] <= 3 && ((!empty($G['base'][1]) && empty($G['base'][2])) || (!empty($G['base'][2]) && empty($G['base'][3])))) { // 結果 # 走者 $G['sb_rn_r'] = (mt_rand(0, 1000) / 100 + 95) / 100; $G['sb_rn_f'] = $G['sb_rn_sec'] / $G['sb_rn_r']; # 守備 $G['sb_df_r'] = (mt_rand(0, 1000) / 100 + 95) / 100; $G['sb_df_f'] = $G['sb_df_sec_s'] / $G['sb_df_r'] + $G['sb_df_sec']; if($G['j_btsw']){ $G['sb_df_f'] += 0.1; } // スイングで増加 if(!$G['j_st']){ $G['sb_df_f'] -= 0.1; } // ボールで減少 # 走塁判定 if($G['sb_rn_f'] <= $G['sb_df_f']) // セーフ { if((!empty($G['base'][1]) && empty($G['base'][2]))) { $html .= "2塁<strong style='color: blue;'>セーフ!</strong>"; $G['base'][2] = $G['base'][1]; $G['base'][1] = null; $this->_game_reslut($G, $G['rn'][1]['id'], 'SB', $G['pc_id']); } elseif((!empty($G['base'][2]) && empty($G['base'][3]))) { $html .= "3塁<strong style='color: blue;'>セーフ!</strong>"; $G['base'][3] = $G['base'][2]; $G['base'][2] = null; $this->_game_reslut($G, $G['rn'][2]['id'], 'SB', $G['pc_id']); // 便乗 if(!empty($G['base'][1])) { $html .= "2塁<strong style='color: blue;'>セーフ!</strong>"; $G['base'][2] = $G['base'][1]; $G['base'][1] = null; $this->_game_reslut($G, $G['rn'][1]['id'], 'SB', $G['pc_id']); } } } else // アウト { if((!empty($G['base'][1]) && empty($G['base'][2]))) { $html .= "2塁<strong style='color: red;'>アウト!</strong>"; $G['c_o']++; $G['base'][1] = null; $this->_game_reslut($G, $G['rn'][1]['id'], 'SBO', $G['pc_id']); } elseif((!empty($G['base'][2]) && empty($G['base'][3]))) { $html .= "3塁<strong style='color: red;'>アウト!</strong>"; $G['c_o']++; $G['base'][2] = null; $this->_game_reslut($G, $G['rn'][2]['id'], 'SBO', $G['pc_id']); // 便乗 if(!empty($G['base'][1])) { $html .= "2塁は<strong style='color: blue;'>セーフ!</strong>"; $G['base'][2] = $G['base'][1]; $G['base'][1] = null; } } } // 表示 $html_run = null; for($i=1; $i<=3; $i++) { if(!empty($G['base'][$i])) { if($html_run){ $html_run .= "・";} $html_run .= $i; } } if($html_run) { if(!empty($G['base'][1]) && !empty($G['base'][2]) && !empty($G['base'][3])) { $html_run = "満塁"; } else { $html_run .= "塁"; } } else { $html_run = "なし"; } $html .= "<br>\nランナー<strong>{$html_run}</strong>となりました!"; } //------------------------------------------------------------// // 得点表示 //------------------------------------------------------------// if($G['get_pt'] > 0 && $G['c_o'] <= 2) { # 計算 if($G['side'] == 'o') { $G['pt_o'] += $G['get_pt']; $G['pt_o_in'][$G['in']] += $G['get_pt']; } else { $G['pt_u'] += $G['get_pt']; $G['pt_u_in'][$G['in']] += $G['get_pt']; } # 勝ち側計算 if($G['pt_o'] > $G['pt_u']) { $G['win_side2'] = 'o'; } elseif($G['pt_o'] < $G['pt_u']) { $G['win_side2'] = 'u'; } else { $G['win_side2'] = null; } # 勝ち投手計算 if($G['win_side'] != $G['win_side2']) { $G['win_side'] = $G['win_side2']; if($G['pt_o'] > $G['pt_u']) { if($G['in'] >= 6) { $G['win_id'] = $OD_DF[1]; } $G['lose_id'] = $UD_DF[1]; } elseif($G['pt_o'] < $G['pt_u']) { if($G['in'] >= 6) { $G['win_id'] = $UD_DF[1]; } $G['lose_id'] = $OD_DF[1]; } else { $G['win_id'] = null; $G['lose_id'] = null; } } # 表示 $html .= "<br>\n<b style='color:red;'>{$G['get_pt']}点追加!"; if(($G['pt_oH'] > $G['pt_uH'] && $G['pt_o'] < $G['pt_u']) || ($G['pt_oH'] < $G['pt_uH'] && $G['pt_o'] > $G['pt_u'])) { $html .= "逆転!"; $G['pt_oH'] = $G['pt_o'];$G['pt_uH'] = $G['pt_u']; } elseif($G['pt_oH'] != $G['pt_uH'] && $G['pt_o'] == $G['pt_u']) { $html .= "同点!"; } elseif($G['pt_oH'] == 0 && $G['pt_uH'] == 0 && $G['pt_o'] != $G['pt_u']) { $html .= "先制点!"; $G['pt_oH'] = $G['pt_o'];$G['pt_uH'] = $G['pt_u']; } elseif($G['pt_oH'] != 0 && $G['pt_uH'] != 0 && $G['pt_oH'] == $G['pt_uH'] && $G['pt_o'] != $G['pt_u']) { $html .= "均衡が破れました!"; $G['pt_oH'] = $G['pt_o'];$G['pt_uH'] = $G['pt_u']; } $html .= "({$G['pt_o']}-{$G['pt_u']})</b>"; } //------------------------------------------------------------// // 打者交代 //------------------------------------------------------------// if($G['j_bc']) { $G['c_s'] = $G['c_b'] = 0; $html .= "<br>\n"; $G['bt_n']++; if($G['bt_n'] >= 9) { $G['bt_n'] = 0; } // 打者再読み込み $G['bt'] = $G['at_ar'][$G['at_b'][$G['bt_n']]]; $G['j_bc'] = 0; } $html .= "<br>\n"; //------------------------------------------------------------// // 勝ち投手計算 //------------------------------------------------------------// if($G['in'] == 5 && $G['side'] == 'u' && $G['c_o'] >= 3) { if($G['pt_o'] > $G['pt_u']) { $G['win_side'] = 'o'; $G['win_id'] = $OD_D[1]; $G['lose_id'] = $UD_D[1]; } elseif($G['pt_o'] < $G['pt_u']) { $G['win_side'] = 'u'; $G['win_id'] = $UD_D[1]; $G['lose_id'] = $OD_D[1]; } else { $G['win_side'] = null; } } //------------------------------------------------------------// // チェンジ //------------------------------------------------------------// if($G['c_o'] >= 3) { $G['c_s'] = $G['c_b'] = $G['c_o'] = 0; $G['in_c'] = 0; $G['base'] = []; $html .= "</div>"; //色表示用 # 保存 if($G['side'] == 'o') { # 守備=>U $UD = $G['df']; $UCs = $G['df_ar']; $UD_B = $G['df_b']; $UD_BC = $G['df_bc']; $UD_D = $G['df_d']; # 攻撃=>O $OD = $G['at']; $OCs = $G['at_ar']; $OD_B = $G['at_b']; $OD_BC = $G['at_bc']; $OD_D = $G['at_d']; } else { # 守備=>O $OD = $G['df']; $OCs = $G['df_ar']; $OD_B = $G['df_b']; $OD_BC = $G['df_bc']; $OD_D = $G['df_d']; # 攻撃=>U $UD = $G['at']; $UCs = $G['at_ar']; $UD_B = $G['at_b']; $UD_BC = $G['at_bc']; $UD_D = $G['at_d']; } // 回変更 if($G['side'] == 'o') { $G['bt_o'] = $G['bt_n']; if($G['in'] >= 9 && $G['pt_o'] < $G['pt_u']) { $html .= "<div class=desc>"; $html .= "<table class='score_board' width=100% style='border:none;'>\n"; $html .= "<tr>"; $html .= "<td rowspan=2><img src='" . $this->_disp_flag($OD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'> <img src='" . $this->_disp_icon($OD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'></td>"; $html .= "<td colspan=3><font style='font-size:40px;'>{$G['pt_o']} - {$G['pt_u']}</font></td>"; $html .= "<td rowspan=2><img src='" . $this->_disp_icon($UD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'> <img src='" . $this->_disp_flag($UD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'></td></tr>"; $html .= "<tr><td width=100> </td><td width=150>ゲームセット!</td><td width=100> </td></tr>"; $html .= "</table></div>\n"; break; } $G['side'] = 'u'; $G['bt_n'] = $G['bt_u']; # 表示 $html .= "<div class=desc name=\"{$G['in']}u\">"; if($G['in'] >= 10) { $html .= "<b style='color:red;'>延長</b>"; } $html .= "<table class='score_board' width=100% style='border:none;'>\n"; $html .= "<tr>"; $html .= "<td rowspan=2><img src='" . $this->_disp_flag($OD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'> <img src='" . $this->_disp_icon($OD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'></td>"; $html .= "<td colspan=3><font style='font-size:40px;'>{$G['pt_o']} - {$G['pt_u']}</font></td>"; $html .= "<td rowspan=2><img src='" . $this->_disp_icon($UD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'> <img src='" . $this->_disp_flag($UD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'></td></tr>"; $html .= "<tr><td width=100> </td><td width=150>{$G['in']}回ウラ</td><td width=100>>></td></tr>"; $html .= "</table></div>\n"; } elseif($G['side'] == 'u') { $G['bt_u'] = $G['bt_n']; if(($G['in'] >= 9 && $G['pt_o'] > $G['pt_u']) || ($G['in'] >= 15 && $game_type == 'pract')) { if((!$G['win_side'] || !$G['win_id']) && $G['pt_o'] > $G['pt_u']) { $G['win_side'] = 'o'; $G['win_id'] = $OD_D[1]; $G['lose_id'] = $UD_D[1]; } $html .= "<div class=desc>"; $html .= "<table class='score_board' width=100% style='border:none;'>\n"; $html .= "<tr>"; $html .= "<td rowspan=2><img src='" . $this->_disp_flag($OD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'> <img src='" . $this->_disp_icon($OD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'></td>"; $html .= "<td colspan=3><font style='font-size:40px;'>{$G['pt_o']} - {$G['pt_u']}</font></td>"; $html .= "<td rowspan=2><img src='" . $this->_disp_icon($UD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'> <img src='" . $this->_disp_flag($UD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'></td></tr>"; $html .= "<tr><td width=100> </td><td width=150>ゲームセット!</td><td width=100> </td></tr>"; $html .= "</table></div>\n"; break; } $G['in']++; $G['side'] = 'o'; $G['bt_n'] = $G['bt_o']; # 表示 $html .= "<div class=desc name=\"{$G['in']}o\">"; if($G['in'] >= 10) { $html .= "<b style='color:red;'>延長</b>"; } $html .= "<table class='score_board' width=100% style='border:none;'>\n"; $html .= "<tr>"; $html .= "<td rowspan=2><img src='" . $this->_disp_flag($OD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'> <img src='" . $this->_disp_icon($OD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'></td>"; $html .= "<td colspan=3><font style='font-size:40px;'>{$G['pt_o']} - {$G['pt_u']}</font></td>"; $html .= "<td rowspan=2><img src='" . $this->_disp_icon($UD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'> <img src='" . $this->_disp_flag($UD['team_flag']) . "' style='height:100px; width:100px; vertical-align:middle;'></td></tr>"; $html .= "<tr><td width=100><<</td><td width=150>{$G['in']}回オモテ</td><td width=100> </td></tr>"; $html .= "</table></div>\n"; } } //------------------------------------------------------------// // サヨナラ判定 //------------------------------------------------------------// if($G['side'] == 'u' && $G['in'] >= 9 && $G['pt_o'] < $G['pt_u']) { if(!$G['win_side'] || !$G['win_id']) { $G['win_side'] = 'u'; $G['win_id'] = $UD_D[1]; $G['lose_id'] = $OD_D[1]; } $html .= "</div>"; $html .= "<div class=desc>"; $html .= "<table class='score_board' width=100% style='border:none;'>\n"; $html .= "<tr>"; $html .= "<td rowspan=2><img src='" . $this->_disp_flag($OD['team_flag']) . "' style='height:60px; width:60px; vertical-align:middle;'> <img src='" . $this->_disp_icon($OD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'></td>"; $html .= "<td colspan=3><font style='font-size:40px;'>{$G['pt_o']} - {$G['pt_u']}</font></td>"; $html .= "<td rowspan=2><img src='" . $this->_disp_icon($UD['mn_img']) . "' style='height:30px; width:30px; vertical-align:middle;'> <img src='" . $this->_disp_flag($UD['team_flag']) . "' style='height:60px; width:60px; vertical-align:middle;'></td></tr>"; $html .= "<tr><td width=100> </td><td width=150 style='color:red;'>サヨナラだ~!</td><td width=100> </td></tr>"; $html .= "</table></div>\n"; break; } // Last $G['i']++; }
試合の設計概要
下記は試合の設計概要です。
ポイントとしては以下の通り。
- 投球・打撃はランダム要素に左右される。
- 走塁・守備はランダム要素がない。
詳細なゲーム流れ(1投球ごと)は以下の通りです。
// 投手 HP補正 投球始点設定 球種選択 投球座標選択 初速設定 変化量取得・速度設定 キレ設定 変化方向・量設定 // 打者 打席位置設定 待ち球選択 失投計算 打者スイング設定(打つかどうか) // 仮想投球(打者脳内) 投球開始時設定 変化時設定(キレ量が多いほど打者の直前で曲がる) 打撃時判定 ・内外打ち分け計算 ・振り遅れ計算(今はない) ・ミートズレ計算 ・コース補正(難しいコースほど打ちにくい) ・変化量補正(変化量が多いほど打ちにくいvsミート) ・キレ補正(キレ量が多いほど打ちにくいvsミート) ・ストレート補正(球速が早いほど打ちにくい) // 盗塁判定 // 実投球開始 投球開始時設定 if(カット時設定) カットはミートが影響してくる elif(打撃時設定) 投球開始→球・変化ポイントまで移動→球・ミートポイントまで移動→衝突判定→打球方向・力判定 else(見送り設定) 各結果判定 if(打撃時) # それ以外は省略する 打球移動判定&捕球判定 # ランダム要素なし、打球速度は物理計算されて失速していくが守備者の移動速度は一定。 送球判定 # 本塁→三塁→二塁→一塁とアウトにできるところがないか判定して送球する。送球しない選択肢はない。送球速度は一定。 走塁判定 # 走者の速度は一定。トリプルプレーまであります。守備側は最善の判断を行う。 // 以降後処理
他
個人的な見解ですが、堅実なチーム作りをするなら、走塁・守備重視(総合力)で勝負するべきです。
ランダム要素がないので、盗塁は走力が高い選手が出塁さえしてしまえば100%可能。守備も試合開始時のやる気・体力には影響されるものの、一定です。試合途中で疲労感が爆発することはありません。
爆発力があるチーム作りをするなら、打撃重視ですね。格上でも勝てる要素が盛りだくさんです。ただし、ランダム要素によって格下にも呆気なく負けます。
各選手の育成方法等詳細については別の機会に記載したいと思います。