Ooops
November 28, 2020, 10:55:39 AM

Author Topic: [bmx] Fighting AI by Polan [ 1+ years ago ]  (Read 645 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Fighting AI by Polan [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : Fighting AI
Author : Polan
Posted : 1+ years ago

Description : It's not optimalised!
Code show simple AI. Each dot, represent fighter, there are  2 teams, blue and red. Each dot have it's own stats that make it more dynamic.
AI pick clostest enemy, force fighter to turn into enemy direction, and start firing when he have chance to hit. Multiple dots can chase 1 enemy which sometimes might end up in forming of gank squad. AI won't go outside screen, will chase enemy if he have chance to get him, and will sometimes help friends (happens quite often).


Code :
Code: BlitzMax
  1. Framework BRL.GLMax2D
  2. Import BRL.Random
  3. SetGraphicsDriver GLMax2DDriver()
  4. SeedRnd(MilliSecs())
  5. Global gw = 1024,gh = 768
  6. Graphics gw,gh
  7. Type dot
  8.         Field x#,y#
  9.         Field sp#
  10.         Field rot#,rotdoc#
  11.         Field zwrot#
  12.         Field team
  13.         Field id
  14.         Field status,stat
  15.         Field chaser
  16.         Field hp
  17.         Field frate,rate
  18.         Method update()
  19.                 x :+ Cos(rot)
  20.                 y :+ Sin(rot)
  21.                 'If status = 0
  22.                         status1 = Rand(0,1)
  23.                         If status1 = 1
  24.                                 status = 2
  25.                                 dist# = 65000
  26.                                 For x1 = 0 To count-1
  27.                                 If d[x1] And d[x1].team <> team
  28.                                         dist1# = Sqr((x-d[x1].x)^2+(y-d[x1].y)^2)
  29.                                         If dist1 < dist
  30.                                                 dist = dist1
  31.                                                 chaser = d[x1].id
  32.                                                 d[x1].status = 3
  33.                                                 d[x1].chaser = id
  34.                                                         EndIf
  35.                                                 EndIf
  36.                                 Next
  37.                                         EndIf
  38.                                 'EndIf
  39.                 rate :+ 1
  40.                 If status = 2
  41.                         If d[chaser]
  42.                                 rotdoc = ATan2(-y+d[chaser].y,-x+d[chaser].x)
  43.                                 dist# = Sqr((x-d[chaser].x)^2+(y-d[chaser].y)^2)
  44.                                 If dist < 100
  45.                                         If rot > rotdoc-10 And rot < rotdoc+10
  46.                                                 If rate > frate
  47.                                                         rate = 0
  48.                                                         b:bullet = New bullet
  49.                                                         b.team = team
  50.                                                         b.x = x
  51.                                                         b.y = y
  52.                                                         b.rot = rot + Rand(-2,2)
  53.                                                         ListAddLast(list,b)
  54.                                                                 EndIf
  55.                                                         EndIf
  56.                                                 EndIf
  57.                                 If dist > 150
  58.                                         d[chaser].status = 0
  59.                                         status = 0
  60.                                                 EndIf
  61.                                 Else
  62.                                 status = 0
  63.                                         EndIf
  64.                                 EndIf
  65.                 If status = 3
  66.                        
  67.                                 EndIf
  68.                 If status = 3 Or status = 0
  69.                         If x < 50
  70.                                 rotdoc = ATan2(0,x)
  71.                                         EndIf
  72.                         If x > gw-50
  73.                                 rotdoc = ATan2(0,gw-50-x)
  74.                                         EndIf
  75.                         If y < 50
  76.                                 rotdoc = ATan2(y,0)
  77.                                         EndIf
  78.                         If y > gh-50
  79.                                 rotdoc = ATan2(gh-50-y,0)
  80.                                         EndIf
  81.                                 EndIf
  82.                 If rot < rotdoc Then rot :+ zwrot
  83.                 If rot > rotdoc Then rot :- zwrot
  84.                 temp# = rot-rotdoc
  85.                 If temp < 0 Then temp = -temp
  86.                 If temp < zwrot Then rot = rotdoc
  87.                 If team = 1
  88.                         SetColor 0,0,255
  89.                         Else
  90.                         SetColor 255,0,0
  91.                                 EndIf
  92.                 SetRotation rot
  93.                 DrawRect x-1,y-1,3,3
  94.                         End Method
  95.                 End Type
  96. Global list:TList = CreateList()
  97. Type bullet
  98.         Field x#,y#,rot#
  99.         Field sp# = 5,team
  100.         Field life=40
  101.         Method update()
  102.                 life :- 1
  103.                 If life < 0 Then ListRemove(list,Self)
  104.                 If team = 1
  105.                         SetColor 100,100,200
  106.                         Else
  107.                         SetColor 200,100,100
  108.                                 EndIf
  109.                 x :+ Cos(rot)*sp
  110.                 y :+ Sin(rot)*sp
  111.                 If x < 0 Or y < 0 Or x > gw Or y > gh Then ListRemove(list,Self)
  112.                 For x1 = 0 To count-1
  113.                 If d[x1] And d[x1].team <> team
  114.                         dist# = Sqr((x-d[x1].x)^2+(y-d[x1].y)^2)
  115.                         If dist < 2
  116.                                 'boom(d[x1].x,d[y1].y)
  117.                                 d[x1].hp :- 1
  118.                                 If d[x1].hp <= 0 Then d[x1] = Null
  119.                                 ListRemove(list,Self)
  120.                                         EndIf
  121.                                 EndIf
  122.                 Next
  123.                 SetRotation rot-90
  124.                 DrawLine x,y,x,y-3
  125.                         End Method
  126.                 End Type
  127. Type boom
  128.        
  129.                 End Type
  130. Global timer = 0
  131. Global count = 100 , d:dot[count]
  132. For x = 0 To count-1
  133. newdot()
  134. Next
  135.  
  136. While Not KeyHit(key_escape)
  137. Cls
  138.  
  139. timer :+ 1
  140. If timer > 3
  141.         timer = 0
  142.         newdot()
  143.                 EndIf
  144.  
  145. For b:bullet = EachIn list
  146. b.update()
  147. Next
  148. For x = 0 To count-1
  149. If d[x]
  150.         d[x].update()
  151.                 EndIf
  152. Next
  153.  
  154. Flip
  155. Wend
  156.  
  157. Function newdot()
  158.         For x = 0 To count-1
  159.         If d[x]
  160.                 Else
  161.                 d:dot[x] = New dot
  162.                 d[x].x = Rand(0,1023)
  163.                 d[x].y = Rand(0,767)
  164.                 d[x].sp = Rand(1,4)
  165.                 d[x].zwrot = Rand(1,4)
  166.                 d[x].team = x Mod 2 + 1
  167.                 d[x].rot = Rand(0,360)
  168.                 d[x].rotdoc = Rand(0,360)
  169.                 d[x].id = x
  170.                 d[x].frate = Rand(1,5)
  171.                 d[x].hp = Rand(1,6)
  172.                         EndIf
  173.         Next
  174. End Function


Comments :


Yasha(Posted 1+ years ago)

 This is really cool!


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal