# Shuffling an Array

Attention Topic was automatically imported from the old Question2Answer platform.

For this node i want random movement but the problem is that the choose function continuously shuffles the array and as a result direction keeps changing so i think i need to shuffle the array, stop it then return the first element. How would i do that???

``````extends KinematicBody2D

var direction = Vector2.RIGHT
var state = 1

func choose(array):
array.shuffle()
return array.front()

func move(delta):
position += direction * 100 * delta

func _physics_process(delta):

if state == 1:
direction = choose([Vector2.RIGHT,Vector2.LEFT,Vector2.UP])
move(delta)
``````

The problem here is you are changing directions every frame so the actor only moves `100 * delta` pixels before potentially changing directions. You need to only change directions after a certain amount of time has elapsed.

The best way to do this is to create a child `Timer` node and connect its `timeout` signal to a callback function that handles the logic of changing directions. An alternative, less preferable way is to accumulate `delta` and change directions after a certain period of time (in this case 2 seconds):

``````extends Node2D

var direction = Vector2.RIGHT
var state = 1
var time_since_last_direction_change = 0

func choose(array):
array.shuffle()
return array.front()

func move(delta):
position += direction * 100 * delta

func _physics_process(delta):
time_since_last_direction_change += delta
if time_since_last_direction_change > 2:
direction = choose([Vector2.RIGHT,Vector2.LEFT,Vector2.UP])
time_since_last_direction_change = 0

if state == 1:
move(delta)
``````

Ummm… is there something i can do to the choose function that would make it return 1 direction after shuffling the array

javrocks | 2021-11-08 20:36

That is exactly what your`choose()` function does as it is implemented. The problem is you are potentially changing directions every frame which means your actor will only move a few pixels in one direction before potentially change directions. I can’t imagine this is desired behavior in any game.

The remedy is what I listed above. If you have any questions about how to implement the `Timer` node I’ll be happy to help.

timothybrentwood | 2021-11-08 21:06

Ok thanks for that explanation
And yes how would you implement the Timer Node

javrocks | 2021-11-08 21:59

``````extends Node2D

var direction = Vector2.RIGHT
var state = 1
const possible_directions = [Vector2.RIGHT, Vector2.LEFT, Vector2.UP]
var direction_change_timer : Timer

direction_change_timer = Timer.new()
direction_change_timer.wait_time = 2 # whatever you want it to be
direction_change_timer.connect("timeout", self, "_on_direction_change_timer_timeout")

direction_change_timer.start()

func choose(array):
array.shuffle()
return array.front()

func move(delta):
position += direction * 100 * delta

func _physics_process(delta):
if state == 1:
move(delta)

func _on_direction_change_timer_timeout():
direction = choose(possible_directions)
``````

timothybrentwood | 2021-11-08 22:54