搜档网
当前位置:搜档网 › 中国象棋源代码-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","bmp\\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","bmp\\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","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\99.wfb"},

{"bmp\\101.wfb","bmp\\102.wfb","bmp\\102.wfb","bmp\\104.wfb","bmp\\105.wfb","bm p\\106.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,

0,255,255,0,255,255,255,255,255,255,255,0,0,1,

0,255,0,1,1,0,255,255,255,255,255,255,255,0,

0,0,1,1,1,1,0,255,255,255,255,255,0,1,

0,1,1,1,1,1,1,0,255,255,255,0,1,1,

1,1,1,1,1,1,1,1,0,255,0,1,1,1,

1,1,1,1,1,1,1,1,1,0,1,1,1,1

};

struct pos{

int x;

int y;

}position[10][9],redcurpos,redtemppos,redoldpos,blackcurpos,blacktemppos,blacko ldpos;

/*----------------------------------------------------*/

selectpage(register char page) /*换页函数*/

{

union REGS r;

r.x.ax=0x4f05;

r.x.bx=0;

r.x.dx=page; /*选择页面*/

int86(0x10,&r,&r);

}

unsigned char set_SVGA_mode(int vmode) /*设置SVGA屏幕模式*/

{

union REGS r;

r.x.ax=0x4f02;

r.x.bx=vmode;

int86(0x10,&r,&r);

return(r.h.ah);

}

unsigned int get_SVGA_mode() /*获取当前SVGA屏幕模式*/

{

union REGS r;

r.x.ax=0x4f03;

int86(0x10,&r,&r);

return(r.x.bx);

}

drawbmp(int start_x,int start_y,char filename[])

{

char buffer[640];

int i,j,k,n,r,g,b,width,length;

long position;

FILE *fp;

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

}

/*--------------------红方操作--------------------*/ int redcanselect()

{

int x,y;

x=redcurpos.x;

y=redcurpos.y;

if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)

return 1;

else

return 0;

}

int redcanmove()

{

int i,j,min,max,oldx,oldy,x,y;

oldx=redoldpos.x;

oldy=redoldpos.y;

x=redcurpos.x;

y=redcurpos.y;

/*case1 目标位置是否是自己人*/

if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)

return 0;

/* 军、马、炮、相、士、将、卒的走法正确性的判断*/ switch(board[oldx][oldy])

{

case RED_BIN: /*完成*/

if(oldx>=5)

{ if(y!=oldy||(oldx-x)!=1) return 0;}

else

{ if(x==(oldx-1)&&y==oldy) return 1;

else

if(x==oldx&&y==(oldy+1)) return 1;

else

if(x==oldx&&y==(oldy-1)) return 1;

else

return 0;

}

break;

case RED_JIANG: /*完成*/

if(x!=oldx&&y!=oldy) return 0;

if(x!=oldx)

if((x-oldx)>1||(oldx-x)>1) return 0;

else if(x<7) return 0;

else if(y!=oldy)

if((y-oldy)>1||(oldy-y)>1) return 0;

else if(y<3||y>5) return 0;

break;

case RED_JU: /*完成*/

if(x!=oldx&&y!=oldy) return 0;

else if(x!=oldx)

{ min=(x>oldx)?oldx:x;

max=(x>oldx)?x:oldx;

for(i=min+1;i

if(board[i][y]!=0) return 0;

}

else if(y!=oldy)

{ min=(y>oldy)?oldy:y;

max=(y>oldy)?y:oldy;

for(i=min+1;i

if(board[x][i]!=0) return 0;

}

break;

case RED_MA: /*完成*/

if((x-oldx)==2&&((y-oldy)==1||(oldy-y)==1)) {

if(board[oldx+1][oldy]!=0) return 0;

}else

if((oldx-x)==2&&((y-oldy)==1||(oldy-y)==1)) {

if(board[oldx-1][oldy]!=0) return 0;

}else

if((y-oldy)==2&&((x-oldx)==1||(oldx-x)==1)) {

if(board[oldx][oldy+1]!=0) return 0;

}else

if((oldy-y)==2&&((x-oldx)==1||(oldx-x)==1)) {

if(board[oldx][oldy-1]!=0) return 0;

}else

return 0;

break;

case RED_PAO: /*完成*/

if(x!=oldx&&y!=oldy) return 0;

if(board[x][y]==0)

{

if(x!=oldx)

{ min=(x>oldx)?oldx:x;

max=(x>oldx)?x:oldx;

for(i=min+1;i

if(board[i][y]!=0) return 0; }

else if(y!=oldy)

{ min=(y>oldy)?oldy:y;

max=(y>oldy)?y:oldy;

for(i=min+1;i

if(board[x][i]!=0) return 0; }

}

else

{

if(x!=oldx)

{ min=(x>oldx)?oldx:x;

max=(x>oldx)?x:oldx;

for(i=min+1,j=0;i

if(j!=1) return 0;

}

else if(y!=oldy)

{ min=(y>oldy)?oldy:y;

max=(y>oldy)?y:oldy;

for(i=min+1,j=0;i

if(j!=1) return 0;

}

}

break;

case RED_SHI: /*完成*/

if(oldx==9||oldx==7)

{if(x!=8||y!=4) return 0;} else if(oldx==8)

{if(x==9&&y==3) return 1; else

if(x==9&&y==5) return 1; else

if(x==7&&y==3) return 1; else

if(x==7&&y==5) return 1; else return 0;

}else return 0;

break;

case RED_XIANG: /*完成*/

if(x<5) return 0;

if(x!=oldx&&y!=oldy)

{

if((x-oldx)==2&&(y-oldy)==2)

{i=oldx+1;j=oldy+1;}

else if((x-oldx)==2&&(oldy-y)==2)

{i=oldx+1;j=oldy-1;}

else if((oldx-x)==2&&(y-oldy)==2)

{i=oldx-1;j=oldy+1;}

else if((oldx-x)==2&&(oldy-y)==2)

{i=oldx-1;j=oldy-1;}

else return 0;

if(board[i][j]!=0) return 0;

}

else return 0;

break;

}

return 1;

}

教育之通病是教用脑的人不用手,不教用手的人用脑,所以一无所能。教育革命的对策是手脑联盟,结果是手与脑的力量都可以大到不可思议。

相关主题