Python 面向对象的国际象棋程序设计

Python 面向对象的国际象棋程序设计,python,oop,chess,Python,Oop,Chess,在我的国际象棋程序中,我有一个叫做Move的类。它存储了这件物品的取走和放置位置。那是什么,那是什么 但问题是,为了获得移动和捕获的片段,我将整个Board对象传递给uuu init_uuu方法。因此,在我看来,我应该把所有的Move类方法存储到Board类中,Board类也有一个方法,可以得到给定正方形上的块 我刚刚开始学习OO,所以关于这方面的一些建议,也许一些更一般的设计决策是非常感谢的 这是Move类,我觉得最好省略它 class Move(object): def __ini

在我的国际象棋程序中,我有一个叫做Move的类。它存储了这件物品的取走和放置位置。那是什么,那是什么

但问题是,为了获得移动和捕获的片段,我将整个Board对象传递给uuu init_uuu方法。因此,在我看来,我应该把所有的Move类方法存储到Board类中,Board类也有一个方法,可以得到给定正方形上的块

我刚刚开始学习OO,所以关于这方面的一些建议,也许一些更一般的设计决策是非常感谢的

这是Move类,我觉得最好省略它

class Move(object):

    def __init__(self, from_square, to_square, board):
        """ Set up some move infromation variables. """
        self.from_square = from_square
        self.to_square = to_square
        self.moved = board.getPiece(from_square)
        self.captured = board.getPiece(to_square)

    def getFromSquare(self):
        """ Returns the square the piece is taken from. """
        return self.from_square

    def getToSquare(self):
        """ Returns the square the piece is put. """
        return self.to_square

    def getMovedPiece(self):
        """ Returns the piece that is moved. """
        return self.moved

    def getCapturedPiece(self):
        """ Returns the piece that is captured. """
        return self.captured

当你创建一个对象时,你就是在创建一个东西。棋盘和棋盘上的棋子都是东西。当你想与这些事情互动时,你需要一种方法——或者一个动词

这只是一种建议的方法,以避免使用
Move
类。我打算做的是:

  • 创建表示线路板和线路板上所有部件的对象
  • 表示单个工件运动特征和工件特定动作(如运动)的所有工件的类
我从写
板开始
;以后可以决定如何表示这些位置

class Board:
    def __init__(self):
         self.board = [['-' for i in xrange(8)] for j in xrange(8)]
    # You would have to add logic for placing objects on the board from here.

class Piece:
    def __init__(self, name):
         self.name = name
    def move(self, from, to):
         # You would have to add logic for movement.
    def capture(self, from, to):
         # You would have to add logic for capturing.
         # It's not the same as moving all the time, though.

class Pawn(Piece):
    def __init__(self, name=""):
        Piece.__init__(self, name)
    def move(self, from, to):
        # A rule if it's on a starting block it can move two, otherwise one.
    def capture(self, from, to):
        # Pawns capture diagonal, or via en passant.

一整节课都在做动作?我不同意这种设计…创建一个
Piece
s的超类,在那里有一个
move()
函数,并覆盖它以适应不同类型的Piece会更有效。哦,我知道另一个问题也有同样的问题,但是有一个答案是用Java写的,我不能完全理解。但是从那以后,我有了一个移动类的想法。澄清一点:对象代表名词,比如一本书、一块木板或一台电视。方法表示动词,如read、move/place或watch。我读过关于将move作为一个类的想法,这对我来说有点意义,正如回答者所解释的,在进行移动生成或搜索时,我可以有一个移动对象列表来表示所有移动以及它们的相关信息。哦,对不起,我不太明白你为什么要谈论名词和动词,可能是因为我的英语不是最好的。@Makoto——用一个类来表示一个动作并不一定是个坏主意。你可以创建一个移动列表,基本上就是你重建整个游戏所需要的所有信息。(这也使得
undo/redo
功能更加简单)。换句话说,一个动作实际上可以是一个名词。这是否可取实际上取决于用户想要什么功能。为了简单地创建一个可玩的国际象棋游戏,您提出的想法很好。非常感谢您的反馈。但我想我还是会继续我的初始方法,因为我已经完成了ChessRules类的大部分内容,该类检查移动是否合法。正如我从您的实现中了解到的,这种检查必须在Pawn(或其他部分)类中完成。再次感谢你!棋步实际上是象棋游戏中的一个(抽象)项目。例如,我们计算移动的次数。在您尝试实现之前,让每一个片段移动本身似乎都是显而易见的OOP。例如,中途捕获取决于上一步是哪一块。城堡的移动取决于国王和车的历史,以及中间广场的被攻击状态。棋子们怎么知道什么时候允许?@BoPersson:棋子们只需要知道运动的规则。棋盘可以保存有关棋子本身的状态信息(即关于国王区或皇后区的城堡是否合法、棋子是否可以移动到另一个位置、棋子是否可以顺道捕获等信息)。