Para estos casos concretos, olvidate de regex, es mucho más sencillo hacerlo por código... el tema es si las reglas pueden complicarse mucho más como para justificar usar un regex... o si lo vas a implementar como lenguaje de consulta a los jugadores...
Para los ejemplos:
1- `[fd]((?C<N,/^.o/>)|(?C<H,/^(?<=o)|^.o/>))` <-- donde [fd] encuentra una celda transitable, y los callouts para llamar a otro regex que revisa al Norte u Horizontal si coincide desde la posición del puntero
2- `.(?C<HV,^[fd]{3}>)` <-- una celda cualquiera, y el callout para otro regex que busque desde esa posición si ha…