搜档网
当前位置:搜档网 › 中国象棋源代码-C语言小程序

中国象棋源代码-C语言小程序

中国象棋源代码-C语言小程序
中国象棋源代码-C语言小程序

*--------------------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);

}

相关主题