Pass The ⚽️ Around The Circle
Python 3, 67 55 bytes



f=lambda x,*l:x and-~f(*l[x%3-1::1-x//3*2],0,*l[x%2:1])


Try it online!

Use @Leo's idea of keeping the current player at a fixed index and transforming the list instead. Be sure to check out and upvote his answer!

If the current list is [x, a, b, c, d], where x is the move of the current player, then we want to rotate the list appropriately, and replace x with 0:


If x == 1, the new list is [a, b, c, d, 0]
If x == 2, the new list is [b, c, d, 0, a]
If x == 3, the new list is [d, c, b, a, 0]
If x == 0, this player has already been visited, thus we stop the algorithm.




Python 2, 90 85 bytes



f=lambda l,d=1,p=0,*t:(p in t)^1and-~f(l,[d,-d][l[p]&gt;2],(-~l[p]%4*d-d+p)%len(l),p,*t)


Try it online!

Not every elegant, but does the job.

This recursive function keeps track of the current direction d, the position p, and the list of seen position t.