这个标签用于国际象棋游戏和让计算机玩它的问题。
我现在这样做的方法是使用我将用于普通的minimax搜索的相同移动生成功能,以及相同的make-move函数以及每次移动后检查获胜的相同功能。在象棋或检查器(甚至在简单游戏中)等复杂游戏中,这些都是非常昂贵的操作。 我的问题是:是否有更好的方法来实施游戏模拟以使其成本降低?我不能每次都无法进行全部移动,也不能每次赢得胜利吗?还有其他改善模拟时间的方法吗?
我有以下任务要在屏幕上打印奶酪板的碎片,它们必须采用这种格式♔,但这是最少的问题。 如果我循环通过,我得到了 我有以下任务要在屏幕上打印奶酪板的碎片,它们必须以这种格式♔,但这是最少的问题。 如果我循环循环我在0x7fc8fa510790>中获得此main<.rook对象,我该如何编码 - >如果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]) 现在,我正在从事以下功能,我没有走远,我可以得到零件的位置,侧面等例如,他们的名字,但是我在这里有一个对象,有人可以说明一种方法如何处理吗? 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) 为什么不设置rok的__repr__返回诸如“♜”之类的东西: def __repr__(self): return "♜" 然后,您可以打印出B1并使您的图标整洁。 我会为板定义一个类,以便您可以将零件保存在二维网格中。 然后,您也可以与词典有一些交叉引用,因此您可以通过其颜色和类型(即班级)在板上快速找到一块。 这里是一些想法: 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) 如果您想movemovemove已经在董事会上的作品,可以做: board.move(board.pieces[WHITE][Bisshop][1], 1, 4) 这将移动第二个白色bisshop。 一种方法是将较大的任务分解为几个较小的步骤,即: 环环 找到该行中的所有作品并构建一个字符串以表示IT 打印该行 部分解决方案可能是在没有碎片的情况下打印板,然后从那里扩展。 要获取代表Rook的符号,您可以在返回正确符号的类中添加一种方法。 注意,模量操作员非常适合创建交替的黑白正方形。 阶级: defInit(自我,颜色,符号): self.color =颜色#'白色'أ执 self.symbol =符号 def __repr__(self): return self.symbol 阶级典当(零件): defInit(自我,颜色): super()。init(颜色,'♙'如果color =='白色'else'♟') self.first_move =true阶级Rook(零件): defInit(自我,颜色): super()。init(颜色,'♖'如果color =='white'else''♜') 类骑士(零件): defInit(自我,颜色): super()。init(颜色,'♘'如果color =='white'else''♞') 阶级主教(件): defInit(自我,颜色): super()。init(颜色,'♗'如果color =='white'else''♝') 类女王(件): defInit(自我,颜色): super()。init(颜色,'♕'如果color =='white'else''♛') 级国王(作品): defInit(自我,颜色): super()。init(颜色,'♔'如果color =='white'else''♚') 类棋盘: defInit(self): self.board = [[[none for _在范围(8)中_ for _ in范围(8)] self.current_player ='White' self.setup_board() def setup_board(self): # ترتيب القطع السوداء self.board[0] = [ Rook('black'), Knight('black'), Bishop('black'), Queen('black'), King('black'), Bishop('black'), Knight('black'), Rook('black') ] self.board[1] = [Pawn('black') for _ in range(8)] # ترتيب القطع البيضاء self.board[7] = [ Rook('white'), Knight('white'), Bishop('white'), Queen('white'), King('white'), Bishop('white'), Knight('white'), Rook('white') ] self.board[6] = [Pawn('white') for _ in range(8)] def print_board(self): print(' a b c d e f g h') for i, row in enumerate(self.board): print(8 - i, end=' ') for piece in row: print(piece.symbol if piece else '·', end=' ') print(8 - i) print(' a b c d e f g h') def move_piece(self, start, end): start_col, start_row = ord(start[0]) - ord('a'), 8 - int(start[1]) end_col, end_row = ord(end[0]) - ord('a'), 8 - int(end[1]) piece = self.board[start_row][start_col] if not piece or piece.color != self.current_player: print("حركة غير صالحة: القطعة ليست لك") return False target = self.board[end_row][end_col] if target and target.color == self.current_player: print("حركة غير صالحة: لا يمكن أكل قطعك الخاصة") return False # تنفيذ الحركة (بدون تحقق كامل من القواعد) self.board[end_row][end_col] = piece self.board[start_row][start_col] = None self.current_player = 'black' if self.current_player == 'white' else 'white' return True def main(): game =棋盘() 而真: game.print_board() move =输入(f“ f式{game.current_player} sande 4):”): 如果move.lower()=='exit': 破裂 if len(move) != 4 or not move[:2].isalpha() or not move[2:].isdigit(): print("صيغة غير صحيحة! استخدم الصيغة مثل e2e4") continue start = move[:2].lower() end = move[2:].lower() if game.move_piece(start, end): print("حركة ناجحة!") else: print("حركة فاشلة، حاول مرة أخرى") 如果name==“main”: main()
我正在构建一个国际象棋 GUI,它应该与 Stockfish 对话。我听说我必须生成一个 FEN 字符串,以告诉 Stockfish 已采取的行动。所以问题是,如何...
我是人工智能的新手,我正在尝试使用国际象棋库构建一个具有 alpha beta 修剪功能的国际象棋引擎。不过,我一开始遇到了几个问题,在深度 6 或 7 的时候太慢了,你等等...
使用Python国际象棋库时的奇怪错误,在set.fen()和push(move)之后,board.legel_moves生成错误的棋步
我正在用Python国际象棋库编写一个小型国际象棋GUI。昨天,我运行了我的代码很多次,没有任何问题。然后我安装了一些其他的Python库。今天我发现一个奇怪的错误:
使用python-chess从PGN评论中提取非标准评估分数
我有一个 PGN 文件,它是 Cute Chess 的输出。 1. e4 {+0.42/27 1.6s} e5 {-0.21/26 5.4s} 2. Nf3 {+0.34/22 0.94s} Nc6 {-0.16/19 0.37s} 3. Bb5 {+0.35/27 2.1s} Nf6 {-0.19/26 0.80s} 4. O-O {+0.3...
如何使用 python chess.pgn.read_game 函数提取 PGN 文件中的分数
PGN 的分数如下: 1. e4 {+0.42/27 1.6s} e5 {-0.21/26 5.4s} 2. Nf3 {+0.34/22 0.94s} Nc6 {-0.16/19 0.37s} 3. Bb5 {+0.35/27 2.1s} Nf6 {-0.19/26 0.80s} 4. O-O {+0.33/22 0.56s} Nxe4 {-0.16/26...
我需要弄清楚如果两个玩家都没有完成游戏就离开游戏该怎么办。在这种情况下,我需要一个解决方案来保留当前的游戏状态并确定何时应该考虑游戏......
我正在制作一个国际象棋游戏,atm我正在制作一个棋盘,正要完成时我意识到它没有颜色并且就像...... “如何添加颜色?” 这是代码,在哪里以及如何...
我有一项服务,可以从数据库获取游戏并向其添加动作。此外,它还编辑当前的 pgn(动作字符串)。是否有任何函数可以获取给定的动作字符串并解析来自...的动作
我已经仔细研究了位板上的国际象棋编程维基,但我仍然在努力思考如何实际创建它们。根据我收集的信息,它们应该是 uint64_t 对吗?
我目前正在使用 OpenCV 用 python 编写一个项目,旨在识别屏幕上棋盘上棋子的位置。 我已经成功地使用了模板匹配功能...
我正在构建一个国际象棋引擎,我正在尝试使用我之前使用过的名为 perftree 的程序来测试它。为了让 perftree 能够使用我的代码,我需要以某种方式格式化我的输出。
我正在尝试使用 Chess.js 和 Chessboard.js 使用 Minimax 算法和 alpha-beta 修剪来编写国际象棋引擎。问题是该算法需要很长时间才能执行所有
如何使用 ppo 加快 python 国际象棋机器人的训练时间?
我正在尝试构建一个使用近端策略优化进行学习的国际象棋机器人。我目前正在使用 python-chess 库(https://python-chess.readthedocs.io/en/latest/index.html#)作为
我真的很努力将stockfish 与c# 实现统一,我见过很多人使用标准输入来读取stockfish。不过,无论我做什么,我的程序都会冻结。 (对...
我有一个 CLI 国际象棋程序,它接收用户的输入(例如:'e2e4')并将其转换为两个位图,即 s_map 和 e_map。 位图表示为 0x0000000000000000ULL; 右边在哪里...
如果操作 stdin 和 stdout,Python subprocess.popen 会死锁?
我编写了一个脚本来操作国际象棋引擎的标准输入和标准输出。基本上,我使用 subprocess.popen 打开程序,并使用 threading.Thread 操作每个输入和输出。 但是,如果...