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