Help us understand the problem. What is going on with this article?

[ゲームAI] バスケットの試合のAIについて

[1] 概要

バスケットの試合シーンのAIについて記載します。

試合はCPU同士の対戦です。
選手は全て自動で動きます。
ユーザーは監督の立場で戦術やメンバーを決定して試合に介入することができます。

試合シーンのAIの他に、
・バスケットのテクニックや連携などの紹介
・CPU同士の試合を見て、面白いと思ってもらうにはどうすればいいか
などの内容も記載しています。
プログラム実装の価値基準になります。

※セットオフェンスについての考察を追加しました
https://qiita.com/jukasahara/items/a0ae2bbf871727ca90e7


 

[2] バスケットのテクニックや連携などを一部紹介

○ドライブ

ゴールに向かって、相手守備陣の中に切り込むドリブルをドライブといいます。

参考動画:並里選手のドライブ
https://twitter.com/B_LEAGUE/status/1139127365596934144

動画の解説
2_00_ドライブ.png
左上の白1(並里選手)がドライブを仕掛けます



2_01_ドライブ.png
白1がそのままゴールに向かわないように、黒a,黒bが守備に向かいます。
黒aは白3を、黒bは白2をマークしていましたが、マークが外れた状態になります。



2_02_ドライブ.png
白1は白2へパス、そしてシュートが決まりました。
黒bは白1の守備に向かっていたため、白2への守備が遅れてしましました。
また、残り時間がもう少し長ければ白1から白3へパスして3ポイントシュートを狙う選択肢もあったと思います。

ドライブはこのように相手ディフェンスを引きつけて、フリーの選手を作り出すことができます。
そのままドリブルでシュートを狙ってもいいと思います。


 

○ステップバック

1ステップ後ろに下がってシュートを打つテクニックです。
自分のシュートスペースを確保することにより、相手からシュートブロックされる危険性をなくします。

参考動画:ジェームズ・ハーデン
https://www.youtube.com/watch?v=VxBmSmNQymc

2_00_ステップバック.png
近すぎると相手のブロックが届いてしまう



2_01_ステップバック.png
1ステップ後ろに下がることで、相手のシュートブロックをかわすことが可能になります。
特に3ポイントライン付近でよく使われます。


 
▽ステップバックとドリブルの組み合わせについて
2_ステップバック_02.png
2_ステップバック_03.png
1.自分:ドリブルで抜こうと試みる
2.相手:抜かれないように後ろへ重心を傾ける
3.自分:ステップバックで後ろへ下がってからシュート
4.相手:重心が後ろにあったので、前へ出るのが一瞬遅れる

ドリブルとステップバックを組み合わせた場合、このような流れになります。
ドリブルの選択肢を意識させることにより、ステップバックでよりシュートスペースを確保しやすくなります。

ステップバックを警戒して前めに重心を傾けていると、今度はドリブルの対応が難しくなり、ドリブルで抜かれてしまうかもしれません。


 

○シュートモーションが早いシュート、キャッチアンドシュート

参考動画:ステフィン・カリー
https://www.youtube.com/watch?v=G2BQvyRgWds

シュートに行くまでの動作を早くすることで相手のシュートブロックを間にあわないようにします。
それに加えてドリブルや、シュートフェイント、ステップバックなど組み合わせると、対応がとても難しくしています。

ステップバック04.png


 

○ピックプレイ

・スクリーン(ピック)について

相手DFの進行を味方選手が壁となってふさぐプレイをスクリーン(ピック)といいます。

2_ピックプレイ_00.png

黒aが白1を、
黒bが白2をマークしているとします

白1が図のように移動するとします。
黒aは白1をマークしているので追いかけてきます。
このとき白2が黒aの進行を妨げるように壁となり、白1が(やや)フリーになる状態を作ります。
スクリーンになる選手は、体の大きいセンターのポジションの選手が望ましいです。


 

・ピックアンドロール

上記のスクリーンから、スクリーンをした選手(白2)が前へ方向転換してボールをもらう動きのことをピックアンドロールといいます。

2_ピックプレイ_01.png
2_ピックプレイ_02.png
黒bは白1の守備に向かうため、白2がフリーになります。

▽ピックアンドロールの参考動画
https://www.youtube.com/watch?v=Dsi0CI71YYU


 

・ピックアンドポップ

スクリーンから、スクリーンした選手(白2)が後ろでボールをもらう動きのことをピックアンドポップといいます。
相手DFの選手がドリブルの選手(白1)に追いついている場合に有効です。

2_ピックプレイ_03.png
2_ピックプレイ_04.png

▽ピックアンドポップの参考動画
https://www.youtube.com/watch?v=mzVGd9VumdM
https://www.youtube.com/watch?v=wWkkB3-zajM


 

○オフザボール中のスクリーンとセットオフェンスについて

ボールと直接関係ないところで、スクリーンを利用してフリーの選手を作り出します。
いろんなチームの連携があります。

・ウォーリアーズ
http://tunadrama.com/blog/warriors-set-offence-out-of-timeout-cyclone/

・解説つき
https://www.youtube.com/watch?v=KQsLrQQ7egM


 

[3] CPU同士の試合を見て面白いと思ってもらうにはどうすればいいか?

ユーザーに面白いと思ってもらうための要素、選手の動き、考え方などを記載します。


 

○パスがまわりやすい

ありきたりですが、これが案外効果が高いです。
逆にパスがつながりにくいとストレスを感じます。


 

○連携した動き、チームプレー、ピックプレーなど

・スペースに走りこむ
・スペースでパスをもらう、走りながらパスをもらう
・空いたスペースに走りこむ(3人目の動き)
・ピックプレー
・アリウープ
などが実現できると見てて面白いです。

(例、スペースを空ける動きとそこに走りこむ動きについて)
3_3人目の動き.png
白2はゴール下のスペースへ向かいます。
白2をマークしている黒aはつられてゴール下に向かいます。
白3は「白2が移動したことによってできたスペース」に走りこみます。
白1はボール所持選手で、白2にパスするなり、白3にパスして3Pを狙うことができます。
一見スペースは無いように見えても、味方の動き方によってスペースを作り出すことができます。


 

○一対一の勝負(1on1)

[攻撃VS守備]
・攻撃の選択肢はシュート、パス、ドリブルなど
・能力勝負
・駆け引き(ステップバック、シュートフェイント、キャッチアンドシュート、1タッチパスなど)
・意識、重心、反応の良さ、読みあい(これは表現が難しい、情報を毎回画面に表示できない)
・チャレンジ精神、攻める姿勢が見えるようにする
・リスクリターンのバランス(ボールがとられやすい選択肢を実行しすぎないなど)

のような要素を表現できると効果が高いです。
常に一対一の勝負があり、展開が速いので見落としがちになりますが、しっかりと用意しておきたいです。


 

○スリーポイントシュートの打ち得にならないようにする

シュートレンジの戦術で3Pシュートを多くする戦術が一番得点率が高くなるのでは?と考えました。

例、
3Pシュート
→リバウンドをとる
→ゴール下で2Pシュート
(ただ2Pシュートを狙うより、3Pシュートを打っておいた方がお得?)

以下の項目を調整して、3Pシュートを多用する戦術が必ずしも一番優れている戦術にならないようにしました。
・3Pの入る確率
・リバウンド成功率
・リバウンドをとられた場合の守備(カウンター対策)
※カウンターで失点しやすくするとバランスが良くなりました。


 

○ユーザーが予想できない動きをする

攻撃の選手は、誰が、どこで、どのタイミングでシュートを打つか、的を絞らせないように攻撃を仕掛けます
(誰がシュートを打つか、シュートの距離が近いor遠い、速攻orゆっくり攻めるなど)
→その攻撃に対して、守備選手は相手の攻撃が読めないので、意表をつかれます。
→見ているユーザーも意表をつかれます
→見てて面白い!!
という(謎の)流れで面白さにつなげます。

他にも以下の要素で、ユーザーが予想できない動きをして、見ていて面白い試合展開にしていきます。
・パスのスピードが速い、遅い、特殊なパス(バウンドパス、ロブパス、ワンタッチパスなど)
・パスとみせかけて、ドリブル
・ドリブルに緩急をつける、急にトップスピートのドライブ
・シュートフェイント
・個人技、チームプレー


 

○ランダム性

