const std = @import("std"); // zig fmt: off pub const Square = packed enum(u6) { a8, b8, c8, d8, e8, f8, g8, h8, a7, b7, c7, d7, e7, f7, g7, h7, a6, b6, c6, d6, e6, f6, g6, h6, a5, b5, c5, d5, e5, f5, g5, h5, a4, b4, c4, d4, e4, f4, g4, h4, a3, b3, c3, d3, e3, f3, g3, h3, a2, b2, c2, d2, e2, f2, g2, h2, a1, b1, c1, d1, e1, f1, g1, h1, }; // zig fmt: on const Board = struct { wP: u64, wN: u64, wB: u64, wR: u64, wQ: u64, wK: u64, bP: u64, bN: u64, bB: u64, bR: u64, bQ: u64, bK: u64, wCastlePerm: bool, bCastlePerm: bool, movesSinceCapture: u16, whiteToMove: bool, }; pub fn printBitboard(bitboard: u64) void { var rank: u6 = 0; while (rank < 8) : (rank += 1) { var file: u6 = 0; while (file < 8) : (file += 1) { const square = 8 * rank + file; const occupied: u8 = if (getBit(bitboard, square)) 1 else 0; std.debug.print("{d}, ", .{occupied}); } std.debug.print("\n", .{}); } } fn getBit(bitboard: u64, square: u6) bool { const mask = @as(u64, 1) << square; return bitboard & mask != 0; } pub fn setBit(bitboard: u64, square: Square) u64 { const mask = @as(u64, 1) << @enumToInt(square); return bitboard | mask; } pub fn resetBit(bitboard: u64, square: Square) u64 { const mask = @as(u64, 1) << @enumToInt(square); return if (getBit(bitboard, @enumToInt(square))) bitboard ^ mask else bitboard; }