中国象棋的源代码
- 提问者网友:太高姿态
- 2021-04-16 01:42
- 五星知识达人网友:野慌
- 2021-04-16 03:08
#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","bmp\\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,blackoldpos;
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)
{
union REGS r;
r.x.ax=0x4f02;
r.x.bx=vmode;
int86(0x10,&r,&r);
return(r.h.ah);
}
unsigned int get_SVGA_mode()
{
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)
{
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++)
{
b=fgetc(fp);g=fgetc(fp);r=fgetc(fp);
outportb(0x3c8,i);
outportb(0x3c9,r>>2);
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<width+start_y;i++,n++)
{
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);
}
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;
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<max;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<max;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<max;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<max;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<max;i++)
if(board[i][y]!=0) j++;
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<max;i++)
if(board[x][i]!=0) j++;
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;
}
- 1楼网友:大漠
- 2021-04-16 05:04
- 2楼网友:雾月
- 2021-04-16 04:18
什么意思啊 兄弟清楚点
- 3楼网友:孤老序
- 2021-04-16 04:01
中国象棋源代码
blackleft()
{
int x,y,n;
if(blackcurpos.y>0)
{
blackcurpos.y--;
x=position[blacktemppos.x][blacktemppos.y].x;
y=position[blacktemppos.x][blacktemppos.y].y;
if(board[blacktemppos.x][blacktemppos.y]==0)
drawbmp(x,y,boardfile[blacktemppos.x][blacktemppos.y]);
else if(!(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE))
{
n=board[blacktemppos.x][blacktemppos.y];
drawbmp(x,y,chessfile[n]);
}
if(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE)
drawselecursor(blackoldpos);
drawcursor(blackcurpos);
blacktemppos.x=blackcurpos.x;
blacktemppos.y=blackcurpos.y;
}
}
blackright()
{
int x,y,n;
if(blackcurpos.y<8)
{
blackcurpos.y++;
x=position[blacktemppos.x][blacktemppos.y].x;
y=position[blacktemppos.x][blacktemppos.y].y;
if(board[blacktemppos.x][blacktemppos.y]==0)
drawbmp(x,y,boardfile[blacktemppos.x][blacktemppos.y]);
else if(!(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE))
{
n=board[blacktemppos.x][blacktemppos.y];
drawbmp(x,y,chessfile[n]);
}
if(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE)
drawselecursor(blackoldpos);
drawcursor(blackcurpos);
blacktemppos.x=blackcurpos.x;
blacktemppos.y=blackcurpos.y;
}
}
blackdo()
{
int i,j,x,y,n;
if(blackstate==SELECT&&blackcanselect())
{
if(board[blackcurpos.x][blackcurpos.y]<=BLACK&&board[blackcurpos.x][blackcurpos.y]>0)
{
blackstate=MOVE;
drawselecursor(blackcurpos);
blackoldpos.x=blackcurpos.x;
blackoldpos.y=blackcurpos.y;
}
}
else if(blackstate==MOVE&&blackcanmove())
{
x=position[blackoldpos.x][blackoldpos.y].x;
y=position[blackoldpos.x][blackoldpos.y].y;
drawbmp(x,y,boardfile[blackoldpos.x][blackoldpos.y]);
x=position[blackcurpos.x][blackcurpos.y].x;
y=position[blackcurpos.x][blackcurpos.y].y;
n=board[blackoldpos.x][blackoldpos.y];
drawbmp(x,y,chessfile[n]);
if(board[blackcurpos.x][blackcurpos.y]==RED_JIANG)
{
winner=BLACK;
finish=1;
return;
}
board[blackcurpos.x][blackcurpos.y]=n;
board[blackoldpos.x][blackoldpos.y]=0;
for(i=0;i<=2;i++)
for(j=3;j<=5;j++)
if(board[i][j]==BLACK_JIANG)
{x=i;y=j;}
for(i=x+1,j=y,n=0;i<=9;i++)
{
if(board[i][j]==RED_JIANG&&n==0)
{winner=RED;finish=1;break;}
else if(board[i][j]!=0) n++;
}
turn=RED;
redstate=SELECT;
drawcursor(redcurpos);
drawbmp(30,438,"bmp\\rzq.wfb");
}
}
blackundo()
{
int x,y,n;
if(blackstate==MOVE)
{
x=position[blackoldpos.x][blackoldpos.y].x;
y=position[blackoldpos.x][blackoldpos.y].y;
n=board[blackoldpos.x][blackoldpos.y];
drawbmp(x,y,chessfile[n]);
blackoldpos.x=blackcurpos.x;
blackoldpos.y=blackcurpos.y;
drawcursor(blackcurpos);
blackstate=SELECT;
}
}
start()
{
drawcursor(blackcurpos);
drawbmp(30,438,"bmp\\bzq.wfb");
while(!finish)
{
key=getkey();
switch(key){
case RED_UP:
if(turn==RED)
redup();
break;
case RED_DOWN:
if(turn==RED)
reddown();
break;
case RED_LEFT:
if(turn==RED)
redleft();
break;
case RED_RIGHT:
if(turn==RED)
redright();
break;
case RED_DO:
if(turn==RED)
reddo();
break;
case RED_UNDO:
if(turn==RED)
redundo();
break;
case BLACK_UP:
if(turn==BLACK)
blackup();
break;
case BLACK_DOWN:
if(turn==BLACK)
blackdown();
break;
case BLACK_LEFT:
if(turn==BLACK)
blackleft();
break;
case BLACK_RIGHT:
if(turn==BLACK)
blackright();
break;
case BLACK_DO:
if(turn==BLACK)
blackdo();
break;
case BLACK_UNDO:
if(turn==BLACK)
blackundo();
break;
case ESCAPE: finish=1;break;
}
}
}
main()
{
init();
initpos();
initchessmap();
drawbmp(0,0,"bmp\\board.wfb");
initdrawchess();
redcurpos.x=redoldpos.x=redtemppos.x=9;
redcurpos.y=redoldpos.y=redtemppos.y=8;
blackcurpos.x=blackoldpos.x=blacktemppos.x=0;
blackcurpos.y=blackoldpos.y=blacktemppos.y=0;
start();
if(winner==RED)
drawbmp(200,200,"bmp\\redwin.wfb");
else if(winner==BLACK)
drawbmp(200,200,"bmp\\blackwin.wfb");
else
drawbmp(200,200,"bmp\\exit.wfb");
getch();
end();
}