如何使用ascii在python中对棋子进行验证

2024-04-24 12:37:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始为python编写命令行象棋。我成功地创建了这样一个表:

def setup_grid():
    grid = [[' ' for i in range(gridsize)] for i in range(gridsize)]    # Creates a grid of 0 of the size set by user
    return(grid)

# Displaying the grid to the user
def show_grid(grid):
    gridsize = len(grid)
    horizontal = '   '+4*gridsize*'-'+'-'           # This prints the horizontal borders of the grid


    #####################################################
    toplabel = '     '                                  #
    for i in string.ascii_lowercase[:gridsize]:         # This creates the letters according 
        toplabel = toplabel+i+'   '                     # to how big the grid is. This prints the top letters
    print '\n'+toplabel+'\n'+horizontal                 #
    #####################################################


    #########################################
    for idx,i in enumerate(grid):           #
        row = '{0:2} |'.format(idx+1)       #
        for j in i:                         # This creates the numbers
            row = row+' '+j+' |'            # for the left side of the grid
        print row+'\n'+horizontal           #
    print ''                                #
    #########################################

def play_game():
    gridsize = 8
    currgrid = [[' ' for i in range(gridsize)] for i in range(gridsize)]
    show_grid(currgrid)
    grid = []

play_game()

现在我正在努力为白皇后定义wq这样的作品。 玩家选择移动哪一个棋子的方法是在网格上选择坐标,然后输入新的坐标移动棋子。我不知道的是如何确保零件按要求移动。我不知道怎样才能证实他们的行动。你知道吗


Tags: ofthetoinfordefrangethis
1条回答
网友
1楼 · 发布于 2024-04-24 12:37:10

移动验证有点复杂,但是,下面是一个如何验证女王的移动的可能性。首先,您可能希望将游戏布局移动到一个类中,以便更简单地访问棋盘和棋子。然后,创建一个方法来移动一个工件。方法可以由装饰器包装,装饰器将验证传递给方法的坐标:

def validate_move(f):
  def wrapper(cls, name, x, y):
    methods = {'q':cls.__class__.queen_moves} #build dictionary of move accumulators
    full_moves = list(methods[name[:-1]](getattr(cls, 'board'), color = name[-1]))
    if [x, y] not in full_moves:
      print("invalid move")
    else:
      f(cls, x, y)
  return wrapper

class Chess:
  pieces = [['r', 'kn', 'b', 'k', 'q', 'b', 'kn', 'r'], ['p']*8]
  def __init__(self):
    self.board = [[i+'b' for i in b] for b in Chess.pieces]+([['-']*8]*8)+[[i+'w' for i in b] for b in Chess.pieces]
  @validate_move
  def move_piece(_name, x, y):
    a1, b1 = [(i, b) for i in range(8) for b in range(8) if self.board[i][b] == _name]
    self.board[x][y] = _name
    self.board[a1][b1] = '-'        
  @staticmethod
  def queen_moves(board, color = 'w'):
     c1, c2 = [(i, b) for i in range(8) for b in range(8) if board[i][b] == 'q'+color]
     _c2, _c1 = c2, c1
     while c2 < 8: #check vertically
       c2 += 1
       if board[c1][c2] != '-':
         c2 = _c2
         break
       yield [c1, c2]
     while c2 >= 0: #check vertically
        c2 -= 1
        if board[c1][c2] != '-':
           c2 = _c2
           break
        yield [c1, c2]
     while c1 < 8: #check horizontally
       c1 += 1
       if board[c1][c2] != '-':
           c1 = _c1
           break
        yield [c1, c2]
     while c1 >= 0: #check horizontally
       c1 -= 1
       if board[c1][c2] != '-':
           c1 = _c1
           break
        yield [c1, c2]

因此,你还有两件事要做:

  1. 创建一个staticmethod的完整列表,以获得板上所有工件的完整移动。

  2. wrapper中建立methods字典来存储move finder函数对象。

相关问题 更多 >