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

Checkerboard pattern without x and y (purely based on index)

有没有一种不用嵌套 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
}

有更简单的方法吗?如果是,请同时解释如何以及为什么,我想知道我的代码中发生了什么:)

如果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;
    }