Boids
A Boids algorithm simulates the flocking behavior of birds. This task requires the creation of a graphical or purely textual simulation of a flock of birds navigating the cave with obstacles depicted below.
.......###############............................................................... .......###############............................................................... ......#################.............................................................. O......###############............................................................... OO.....###############............................................................... OO.....###############....................#.........................#................ OO......#############...................#####...................#########............ OO......#############...................#####..................###########........... OO.......###########...................#######................#############.......... OO.........#######......................#####................###############......... OO............#.........................#####...............#################........ OO........................................#.................#################........ O...........................................................#################........ ............................................................#################........ ...........................................................###################....... ............................................................#################........
If you implement a purely textual simulation, this is a possible board representation, where "O" are the boids that should go toward the right, "#" are fixed walls that should be avoided by the boids, and "." is free space (using a space is also acceptable for free space, if you add some kind of frame around the board).
A simulation that doesn't contain obstacles but only shows flocking behavior is acceptable.
- See also
C
See Boids/C
FreeBASIC
ASCII mode
Const MAP_WIDTH = 86
Const MAP_HEIGHT = 20
Type Punto
As Integer x
As Integer y
End Type
Type Boid
As Punto posic
End Type
Type Environment
As Ubyte buffer(MAP_HEIGHT, MAP_WIDTH)
As Boid boids(17)
As Integer boidCnt
End Type
Dim Shared As Environment env
' Initialize map with walls and spaces
Sub initMap()
Dim As Integer x, y, posic = 1
' Add cave obstacles (hardcoded pattern)
Dim As String cave = _
" ############### " & Chr(10) & _
" ############### " & Chr(10) & _
" ################# " & Chr(10) & _
"O ############### " & Chr(10) & _
"OO ############### " & Chr(10) & _
"OO ############### # # " & Chr(10) & _
"OO ############# ##### ######### " & Chr(10) & _
"OO ############# ##### ########### " & Chr(10) & _
"OO ########### ####### ############# " & Chr(10) & _
"OO ####### ##### ############### " & Chr(10) & _
"OO # ##### ################# " & Chr(10) & _
"OO # ################# " & Chr(10) & _
"O ################# " & Chr(10) & _
" ################# " & Chr(10) & _
" ################### " & Chr(10) & _
" ################# "
' Process the map line by line
For y = 1 To 16
For x = 1 To 85
Select Case Mid(cave, posic, 1)
Case "#"
env.buffer(y, x) = Asc("#")
Case "O"
env.boids(env.boidCnt).posic.x = x
env.boids(env.boidCnt).posic.y = y
env.boidCnt += 1
env.buffer(y, x) = Asc(" ")
Case Else
env.buffer(y, x) = Asc(" ")
End Select
posic += 1
Next x
posic += 1 ' Skip Chr(10)
Next y
' Add frame
For x = 0 To MAP_WIDTH-1
env.buffer(0, x) = Asc("#")
env.buffer(MAP_HEIGHT-1, x) = Asc("#")
Next x
For y = 0 To MAP_HEIGHT-1
env.buffer(y, 0) = Asc("#")
env.buffer(y, MAP_WIDTH-1) = Asc("#")
Next y
'
End Sub
' Check if position is free
Function isFree(x As Integer, y As Integer) As Boolean
If env.buffer(y,x) = Asc(" ") Then
For i As Integer = 0 To env.boidCnt-1
If env.boids(i).posic.x = x Andalso env.boids(i).posic.y = y Then Return False
Next
Return True
End If
Return False
End Function
Sub moveBoids()
For i As Integer = 0 To env.boidCnt-1
Dim As Integer nx = env.boids(i).posic.x + 1
Dim As Integer ny = env.boids(i).posic.y
' Try to move right
If isFree(nx, ny) Then
env.boids(i).posic.x = nx
' If blocked, try up or down
Elseif isFree(env.boids(i).posic.x, ny-1) Then
env.boids(i).posic.y -= 1
Elseif isFree(env.boids(i).posic.x, ny+1) Then
env.boids(i).posic.y += 1
End If
Next
End Sub
Sub drawState()
Dim As Integer x, y, i
Cls
' Draw environment
For y = 0 To MAP_HEIGHT-1
For x = 0 To MAP_WIDTH-1
Draw String (x*8, y*16), Chr(env.buffer(y,x))
Next x
Next y
' Draw boids
For i = 0 To env.boidCnt-1
Draw String (env.boids(i).posic.x*8, env.boids(i).posic.y*16), "O"
Next
End Sub
' Main program
Screenres MAP_WIDTH*8, MAP_HEIGHT*16, 32
Windowtitle "Boids in FreeBASIC"
initMap()
Do
moveBoids()
drawState()
Sleep 100
Loop Until Multikey(&h01)
Go
See Boids/Go
Java
See Boids/Java
Julia
See Boids/Julia
Nim
See Boids/Nim
Phix
See Boids/Phix
Screenshot: http://phix.x10.mx/shots/boids.png
Wren
See Boids/Wren