As is, the current tick() recalculates a new target coordinate set every time either the targetX or targetY values have been reached, so the fish always move on the diagonal (that is, changing both x/y each tick) instead of only horizontal or vertical.
Considering the limitations of the source material this is arguably fine - and vertical only should probably not be considered, but it may be worth allowing for horizontal swimming - so it paths directly across the x-axis to a target.