パスカットでボールの軌道がずれたり、リングのバウンドが予想外のところへ跳ね返ったり、
何か少しでも乱数の要素を入れた方がいいです。
そうしないとパラメータが強いチームが安定して勝利してしまい、退屈な試合展開になってしまいます。


 

○ダンク、アリウープの迫力、ダブルクラッチとか細かいテクニックとの対比

上記で説明してきた細かいテクニックや、ダブルクラッチなどのシュートテクニックと、
ダンクやアリウープなどの豪快なシュートの対比がおもしろいです。
バスケの醍醐味です。

・ヤニスアデトクンボ
https://www.youtube.com/watch?v=3HdCuN8hj9U

・アリウープ
https://www.youtube.com/watch?v=6aA4jkowCOE

ちなみにシュートブロック(ブロックショット?)も成功すると凄い盛り上がります。
https://www.youtube.com/watch?v=S4VAFMGMfwM


 

○その他ゲーム的要素

・戦術、戦略性、ユーザーが思ったとおりに動く
・成長要素の反映、選手の能力が試合シーンに反映される(シュート成功率アップ、移動速度アップ、パススピードアップ、ジャンプ力アップなど)
・何らかのネガティブな出来事が発生したとき、それを改善するための選択肢を用意しておく。自動対戦なので要注意。


 

[4] 試合シーンについて

ここから試合シーンのアルゴリズム、プログラムについて記載します。

[4-1] 試合の概要

試合シーンについて記載します。
試合シーンはCPU同士の対戦で、自動で進行するものとします。


 
○処理の流れについて
4_選手の意思決定00.png
主に戦術→コート評価→選手の意思決定の流れで選手たちの行動を決定します。
戦術が直接選手の意思決定に影響を与えたりもします。


 
○ポジションについて紹介
・ポイントガード(PG)
・シューティングガード(SG)
・スモールフォワード(SF)
・パワーフォワード(PF)
・センター(C)
の5つあります。
(PGとSG→G(ガード)、SFとPF→F(フォワード)の表記の方が主流かもしれません)


 

[4-2] 戦術について

[4-2-1] 事前に設定する戦術について

戦術はユーザーが決定できるようにします。

○オフェンス戦術
・シュートはどの位置から主に狙うか(ゴール下~3P)
・ポジショニング(ゴール下付近に密集する~3Pラインに広がる)

○ディフェンス戦術
・守備の仕方(マンツーマンディフェンス~ゾーンディフェンス)
・守備のフォーメーション

などを設定できるようにします。


 

[4-2-2] 試合中のオフェンス設定について

試合中の細かい戦術設定について。
以下の要素を攻守交替でオフェンスになるたびに設定します。
・1.選手のポジショニング位置の設定
・2.選手のオフザボールの動き方針の決定(パスのたびに更新)
・3、どこからシュートを狙うかの設定(シュート距離の設定)

このオフェンス戦術は、選手を単調な動きにさせないようにしたり、試合展開のバリエーションを増やすなどの効果があります。
[3]の「ユーザーが予想できない動きをする」の実現に役立ちます。
(ディフェンスの意表をつく→ユーザーも意表をつかれる→面白い!)

なおディフェンスは攻守交替のたびに何か変更するような要素は作成していないです。


 

○1.選手のポジショニング位置の設定について

・設定方法について
あらかじめ選手のポジション位置の候補を用意します。
コート評価00.png
青の位置は3P狙い、ピンクはゴール下、黄色はその中間です。
この13カ所から1つ選びます。

どこの箇所を選ぶかはポジションごとに異なります。
C>PF>SF>SG>PGの順番でゴール下から近くになるようにします。

4_2_2_コート評価00.png

それと、[4-2-1]のオフェンス戦術のポジショニングも影響させます。
「ゴール下付近に密集する」を選択していると、全体的に図の右寄り(ゴール下に近い)にポジションニングをします。
「3Pラインに広がる」を選択していると、全体的に図の左寄りにポジションニングをします。

※PGがゴール下、Cが3Pラインに行くことも確率的にありえるようにしています。

・プログラムについて(ポジションごとの配布)

