#Python 2, 536 509 448 441 bytes
Python 2, 536 509 448 441 bytes
Call via a()
; moves are to be entered in the form piece,destination
(i.e., 1,4
); quit with Ctrl-C. If anyone can see more golfing potential, I'm all ears.
b,r,x='_',lambda p:''.join([p[i]for i in x]),range(11)
def a(m='xo'):
t=w=0;p=dict(zip(x,'xxxx___oooo'))
while w<1:
print r(p);y=m[t%2]
try:
s,v=input();1/all([y==p[s],{v}<{r(p).rfind(b,0,s),r(p).find(b,s)},v-s]);p[s],p[v],h,c=b,y,0,{}
for _ in y,m[-~t%2]:
for i in p:exec{_:"h=1;p.update(c)",b:"h,c=0,{}"}.get(p[i],h*"c[i]=b")
w=min(map(r(p).count,m))<2;t+=1
except:print"INVALID"
print"P%d WINS"%-~(r(p).count('o')<2)