日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

游戏ai 行为树_游戏AI –行为树简介

發(fā)布時(shí)間:2023/12/3 ChatGpt 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游戏ai 行为树_游戏AI –行为树简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

游戲ai 行為樹

游戲AI是一個(gè)非常廣泛的主題,盡管有很多資料,但我找不到能以較慢且更易理解的速度緩慢介紹這些概念的東西。 本文將嘗試解釋如何基于行為樹的概念來設(shè)計(jì)一個(gè)非常簡(jiǎn)單但可擴(kuò)展的AI系統(tǒng)。

什么是AI?

人工智能是參與游戲的實(shí)體表現(xiàn)出的類似于人類的行為。 與實(shí)際的智能推理驅(qū)動(dòng)的行為相比,這更是實(shí)體對(duì)智能和周到的行動(dòng)的幻想。 目的是試圖欺騙玩家,使他們認(rèn)為其他“智能”實(shí)體是由人類而不是機(jī)器控制的。 說起來容易做起來難,但是我們可以使用很多技巧來實(shí)現(xiàn)一些真正好的,看似隨機(jī)的“智能”行為。

一個(gè)例子

在跳入有趣的話題之前,讓我們起草一個(gè)我們想要實(shí)現(xiàn)的目標(biāo)的計(jì)劃。 同樣,我將以機(jī)器人為例。 想象一下一個(gè)競(jìng)技場(chǎng),機(jī)器人將在其中爭(zhēng)奪戰(zhàn),最后一個(gè)站位的機(jī)器人將是贏家。

競(jìng)技場(chǎng)將是一塊木板,機(jī)器人將隨機(jī)放置在上面。 我們將其制作為基于回合的游戲,以便我們可以追蹤整個(gè)AI的發(fā)展,但可以輕松將其轉(zhuǎn)變?yōu)閷?shí)時(shí)游戲。

規(guī)則很簡(jiǎn)單:

  • 木板是矩形
  • 機(jī)器人可以在任一方向上每轉(zhuǎn)一圈將瓷磚移動(dòng)到任何相鄰的未占用瓷磚上
  • 機(jī)器人具有一定范圍,并且可以向其范圍內(nèi)的機(jī)器人發(fā)射
  • 機(jī)器人將具有通常的屬性:它們?cè)斐傻膫蜕?

為了簡(jiǎn)單起見,我們將使用非常簡(jiǎn)單的結(jié)構(gòu)。 該應(yīng)用程序?qū)⒕哂蠨roid類和Board類。 機(jī)器人將具有以下定義它的屬性:

public class Droid {final String name;int x;int y;int range;int damage;int health;Board board;public Droid(String name, int x, int y, int health, int damage, int range) {this.name = name;this.x = x;this.y = y;this.health = health;this.damage = damage;this.range = range;}public void update() {// placeholder for each turn or tick}/* ... *//* getters and setters and toString() *//* ... */ }

Droid只是具有一些屬性的簡(jiǎn)單pojo。 這些屬性不言自明,但這是它們的簡(jiǎn)短摘要:

  • name –機(jī)器人的唯一名稱,也可以用于ID。
  • x和y –網(wǎng)??格上的坐標(biāo)。
  • health , damage和range -它說了什么。
  • board –是對(duì)機(jī)器人所在的Board以及其他機(jī)器人的引用。 我們需要這樣做,因?yàn)闄C(jī)器人將通過了解其環(huán)境(即board <./ li>)來做出決策。

還有一個(gè)空的update()方法,每次droid結(jié)束旋轉(zhuǎn)時(shí)都會(huì)調(diào)用該方法。 如果是實(shí)時(shí)游戲,則從游戲循環(huán)(最好是從游戲引擎)中調(diào)用update方法。

還有一些明顯的getter和setter以及toString()方法,它們從清單中省略了。 Board類非常簡(jiǎn)單。

public class Board {final int width;final int height;private List<Droid> droids = new ArrayList<Droid>();public Board(int width, int height) {this.width = width;this.height = height;}public int getWidth() {return width;}public int getHeight() {return height;}public void addDroid(Droid droid) {if (isTileWalkable(droid.getX(), droid.getY())) {droids.add(droid);droid.setBoard(this);}}public boolean isTileWalkable(int x, int y) {for (Droid droid : droids) {if (droid.getX() == x && droid.getY() == y) {return false;}}return true;}public List<Droid> getDroids() {return droids;} }

它具有width和height ,并且包含機(jī)器人列表。 它還包含一些方便的方法來檢查給定坐標(biāo)上是否已存在機(jī)器人,以及一種輕松地逐個(gè)添加機(jī)器人的方法。

到目前為止,這是相當(dāng)標(biāo)準(zhǔn)的。 我們可以在板上散布一些機(jī)器人,但它們不會(huì)做任何事情。 我們可以創(chuàng)建板,向其中添加一些機(jī)器人,然后開始調(diào)用update() 。 它們只是一些愚蠢的機(jī)器人。

不太傻的機(jī)器人

為了使droid做某事,我們可以在其update()方法中實(shí)現(xiàn)邏輯。 這就是所謂的每一次跳動(dòng)或在我們的情況下每轉(zhuǎn)一次的方法。 例如,我們希望我們的機(jī)器人在競(jìng)技場(chǎng)(木板)上徘徊,如果他們看到射程范圍內(nèi)的其他機(jī)器人,請(qǐng)接合它們并開始向它們射擊直到它們死亡。 這將是非常基本的AI,但仍然是AI。

偽代碼如下所示:
if enemy in range then fire missile at it
otherwise pick a random adjacent tile and move there

這意味著,機(jī)器人之間的任何相互作用都將導(dǎo)致僵持,較弱的機(jī)器人會(huì)被破壞。 我們可能要避免這種情況。 因此,我們可以補(bǔ)充一下,如果機(jī)器人有可能丟失,請(qǐng)嘗試逃跑。 僅在無處可逃時(shí)站起來戰(zhàn)斗。

if enemy in range then
if enemy is weaker then fight escape route exists then escape fight wander

一切都很好。 機(jī)器人將開始“智能化”地工作,但是除非我們添加更多代碼來做更多聰明的事情,否則它們?nèi)匀环浅S邢蕖?而且,它們將起到相同的作用。 想象一下,如果將它們放在更復(fù)雜的舞臺(tái)上。 在競(jìng)技場(chǎng)上,有一些道具如力量道具可以增強(qiáng)力量,可以避免障礙。 例如,當(dāng)機(jī)器人四處飛來飛去時(shí),請(qǐng)決定在拿起醫(yī)療/修理包與拿起武器加電之間。
它很快就會(huì)失控。 如果我們想要一個(gè)行為不同的機(jī)器人該怎么辦。 一個(gè)是攻擊機(jī)器人,另一個(gè)是修理機(jī)器人。 當(dāng)然,我們可以通過對(duì)象合成來實(shí)現(xiàn)這一目標(biāo) ,但是機(jī)器人的大腦將極其復(fù)雜,游戲設(shè)計(jì)的任何變化都需要付出巨大的努力才能適應(yīng)。

讓我們看看是否可以提出一個(gè)可以解決這些問題的系統(tǒng)。

大腦來了

我們可以將機(jī)器人的AI模塊視為某種大腦。 大腦由遵循一系列規(guī)則作用于機(jī)器人的幾個(gè)例程組成。 這些規(guī)則支配著例程的執(zhí)行,因此它將生存和贏得比賽的機(jī)會(huì)最大化作為最終目標(biāo)。 如果我們想到由例程組成的人腦,并以馬斯洛的需求層次作為參考,我們可以立即識(shí)別出一些例程。

  • 生理程序 –每次都需要執(zhí)行的程序,否則將沒有任何生命
  • 生存程序 –一旦滿足生活條件,就必須執(zhí)行該程序,以確保長期生存
  • 有抱負(fù)的例程 –如果在維持生計(jì)之后還剩下時(shí)間需要再次執(zhí)行生計(jì),則將執(zhí)行此例程

