繁体   English   中英

Python:作为一名骑士,我该如何在numpy阵列棋盘周围移动?

[英]Python: How do I move around a numpy array chessboard, as a knight?

我有以下代码用于numpy数组:

import numpy as np

a = np.array([[0,1,2,3,4,5,6,7],
[8,9,10,11,12,13,14,15],
[16,17,18,19,20,21,22,23],
[24,25,26,27,28,29,30,31],
[32,33,34,35,36,37,38,39],
[40,41,42,43,44,45,46,47],
[48,49,50,51,52,53,54,55],
[56,57,58,59,60,61,62,63]])

给定一个起点,我需要像骑士在国际象棋棋盘上那样在棋盘上移动(垂直2个空间,水平1个空间,反之亦然)。

我可以使用np.argwhere来获取起点的坐标:

np.argwhere(a == 13)返回[[1 5]]。

我该怎么办才能从那里走走? 我想测试所有可能的移动,并返回所有坐标。

将有八个这样的可能组合。 我们可以将它们作为8 x 2数组中的偏移量,并使用起始XY进行广播加法。 此外,我们需要筛选超出棋盘限制的那些。

因此,以开头X,Y为元组的实现将是-

def knight_move(start_xy):
    offset1 = np.array([[-2,-1],[-2,1],[2,-1],[2,1]])    
    idx = np.row_stack((offset1, offset1[:,::-1])) + start_xy    
    return idx[~((idx < 0) | (idx > 7)).any(1)]

样品运行-

In [66]: a   # Chessboard as array
Out[66]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29, 30, 31],
       [32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47],
       [48, 49, 50, 51, 52, 53, 54, 55],
       [56, 57, 58, 59, 60, 61, 62, 63]])

In [67]: newXYs = knight_move((1,5)) # 13

In [68]: newXYs
Out[68]: 
array([[3, 4],
       [3, 6],
       [0, 3],
       [2, 3],
       [0, 7],
       [2, 7]])

In [69]: a[newXYs[:,0], newXYs[:,1]]
Out[69]: array([28, 30,  3, 19,  7, 23])

骑士的位置可以用[xy]表示,其中0 <= x,y < 8 可能的8个运动方向可以由矢量[+/-1 +/-2], [+/-2 +/-1] 但是,仅当结果字段有效时,移动才有效(请参见x,y的上述限制)。 此方法无需使用数组即可工作。

使用一维数组的一种更有效的方法如下:在8x8棋盘周围添加宽度为2的边框。 这个放大的12x12电路板被编码为一维数组,其中单元格值表示相应字段的有效性:

board = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]

骑士的位置由一个索引(例如,左上角为26)表示,骑士的可能运动由索引偏移+/-1 + 12*(+/-2)+/-2 + 12*(+/-1) ,所以总共25, -23, 23, -25, 14, -10, 10, -14 -25,14 25, -23, 23, -25, 14, -10, 10, -14 再次通过结果索引的有效性检查移动的有效性,该结果索引减小为board[index+move] == 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM