对不同的棋子

时间:2015-10-04 11:57:25

标签: python

最近我获得了一个编程任务,模仿了8个皇后问题,我确信你们都知道这个问题,并且负责为电路板上的不同部分创建功能。例如,将女王放在棋盘上,使她不会看到其他女王。

下面你会找到我的第一个功能queensees,它基本上只是突出了女王在棋盘上的位置,并确定她是否可以看到其他人。

def queenSees(pos,size):
  """ Return a list of all squares"In view" of a queen in position pos on a board of size"""
  inView=[]
  #Row and column
  for i in range(size):
      #Column
      setAppend(inView,(i,pos[1]))
      #Row
      setAppend(inView,(pos[0],i))
      #Diagonals
      for r in [-1,1]:
          for c in [-1,1]:
              appendIfInBounds(inView, pointShift(pos,r*i,c*i), size)
  #Take out position of queen so she doesn't see herself...
  inView.remove(pos)

下面我还为车作品编写了一个函数,因为它只是将对角搜索从等式中解出来。

def rooksees(pos,size):
  """ Return a list of all squares"In view" of a rook in position pos on a board of size"""
  inView=[]
  #Row and column
  for i in range(size):
      #Column
      setAppend(inView,(i,pos[1]))
      #Row
      setAppend(inView,(pos[0],i))

              appendIfInBounds(inView, pointShift(pos,r*i,c*i), size)
  #Take out position of queen so he doesn't see himself...
  inView.remove(pos)

我如何修改它以容纳骑士棋子?

2 个答案:

答案 0 :(得分:0)

骑士在基本方向上移动两个距离中的一个,并且在正交方向上移动这两个距离中的另一个。 4个原始方向* 2个正交方向每个* 2个原始距离= 16个可能的位置。看起来你已经知道如何过滤掉实际上离开的理论位置,所以你需要做的就是首先产生这16个位置。如果你无法找到一种方法来提出这些programaticaly,你可以像这样硬编码:

positions = [[pos[0]+2,pos[1]+1],[pos[0]+2,pos[1]-1] ... ]

但这很容易产生轻微的错别字导致难以追踪的错误。更好的方法可能是硬编码"调整":

moves = [(2,1),(2,-1),(-2,1)(-2,-1) ... ]

然后使用循环将它们应用到当前位置:

positions = [[pos[0]+d[0],pos[1]+d[1]] for d in moves]

答案 1 :(得分:0)

你需要做的就是对角线代码的注释。

即使我知道坐标,我也无法实现骑士的看法:任何人都可以告诉我如何更改queensees功能以显示骑士 - 记得我已经注释掉了queensees功能元素我试图显示骑士的动作没有用。

def makeBoard(size):     板= []     我的范围(大小):         board.append([])         对于范围(大小)中的j:             板[-1] .append(假)     返回董事会

def displayBoard(b):     分频器=( “+ ---” * LEN(B))+ “+”     对于b中的行:         打印分隔符         print“|”+“|”。join({True:“X”,False:“”} [i] for i in row)+“|”     打印分隔符

def setAppend(s,i):     “”除非我已经在s“”“     如果不是我在s:s.append(i)

def inBoard(p,size):     msgstr“”“如果点对于给定大小的板有效,则返回True。否则返回False”“”     如果0 <= p [0]

def pointShift(p,r,c):     “”返回单元格r,c的位置,远离给定点p“”“     return(p [0] + r,p [1] + c)

def appendIfInBounds(s,p,size):     msgstr“”“如果点p在给定大小的板的范围内,则附加到s,除非它已经存在”“”     如果是inBoard(p,size):         setAppend(S,P)

def queenSees(pos,size):     “”返回所有正方形的列表“在视图中”在一块大小的板上位置pos的女王“”“     inView = []     moves = [(-2,-1),(-2,+ 1),(+ 2,-1),(+ 2,+ 1),( - 1,-2),( - 1,+ 2) ,(+ 1,-2),(+ 1,+ 2)]     #Row和专栏     对于我的范围(大小):

    setAppend(inview,(moves[i]))
    #Column
    #setAppend(inView,(i,pos[1]))
    #Row
    #setAppend(inView,(pos[0],i))
    #Diagonals
    #for r in [-1,1]:
        #for c in [-1,1]:
           # appendIfInBounds(inView, pointShift(pos,r*i,c*i), size)
#Take out position of queen so she doesn't see herself...
inView.remove(pos)
return inView

def hasQueen(董事会,积分):     “”如果给定电路板上的任何给定点包含一个女王,则返回True“”“     对于p点:         如果董事会[p [0]] [p [1]]:             返回True     返回False

def cloneBoard(b,size):     msgstr“”“复制一块电路板。电路板是对象(列表是对象)所以a = b只是让它们引用同一个对象......”“     c = makeBoard(size)#clone     我的范围(大小):         对于范围(大小)中的j:             C [i] [j] = B [i] [j]     返回c

def fillBoardRecursion(board,row,size):     “”如果董事会已完成给定行,请尝试下一行的所有可能仓位并继续“”“     如果row == size:         #基本情况         返回董事会     其他:         col范围(大小):             #如果我们把女王放在这里,它会“看到”另一个吗?             如果没有hasQueen(board,queenSees((row,col),size)):                 B = cloneBoard(板,大小)                 B [行] [山口] = TRUE                 result = fillBoardRecursion(b,row + 1,size)                 如果结果!=错误:                     返回结果         返回False #Failed此时返回,所以返回False

B = makeBoard(8) B = fillBoardRecursion(B,0,8) displayBoard(b)中