讓我們分解一下人類的智慧。 人類需要呼吸才能生存。 每次呼吸都消耗能量。 一個(gè)人可以呼吸這么多,直到能量耗盡。 要補(bǔ)充能量,就需要吃飯。 一個(gè)人只有在他/她有食物可支配的情況下才能吃飯。 如果沒有可用的食物,則需要消耗更多的能量。 如果購買食物需要很長時(shí)間(例如,需要狩獵)并且獲得的食物量很少,那么在食用之后,人們需要更多食物,并且例程會(huì)立即重新開始。 如果從超市購買散裝的食物,吃完后還有很多剩余的空間,因此人類可以繼續(xù)做更多有趣的事情,這些都是他/她理想的部分。 例如,結(jié)交朋友,發(fā)動(dòng)戰(zhàn)爭(zhēng)或看電視之類的事情。
只要思考一下人腦中有多少東西才能使我們發(fā)揮功能并嘗試對(duì)其進(jìn)行模擬。 所有這些都忽略了我們正在獲得和響應(yīng)的大多數(shù)刺激。 為此,我們需要對(duì)人體進(jìn)行參數(shù)設(shè)置,并且由刺激觸發(fā)的每個(gè)傳感器將更新正確的參數(shù),并且執(zhí)行的例程將檢查新值并采取相應(yīng)的措施。 我現(xiàn)在不會(huì)描述它,但是您希望我有所想法。

讓我們切換回更簡(jiǎn)單的機(jī)器人。 如果我們嘗試使人類例程適應(yīng)機(jī)器人,我們將得到如下所示:

  • 生理的/存在的 -在本示例中我們可以忽略這部分,因?yàn)槲覀冊(cè)O(shè)計(jì)的是機(jī)器人,并且它們是機(jī)械人。 當(dāng)然,對(duì)于它們來說,它們?nèi)匀恍枰獜碾姵鼗蚱渌赡芎谋M的能源中獲取能量(例如動(dòng)作點(diǎn))。 為了簡(jiǎn)單起見,我們將忽略這一點(diǎn),并認(rèn)為能源是無限的。
  • 生存/安全 -該例程將確保機(jī)器人在避免當(dāng)前威脅的情況下在當(dāng)前回合中存活并存活。
  • 有抱負(fù) –一旦安全例行程序簽出就可以啟動(dòng),而不必激活機(jī)器人的逃逸例行程序。 機(jī)器人目前的簡(jiǎn)單愿望是殺死其他機(jī)器人。

盡管所描述的例程非常簡(jiǎn)單并且可以進(jìn)行硬編碼,但是我們將要實(shí)現(xiàn)的方法更加復(fù)雜。 我們將使用基于行為樹的方法。

首先,我們需要將機(jī)器人的所有活動(dòng)委托給它的大腦。 我將其稱為“ Routine而不是大腦。 它可以被稱為BrainAI或其他任何東西,但我選擇Routine是因?yàn)樗鼘⒆鳛榻M成所有例程的基類。 它還將負(fù)責(zé)控制大腦中的信息流。 Routine本身是具有3個(gè)狀態(tài)的有限狀態(tài)機(jī)。

public abstract class Routine {public enum RoutineState {Success,Failure,Running}protected RoutineState state;protected Routine() { }public void start() {this.state = RoutineState.Running;}public abstract void reset();public abstract void act(Droid droid, Board board);protected void succeed() {this.state = RoutineState.Success;}protected void fail() {this.state = RoutineState.Failure;}public boolean isSuccess() {return state.equals(RoutineState.Success);}public boolean isFailure() {return state.equals(RoutineState.Failure);}public boolean isRunning() {return state.equals(RoutineState.Running);}public RoutineState getState() {return state;} }

這三種狀態(tài)是:

  • Running -該例程當(dāng)前正在運(yùn)行,并且將在下一回合中作用于機(jī)器人。 例如。 該例程負(fù)責(zé)將機(jī)器人移動(dòng)到某個(gè)位置,并且機(jī)器人在運(yùn)輸過程中仍然不間斷地移動(dòng)。
  • Success –例行程序已經(jīng)完成,并且成功完成了應(yīng)做的工作。 例如,如果例程仍然是“移動(dòng)到位置”,則當(dāng)機(jī)器人到達(dá)目的地時(shí)例程成功。
  • Failure –使用前面的示例(移至),機(jī)器人的移動(dòng)被中斷(機(jī)器人被破壞,出現(xiàn)了意外障礙或其他常規(guī)例程受到干擾)并且沒有到達(dá)目的地。

Routine類具有act(Droid droid, Board board)抽象方法。 我們需要傳入Droid和Board因?yàn)楫?dāng)例程執(zhí)行操作時(shí),它會(huì)在droid上并且在知道droid的環(huán)境即董事會(huì)上也這樣做。 例如,moveTo例程將在每轉(zhuǎn)一圈更改機(jī)器人的位置。 通常,當(dāng)例程作用于機(jī)器人時(shí),它會(huì)使用從其環(huán)境中收集的知識(shí)。 這些知識(shí)是根據(jù)實(shí)際情況建模的。 想象一下,機(jī)器人(像我們?nèi)祟愐粯?#xff09;無法看到整個(gè)世界,而只能看到它的視線范圍。 我們?nèi)祟惖囊曇按蠹s為135度,因此,如果我們要模擬人類,我們將進(jìn)入包含我們看到的部分及其中所有可見部分的世界切片,并讓例行程序進(jìn)行如下操作:盡其所能并得出結(jié)論。 我們也可以對(duì)機(jī)器人執(zhí)行此操作,只需傳遞range覆蓋的電路板部分,但我們現(xiàn)在將使其保持簡(jiǎn)單并使用整個(gè)電路板。 start() , succeed()和fail()方法是簡(jiǎn)單的公共可重寫方法,可以相應(yīng)地設(shè)置狀態(tài)。 另一方面, reset()方法是抽象的,必須由每個(gè)具體例程來實(shí)現(xiàn),以重置該例程專有的任何內(nèi)部狀態(tài)。 其余的是查詢例程狀態(tài)的便捷方法。

學(xué)習(xí)走路

讓我們實(shí)現(xiàn)第一個(gè)具體例程,即上面討論的MoveTo 。

public class MoveTo extends Routine {final protected int destX;final protected int destY;public MoveTo(int destX, int destY) {super();this.destX = destX;this.destY = destY;}public void reset() {start();}@Overridepublic void act(Droid droid, Board board) {if (isRunning()) {if (!droid.isAlive()) {fail();return;}if (!isDroidAtDestination(droid)) {moveDroid(droid);}}}private void moveDroid(Droid droid) {if (destY != droid.getY()) {if (destY > droid.getY()) {droid.setY(droid.getY() + 1);} else {droid.setY(droid.getY() - 1);}}if (destX != droid.getX()) {if (destX > droid.getX()) {droid.setX(droid.getX() + 1);} else {droid.setX(droid.getX() - 1);}}if (isDroidAtDestination(droid)) {succeed();}}private boolean isDroidAtDestination(Droid droid) {return destX == droid.getX() && destY == droid.getY();} }

這是一個(gè)非常基本的類,它將使機(jī)器人將一個(gè)磁貼向目的地移動(dòng),直到到達(dá)目的地。 除了機(jī)器人是否處于活動(dòng)狀態(tài)之外,它不會(huì)檢查任何其他約束。 那就是失敗的條件。 該例程具有2個(gè)參數(shù)destX和destY 。 這些是MoveTo例程將用于實(shí)現(xiàn)其目標(biāo)的最終屬性。 該例程的唯一職責(zé)是移動(dòng)機(jī)器人。 如果做不到,它將失敗。 而已。 在這里, 單一責(zé)任非常重要。 我們將看到如何將它們結(jié)合起來以實(shí)現(xiàn)更復(fù)雜的行為。 reset()方法只是將狀態(tài)設(shè)置為Running 。 它沒有其他內(nèi)部狀態(tài)或值要處理,但是需要重寫。
該例程的核心是act(Droid droid, Board board)方法,該方法執(zhí)行操作并包含邏輯。 首先,它檢查故障情況,即機(jī)器人是否死亡。 如果它已經(jīng)死了并且例程處于活動(dòng)狀態(tài)(其狀態(tài)為Running ),則該例程將無法執(zhí)行應(yīng)有的操作。 它調(diào)用超類的默認(rèn)fail()方法將狀態(tài)設(shè)置為Failure并退出該方法。
該方法的第二部分檢查成功條件。 如果機(jī)器人尚未到達(dá)目的地,則將機(jī)器人向目的地移動(dòng)一格。 如果到達(dá)目的地,則將狀態(tài)設(shè)置為Success 。 檢查isRunning()以確保該例程僅在該例程處于活動(dòng)狀態(tài)且尚未完成時(shí)才起作用。

