找回密码
 点一下
查看: 2610|回复: 9

<AI>关于“攻击组”的问题- -

[复制链接]
发表于 2009-11-14 17:34:57 | 显示全部楼层 |阅读模式
“把6个单位放在单位组中攻击目标的基地”这个写法卡住偶4+个小时了- -


                  call InitAssaultGroup()
                  call SetAssaultGroup(1,6, 'nnmg' )
                  //call AnyPlayerAttack()  
                  call AttackMoveKillA(GetMegaTarget())


貌似默认wai翻译品的执行部分也是类似的样子 可是无论怎么写 AI都是不用- -
发表于 2009-11-14 17:44:23 | 显示全部楼层
恩。。AI这里偶是门外汉。。
回复

使用道具 举报

发表于 2009-11-14 21:08:54 | 显示全部楼层
你还少了一步FormGroup()

队伍都没组织起来怎么出去打仗捏。
回复

使用道具 举报

 楼主| 发表于 2009-11-14 21:49:49 | 显示全部楼层
加入这段代码之后 AI会被卡住的 只建造最开始的建筑之后就什么都不做了

[jass]
           if Cycling == 1 then
               call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"Do Some Hunting")
               call InitAssaultGroup()
               call SetAssaultGroup(1,6, 'nnmg' )
               call FormGroup(0,true)
               call AttackMoveKillA(GetAllianceTarget())
           endif
[/jass]
回复

使用道具 举报

发表于 2009-11-14 22:18:38 | 显示全部楼层
由于说明起来有点麻烦所以做老个演示。

进入游戏后按一下ESC以发动进攻。


[jass]
function AttackAssignment takes nothing returns nothing
    local unit target
    call StaggerSleep( 0, 2 )
    loop
       if (GetLastCommand()==1 and GetLastData()==1) then
          call PopLastCommand()
          call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"我们接到命令,立刻发动总力战。开始生成队员名单...")     
          call InitAssaultGroup()
          call SetAssaultGroup(1,7, 'nnmg' )
          call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"队员名单生成完毕,开始获取敌方主基地位置..")  
          call StartGetEnemyBase(  )
          call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"获取中...")
          loop
          exitwhen (not WaitGetEnemyBase())
                call SuicideSleep( 1 )
          endloop
          set target = GetEnemyBase()
          call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"已定位敌方主基地。开始集结队伍..")  
          call FormGroup( 3, false)
          call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"队伍集结完毕,开始进攻...")
          call AttackMoveKillA(target)
          call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"进攻完了。")
       endif
       call Sleep( 1.0 )
    endloop
endfunction

function main takes nothing returns nothing
    call InitAI(  )
    call CreateCaptains(  )
    call Sleep( 0.1 )   
    call StartThread( function AttackAssignment )
    call PlayGame(  )
endfunction
[/jass]

[trigger]
Init AI
    Events
        Map initialization
    Conditions
    Actions
        Visibility - Disable fog of war
        Visibility - Disable black mask
        AI - Start melee AI script for Player 2 (Blue): war3mapImported\\1.ai
        Melee Game - Create starting units (for all players)
[/trigger]
[trigger]
Send Command
    Events
        Player - Player 1 (Red) skips a cinematic sequence
    Conditions
    Actions
        AI - Send Player 2 (Blue) the AI Command (1, 1)
        Trigger - Turn off (This trigger)
[/trigger]

AICommand.w3x

18 KB, 下载次数: 21

回复

使用道具 举报

发表于 2009-11-14 22:32:29 | 显示全部楼层
另外你应该把建造和进攻的线程分开来。否则一个卡住另一个就动不了了。

像别人AMAI,进攻都是多线程的。
回复

使用道具 举报

 楼主| 发表于 2009-11-14 23:56:23 | 显示全部楼层
我把攻击部分放在另一个function里面loop,一开始启动,可是建筑还是卡住了- -
奇怪- -
回复

使用道具 举报

发表于 2009-11-15 09:24:41 | 显示全部楼层
function不是线程。

看我的例子里,用StartThread启动的才叫线程。

   call StartThread( function WorkerAssignment )
    call StartThread( function AttackAssignment )

用这个函数分别启动建造线程和攻击线程。
回复

使用道具 举报

发表于 2009-11-15 17:57:22 | 显示全部楼层
这里是一个我刚整的建造\\攻击双线程AI演示。


