有没有一种方法可以在不使用嵌套 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;
}