【问题标题】:Print out chess board from list of objects从对象列表中打印出棋盘
【发布时间】:2022-01-09 17:51:58
【问题描述】:

我有以下任务在屏幕上打印棋盘的碎片,它们必须采用这种格式 ♔ 但这是最​​小的问题。

如果我循环通过我在 0x7fc8fa510790> 处得到这个 ma​​in.Rook 对象,我该如何编码 --> if main.Rook == ♖,

代码完成后的输出应该是这样的:

♖ ♔  
 ♜  ♜
 ♚ ♜ 
♖   ♗
♗    

目前我是这样构建电路板的



class Piece:
    pos_x : int 
    pos_y : int
    side_ : bool #True for White and False for Black
    def __init__(self, pos_X : int, pos_Y : int, side_ : bool):
        '''sets initial values'''
        self.pos_x=pos_X 
        self.pos_y=pos_Y
        self.side_=side_ #maybe set it to True?

    def __str__(self):#
        return f"{self.pos_x} {self.pos_y} {self.side_}"

    def get_side(self):
        return side_
      
class Rook(Piece):
    def __init__(self, pos_X : int, pos_Y : int, side_ : bool):
        '''sets initial values by calling the constructor of Piece'''
        super().__init__(pos_X, pos_Y, side_)
    def __repr__(self):
      if self.side_==False:
           return "♜" 
      else:
        return "♖"  


wr1 = Rook(1,2,True)
br1 = Rook(4,3,False)
br2 = Rook(2,4,False)
br3 = Rook(5,4, False)
wr2 = Rook(1,5, True)
B1 = (10, [wr1,br1, br2, br3, wr2])

所以现在我正在研究以下功能,我没有走多远,我可以得到棋子的位置,侧面等等,但是如果我有一个变量,我怎么知道它们是 ROOK 还是其他东西例如可以使用他们的名字,但是这里我有一个对象,有人可以说明一种方法来解决这个问题吗?

def conf2unicode(B: Board) -> str: 
    '''converts board cofiguration B to unicode format string (see section Unicode board configurations)'''
    for piece in B[1]:
      print (piece)

【问题讨论】:

  • 如果您的任务是打印板子,那么这看起来有点矫枉过正。你能具体说明一下任务是什么吗?您需要处理的输入是什么?你能举一个输入和相应预期输出的例子吗?
  • 输入是代码底部的那个,wr1 = Rook(1,2,True)是位置坐标和边(True是白色),输出将是棋盘 5x5,用 unicode 字符表示棋子,它们之间有空格表示空格
  • 好的。国际象棋不是在 8x8 棋盘上下的吗?
  • 别担心这是一个练习,板子可以是你喜欢的任何尺寸......
  • 您能对答案提供一些反馈吗?或者考虑将答案标记为已接受。

标签: python class oop chess


【解决方案1】:

我将为棋盘定义一个类,以便您可以将棋子保存在二维网格中。 然后,您还可以与字典进行一些交叉引用,这样您就可以通过颜色和类型(即类)在板上快速找到一块。

这里有一些想法:

WHITE = True
BLACK = False

class Piece:
    pos_x: int 
    pos_y: int
    side: bool # BLACK or WHITE
    def __init__(self, side: bool, symbol: str):
        self.side = side
        self.symbol = symbol
        self.pos_x = self.pos_y = None

    def set_position(self, pos_x: int, pos_y: int):
        self.pos_x = pos_x
        self.pos_y = pos_y

    def clear_position(self):
        self.pos_x = self.pos_y = None

    def __repr__(self) -> str:
        return self.symbol

      
class Rook(Piece):
    def __init__(self, side: bool):
        super().__init__(side, "♜♖"[int(side)])

class King(Piece):
    def __init__(self, side: bool):
        super().__init__(side, "♚♔"[int(side)])

class Bisshop(Piece):
    def __init__(self, side: bool):
        super().__init__(side, "♝♗"[int(side)])



class Board:
    def __init__(self, row_count: int = 8, col_count: int = 8):
        self.rows = [[None] * col_count for _ in range(row_count)]
        self.pieces = [{  # BLACK pieces by type
            King: [],
            Rook: [],
            Bisshop: []
        }, {  # WHITE pieces by type
            King: [],
            Rook: [],
            Bisshop: []
        }]

    def add(self, piece: Piece, pos_x: int, pos_y: int):
        piece.set_position(pos_x, pos_y)
        self.rows[pos_y][pos_x] = piece
        self.pieces[piece.side][type(piece)].append(piece)

    def remove(self, piece: Piece):
        self.rows[piece.pos_y][piece.pos_x] = None
        piece.clear_position()
        self.pieces[piece.side][type(piece)].remove(piece)

    def move(self, piece: Piece, to_x: int, to_y: int):
        self.remove(piece)
        self.add(piece, to_x, to_y) 

    def __repr__(self):
        return "\n".join(
            "".join(repr(piece) if piece else "." for piece in row)
                for row in self.rows
        )


board = Board(5, 5)
# coordinates are zero-index based:
board.add(Rook(WHITE), 0, 0)
board.add(King(WHITE), 2, 0)
board.add(Rook(BLACK), 1, 1)
board.add(Rook(BLACK), 4, 1)
board.add(King(BLACK), 1, 2)
board.add(Rook(BLACK), 3, 2)
board.add(Rook(WHITE), 0, 3)
board.add(Bisshop(WHITE), 4, 3)
board.add(Bisshop(WHITE), 0, 4)
print(board)

如果你想移动一块已经在棋盘上的棋子,你可以这样做:

board.move(board.pieces[WHITE][Bisshop][1], 1, 4)

这会移动第二个白主教。

【讨论】:

  • 我看到你想用后续问题编辑我的答案。我拒绝了。相反,如果这不能回答您的 original 问题,请在此处通过评论告诉我。如果是这样,那么请通过标准方式提出后续问题(重点关注此实现的不同问题)。单击“”按钮并在新问题中提供所有详细信息。
  • 您想要编辑的内容之一是“我需要获得类似的东西:"♖ ♔  \n ♜  ♜\n ♚ ♜ \n♖   ♗\n♗    "。但这就是该脚本在最终打印中输出的内容(我使用点而不是空格,但这是唯一的区别)。你运行了我发布的脚本吗?
  • 你能回到我身边吗?这回答了你的问题吗?
【解决方案2】:

为什么不将 Rook 的 __repr__ 设置为返回类似“♜”的内容:

def __repr__(self):
   return "♜"

然后您可以打印出 B1 并让您的图标美观整洁。

【讨论】:

  • 我已将 repr 添加到 Rook,如果我打印 (br1.__repr__()) 我会得到 ♜,如果我在 B1[1] 中循环查找片段:print( piece.__repr__()) 我仍然得到像 <__main__.rook object at> 这样的对象名称
【解决方案3】:

一种方法是将较大的任务分解为几个较小的步骤,即:

  1. 遍历每一行
  2. 查找该行中的所有部分并构建一个字符串来表示它
  3. 打印该行

部分解决方案可能是打印没有碎片的板,然后从那里扩展。

要获得代表车的符号,您可以向类添加一个返回正确符号的方法。

注意,模运算符非常适合创建交替的黑白方块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2020-03-25
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多