我們還需要填寫Droid的update方法以使其使用例程。 這只是一個(gè)簡(jiǎn)單的委托。 它是這樣的:

public void update() {if (routine.getState() == null) {// hasn't started yet so we start itroutine.start();}routine.act(this, board);}

它應(yīng)該僅由第6行組成,但我還要檢查一下狀態(tài)是否為null ,如果為null ,則start例程。 這是在首次調(diào)用update啟動(dòng)例程的一種方法。 這是一種準(zhǔn)命令模式,因?yàn)樵赼ct方法中,將action命令的接收者作為參數(shù)(即機(jī)器人本身)作為參數(shù)。 我還修改了Routine類以在其中記錄不同的事件,因此我們可以看到發(fā)生了什么。

// --- omitted --- */public void start() {System.out.println(">>> Starting routine: " + this.getClass().getSimpleName());this.state = RoutineState.Running;}protected void succeed() {System.out.println(">>> Routine: " + this.getClass().getSimpleName() + " SUCCEEDED");this.state = RoutineState.Success;}protected void fail() {System.out.println(">>> Routine: " + this.getClass().getSimpleName() + " FAILED");this.state = RoutineState.Failure;}// --- omitted --- */

讓我們用一個(gè)簡(jiǎn)單的Test類進(jìn)行Test 。

public class Test {public static void main(String[] args) {// SetupBoard board = new Board(10, 10);Droid droid = new Droid("MyDroid", 5, 5, 10, 1, 2);board.addDroid(droid);Routine moveTo = new MoveTo(7, 9);droid.setRoutine(moveTo);System.out.println(droid);// Execute 5 turns and print the droid outfor (int i = 0; i < 5; i++) {droid.update();System.out.println(droid);}} }

這是帶有main方法的標(biāo)準(zhǔn)類,該方法首先設(shè)置一個(gè)10 x 10的正方形Board并在坐標(biāo)5,5處添加具有所提供屬性的Droid 。 在第10行上,我們創(chuàng)建了MoveTo例程,該例程將目標(biāo)設(shè)置為(7,9) 。 我們將此例程設(shè)置為機(jī)器人的唯一例程( 第11行),并打印機(jī)器人的狀態(tài)( 第12行)。 然后我們執(zhí)行5轉(zhuǎn)并在每轉(zhuǎn)之后顯示機(jī)器人的狀態(tài)。

運(yùn)行Test我們將看到以下內(nèi)容打印到sysout中:

Droid{name=MyDroid, x=5, y=5, health=10, range=2, damage=1}>>> Starting routine: MoveToDroid{name=MyDroid, x=6, y=6, health=10, range=2, damage=1}Droid{name=MyDroid, x=7, y=7, health=10, range=2, damage=1}Droid{name=MyDroid, x=7, y=8, health=10, range=2, damage=1}>>> Routine: MoveTo SUCCEEDEDDroid{name=MyDroid, x=7, y=9, health=10, range=2, damage=1}Droid{name=MyDroid, x=7, y=9, health=10, range=2, damage=1}

如我們所見,機(jī)器人按照預(yù)期從位置(5,5)開始。 首次調(diào)用update方法,啟動(dòng)MoveTo例程。 隨后的3次對(duì)更新的調(diào)用將通過將機(jī)器人的坐標(biāo)每轉(zhuǎn)一圈將其移動(dòng)到目的地。 例程成功后,傳遞給該例程的所有調(diào)用都將被忽略,因?yàn)樗淹瓿伞?

這是第一步,但不是很有幫助。 假設(shè)我們想讓我們的機(jī)器人在板上徘徊。 為此,我們需要重復(fù)執(zhí)行MoveTo例程,但是每次重新啟動(dòng)MoveTo例程時(shí),都需要隨機(jī)選擇目的地。

徘徊

但是,讓我們從Wander例程開始。 它不過是MoveTo不過只要我們了解棋盤,我們就會(huì)生成一個(gè)隨機(jī)目的地。

public class Wander extends Routine {private static Random random = new Random();private final Board board;private MoveTo moveTo;@Overridepublic void start() {super.start();this.moveTo.start();}public void reset() {this.moveTo = new MoveTo(random.nextInt(board.getWidth()), random.nextInt(board.getHeight()));}public Wander(Board board) {super();this.board = board;this.moveTo = new MoveTo(random.nextInt(board.getWidth()), random.nextInt(board.getHeight()));}@Overridepublic void act(Droid droid, Board board) {if (!moveTo.isRunning()) {return;}this.moveTo.act(droid, board);if (this.moveTo.isSuccess()) {succeed();} else if (this.moveTo.isFailure()) {fail();}} }

遵循單一責(zé)任原則, Wander類的唯一目的是在板上選擇隨機(jī)的目的地。 然后,它使用MoveTo例程將機(jī)器人獲取到新的目的地。 reset方法將重新啟動(dòng)它,并選擇一個(gè)新的隨機(jī)目標(biāo)。 目標(biāo)是在構(gòu)造函數(shù)中設(shè)置的。 如果我們希望機(jī)器人漫游,可以將Test類更改為以下內(nèi)容:

public class Test {public static void main(String[] args) {// SetupBoard board = new Board(10, 10);Droid droid = new Droid("MyDroid", 5, 5, 10, 1, 2);board.addDroid(droid);Routine routine = new Wander(board);droid.setRoutine(routine);System.out.println(droid);for (int i = 0; i < 5; i++) {droid.update();System.out.println(droid);}} }

輸出將類似于以下內(nèi)容:

Droid{name=MyDroid, x=5, y=5, health=10, range=2, damage=1}>>> Starting routine: Wander>>> Starting routine: MoveToDroid{name=MyDroid, x=6, y=6, health=10, range=2, damage=1}Droid{name=MyDroid, x=7, y=7, health=10, range=2, damage=1}Droid{name=MyDroid, x=7, y=8, health=10, range=2, damage=1}>>> Routine: MoveTo SUCCEEDED>>> Routine: Wander SUCCEEDEDDroid{name=MyDroid, x=7, y=9, health=10, range=2, damage=1}Droid{name=MyDroid, x=7, y=9, health=10, range=2, damage=1}

注意Wander如何包含和委托MoveTo例程。

重復(fù),重復(fù),重復(fù)…

一切都很好,但是如果我們希望機(jī)器人反復(fù)游蕩怎么辦? 我們將創(chuàng)建一個(gè)Repeat例程,其中將包含要重復(fù)的例程。 同樣,我們將使該例程生效,以便它可以使用一個(gè)參數(shù)來指定要重復(fù)一個(gè)例程多少次。 如果不接受參數(shù),則它將永久重復(fù)包含例程,或者直到機(jī)器人死掉為止。

public class Repeat extends Routine {private final Routine routine;private int times;private int originalTimes;public Repeat(Routine routine) {super();this.routine = routine;this.times = -1; // infinitethis.originalTimes = times;}public Repeat(Routine routine, int times) {super();if (times < 1) {throw new RuntimeException("Can't repeat negative times.");}this.routine = routine;this.times = times;this.originalTimes = times;}@Overridepublic void start() {super.start();this.routine.start();}public void reset() {// reset countersthis.times = originalTimes;}@Overridepublic void act(Droid droid, Board board) {if (routine.isFailure()) {fail();} else if (routine.isSuccess()) {if (times == 0) {succeed();return;}if (times > 0 || times <= -1) {times--;routine.reset();routine.start();}}if (routine.isRunning()) {routine.act(droid, board);}} }

該代碼很容易理解,但是我將解釋一些添加的內(nèi)容。 屬性routine在構(gòu)造函數(shù)中傳遞,該例程將被重復(fù)。 originalTimes是一個(gè)存儲(chǔ)變量,其中包含初始次數(shù)值,因此我們可以使用reset()調(diào)用重新啟動(dòng)例程。 這只是初始狀態(tài)的備份。 times屬性是提供的例程將被重復(fù)多少次。 如果它是-1那么它是無限的。 所有這些都在act方法內(nèi)的邏輯中進(jìn)行了編碼。 為了測(cè)試這一點(diǎn),我們需要?jiǎng)?chuàng)建一個(gè)Repeat例程并提供要重復(fù)的內(nèi)容。 例如,要使機(jī)器人不斷徘徊,我們需要這樣做:

Routine routine = new Repeat((new Wander(board)));droid.setRoutine(routine);

如果我們反復(fù)調(diào)用update ,我們將看到機(jī)器人將不斷移動(dòng)。 檢查以下樣本輸出:

Droid{name=MyDroid, x=5, y=5, health=10, range=2, damage=1}>> Starting routine: Repeat>>> Starting routine: Wander>>> Starting routine: MoveToDroid{name=MyDroid, x=4, y=6, health=10, range=2, damage=1}>>> Routine: MoveTo SUCCEEDED>>> Routine: Wander SUCCEEDEDDroid{name=MyDroid, x=4, y=7, health=10, range=2, damage=1}>>> Starting routine: Wander>>> Starting routine: MoveToDroid{name=MyDroid, x=5, y=6, health=10, range=2, damage=1}Droid{name=MyDroid, x=6, y=5, health=10, range=2, damage=1}Droid{name=MyDroid, x=7, y=4, health=10, range=2, damage=1}Droid{name=MyDroid, x=8, y=3, health=10, range=2, damage=1}Droid{name=MyDroid, x=8, y=2, health=10, range=2, damage=1}>>> Routine: MoveTo SUCCEEDED>>> Routine: Wander SUCCEEDEDDroid{name=MyDroid, x=8, y=1, health=10, range=2, damage=1}>>> Starting routine: Wander>>> Starting routine: MoveToDroid{name=MyDroid, x=7, y=2, health=10, range=2, damage=1}Droid{name=MyDroid, x=6, y=3, health=10, range=2, damage=1}

請(qǐng)注意Repeat例程不會(huì)結(jié)束。

組裝情報(bào)

到目前為止,我們只是在編寫行為。 但是,如果我們想對(duì)機(jī)器人進(jìn)行決策并建立更復(fù)雜的行為,該怎么辦? 輸入行為樹。 這個(gè)術(shù)語沒有描述它的含義,我發(fā)現(xiàn)的大多數(shù)文章也沒有描述。 我將從首先要實(shí)現(xiàn)的目標(biāo)開始,希望這一切都是有意義的。 我想實(shí)現(xiàn)本文開頭所述的行為。 我希望我的機(jī)器人掃描其范圍內(nèi)是否有較弱的機(jī)器人,如果有,請(qǐng)使其接合,否則請(qǐng)?zhí)与x。 看下圖。 它顯示了一棵樹。 它不過是由多個(gè)不同例程組成的例程。 每個(gè)節(jié)點(diǎn)都是一個(gè)例程,我們將必須實(shí)現(xiàn)一些特殊的例程。

Droid AI(行為樹)

讓我們打破常規(guī)。

  • Repeat –是較早實(shí)施的例程。 它將永遠(yuǎn)重復(fù)給定的例程,或者直到嵌入式例程失敗為止。
  • Sequence –順序例程只有在其包含的所有例程都成功后才能成功。 例如,要攻擊機(jī)器人,敵方機(jī)器人必須在射程范圍內(nèi),需要裝載槍支,機(jī)器人需要拉動(dòng)扳機(jī)。 一切按此順序進(jìn)行。 因此,該序列包含例程列表并對(duì)其執(zhí)行操作,直到所有例程都成功為止。 如果槍未裝彈,則沒有必要扳動(dòng)扳機(jī),因此整個(gè)攻擊都是失敗的。
  • Selector –此例程包含一個(gè)或多個(gè)例程的列表。 當(dāng)它起作用時(shí),如果列表中的例程之一成功,它將成功。 例程的執(zhí)行順序由例程的傳遞順序設(shè)置。如果我們想隨機(jī)化例程的執(zhí)行,則創(chuàng)建一個(gè)Random例程很容易,其唯一目的是隨機(jī)化例程列表通過了。
  • 所有灰色例程都是樹上的葉子,這意味著它們不能再包含任何后續(xù)例程,它們是作用于接收者的機(jī)器人上的例程。

上面的樹代表了我們想要實(shí)現(xiàn)的非常基本的AI。 讓我們從根開始。
Repeat –將無限期重復(fù)選擇器,直到兩個(gè)分支都無法成功執(zhí)行。 選擇器中的例程為: Attack a droid和Wander 。 如果兩者均失敗,則表明機(jī)器人已死。 Attack a droid例程是一系列例程,這意味著所有例程都必須成功才能使整個(gè)分支成功。 如果失敗,則后退是通過Wander選擇一個(gè)隨機(jī)目的地并將其移動(dòng)到那里。 然后重復(fù)。

我們需要做的就是實(shí)現(xiàn)例程。 例如, IsDroidInRange可能看起來像這樣:

public class IsDroidInRange extends Routine {public IsDroidInRange() {}@Overridepublic void reset() {start();}@Overridepublic void act(Droid droid, Board board) {// find droid in rangefor (Droid enemy : board.getDroids()) {if (!droid.getName().equals(enemy)) {if (isInRange(droid, enemy)) {succeed();break;}}}fail();}private boolean isInRange(Droid droid, Droid enemy) {return (Math.abs(droid.getX() - enemy.getX()) <= droid.getRange()|| Math.abs(droid.getY() - enemy.getY()) < droid.getRange());} }

這是一個(gè)非常基本的實(shí)現(xiàn)。 它確定機(jī)器人是否在范圍內(nèi)的方式是,通過遍歷板上的所有機(jī)器人,以及敵方機(jī)器人(假設(shè)名稱唯一)是否在范圍內(nèi),則成功了。 否則失敗。 當(dāng)然,我們需要以某種方式將這個(gè)機(jī)器人輸入下一個(gè)例程,即IsEnemyStronger 。 這可以通過為droid提供上下文來實(shí)現(xiàn)。 一種簡(jiǎn)單的方法可能是Droid類可以具有一個(gè)屬性nearestEnemy ,如果success ,例程將填充該字段,而失敗則將其清除。 這樣,以下例程可以訪問droid的內(nèi)部,并使用該信息確定其成功或失敗的情況。 當(dāng)然,可以并且應(yīng)該對(duì)此進(jìn)行擴(kuò)展,以便機(jī)器人將在其范圍內(nèi)包含一系列機(jī)器人,并有例程確定機(jī)器人應(yīng)該飛行還是戰(zhàn)斗。 但這不是本介紹的范圍。

我不會(huì)實(shí)現(xiàn)本文中的所有例程,但是您將能夠在github上查看代碼: https : //github.com/obviam/behavior-trees ,我將添加越來越多的例程。

然后去哪兒?

僅僅看一下就可以做出很多改進(jìn)。 作為測(cè)試系統(tǒng)的第一步,為了方便起見,我將例程的創(chuàng)建移至工廠。

/*** Static convenience methods to create routines*/ public class Routines {public static Routine sequence(Routine... routines) {Sequence sequence = new Sequence();for (Routine routine : routines) {sequence.addRoutine(routine);}return sequence;}public static Routine selector(Routine... routines) {Selector selector = new Selector();for (Routine routine : routines) {selector.addRoutine(routine);}return selector;}public static Routine moveTo(int x, int y) {return new MoveTo(x, y);}public static Routine repeatInfinite(Routine routine) {return new Repeat(routine);}public static Routine repeat(Routine routine, int times) {return new Repeat(routine, times);}public static Routine wander(Board board) {return new Wander(board);}public static Routine IsDroidInRange() {return new IsDroidInRange();}}

這將允許以更優(yōu)雅的方式測(cè)試某些方案。 例如,要放置2個(gè)具有不同行為的機(jī)器人,您可以執(zhí)行以下操作:

public static void main(String[] args) {Board board = new Board(25, 25);Droid droid1 = new Droid("Droid_1", 2, 2, 10, 1, 3);Droid droid2 = new Droid("Droid_2", 10, 10, 10, 2, 2);Routine brain1 = Routines.sequence(Routines.moveTo(5, 10),Routines.moveTo(15, 12),Routines.moveTo(2, 4));droid1.setRoutine(brain1);Routine brain2 = Routines.sequence(Routines.repeat(Routines.wander(board), 4));droid2.setRoutine(brain2);for (int i = 0; i < 30; i++) {System.out.println(droid1.toString());System.out.println(droid2.toString());droid1.update();droid2.update();}}

當(dāng)然,到目前為止,這并不是最好的解決方案,但是它比例程的不斷實(shí)例化要好。 理想情況下,應(yīng)該通過外部腳本編寫腳本或從外部加載AI,例如,通過腳本編寫,或至少以JSON形式提供,并由AI匯編程序創(chuàng)建。 這樣,每次調(diào)整AI時(shí)都不需要重新編譯游戲。 但同樣,這也不是本文的范圍。

此外,我們?nèi)绾螞Q定哪個(gè)動(dòng)作需要轉(zhuǎn)牌/勾號(hào)或立即得到評(píng)估? 一種可能的解決方案是將動(dòng)作點(diǎn)分配給機(jī)器人可以花費(fèi)一轉(zhuǎn)的動(dòng)作點(diǎn)(如果是實(shí)時(shí)的,則勾選),并為每個(gè)動(dòng)作分配一個(gè)成本。 只要機(jī)器人機(jī)器人用完了點(diǎn),我們就可以繼續(xù)前進(jìn)。 我們還需要跟蹤哪個(gè)例程是當(dāng)前例程,以便我們優(yōu)化樹的遍歷。 如果AI非常復(fù)雜,尤其是在實(shí)時(shí)游戲中,這將很有幫助。

如果您認(rèn)為本文很有用,并且想要獲取代碼,請(qǐng)檢查github存儲(chǔ)庫。 您也可以返回,因?yàn)槲掖蛩銛U(kuò)展并更新它,從而使它演變成更完整的AI示例。 因?yàn)檫@是我第一次接觸AI,所以還有很多事情需要改進(jìn),而且我始終對(duì)改進(jìn)有很多意見和想法。

  • https://github.com/obviam/behavior-trees

翻譯自: https://www.javacodegeeks.com/2014/08/game-ai-an-introduction-to-behaviour-trees.html

游戲ai 行為樹

總結(jié)

以上是生活随笔為你收集整理的游戏ai 行为树_游戏AI –行为树简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

99这里只有久久精品视频 | 久在线 | 欧美激情综合色综合啪啪五月 | 青青河边草免费观看 | 色欧美日韩 | 国产91精品欧美 | 成人久久视频 | 黄色三级免费看 | 国内成人精品2018免费看 | 亚洲做受高潮欧美裸体 | 500部大龄熟乱视频使用方法 | 91精品视屏| 深爱婷婷网 | 天天摸天天干天天操天天射 | 亚洲精品国产精品国自 | 中文字幕在线观看一区 | 国产91精品一区二区绿帽 | 久久艹中文字幕 | 欧美另类网站 | 欧美极度另类性三渗透 | 国产在线黄色 | 国产在线欧美在线 | 免费福利小视频 | 天天综合久久 | 97超碰人人爱 | 久av在线 | 美女免费视频黄 | 91av手机在线 | 天天爽人人爽夜夜爽 | 国产美女久久久 | 国内久久看 | 久久精品一二三区 | 国产网站在线免费观看 | 97精品一区二区三区 | 91亚洲精品国偷拍自产在线观看 | 青青草国产成人99久久 | 亚洲精品国产精品国 | 国产又黄又爽无遮挡 | 色婷婷精品大在线视频 | 国产免费一区二区三区最新 | 精品久久久久久综合 | 日日夜夜人人天天 | 免费在线黄色av | 天天操天天操天天 | 久久综合影音 | 另类老妇性bbwbbw高清 | 在线免费黄网站 | 中文字幕美女免费在线 | 91看片淫黄大片在线播放 | 久草在线播放视频 | 亚洲精品91天天久久人人 | a午夜在线| 就色干综合 | 欧美色精品天天在线观看视频 | 日韩中出在线 | 色91av| 亚洲精品国偷自产在线91正片 | 黄色电影在线免费观看 | 久久精品国产久精国产 | 波多野结衣电影一区二区三区 | 黄色亚洲免费 | 一级黄色片在线播放 | 超碰97国产在线 | 日韩国产精品久久久久久亚洲 | 国色综合 | 国产成人精品一区在线 | 天天爽夜夜爽精品视频婷婷 | 国产黄色美女 | 丝袜美女视频网站 | 国产成人久久av免费高清密臂 | 精品理论片 | 亚洲h在线播放在线观看h | 日本69hd | 不卡av在线| 国产精品国产三级国产aⅴ9色 | 久久精品国产一区二区电影 | 少妇自拍av | 国产精品久久久久久久久久妇女 | 人人干人人爽 | 婷婷丁香五 | 久草精品在线 | 欧美一区二区三区在线看 | 成年人免费av | 国产精品久久久久久久久久了 | 国产日韩欧美在线观看视频 | 91麻豆视频网站 | 国产在线观看91 | 国产免费精彩视频 | 又黄又网站 | 狠狠久久婷婷 | av专区在线 | 六月丁香激情综合色啪小说 | 成年人免费看 | 91最新在线观看 | 久久综合免费视频影院 | 国产色道 | 中文字幕人成人 | 亚洲国产精品99久久久久久久久 | 亚洲国内精品在线 | 在线看片日韩 | 97天堂 | 去干成人网 | 不卡精品视频 | 精品国产1区 | 天天操天天舔天天干 | 成人黄色在线视频 | 久久成人视屏 | 在线免费观看黄网站 | 天天综合网在线观看 | 国产精品美女免费看 | 国内精品久久久精品电影院 | 九九九电影免费看 | 国产精品99页 | www.狠狠干 | 91亚洲精品国偷拍自产在线观看 | 欧美一区二区伦理片 | 九九精品毛片 | 精品国产一区二区三区在线观看 | 国产视频在线看 | 色网站在线观看 | 久久久久久久久爱 | 国产婷婷vvvv激情久 | 免费看污在线观看 | 色在线免费| 91少妇精拍在线播放 | 亚洲欧美综合精品久久成人 | 欧美热久久 | 91资源在线播放 | 久久免费a | 国产亚洲欧美在线视频 | 黄网站免费大全入口 | 91精品国产99久久久久久红楼 | 天天操天天干天天干 | 久久久久9999亚洲精品 | 婷婷色在线 | 99久久99久久精品国产片 | 日韩电影一区二区在线观看 | 亚洲精品视频免费看 | 欧美日韩国产欧美 | 亚洲va欧美va人人爽春色影视 | 久久久国产日韩 | 97在线观看视频国产 | 亚洲爱爱视频 | 免费福利在线观看 | 日韩中文字幕在线观看 | 在线看成人 | 成人av片免费看 | 丝袜美腿亚洲 | 天天干一干 | 天天躁日日| 青青射| 欧美一区二视频在线免费观看 | 久久少妇免费视频 | 人人爽人人乐 | 91久久偷偷做嫩草影院 | 亚洲美女久久 | 视频成人| 91免费的视频在线播放 | 欧美日韩1区 | 在线观看黄 | 麻豆国产精品视频 | 在线亚洲天堂网 | 少妇搡bbbb搡bbb搡忠贞 | 免费在线观看不卡av | 免费视频91蜜桃 | 00av视频 | 精品一二三四视频 | 国产精品电影在线 | 欧洲精品亚洲精品 | 国产精品久久久久久久电影 | 欧美aⅴ在线观看 | 国产又粗又猛又色 | 日韩精品影视 | 天天射天天操天天色 | 美女黄频在线观看 | 日韩在线视频免费看 | 天天射色综合 | 久久视频99 | 久久久久久久国产精品视频 | 免费在线a | 天天狠狠| 天天色天天骑天天射 | 日韩av中文字幕在线免费观看 | 色综合天天天天做夜夜夜夜做 | 黄污在线观看 | 亚洲美女在线一区 | 91精品啪| 精品国产aⅴ麻豆 | 成人一区电影 | 免费观看www小视频的软件 | 欧美激情综合五月色丁香 | 精品福利网 | 国产精品成人一区二区三区吃奶 | 成人a v视频 | 久久精品影片 | 日韩欧美综合精品 | 亚州国产精品视频 | 国产精品18久久久久久不卡孕妇 | 亚洲高清资源 | 亚洲国产精品成人综合 | 久久高清免费视频 | 欧美成年性 | 精品国产伦一区二区三区 | 激情黄色av| 午夜精品视频一区 | 天天色天天操综合 | 日韩免费专区 | 久久精品国产久精国产 | av片子在线观看 | 亚洲成a人片在线观看网站口工 | 天天狠狠干 | 亚洲综合色丁香婷婷六月图片 | 91av在线不卡 | 人人藻人人澡人人爽 | 天天天干天天射天天天操 | 麻豆高清免费国产一区 | 国产高清黄 | 成人午夜电影网 | 99国产精品一区二区 | 手机在线永久免费观看av片 | 韩日视频在线 | 日韩中字在线 | 日批视频国产 | 韩国三级一区 | aaa毛片视频 | 久久久久成人精品 | 999久久久久久久久6666 | 日韩精品一区二区三区免费观看 | 久久国产精品久久国产精品 | 97在线成人 | 骄小bbw搡bbbb揉bbbb| 91黄色成人 | 香蕉视频网址 | 国产精品久久毛片 | 亚洲区另类春色综合小说校园片 | 午夜av在线免费 | 日韩欧美高清不卡 | 亚洲精品中文字幕在线 | 超碰在线人人草 | 中文字幕乱视频 | 国模视频一区二区 | 成人免费视频在线观看 | 亚洲精品黄网站 | 免费99精品国产自在在线 | 国产精品igao视频网网址 | 久久视频在线 | 日韩动漫免费观看高清完整版在线观看 | 欧美亚洲免费在线一区 | 日韩精品一二三 | a特级毛片 | 丁香六月网 | 亚洲国产偷 | 97看片网 | 成人观看视频 | 亚洲美女在线国产 | www.操.com| 久草线| 丁香狠狠 | 四虎在线观看视频 | 久久不射电影院 | 91av免费看 | 午夜.dj高清免费观看视频 | 美女网站视频一区 | 夜夜嗨av色一区二区不卡 | 久久草av| 激情综合网婷婷 | 丁香婷婷激情啪啪 | 欧美久久九九 | 欧美少妇的秘密 | 深爱激情综合 | 91最新在线视频 | 久久成人国产精品入口 | 91av福利视频 | 日韩三级在线 | 欧美 亚洲 另类 激情 另类 | 久久99热精品 | 99c视频在线 | 免费高清男女打扑克视频 | 日韩美女黄色片 | 欧美一级片免费 | 这里有精品在线视频 | 日韩视频在线观看视频 | 500部大龄熟乱视频使用方法 | 一区二区三区日韩精品 | 四川妇女搡bbbb搡bbbb搡 | 天天色天天操综合 | 亚洲高清视频在线播放 | 国产日女人| 久久亚洲免费视频 | 青青射| 五月婷婷综合激情网 | 日韩在线视频在线观看 | 国产精品永久免费观看 | 日韩欧美视频 | 久久久久久久久久久网站 | av高清一区 | 久久99亚洲网美利坚合众国 | 在线电影 一区 | 91女神的呻吟细腰翘臀美女 | 成人a级黄色片 | 91在线91拍拍在线91 | 黄色毛片电影 | 日韩h在线观看 | 久久精品亚洲综合专区 | 久草视频视频在线播放 | 看全黄大色黄大片 | 制服丝袜在线91 | 手机看片1042 | 午夜精品久久久久久久久久久久久久 | 少妇做爰k8经典 | 日本精品二区 | 国内99视频| 96久久久 | 波多野结衣精品 | 日韩久久在线 | 久久久免费毛片 | 超碰97在线人人 | 午夜10000| 天天操天天能 | 日韩中文字幕在线观看 | 中文字幕av日韩 | 狠狠久久综合 | 91麻豆国产福利在线观看 | 九色91在线视频 | 久久精品男人的天堂 | 欧美精品日韩 | 天天做综合网 | 激情综合色播五月 | 国产在线观看你懂的 | bbbb操bbbb| 欧美-第1页-屁屁影院 | 97av在线视频| 在线视频手机国产 | 欧美a在线免费观看 | 美女搞黄国产视频网站 | 午夜精品视频一区二区三区在线看 | 成年人免费在线观看网站 | 正在播放亚洲精品 | 欧美日韩久 | 色网站在线免费 | 国产午夜亚洲精品 | 在线播放一区二区三区 | 成人av电影免费在线观看 | 久久精品福利视频 | 高清不卡一区二区三区 | 欧美色噜噜 | 国内精品久久久久久久久 | 久99久精品视频免费观看 | 在线免费观看视频你懂的 | 欧美在线视频不卡 | 日本精油按摩3 | 伊人色综合网 | 色狠狠狠 | 黄色小说在线观看视频 | 激情综合站 | 激情五月网站 | 日本中出在线观看 | 2023天天干| 91麻豆传媒 | 国产成本人视频在线观看 | 粉嫩av一区二区三区四区五区 | 国产91成人在在线播放 | av五月婷婷 | 国产又粗又长又硬免费视频 | 亚洲 欧美变态 另类 综合 | 韩国av免费观看 | 日韩高清一区二区 | 制服丝袜一区二区 | 欧美精品久久久久久久久久久 | 成人av日韩 | 不卡日韩av| 色婷婷综合久久久久中文字幕1 | 久久人人爽人人爽人人片av免费 | 久久久香蕉视频 | 久久成人亚洲欧美电影 | 国产亚洲精品久久久网站好莱 | 中文字幕乱码亚洲精品一区 | 日韩在线电影一区二区 | 在线观看亚洲精品视频 | 中文电影网 | 制服丝袜在线91 | 天天射日| 日韩在线免费视频观看 | 亚洲在线精品 | 久草视频在线资源站 | 亚洲高清在线精品 | 91精品久久久久久久99蜜桃 | 欧美激情综合五月 | 久久久在线| 欧美日韩视频在线观看一区二区 | 99久久精品午夜一区二区小说 | 探花视频免费观看高清视频 | 免费在线观看不卡av | 美女在线免费视频 | 天天天综合网 | 国外成人在线视频网站 | www免费看| 久久人人97超碰国产公开结果 | 欧美少妇xxx | 国产原创在线观看 | av观看在线观看 | 国产黄大片在线观看 | 国产最新在线观看 | 久久免费高清 | 日韩高清在线一区二区 | av黄色成人 | 狠狠躁日日躁夜夜躁av | 久草久草久草久草 | 欧美另类性 | 又黄又爽又刺激的视频 | 国产999精品久久久久久麻豆 | 欧美视频在线观看免费网址 | 日韩在线中文字幕视频 | 一区二区在线影院 | 亚洲精品在线看 | 手机在线欧美 | 久草免费在线观看视频 | 欧美一级视频在线观看 | 久久精品国产成人精品 | 91人人澡人人爽 | 国产精品一码二码三码在线 | 黄色特一级 | 天天射综合网视频 | 久久av免费电影 | 天天五月天色 | 十八岁免进欧美 | 美女精品网站 | 伊人亚洲综合网 | h文在线观看免费 | 国产成人久久久77777 | 久草com| 色丁香综合 | 91热视频在线观看 | www.久久爱.cn | 国产精品久久久久久久久久99 | 奇米导航 | 精品视频www | av色网站| 成av人电影 | 国产小视频在线 | 成人综合免费 | 粉嫩av一区二区三区四区五区 | 操操操日日| 1区2区3区在线观看 三级动图 | 亚洲免费精彩视频 | 久久电影中文字幕视频 | 国产精品免费久久久久影院仙踪林 | 亚洲成a人片在线www | 亚洲精品日韩一区二区电影 | 最新日韩视频 | 免费高清av在线看 | 国产黄a三级三级三级三级三级 | 97超碰在线视 | 国语黄色片 | 香蕉视频在线播放 | 久久99久久久久久 | 丁香激情五月婷婷 | 免费中文字幕 | 久久久免费 | 成人黄视频 | 久久精品视频在线观看 | 米奇四色影视 | 久热香蕉视频 | 免费高清在线视频一区· | 国产精品久久久久久妇 | 一区 在线 影院 | 成人午夜影院 | www.操.com| 亚洲一级黄色 | 98超碰人人 | 午夜影视剧场 | 麻豆一区二区 | 午夜av网站 | 黄色一区二区在线观看 | 国产亚洲成人网 | 国语精品免费视频 | 99热9 | 亚洲人成免费 | 天天干天天综合 | 日本久久高清视频 | 亚洲精品18日本一区app | 久久免费国产精品1 | 在线观看网站av | 久久在线视频精品 | 国产色 在线| 乱男乱女www7788 | 日日干日日 | 天天操夜 | 天天色天 | 午夜久久福利 | 国产精品露脸在线 | 欧美日韩国语 | 久久小视频 | 一区二区三区在线视频观看58 | 免费观看一级视频 | 日韩在线观看一区二区三区 | 涩涩网站在线观看 | 欧美一区二区精品在线 | 欧美激情精品一区 | 在线观看av中文字幕 | 亚洲人人网 | 91丨九色丨首页 | av九九| 91精彩视频在线观看 | 久久精彩视频 | 在线观看mv的中文字幕网站 | 东方av在 | 欧美激情精品一区 | 97超碰站| 国产五月天婷婷 | 国产精品美女久久久 | 日韩福利在线观看 | 欧美色图亚洲图片 | 国产在线久草 | 国产一区在线免费观看视频 | 久久一线 | 六月丁香色婷婷 | 成人va天堂 | 中文字幕一区二区三区乱码不卡 | 免费在线观看a v | 五月综合婷 | 欧美精选一区二区三区 | 黄色大片日本免费大片 | av一本久道久久波多野结衣 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 五月天高清欧美mv | 香蕉视频在线网站 | 日韩精品在线一区 | 免费一级日韩欧美性大片 | 在线亚洲欧美视频 | 91大神精品视频在线观看 | 日韩videos | 手机看片中文字幕 | 欧美成天堂网地址 | 久久怡红院 | 韩国一区二区三区在线观看 | 色噜噜在线观看 | 国产福利精品一区二区 | 久草视频在线免费 | www色com | 国产精品久久久99 | 欧美综合干 | 国产三级精品三级在线观看 | 欧美色图亚洲图片 | 一区二区欧美激情 | 婷婷综合五月天 | 中文字幕视频网 | 亚洲激情在线 | 国产护士在线 | 国产毛片在线 | 久久字幕 | 亚洲精品久 | 最新日韩中文字幕 | 新版资源中文在线观看 | 男女拍拍免费视频 | 97av.com| 少妇高潮冒白浆 | 五月综合激情婷婷 | 亚洲视频免费 | 日韩一区二区三免费高清在线观看 | av短片在线观看 | 国产99免费视频 | 欧美巨乳网 | 国产91精品一区二区 | 在线观看v片 | 久久久久麻豆v国产 | 天天天色| 99久国产 | 亚洲高清av | 99色婷婷 | 在线成人高清电影 | 最近中文字幕完整视频高清1 | av综合网址 | 婷婷久久亚洲 | www99久久| 91大神精品视频在线观看 | 色综合在| 欧美综合色在线图区 | 中文字幕av在线播放 | 日日干夜夜爱 | 中文在线a∨在线 | 午夜丰满寂寞少妇精品 | 韩国一区在线 | 国产精品一区二区三区四 | 国产午夜三级一区二区三 | 国产日本亚洲高清 | 99久久久成人国产精品 | 国产三级午夜理伦三级 | 性日韩欧美在线视频 | 综合久久婷婷 | 国产亚洲片 | 久久午夜视频 | 亚洲精品综合久久 | 一区在线观看 | 免费污片 | 99久在线精品99re8热视频 | 亚洲成av人片在线观看香蕉 | 精品久久久久久久久久久院品网 | 91在线看| 久久不射电影网 | 97超碰在线久草超碰在线观看 | 亚洲欧洲精品一区二区精品久久久 | 久久视频这里有精品 | 韩日成人av | 香蕉精品视频在线观看 | 亚洲 欧美 变态 国产 另类 | 成人性生交大片免费看中文网站 | 国产尤物视频在线 | 亚洲成a人片77777kkkk1在线观看 | 伊人色播| 99c视频在线| 6699私人影院 | 欧美国产精品一区二区 | 国产精品理论片在线播放 | 人人插人人费 | 国产一级高清 | 成在人线av | 天天操天天射天天 | 视频在线观看亚洲 | 日本久久高清视频 | 超级av在线| 天天躁日日躁狠狠躁av中文 | 久久另类小说 | 91精品国产92久久久久 | 国产成人精品一区二区在线观看 | 国产精品日韩久久久久 | 波多野结衣在线视频免费观看 | 国产小视频免费观看 | 亚洲国产日韩一区 | 欧美在线观看视频免费 | 婷婷丁香狠狠爱 | 免费又黄又爽的视频 | 日韩av电影手机在线观看 | 国产精品久久久精品 | 黄网站色欧美视频 | 在线观看播放av | 婷婷色av | 激情综合交 | 最近在线中文字幕 | 欧美亚洲成人xxx | 在线观看亚洲国产精品 | 亚洲美女视频在线观看 | 国产精品美女免费看 | 国产一二三在线视频 | 婷婷久操| 在线免费观看黄色 | 国产精品久久久久久久久婷婷 | 久影院| av一二三区 | 91精品啪在线观看国产线免费 | 国产美女主播精品一区二区三区 | www好男人 | 精品 一区 在线 | 在线播放国产精品 | 综合精品在线 | 国内外成人免费在线视频 | 黄色成年网站 | 欧美国产不卡 | www.夜夜夜 | 人人干在线 | 夜色资源站wwwcom | 天天干,狠狠干 | 日日成人网 | 97超碰在线久草超碰在线观看 | 黄网站www| 毛片美女网站 | 五月婷婷综合在线观看 | 国产精品av在线 | 69精品久久| 国产精品xxxx18a99 | 欧美性超爽 | 国产午夜麻豆影院在线观看 | 亚洲精品在线一区二区三区 | 欧美成人h版 | 99久久久久久久 | 久热久草| 亚洲午夜不卡 | 亚洲aⅴ乱码精品成人区 | 深爱婷婷| 天天干夜夜想 | 久久久国产毛片 | 国产99在线 | 92中文资源在线 | 欧女人精69xxxxxx | 免费影视大全推荐 | 国产a级片免费观看 | 香蕉视频久久久 | 国产美女视频免费观看的网站 | 99九九99九九九视频精品 | 成人a毛片| 青青久草在线 | av福利在线免费观看 | 日韩国产欧美在线视频 | 久久综合久色欧美综合狠狠 | 伊人超碰在线 | 热久精品| 欧美一二在线 | 国产成人一区二区三区在线观看 | 亚洲国产午夜视频 | 日韩免费观看视频 | 成人中文字幕av | 国产免费嫩草影院 | 韩国av一区二区三区在线观看 | 黄色影院在线播放 | 高清日韩一区二区 | 国产一区二区久久久 | 久久久国产一区二区 | 精品亚洲一区二区三区 | 99在线观看视频 | 在线欧美小视频 | av电影在线免费观看 | 欧美 日韩精品 | 天天操天天射天天爽 | 超碰人在线 | 中文视频在线看 | 日韩电影精品 | av黄在线播放 | 日韩免费在线观看 | 久久久污 | 91在线视频网址 | 亚洲一区二区三区在线看 | 成人欧美一区二区三区在线观看 | 免费在线国产精品 | 天堂在线一区二区三区 | 91精品国产91久久久久福利 | www.狠狠操| 免费视频国产 | 日韩精品免费在线 | 国内精品久久久久久久久 | 亚洲欧洲在线视频 | 日韩极品在线 | 美女免费电影 | 亚洲四虎 | 午夜精品久久久久久 | 黄色三级在线观看 | 在线观看av黄色 | 国产人免费人成免费视频 | 成人国产精品av | 日日综合网 | 成人av影视| 欧美精品久久人人躁人人爽 | 成人免费在线观看电影 | avwww在线观看 | 亚洲蜜桃av | 精品国产免费一区二区三区五区 | 在线观看中文字幕dvd播放 | 欧美日韩精品二区第二页 | 97久久久免费福利网址 | 欧美精品久久久久久久久久 | 四虎影视精品成人 | 免费三级黄 | 黄色一级在线观看 | 欧美日韩亚洲国产一区 | 美女视频免费精品 | 久久一区国产 | 在线精品视频在线观看高清 | 四虎亚洲精品 | 久久久久久欧美二区电影网 | 免费手机黄色网址 | 玖玖视频精品 | 亚洲综合在 | 精品自拍av| 欧美成人视 | 免费福利视频网站 | 久久精品99久久久久久2456 | 狠狠操精品 | 四虎视频 | 天天色天天射天天干 | 国产成人亚洲精品自产在线 | 我要看黄色一级片 | 亚洲一二三久久 | 久久私人影院 | 国产中文在线播放 | 久久久久久久久黄色 | 在线看国产 | 中文字幕一区二区三区四区 | 中文字幕a在线 | 国产精品a久久久久 | 久久99精品国产 | 国产91免费在线 | 欧美va天堂在线电影 | 九九九视频在线 | 日日噜噜噜噜夜夜爽亚洲精品 | 在线免费看黄色 | 最近中文字幕第一页 | 久久免费视频国产 | 一级黄色在线视频 | 亚洲欧美va | 992tv在线成人免费观看 | 天天操 夜夜操 | 丁香婷婷深情五月亚洲 | 91超级碰| 美女视频国产 | 国产精品久久久久久久久岛 | 亚洲理论在线 | 最新av在线播放 | 久久久在线观看 | 黄色影院在线免费观看 | 日韩综合视频在线观看 | 在线a亚洲视频播放在线观看 | 日韩中文字幕在线观看 | av官网在线 | 999久久久 | 婷婷av在线 | 99精品一区 | 亚洲国产精选 | 国产视频2区 | av免费网页| 丁香六月伊人 | 久久久受www免费人成 | 欧美一区免费在线观看 | 天天插天天爽 | www.天天干.com | 超碰97久久| 观看免费av| 久久av观看| 中文字幕精品久久 | 天天做日日做天天爽视频免费 | 人成在线免费视频 | 91 中文字幕| 久久免费视频精品 | 四虎影视4hu4虎成人 | 国产精品久久久久久久久久东京 | 色www精品视频在线观看 | 欧美夫妻性生活电影 | 亚洲欧洲精品一区二区 | 色网站免费在线看 | 日韩精品久久久久久中文字幕8 | 99在线热播 | 二区视频在线观看 | 亚洲第一区精品 | 午夜av日韩 | 人人爽人人片 | 91探花国产综合在线精品 | 欧美日韩国产综合一区二区 | 亚洲精品综合久久 | 久草久草在线 | 国产精品久久久久久久99 | 韩国av免费在线观看 | 国产小视频免费在线网址 | 国产精品色在线 | 国产精品99爱 | 亚洲精品1234区 | 亚洲影院色 | 欧美精品v国产精品v日韩精品 | 国产裸体视频网站 | 欧美日韩一区二区三区在线观看视频 | 美女视频黄是免费的 | 九九九热精品免费视频观看网站 | 欧美在线资源 | 最近高清中文在线字幕在线观看 | 欧美日韩一区二区三区视频 | 久操视频在线免费看 | 国产精品女| 国产成人一区三区 | 免费视频久久久久久久 | 国产亚洲欧美精品久久久久久 | 狠狠色网 | 亚洲色图激情文学 | 国产一区二区不卡在线 | 亚洲高清av | 日本中文字幕在线播放 | 成人黄色在线看 | 天天操·夜夜操 | 日韩三级一区 | 91视频-88av| 久久高清av | 在线电影 一区 | 91久色蝌蚪 | 五月宗合网 | 欧美成人xxx | 特级西西444www大精品视频免费看 | 人人干干人人 | 特黄一级毛片 | 日韩精品免费在线播放 | 免费三级黄色 | 欧美日韩在线观看一区二区 | 2020天天干夜夜爽 | 啪啪动态视频 | 在线电影播放 | 韩国av一区二区三区 | 成人亚洲免费 | 97精品国产97久久久久久久久久久久 | 久久电影中文字幕视频 | 久久久av电影 | 久草资源在线 | 精品欧美一区二区三区久久久 | 又黄又网站 | 五月天天色 | 麻豆精品传媒视频 | 在线观看91精品国产网站 | 美国av大片 | 在线播放 一区 | 视频福利在线观看 | 美女福利视频一区二区 | 中文字幕字幕中文 | 免费观看成人 | 久久免费视频1 | 五月婷在线视频 | 免费在线视频一区二区 | 中文字幕在线观看免费高清完整版 | 国产精彩视频一区二区 | 福利片免费看 | 欧美日韩视频在线观看免费 | a'aaa级片在线观看 | 超碰久热| 欧美久久久久久久 | 在线观看深夜福利 | 欧美精品视 | 日韩一区二区三区高清在线观看 | 黄色免费在线看 | 亚洲干 | av国产在线观看 | 99在线精品免费视频九九视 | 久久人人精 | 操久久免费视频 | 中文字幕在线视频免费播放 | 免费av网站观看 | 少妇资源站 | 欧美国产91 | 亚洲一区二区精品3399 | 免费日韩一区 | 91中文字幕 | 亚洲毛片在线观看. | 国产高清av免费在线观看 | www.超碰| 欧美激情综合色 | 欧美一区二区在线免费观看 | 国产高清在线观看 | 中文字幕久久精品亚洲乱码 | 国产黄色精品在线 | 久久艹国产视频 | 欧美粗又大 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 五月婷婷深开心 | 婷婷看片 | 一本之道乱码区 | 手机av看片| 五月花婷婷 | 国产一区二区视频在线播放 | 国产一区视频免费在线观看 | 久99久中文字幕在线 | 国产在线精品视频 | 亚洲 欧美 国产 va在线影院 | 国产成人精品久久亚洲高清不卡 | 国产精品高清一区二区三区 | 免费a网 | 久久久久久久免费观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 成人黄色影片在线 | 久久国产a | 国产精品伦一区二区三区视频 | 激情欧美丁香 | 久久艹中文字幕 | 在线观看的av网站 | 在线观看一区 | 亚洲aⅴ久久精品 | 免费看的黄色网 | 欧美日韩免费观看一区二区三区 | 免费看的av片 | 夜夜夜夜夜夜操 | 色婷婷国产在线 | 精品国产视频在线 | 91影视成人 | 毛片1000部免费看 | 久久久久久欧美二区电影网 | 中文字幕888| 99r精品视频在线观看 | 久久好看免费视频 | 久久久久久久久久久福利 | 一区二区三区不卡在线 | 日韩高清精品一区二区 | 在线亚洲欧美视频 | 成人黄色电影在线观看 | 亚洲日本在线视频观看 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 91私密视频 | 日韩黄色免费电影 | 丁香婷婷色综合亚洲电影 | 91精品国产成| 天堂av在线免费观看 | 九草视频在线观看 | 国产91精品一区二区绿帽 | 国产麻豆成人传媒免费观看 | 中文字幕二区在线观看 | 久草在线视频免费资源观看 | 粉嫩av一区二区三区四区 | 综合国产在线 | 热re99久久精品国产66热 | 一区二区精品视频 | 亚洲综合一区二区精品导航 | 久久亚洲精品电影 | 天天射天天色天天干 | 狠狠网| 欧美日韩一区久久 | 欧美一级大片在线观看 | 国产又粗又猛又黄又爽的视频 | 日韩av看片 |