?? 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 + -