algorithm - 没有 x 和 y 的棋盘格图案(纯粹基于索引)

有没有一种方法可以在不使用嵌套 for 循环且不使用 x 和 y 的情况下生成棋盘模式?

我确定这之前已经完成了,但是我在寻找它的大约 15 分钟内找不到它。

目前我有这个函数生成首先提取 x 和 y 的模式:

fn get_bg_color_of(idx: usize) -> &'static str {
    const BG_BLACK: &str = "\u{001b}[48;5;126m";
    const BG_WHITE: &str = "\u{001b}[48;5;145m";

    let x = idx % Board::WIDTH;
    let y = idx / Board::WIDTH;

    let is_even_row = y % 2 == 0;
    let is_even_column = x % 2 == 0;

    if is_even_row && is_even_column || !is_even_row && !is_even_column {
        return BG_WHITE;
    }

    BG_BLACK
}

有没有更简单的方法来做到这一点?如果是,还请解释如何以及为什么,我想知道我的代码中发生了什么:)

回答1

如果 WIDTH 是偶数,则需要将 x 和 y 分开。不过,您可以写得更短:

fn get_bg_color_of(idx: usize) -> &'static str {
    const BG_BLACK: &str = "\u{001b}[48;5;126m";
    const BG_WHITE: &str = "\u{001b}[48;5;145m";

    if ( (idx + (idx/Board::WIDTH)) % 2 == 0 ) {
        return BG_WHITE;
    }
    return BG_BLACK;
}

请注意,如果 WIDTH 是奇数,这将不起作用。在这种情况下,您可以这样做:

if ( idx % 2 == 0 ) {
        return BG_WHITE;
    }
}

如果您需要处理这两种情况,那么:

if ( ((idx%Board::WIDTH) + (idx/Board::WIDTH)) % 2 == 0 ) {
        return BG_WHITE;
    }