//ポジションごとの割合の配列(サンプル)
public static int[][][] POSITION_W  = new int[][][]
{
    new int[][]
    {   //PG:   0,1,2,3,4,5,6,      7,8,9,10,11,       12
                new int[]{ 50,  40, 40, 15, 15, 0, 0,   100, 80, 80, 10, 10,  0 },  //ポジショニング:ゴール下
        new int[]{ 100, 80, 80, 30, 30, 10, 10,   15, 5, 5, 0, 0,  0 },     //ポジショニング:広い
    },
       //SG,SF,PF,Cは省略
};

//ポジションごとの割合の配列を取得する
int[][] positionW   = POSITION_W[positionId];

//戦術を加味する
work    = new int[13];
for (int i = 0; i < work.Length; i++) {
    work[i] = (ポジショニングの戦術:0~max) → (positionW[0][i]~positionW[1][i])へ変換
}

//行先エリアを決定します
int sum = 0;
for (int i = 0; i < work.Length; i++) sum += work[i];

int rand        = Random(sum);
int areaIndex   = 0;    //行先のエリア
for ( int i = 0; i < work.Length; i++ ){
    if ( rand < work[i] ){
        index   = i;
        break;
    }
    else {
        rand    -= work[i];
    }
}

return areaIndex;

これでオフェンス時のポジショニング位置が設定されます。
この位置を軸に移動します。
その場で待機してボールをもらったり、この位置からスペースの位置へ走りこんだりします。


 

○2.選手のオフザボールの動き方針の決定について

ボールを持っていない選手の、オフザボールの動き方針を決定します。
主に3種類あります。
・ポジション位置へ向かう(上で設定した位置)
・スペースの位置へ(後述のコート評価の高いところ)
・サポート(保留)

こちらの決定は確率で決定しましたが、チーム戦術や個人の方針なども関与したほうがいいです。

更新タイミングはパスのを実行するたびに更新しています。


 

○3.どこからシュートを狙うかの設定について(ゴールまでの距離)

[4-2-1]オフェンス戦術でシュートの狙う位置を設定しましたが、
ここで決めた位置から何度もシュートを打つと不自然に見えるので、シュートを打つ位置をばらけるように処理を加えます。
(どの距離からもシュートは打つが、設定した距離から一番シュートを打つようにする)

・手順について
1.距離ごとの割合の配列を用意する
2.シュートを打った場所を距離でindexに変換。そのindexのプラスマイナス1に補正をかける
3.それ以外のindexの割合値を上げる、上げ幅は戦術のシュートレンジに影響する
4.割合値の配列から乱数でindexを求める。この値が次の狙うシュートレンジになります。
です。

・処理の流れについて(サンプル)

  ゴール下                3P
    |-------------------------------|
index  0  1  2  3  4  5...
配列=  100 100 100 100 100 100... 

・手順2の処理
ゴール下近くのindex1の場所でシュートを打たれた場合
index1の周辺に補正を加えます
(index0*=0.5, index1*=0.2, index2*=0.5)
配列=   50  20  50 100 100 100 

・手順3の処理
それ以外に補正を加えます。
シュートを狙う位置の戦術によって上昇値が変わります。
(index0,1,2以外に+20)
配列=   50  20  50 120 120 120 

・手順4の処理
int sum = 0;
for (int i = 0; i < 配列.Length; i++) sum += 配列[i];
int rand        = Random(sum);
int index= 0;   //次に狙うシュートレンジindex
for ( int i = 0; i < 配列.Length; i++ ){
    if ( rand < 配列[i] ){
        index   = i;
        break;
    }
    else {
        rand    -= 配列[i];
    }
}

//配列は、50,20,50,120,120,120だったので、右側のindex(遠い距離からのシュート)が選ばれやすくなります。

これで設定した戦術を優先しつつ、いろんな距離からシュートを打つようになります。
また、この値は攻守交替でオフェンスになるたびに再設定されます。



 

[4-3] コート評価について

[4-3-1] コート評価の概要

ボールを持った選手の行動選択肢として、
・ドリブル9方向(その場待機含む)
・シュート
・パス(仲間4人へ)
などがあります。
それぞれの選択肢に評価値をつけて、一番高い選択肢を選びます。
この評価値を算出するときにコート評価を使用します。

例その1
コート評価の説明.png
図のようにコートをマス目に分けて、そこにコート評価を設定します。
ドリブル評価はボール所持選手の周囲8マス+その場の位置、
シュート評価はボール所持選手のその場の位置、
パス評価は受け取る選手の位置
のコート評価を使用して算出します。

コート評価は、ゴールに近いほど高くなる、相手選手周辺は低くなるなどの補正も入れています。


 

[4-3-2] コート評価の種類と設定方法について

コート評価の設定方法について記載します。
・ゴールに近づくほど評価が高い
・スリーポイントラインは評価が高い
・相手選手周辺は評価が低い
などの要素を考慮して設定していきます。
3種類のコート評価を使用します。


 

○共通の評価

1.基本
まずゴールまでの距離が近いほど評価が高くなるようにします。

2.追加処理
特定の場所で評価が高くなるようにします。
・サイドのライン際
・コーナー(守りづらいから評価UP、相手選手の背後をとりやすい)
・3Pライン上(シュートを狙う位置の戦術でさらに加算)
・リバウンド限定対応
で評価を加算します。


 

○共通の評価+3種類のコート評価

・コート評価NORMAL
・コート評価
敵MUL
・コート評価敵MUL味方MUL
の3種類を用意します。それぞれの用途で使い分けます。

種類 敵MUL 味方MUL 用途
コート評価_NORMAL × × ドリブルとシュートの評価
コート評価_敵MUL × パスの受け取り評価
コート評価敵MUL味方MUL スペースの評価

※補足
・敵MUL、味方MULについて
敵(相手選手)や味方の位置周囲に倍数をかけて、コート評価を減少させます。

↓計算例

乗算パラメータ
0.7, 0.4, 0.7
0.4, 0.2, 0.4
0.7, 0.4, 0.7

コート評価
100 100 100 100 100
100 100 100 100 100
100 100 100 100 100
100 100 100 100 100
100 100 100 100 100

↓中央にターゲットがいる場合

100 100 100 100 100
100 70 40 70 100
100 40 20 40 100
100 70 40 70 100
100 100 100 100 100


 

[4-3-3] コート評価の用途について

○「コート評価_NORMAL」について

ドリブルとシュートの評価に使用します。
選手の位置補正を入れないコート評価がそのまま使用されます。

シュートの評価は理解しやすいと思います。(ゴール下に近づくにつれて高い、3Pラインが高い)

ドリブルの評価は積極的にゴール方向に進行してほしいのでこちらの評価値を使用しています。
「コート評価_敵MUL」の評価を使用してもいいと思います。
これは相手の守備選手との接触判定の処理で変わってきます。

↓コート評価_NORMAL(共通評価の設定のみ)
コート評価種類00.png


 

○「コート評価_敵MUL」について

共通の評価をベースにして、相手選手の周辺の評価を下げます。
パスの受け取り位置の評価に使用します。
相手選手がいるところは評価が低くなっているので、この付近でパスの受け取りを避けるようになります。

例、
コート評価種類01.png
オレンジの丸の中が評価が低くなるところです。
白1がボールを所持しているとします。
白3は相手ディフェンスの範囲内なので、白3より白2の方がパスの受け取り先として評価が高くなります。


 

○「コート評価敵MUL味方MUL」について

共通の評価をベースにして、相手選手と味方選手の周辺の評価を下げます。
スペースへの走り込み先orスペースのパスの受け取り位置の評価に使用します。
味方選手と相手選手の周辺の評価が低くすることで、味方選手が評価の高いスペースへ走りこんでボールを受け取ることを実現できます。
よりアグレッシブな試合展開になります。

例、
コート評価種類02.png
オレンジの丸と水色の丸の中が評価が低くなるところです。
なのでこの場合だとゴール下のスペースが一番評価が高い場所になります。

白3がゴール下のスペースへ走りこんで白1からパスをもらいます。
相手の視野角も考慮すると、白3は相手の背後をまわるのでより効果が高いです。
白2は相手ディフェンスの視野に入り続けるのでディフェンスされやすいです。

視野角を考慮した例、
コート評価種類03.png
ボール所持選手とマークする選手の両方を視界にとらえるようにします。(守備の仕方によってはマークする選手を優先して見ることもあります)
スペースにたどりつくまで気づかれないということはないですが、反応が一瞬でも遅れるだけで大分違います。



 