进入地图后按ESC可与AI共享控制,可以进一步看到AI工作的细节。

[jass]
function WorkerAssignment takes nothing returns nothing
    local integer wg
    local integer ww
    call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"采矿、建造、生产线程开始...")
    loop
        
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"重新分配采集工作,重置中...")
        call ClearHarvestAI()
        set wg=GetUnitCountDone('nmpe')
        if (wg<6) then
            if(wg<2) then
                call HarvestGold(0,wg)
                call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"奴隶不足2名,全部分去采矿...")
            else
                call HarvestGold(0,wg-1)
                call HarvestWood(0,1)
                call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"奴隶不足6名,留一人伐木,其余全部分去采矿...")
            endif
        else
            set ww=wg-5
            set wg=5            
            call HarvestGold(0,wg)
            call HarvestWood(0,ww)
            call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"5人采矿,其余全部伐木...")
        endif
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"重新分配建造、训练工作,重置中...")
        call InitBuildArray()
        if (GetPlayerState(ai_player, PLAYER_STATE_RESOURCE_FOOD_CAP)>=GetPlayerState(ai_player, PLAYER_STATE_FOOD_CAP_CEILING)) then
            //call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"已达食物上限,不再建造珊瑚礁...")
        else
            if ((GetPlayerState(ai_player, PLAYER_STATE_RESOURCE_FOOD_CAP)-GetPlayerState(ai_player, PLAYER_STATE_RESOURCE_FOOD_USED))<5) then
                call SetBuildUnit(GetUnitCount('nnfm')+1,'nnfm')
                call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"建筑计划:食物紧张,将珊瑚礁纳入建筑计划...")
            endif
        endif
        if (GetUnitCount('nmpe')<10) then
            call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"奴隶不足10人,继续去抓!")
            call SetBuildUnit(10,'nmpe')   
        endif
        if (GetUnitCount('nnsg')<3) then
            call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"建筑计划:我们需要三个兵营,将产卵地纳入建筑计划...")
            call SetBuildUnit(GetUnitCount('nnsg')+1,'nnsg')
        endif
        if ((GetUnitCountDone('nnsg')>0) and (GetPlayerState(ai_player, PLAYER_STATE_RESOURCE_FOOD_USED)<=GetPlayerState(ai_player, PLAYER_STATE_FOOD_CAP_CEILING)-3)) then
            call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"训练计划:所有兵营暴毒龙...")
            call SetBuildUnit(30,'nsnp')
        endif
        call Sleep( 2 )
    endloop
endfunction


function AttackAssignment takes nothing returns nothing
    local unit target
    call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"攻击线程开始...")
    call StaggerSleep( 0, 2 )
    loop
       if (GetUnitCountDone('nsnp')>=3) then
    call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000开始进行进攻准备...|r")     
    call InitAssaultGroup()
    call SetAssaultGroup(GetUnitCountDone('nsnp'),GetUnitCountDone('nsnp'), 'nsnp' )
    call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000队员名单生成完毕,尝试获取敌方分基地位置...|r")  
    set target = GetEnemyExpansion()
        if (target == null) then
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000找不到敌方分基地,尝试获取敌方主基地位置...|r")  
            call StartGetEnemyBase( )
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000获取中...|r")
            loop
               exitwhen (not WaitGetEnemyBase())
                call SuicideSleep(1)
        endloop
        set target = GetEnemyBase()
    endif
    if (target != null) then
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000已定位敌方基地。开始集结队伍...|r")  
        call FormGroup( 5, false)
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000队伍集结完毕,开始进攻...|r")
            call AttackMoveKill(target)
        call SleepUntilAtGoal()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000抵达目的地...|r")
        call SleepInCombat()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000战斗结束...|r")
    else
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1,"|cffff0000找不到敌人,放弃进攻...|r")  
    endif
       endif
       call Sleep( 1.0 )
    endloop
endfunction

function main takes nothing returns nothing
    call InitAI()
    call CreateCaptains()
    call Sleep(0.1)   
    call StartThread(function WorkerAssignment)
    call StartThread(function AttackAssignment)
    call PlayGame()
endfunction

[/jass]

SpawnDragon.w3x

36 KB, 下载次数: 26

回复

使用道具 举报

发表于 2009-11-15 20:36:37 | 显示全部楼层
好厉害……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-27 14:56 , Processed in 0.145837 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表