c

codeye

V1

2022/10/15阅读:20主题:默认主题

王后能吃到王吗

在国际象棋游戏中,皇后是棋盘上最强的棋子。她可以在8个方向(向前、向后、向左、向右以及四个对角线中的每一个)的直线上移动无限多的方块。

下图显示了皇后在当前位置的影响力--她将能够吃掉标有 "X "的方格上的任何棋子。

可以被皇后吃掉的对手的国王被称为 "受制于人",然后需要找到一些方法来摆脱这种情况。

在任何正常的国际象棋比赛中,王后会在8x8的棋盘上与她的军队合作,以这种方式威胁国王,并最终试图赢得比赛。然而,在这个卡塔中,皇后将在一个5x5的棋盘上独自工作。

5x5棋盘将被表示为一个二维数组,(即:一个包含5个其他数组的数组,每个数组包含5个单字符元素)。每个子数组内的空位将用星号表示。"*",而这25个元素中的一个将用 "q"(女王)和 "k"(国王)表示。两者都将用小写表示。

2维棋盘数组看起来会是这样的。

board = [ [ '*''*''*''*''*' ] 。
          [ '*''*''*''*''k' ],
          [ '*''*''*''*''*' ],
          [ '*''q''*''*''*' ],
          [ '*''*''*''*''*' ] ]

你的任务是写一个函数,如果国王在检查中,它将返回真,如果他不在检查中,它将返回假。

点击这里查看更多关于国际象棋的深入指导。

基础知识

First solution

def check(board):
    for x,line in enumerate(board):
        for y,c in enumerate(line):
            if   c == 'q': xq,yq = x,y
            elif c == 'k': xk,yk = x,y
    return yk==yq or xk==xq or abs(xq-xk) == abs(yq-yk)

Second solution

def check(board):
    #In check or not ?
    #8 个方向如何解析表达?
    qneen,king = [],[]
    for i,row in enumerate(board):
        for j,col in enumerate(row):
            if board[i][j] == 'q':
                qneen = [i,j]
            elif board[i][j] == 'k':
                king = [i,j]
    
    x,y = qneen[0]-king[0],qneen[1]-king[1]
    if any([x==0,y==0]):return True

    else:       
        if abs(x) == abs(y):return True
        else:return False

分类:

后端

标签:

后端

作者介绍

c
codeye
V1