位图计算中的位移似乎不起作用

问题描述 投票:0回答:1

我有一个 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' : 

如有任何反馈,我们将不胜感激。

c bitmap bit-manipulation chess
1个回答
0
投票

问题不在于转换,而在于输出。

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);
© www.soinside.com 2019 - 2024. All rights reserved.