当前位置: 首页 > 知识库问答 >
问题:

如何写出正确的条件?(芬棋)

汤嘉平
2023-03-14

我正试图用python构建一个简单的国际象棋游戏,我已经创建了一个关于棋子位置的字典。我想把字典改成Forsyth–Edwards符号(FEN)(棋子的位置)。

curr_position = {'a8': 'r', 'b8': 'n', 'c8': 'b', 'd8': 'q', 'e8': 'k', 'f8': 'b', 'g8': 'n', 'h8': 'r', 'a7': 'p', 'b7': 'p', 'c7': 'p', 'd7': 'p', 'e7': 'p', 'f7': 'p', 'g7': 'p', 'h7': 'p', 'a6': None, 'b6': None, 'c6': None, 'd6': None, 'e6': None, 'f6': None, 'g6': None, 'h6': None, 'a5': None, 'b5': None, 'c5': None, 'd5': None, 'e5': None, 'f5': None, 'g5': None, 'h5': None, 'a4': None, 'b4': None, 'c4': None, 'd4': None, 'e4': None, 'f4': None, 'g4': None, 'h4': None, 'a3': None, 'b3': None, 'c3': None, 'd3': None, 'e3': None, 'f3': None, 'g3': None, 'h3': None, 'a2': 'P', 'b2': 'P', 'c2': 'P', 'd2': 'P', 'e2': 'P', 'f2': 'P', 'g2': 'P', 'h2': 'P', 'a1': 'R', 'b1': 'N', 'c1': 'B', 'd1': 'Q', 'e1': 'K', 'f1': 'B', 'g1': 'N', 'h1': 'R'}

上述字典应该以FEN返回如下内容:

"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"

我写了

def curr_fen():
    positions2 = ""
    pos_temp = 0
    prev_value = 0
    for ix, value in enumerate(curr_position.values()):
        if ix % 8 == 0 and ix != 0:
            positions2 += "/"
            pos_temp = 0
        if not value:
            pos_temp += 1
            positions2 += str(pos_temp)
        else:
            positions2 += value
    return positions2

print(curr_fen())

哪个返回

"nbqkbnr/pppppppp/12345678/12345678/12345678/12345678/PPPPPPPP/RNBQKBNR" 

这是不正确的。如何调整我的函数以返回期望的输出?

共有1个答案

巫马心水
2023-03-14

当您走过棋盘位置时,您正在跟踪带有pos_temp的连续空方块。

当你找到一个带有棋子的方块或者你移动到下一个等级(如果前一个等级完全为空)时,连续的空方块的数量应该添加到字符串中。

只要将< code>pos_temp添加到字符串中,就需要将其重置为零。

我对您的代码进行了一些添加和一次删除。

def curr_fen():
    positions2 = ""
    pos_temp = 0
    prev_value = 0
    for ix, value in enumerate(curr_position.values()):
        if ix % 8 == 0 and ix != 0:
            if pos_temp > 0:
                positions2 = positions2 + str(pos_temp)
            positions2 += "/"
            pos_temp = 0
        if not value:
            pos_temp += 1
            # positions2 += str(pos_temp)
        else:
            if pos_temp > 0:
                positions2 = positions2 + str(pos_temp)
                pos_temp = 0
            positions2 += value

    return positions2

您的解决方案依赖于以特定顺序构建的字典。这里有几个不依赖于原始字典顺序的替代方案。它们都有转换原始字典的中间步骤。

import collections
def f(d):
    rank_order = '87654321'
    file_order = 'abcdefgh'
    new = collections.defaultdict(dict)
    for (file,rank),piece in d.items():
        new[rank].update({file:piece})
    board = []
    for rank in rank_order:
        s = ''
        temp = 0
        for file in file_order:
            piece = new[rank][file]
            if piece is None:
                temp += 1
            else:
                if temp > 0:
                    s = f'{s}{temp}'
                    temp = 0
                s = f'{s}{piece}'
        if temp > 0:
            s = f'{s}{temp}'
        board.append(s)
    return '/'.join(board)

import itertools
def g(d):
    rank_order = '87654321'
    file_order = 'abcdefgh'
    new1 = collections.defaultdict(list)
    for (file,rank),piece in d.items():
        new1[rank].append((file,piece))
    board = []
    for rank in rank_order:
        s = ''
        positions = new1[rank]
        positions.sort()
        for piece,items in itertools.groupby(positions,key=lambda x:x[1]):
            n_pieces = len(list(items))
            if piece is None:
                s = f'{s}{n_pieces}'
            else:
                s = f'{s}{piece * n_pieces}'
        board.append(s)
    return '/'.join(board)
 类似资料:
  • 我存储用户收藏夹到json文件,但我得到以下错误: 未处理的异常:类型“\u InternalLinkedHashMap” 我将以下数据添加到文件中: 代码是: 我很困惑,不知道如何解决这个问题。

  • 单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧。但是其中的坑却不少,所以也常作为面试题来考。本文主要对几种单例写法的整理,并分析其优缺点。很多都是一些老生常谈的问题,但如果你不知道如何创建一个线程安全的单例,不知道什么是双检锁,那这篇文章可能会帮助到你。 懒汉式,线程不安全 当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样教我们的。 public

  • 我在这里阅读了手册,看到了这个答案,但它不起作用: 没有引用的论点,它是有效的。 但这与我的预期用途不符。 更让人困惑的是,当我以这种方式写出表格时,没有引号,也没有错误: 知道发生了什么吗?

  • 问题内容: 我正在Ruby中创建哈希,并希望以正确的格式将其写入JSON文件。 这是我的代码: 这是结果文件的内容: 我正在使用Sinatra(不知道哪个版本)和Ruby v 1.8.7。 如何以正确的JSON格式将其写入文件? 问题答案: 需要JSON库,并使用。 您的temp.json文件现在看起来像:

  • 问题内容: 我的软件包具有以下结构: 我不确定应如何正确写入文件。 的样子: 但是例如应该看起来如何?我的是: 什么时候应该使用? 问题答案: 很好-它有助于指导导入语句,而无需自动导入模块 http://docs.python.org/tutorial/modules.html#importing-from-a- package 使用和是多余的,仅需要 我认为在导入软件包中使用的最强大的理由之一

  • 我对编码很陌生。尝试用Java编写一个evaluatePostfix函数。我不断得到一个错误: 不兼容的类型:int不能转换为字符堆栈。push(eval(token,a,b)); 下面是我的代码块: 函数接受后缀表达式并计算结果。 这是我的eval函数: