📄 chess.h
字号:
//-----------------------------------------------------------------
// 名称: 国际象棋游戏头文件
//-----------------------------------------------------------------
//常量定义
#define TRUE 1
#define FALSE 0
#define ON 1
#define OFF 0
#define YES 1
#define NO 0
#define OK 0
#define ERR -1
//类型重定义
typedef float FLOAT;
typedef double DOUBLE;
typedef char CHAR;
typedef short SHORT;
typedef int INT;
typedef int BOOL;
typedef unsigned long FLAG;
typedef unsigned long LWORD;
typedef unsigned long DWORD;
typedef unsigned UINT;
typedef long LONG;
typedef unsigned char BYTE;
typedef unsigned short WORD;
#define ZPAGE
//系统类型
typedef BYTE COORD; //坐标(当前行或列)
typedef BYTE LOC[2]; //棋子位置(行,列)
typedef BYTE PIECE; //棋子标识
typedef BYTE BOARD[8][8]; //用8x8二维数组定义棋盘格子(中的棋子)
typedef BYTE MASK[8]; //掩码数组
//4位的棋子编码中低3位(001-110)用于标识棋子名称,高位则用于标识棋子颜色)
#define EMPTY 0 //空
#define PAWN 1 //兵 X-001
#define ROOK 2 //车 X-010
#define KNIGHT 3 //马 X-011
#define BISHOP 4 //象 X-100
#define QUEEN 5 //后 X-101
#define KING 6 //王 X-110
#define WHITE 0 //白(高位X为0,0000)
#define BLACK 8 //黑(高位X为1,1000)
//游戏控制常量定义
#define WH_PAWN_BASEROW 1 //白子底行行号[白子从底行1开始直进时可最多直进两格]
#define BL_PAWN_BASEROW 6 //黑子底行行号[黑子从底行6开始直进时可最多直进两格]
#define MAX_INDEX 63 //最大索引值
#define MIN_INDEX 0 //最小索引值
#define MAX_COL 7 //棋盘最大列号
#define MAX_ROW 7 //棋盘最大行号
#define MIN_COL 0 //棋盘最小列号
#define MIN_ROW 0 //棋盘电波行号
//CPU控制移动类型
#define NO_MOVE 0xFF //未移动
#define NORMAL 1 //正常
#define SAFE 2 //安全
#define CAPTURE 3 //捕获
#define SAFECAPTURE 4 //安全捕获
//全局变量存放于0页,以便快速访问
extern ZPAGE BOARD board; //8x8棋盘数组
extern ZPAGE MASK validmovemask; //有效移动掩码
extern ZPAGE MASK capturemask; //捕获掩码
extern ZPAGE INT movecount; //移动计数
extern ZPAGE LOC wh_king_pos; //白方王的位置
extern ZPAGE LOC bl_king_pos; //黑方王的位置
extern ZPAGE LOC opp_king_pos; //对方王的位置
extern ZPAGE BOOL kingcapture; //王被捕获标识
extern ZPAGE BYTE wh_base_cont; //白方底线掩码
extern ZPAGE BYTE bl_base_cont; //黑方底线掩码
extern ZPAGE BYTE movetype; //移动类型
extern ZPAGE BYTE rate; //移动权重评估值
extern ZPAGE BYTE piecerate; //当前棋子的移动权重
//将行/列坐标(r,c)转换为以0为起点的索引值
#define getindex(r,c) (r * 8) + c;
//将以0为起点的索引值转换为8x8的行列坐标
#define getcoord(r,c,i) r = i / 8; c = i % 8;
//判断棋子类型或名称(棋子编码为XXXX,后3位为类型或名称,高位为颜色标识)
#define piecetype(p) (p & 0x07)
//判断是否为对方棋子
//[判断条件:board[r][c]有子,且该棋子色不同于p的颜色, 其中&0x08后>>3用于取得棋子颜色]
#define is_opp_piece(r,c,p) \
((((board[r][c] & 0x08) >> 3) ^ ((p & 0x08) >> 3)) && (board[r][c]))
//判断是否为有效移动(有效时返回真,否则返回假)
//[判断时根据掩码数组validmovemask中第r行掩码字节中第c位是否为1]
#define is_valid_move(r,c) (validmovemask[r] & (1 << c))
//与CPU对弈
void cpuplay();
//搜索from位置上piececlour颜色的棋子当前所有可能的合法移动
//搜索结果保存于棋盘掩码数组
void val_pawn (LOC from, BOOL piececolour);//兵
void val_bishop(LOC from, BOOL piececolour);//象
void val_knight(LOC from, BOOL piececolour);//马
void val_rook (LOC from, BOOL piececolour);//车
void val_queen (LOC from, BOOL piececolour);//后
void val_king (LOC from, BOOL piececolour);//王
//各方向的有效移动搜索函数
void val_north (LOC from,BOOL piececolour,BOOL depth);//北
void val_south (LOC from,BOOL piececolour,BOOL depth);//南
void val_west (LOC from,BOOL piececolour,BOOL depth);//西
void val_east (LOC from,BOOL piececolour,BOOL depth);//东
void val_northwest(LOC from,BOOL piececolour,BOOL depth);//西北
void val_northeast(LOC from,BOOL piececolour,BOOL depth);//东北
void val_southwest(LOC from,BOOL piececolour,BOOL depth);//西南
void val_southeast(LOC from,BOOL piececolour,BOOL depth);//东南
//工具函数
void updatekingpos (LOC to, BOOL piececolour);//更新王的位置
INT getbestpiecemove(LOC from); //获得最佳移动
BOOL test_singlemove (LOC from,LOC to,PIECE p); //对单次移动进行检测
INT rate_move (PIECE piece,LOC to, BYTE posrate);//移动权重评估函数
void draw_move (LOC from, LOC to,PIECE p); //移动重绘
void init_board (); //棋盘初始化
//棋盘接口函数
void panel_init(); //LCD初始化
void panel_cls(); //清空棋盘
void panel_draw(COORD row, COORD col, PIECE p);//绘制棋盘
BOOL panel_getmove(LOC from, LOC to);//获取当前准备的移动的棋子位置及目标位置
//液晶屏绘制棋子点阵函数及棋盘格子反相函数
void panel_blit(COORD row, COORD col, const BYTE *sprite);
void panel_invert(LOC loc, BYTE flag);
//声音效果函数
void sound_yourmove(); //对方移动
void sound_mymove(); //已方移动
void sound_illegal(); //操作无效
void sound_capture(); //捕获棋子
void sound_youwin(); //对方胜
void sound_iwin(); //已方胜
void sound_tone(WORD period, WORD cycles);//指定周期(频率)与时长的声音输出
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -