我有一个 CLI 国际象棋程序,它接收用户的输入(例如:'e2e4')并将其转换为两个位图,即 s_map 和 e_map。
位图表示为 0x0000000000000000ULL;
其中最右边的位代表 h8,最左边的位代表 a1。
我使用的算法
#ifdef _WIN32
#define CLR "cls"
#else
#define CLR "clear"
#endif
#define SQS 64
#define ROW 8
typedef struct {
uint64_t wp;
uint64_t wr;
uint64_t wn;
uint64_t wb;
uint64_t wq;
uint64_t wk;
uint64_t bp;
uint64_t br;
uint64_t bn;
uint64_t bb;
uint64_t bq;
uint64_t bk;
} PieceBitmaps;
typedef struct {
uint64_t s_map, e_map;
} Move;
typedef struct {
uint64_t s_map, e_map;
} Move;
int main(int argc, char * argv[]) {
char turn = 'W';
char winner = ' ';
PieceBitmaps pieces = init_bitmap();
Move input;
while (winner == ' ') {
system(CLR);
print_stuff(turn, &pieces);
do {
input = get_input();
printf("Hex: S-map: %x E-map: %x\n", input.s_map, input.e_map);
} while (1); // TODO: Validity functions go here.
turn = (turn == 'W') ? 'B' : 'W';
}
}
Move input_to_bitmap(char* input) {
Move mv;
mv.s_map = 0x8000000000000000ULL >> (((input[1] - '1') * ROW) + (tolower(input[0]) - 'a'));
mv.e_map = 0x8000000000000000ULL >> (((input[3] - '1') * ROW) + (tolower(input[2]) - 'a'));
return mv;
}
Move get_input() {
char input[5];
printf("Enter the move eg='e2e4' : ");
fgets(input, sizeof(input), stdin);
printf("%s\n", input);
if(strlen(input) == 4) while (getchar() != '\n'); // We clear the input buffer of garbage val to insure integrity for next iteration.
if (check_valid_input(input)) return (Move){0X0ULL, 0x0ULL};
return input_to_bitmap(input);
}
int check_valid_input(char* input) {
if (input[0] > 'h' || input[0] < 'a' || input[2] > 'h' || input[2] < 'a' ||
input[1] < '1' || input[1] > '8' || input[3] < '1' || input[3] > '8' || strlen(input) != 4) {
puts("Enter the move in a valid format.");
return 1;
}
return 0;
}
>> 索引计算正确,但是,对于某些特定的方格(例如,rank1、rank2 中的方格),该位似乎没有移动,并且仅显示所有这些方格 0,但对于 h8、h7 等其他方格,该位似乎正确移动。
输出如下:
Enter the move eg='e2e4' : e2e4
e2e4
Hex: S-map: 0 E-map: 0
Enter the move eg='e2e4' : h8h7
h8h7
Hex: S-map: 1 E-map: 100
Enter the move eg='e2e4' : a1a4
a1a4
Hex: S-map: 0 E-map: 0
Enter the move eg='e2e4' : b1b4
b1b4
Hex: S-map: 0 E-map: 0
Enter the move eg='e2e4' : a2b4
a2b4
Hex: S-map: 0 E-map: 0
Enter the move eg='e2e4' :
如有任何反馈,我们将不胜感激。
问题不在于转换,而在于输出。
在
main
函数中,您可以使用以下命令来打印转换后的值:
printf("Hex: S-map: %x E-map: %x\n", input.s_map, input.e_map);
%x
格式说明符需要一个unsigned int
作为其参数,但您传入的uint64_t
具有不同的大小。 使用错误的格式说明符会在代码中调用未定义的行为。
您需要使用
PRIx64
宏来生成正确的格式说明符,以十六进制打印 uint64_t
:
printf("Hex: S-map: %" PRIx64 " E-map: %" PRIx64 "\n", input.s_map, input.e_map);