[4-4] 選手の意思決定について

[4-4-1]ボール所持者の意思決定について

○ボールの所持中の行動
・ドリブル(8方向+その場)
・パス(×4人)
・スペースへのパス(×4人)
・シュート
・特殊行動(ドライブ、シュートフェイント、1タッチパス、クイックシュートなど)

それぞれの行動の評価値を算出して、重みをかけて調整したあとに、一番高い評価値の行動を実行します。
コート評価に加えて、追加の補正や評価入れます

○ドリブルの評価値の算出について
・評価値=コート評価_NORMAL
・前方に進む場合は評価アップ
・3Pシュートの場所はアップ

○パスの評価値の算出について
・評価値=コート評価_敵MUL
・マークされてない評価でプラス
・パスの距離が長いほどマイナス
・パスの進行上に相手選手がいる場合はマイナス
・キックアウトのパス(インサイドからアウトサイドへのパス、3Pを狙う用のパス)は見た目がかっこよかったのでプラス

○スペースへのパスの評価値の算出について
・評価値=パスを受ける選手の周囲で一番いいコート評価のところ(コート評価は「コート評価敵MUL味方MUL」を使用)
・パスの距離が長いほどマイナス
・パスの進行上に相手選手がいる場合はマイナス
・キックアウトのパスはプラス

○シュートの評価値の算出について
・評価値=コート評価_NORMAL
・マークされてない評価でプラス
・「[4-2-2] 試合中のオフェンス設定について」で設定したシュートの距離設定(近いほど評価プラス)
・時間経過で評価プラス(24秒以内にシュートを打たなければいけないルールがあります)

それぞれの選択肢の評価値を算出できたら、重みをそれぞれにかけ合わせます。
(評価値=評価値×重み)
コート評価がそれぞれ違うものを使用しているのでここで調整します。
そのあと一番高い評価の選択肢を選択して完了です。


 

[4-4-2] ボール所持者以外のオフェンスの意思決定について

「[4-2-2] 試合中のオフェンス設定について」

・1.選手のポジショニング位置の設定
・2.選手のオフザボールの動き方針の決定
の情報を使用します。

動き方針の種類は
・ポジショニングの位置へ向かう(到着後はその場で待機)
・スペースの位置へ(ポジショニング位置の周囲で一番スペース評価の高い位置)
・サポート(パスコースの確保、ピックプレーなど)
の3パターンです。

動き方針はパスの実行のたびに更新しています。


 

[4-4-3] ディフェンス選手の意思決定について

▽守備の仕方について

マンツーマンディフェンスとゾーンディフェンスの2種類があります。

マンツーマンディフェンスは、それぞれの相手選手に一対一で対応するディフェンスです。
ゾーンディフェンスは、自分の決められた範囲を守るディフェンスです。
ディフェンス05.png

実際の試合では、
主にマンツーマンディフェンス使用しますが、ピンポイントにゾーンディフェンスにしたり、マンツーマンとゾーンをミックスした守り方があります。


 

▽マンツーマンディフェンスについて

それぞれの相手選手に一対一で対応するディフェンス

○マークする選手の設定方法について
各要素の評価値を計算して、重みを掛け合わせてマークをするかの評価値を算出します。
これを相手選手5人分を計算して、一番高かった選手をマークするようにします。

評価値を算出する項目は以下の5つです
・相手選手のゴールまでの距離
・相手選手のマークされてない評価
・相手選手がボール所持者かどうか
・相手選手と自分の距離(近いほど評価が高い)
・自分の守備範囲内にいるかどうか

※補足
・相手選手1人に対して、2人以上でマークすることも想定しています。
・マーク設定は一度に設定するのではなく、1人づつ間をおいて設定しています。(「相手選手のマークされてない評価」の評価を入れるといい感じに調整できたため)

また、ボール所持者がゴールに近づくにつれて評価の重みも変えるようにします。

項目 ゴールまでの距離遠い ゴールまでの距離近い
相手選手のゴールまでの距離 0.2 0.5
相手選手のマークされてない評価 0.5 0.2
相手選手がボール所持者かどうか 0.1 1.0
相手選手と自分の距離(近いほど評価が高い) 0.3 0.2
自分の守備範囲内にいるかどうか 0.3 0.2

重みはゴールまでの距離で補完されます。
これによって、ゴールまでの距離によってマークの人数を変化させることができます。
上の数値の例は、ゴールから離れているときは1対1、ゴールに近いときはボール所持者を複数人でマークするように設定しています。

○ダブルチームについて
1人の選手に2人以上の守備選手が守備することをダブルチームといいます。
この状態だと攻め側にフリーの選手が生まれます。
こういう状況を作るとフリーの選手が生まれたり、動きも流動的になるので見ていて面白いものになります。
ディフェンス01.png

○[2]のドライブの例
ディフェンス08.png
上の並里選手のドライブの例もダブルチームです。
必要に応じて、1人の選手に対して複数人が守備に向かうようにしたいです。


 

▽ゾーンディフェンスについて

自分の決められた範囲を守るディフェンスですが、
上記のマンツーマンディフェンスのマークの要素を使用します。

マンツーマンディフェンスとの主な違いは、マークした選手へどこから間合いを詰めはじめるかの判断です。
マンツーマンディフェンスは速めに間合いを詰めるように守備をして、ゾーンディフェンスは相手選手を引きつけてから間合いを詰めるようにします。(それまでは自分の守備範囲をキープする)
ディフェンス06.png


 

▽ディフェンスのスライドについて

ゾーンディンフェンスで守備選手がつられて外に出た時に、スペースが空いて守備のバランスが悪くなってしまいます。
他の選手をただ棒立ちにしていると違和感があるので、バランスをとるようにポジショニングさせたいです。
ディフェンス07.png

このディフェンスのスライドについて記載します。

○設定方法について
・1.守備のコート評価を持ってきます
(オフェンス同様にゴール下に近づくにつれて評価が高い)

・2.相手オフェンス選手、味方ディフェンス選手(自分以外)の周辺の評価値を下げる
(目的はスペースの位置評価算出と同じ)

・3.自分の守備範囲内で移動するべき位置を決めます。
それぞれの位置に立ったとき、周囲に倍率(0.0~1.0)をかけて減少量の総和を求めます。
この値が一番大きいところに移動するようにします。

例、

乗算パラメータ
0.7, 0.4, 0.7
0.4, 0.2, 0.4
0.7, 0.4, 0.7

ベースのコート評価+敵、味方の評価補正を入れたあとのコート評価
40 50 60 70 80
50  60 70 80 90
60 70 80 90 100
50  60 70 80 90
40  50  60 70 80

↓中央(2,2)に移動する場合(コート評価の(2,2)を中心に乗算パラメータをかける)

40 50 60 70 80
50 42 28 56 90
60 28 16 36 100
50 42 28 56 90
40 50 60 70 80

減少量 = 18+42+24 + 42+64+54 + 18+42+24
       = 328

このように(0,0)~(4,4)まで調べます。
この例では(2,3)(中央右)の位置が一番減少量が高くなります。

↓中央右(2,3)に移動する場合(コート評価の(2,3)を中心に乗算パラメータをかける)

40 50 60 70 80
50 60 49 32 63
60 70 32 18 40
50 60 49 32 63
40 50 60 70 80

減少量 = 21+48+27 + 48+72+60 + 21+48+27
       = 372;

減少量が一番高い(2,3)の位置に移動します。
処理の意味合い的には、相手にとってスペース評価の高い位置を消すように移動する、です。

○守備まとめ
守備は、
・マーク
・守備フォーメーション
・間合いを詰める開始位置の判断
・ディフェンスのスライド
を考慮します。
ややこしいです。

守備の立ち位置を決める場合は、
1.マークする選手を決める
2.マークした選手へ間合いを詰めるかを決める
3.守備の立ち位置を決定する
・間合いを詰める判断 → 間合いをつめる
・間合いを詰めない判断 → 守備フォーメーションとディフェンスのスライドから算出
で考えるとやりやすいです。



 

[4-5] その他特殊処理

○相手ハーフコートに侵入 → ボールを自陣コートに戻さない
戻すとバックコートという名のファールなのでこれは塞ぎます。

○特殊メモ(メタAI?)
・ボールを捕られた回数でパス率を上げる
・左サイド、中央、右サイドでボールがばらけるように補正をかける(見た目重視)


 
以上です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした