次のような while ループがあります。
while a[xp][yp] - a[xp-1][yp] == 0 and a[xp][yp] - a[xp+1][yp] == 0 and a[xp][yp] - a[xp][yp-1] == 0 and a[xp][yp] - a[xp][yp+1] == 0:
c=randint(0,3)
if c==0:
xp=xp+1; yp=yp
elif c==1:
xp=xp-1; yp=yp
elif c==2:
xp=xp; yp=yp+1
else:
xp=xp; yp=yp-1
xp=xp; yp=yp
問題は、xp または yp = 0 または n (x 方向または y 方向の配列の長さ、正方行列) の場合、while ループの条件が破綻し、範囲外エラーが発生することです。xp=0 または xp=n または yp=0 または yp=n (これを行う別のコードがあります) の場合に新しい座標セットを取得し、while ループを再度実行したいだけです。
コードの性質は、約 4 回に 1 回の割合で、範囲外に出ずに実行されるようです。たまたま機能するまで実行し続ける必要があります。