*--------------------chess.c----------------------*/ #include "dos.h"
#include "stdio.h"
/*----------------------------------------------------*/ #define RED 7
#define BLACK 14
#define true 1
#define false 0
#define SELECT 0
#define MOVE 1
#define RED_UP 0x1100
#define RED_DOWN 0x1f00
#define RED_LEFT 0x1e00
#define RED_RIGHT 0x2000
#define RED_DO 0x3900
#define RED_UNDO 0x1000
#define BLACK_UP 0x4800
#define BLACK_DOWN 0x5000
#define BLACK_LEFT 0x4b00
#define BLACK_RIGHT 0x4d00
#define BLACK_DO 0x1c00
#define BLACK_UNDO 0x2b00
#define ESCAPE 0x0100
#define RED_JU 1
#define RED_MA 2
#define RED_XIANG 3
#define RED_SHI 4
#define RED_JIANG 5
#define RED_PAO 6
#define RED_BIN 7
#define BLACK_JU 8
#define BLACK_MA 9
#define BLACK_XIANG 10
#define BLACK_SHI 11
#define BLACK_JIANG 12
#define BLACK_PAO 13
#define BLACK_BIN 14
/*----------------------------------------------------*/ int firsttime=1;
int savemode;
char page_new=0,page_old=0;
int finish=false,turn=BLACK,winner=0;
int key;
int redstate=SELECT,blackstate=SELECT;
int board[10][9];
/*----------------------------------------------------*/
char *chessfile[15]={"",
"bmp\\rju.wfb", "bmp\\rma.wfb", "bmp\\rxiang.wfb","bmp\\rshi.wfb",
"bmp\\rjiang.wfb","bmp\\rpao.wfb","bmp\\rbin.wfb",
"bmp\\bju.wfb", "bmp\\bma.wfb", "bmp\\bxiang.wfb","bmp\\bshi.wfb",
"bmp\\bjiang.wfb","bmp\\bpao.wfb","bmp\\bbin.wfb"
};
char *boardfile[10][9]={
{"bmp\\11.wfb","bmp\\1t.wfb","bmp\\1t.wfb","bmp\\14.wfb","bmp\\15.wfb","bmp\\16.wfb"," bmp\\1t.wfb","bmp\\1t.wfb","bmp\\19.wfb"},
{"bmp\\21.wfb","bmp\\2c.wfb","bmp\\2c.wfb","bmp\\24.wfb","bmp\\25.wfb","bmp\\26.wfb"," bmp\\2c.wfb","bmp\\2c.wfb","bmp\\29.wfb"},
{"bmp\\21.wfb","bmp\\3a.wfb","bmp\\3t.wfb","bmp\\34.wfb","bmp\\3t.wfb","bmp\\36.wfb"," bmp\\3t.wfb","bmp\\3a.wfb","bmp\\29.wfb"},
{"bmp\\41.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","b mp\\4a.wfb","bmp\\4t.wfb","bmp\\49.wfb"},
{"bmp\\51.wfb","bmp\\52.wfb","bmp\\5t.wfb","bmp\\54.wfb","bmp\\5t.wfb","bmp\\56.wfb"," bmp\\5t.wfb","bmp\\58.wfb","bmp\\59.wfb"},
{"bmp\\61.wfb","bmp\\62.wfb","bmp\\6t.wfb","bmp\\64.wfb","bmp\\6t.wfb","bmp\\66.wfb"," bmp\\6t.wfb","bmp\\68.wfb","bmp\\69.wfb"},
{"bmp\\71.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","b mp\\7a.wfb","bmp\\7t.wfb","bmp\\79.wfb"},
{"bmp\\81.wfb","bmp\\8a.wfb","bmp\\8t.wfb","bmp\\84.wfb","bmp\\85.wfb","bmp\\86.wfb"," bmp\\8t.wfb","bmp\\8a.wfb","bmp\\89.wfb"},
{"bmp\\91.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\95.wfb","bmp\\9t.wfb","b mp\\9t.wfb","bmp\\9t.wfb","bmp\\99.wfb"},
{"bmp\\101.wfb","bmp\\102.wfb","bmp\\102.wfb","bmp\\104.wfb","bmp\\105.wfb","bmp\\10 6.wfb","bmp\\108.wfb","bmp\\108.wfb","bmp\\109.wfb"}
};
char cursor[14][14]={
0,0,0,0,0,0,0,0,0,0,0,0,1,1,
0,0,0,0,0,0,0,0,0,0,0,1,1,1,
0,255,255,255,255,255,255,255,0,0,1,1,1,1,
0,255,255,255,255,255,255,0,0,1,1,1,1,1,
0,255,255,255,255,255,255,0,0,1,1,1,1,1,
0,255,255,255,255,255,255,255,0,0,1,1,1,1,
0,255,255,255,255,255,255,255,255,0,0,1,1,1,
0,255,255,255,255,255,255,255,255,255,0,0,1,1,
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Error! Can't open file!");
getch();
return;
}
fseek(fp,28,SEEK_SET);
fread(&i,2,1,fp);
if(i!=8) /*检查是否为256色位图*/
{
puts("Error!Can't find bitmap!");
fclose(fp);
getch();
exit(0);
}
fseek(fp,18,SEEK_SET);
fread(&width,4,1,fp);
fread(&length,4,1,fp);
if(firsttime)
{
fseek(fp,54,SEEK_SET);
for(i=0;i<256;i++) /*按照该图片的DAC色表设置色彩寄存器*/
{
b=fgetc(fp);g=fgetc(fp);r=fgetc(fp); /*获取R、G、B分量*/
outportb(0x3c8,i);
outportb(0x3c9,r>>2); /*右移是要转化为VGA的6位寄存器形式*/ outportb(0x3c9,g>>2);
outportb(0x3c9,b>>2);
fgetc(fp);
}
}
else
fseek(fp,300,SEEK_SET);
k=(width%4)?(4-width%4):0; /*宽度修正值*/
for(j=length-1+start_x;j>=start_x;j--)
{
fread(buffer,width,1,fp);
for(i=start_y,n=0;i { position=j*640l+i; /*计算要显示点的显存位置*/ page_new=position/65536; /*计算显示页*/ if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/ {selectpage(page_new);page_old=page_new;} pokeb(0xa000,position%65536,buffer[n]); /*写到显存位置*/ } fseek(fp,k,SEEK_CUR); /*每行绘制完后修正宽度*/ } fclose(fp); } init() { savemode=get_SVGA_mode(); /*先保存原来的屏幕模式*/ set_SVGA_mode(0x101); /*硬件无关性初始化屏幕为640*480 256色模式*/ } end() { set_SVGA_mode(savemode); /*恢复屏幕*/ } /*----------------------------------------------------*/ initpos() { int i,j; for(i=0;i<10;i++) for (j=0;j<9;j++) { position[i][j].x=35+i*39; position[i][j].y=43+j*40; } } initchessmap() { board[0][0]=BLACK_JU; board[0][1]=BLACK_MA; board[0][2]=BLACK_XIANG; board[0][3]=BLACK_SHI; board[0][4]=BLACK_JIANG; board[0][5]=BLACK_SHI; board[0][6]=BLACK_XIANG; board[0][7]=BLACK_MA; board[0][8]=BLACK_JU; board[2][1]=BLACK_PAO; board[2][7]=BLACK_PAO; board[3][0]=BLACK_BIN; board[3][2]=BLACK_BIN; board[3][4]=BLACK_BIN; board[3][6]=BLACK_BIN; board[3][8]=BLACK_BIN; board[9][0]=RED_JU; board[9][1]=RED_MA; board[9][2]=RED_XIANG; board[9][3]=RED_SHI; board[9][4]=RED_JIANG; board[9][5]=RED_SHI; board[9][6]=RED_XIANG; board[9][7]=RED_MA; board[9][8]=RED_JU; board[7][1]=RED_PAO; board[7][7]=RED_PAO; board[6][0]=RED_BIN; board[6][2]=RED_BIN; board[6][4]=RED_BIN; board[6][6]=RED_BIN; board[6][8]=RED_BIN; } initdrawchess() { int i,j;; for(i=0;i<10;i++) for(j=0;j<9;j++) { if(board[i][j]) drawbmp(position[i][j].x,position[i][j].y,chessfile[board[i][j]]); } } drawcursor(struct pos p) { int i,j,n,m,x,y; long thisposition; x=position[p.x][p.y].x+20; y=position[p.x][p.y].y+25; for(j=13-1+x,m=13;j>=x;j--,m--) { for(i=y,n=0;i<13+y;i++,n++) { thisposition=j*640l+i; /*计算要显示点的显存位置*/ page_new=thisposition/65536; /*计算显示页*/ if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/ {selectpage(page_new);page_old=page_new;} if(cursor[m][n]!=1) if(cursor[m][n]==0) pokeb(0xa000,thisposition%65536,0); else if(turn==RED) pokeb(0xa000,thisposition%65536,153); else pokeb(0xa000,thisposition%65536,255); } } } drawselecursor(struct pos p) { int i,j,n,m,x,y; long thisposition; x=position[p.x][p.y].x+20; y=position[p.x][p.y].y+25; for(j=13-1+x,m=13;j>=x;j--,m--) { for(i=y,n=0;i<13+y;i++,n++) { thisposition=j*640l+i; /*计算要显示点的显存位置*/ page_new=thisposition/65536; /*计算显示页*/ if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/ {selectpage(page_new);page_old=page_new;} if(cursor[m][n]!=1) pokeb(0xa000,thisposition%65536,0); } } } /*----------------------------------------------------*/ int getkey() { int press; while(bioskey(1) == 0); press=bioskey(0); press=press&0xff00; return(press); }