📄 bwchess.c
字号:
int i,j;
for(i=1;i<=5;i++)
drawbox(x-5+i,y-5+i,x+DET*8+5+i,y+DET*8+5+i,TABLESHADOW);
drawbox(x-5,y-5,x+DET*8+5,y+DET*8+5,TABLECOLOR);
drawboxt(x-3,y-3,x+DET*8+3,y+DET*8+3);
setcolor(GRIDCOLOR);
for(i=0;i<8;i++)
for(j=0;j<8;j++)
rectangle(x+DET*i,y+DET*j,x+DET*i+DET,y+DET*j+DET);
}
/*画棋子*/
/*在第r行,第c列画棋子*/
void drawchess(int r,int c,int color)
{
int cr;
cr=DET/2;
setcolor(color);
circle(tablex0+(c-1)*DET+cr,tabley0+(r-1)*DET+cr,cr-3);
setfillstyle(SOLID_FILL,color);
floodfill(tablex0+(c-1)*DET+cr,tabley0+(r-1)*DET+cr,color);
chess[r][c].flag=1;
chess[r][c].color=color;
/*该什么颜色的棋子走了*/
if(color==WC)curchess=BC;
else curchess=WC;
curr=r;
curc=c;
}
/*只画棋子*/
/*在第r行,第c列画棋子*/
void drawchessonly(int r,int c,int color)
{
int cr;
cr=DET/2;
setcolor(color);
circle(tablex0+(c-1)*DET+cr,tabley0+(r-1)*DET+cr,cr-3);
setfillstyle(SOLID_FILL,color);
floodfill(tablex0+(c-1)*DET+cr,tabley0+(r-1)*DET+cr,color);
chess[r][c].color=color;
}
/*画实心矩形*/
void drawbox(int x1,int y1,int x2,int y2,int color)
{
setfillstyle(SOLID_FILL,color);
bar(x1,y1,x2,y2);
}
/*画棋子外的圈线*/
void drawedge(int r,int c,int color)
{
int cr;
cr=DET/2;
setcolor(color);
rectangle(tablex0+(c-1)*DET+1,tabley0+(r-1)*DET+1,tablex0+c*DET-1,tabley0+r*DET-1);
rectangle(tablex0+(c-1)*DET+2,tabley0+(r-1)*DET+2,tablex0+c*DET-2,tabley0+r*DET-2);
}
/*显示字模汉字*/
void drawmat(char *mat,int matsize,int x,int y,int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
{
int i,j,k,n;
n=(matsize-1)/8+1;
for(j=0;j<matsize;j++)
for(i=0;i<n;i++)
for(k=0;k<8;k++)
if(mat[j*n+i]&(0x80>>k)) /*测试为1的位则显示*/
putpixel(x+i*8+k,y+j,color);
}
/*打印分数*/
void printscore()
{
char p[3];
drawbox(520,120,590,135,INFBKCOLOR);
drawbox(520,140,590,155,INFBKCOLOR);
setcolor(WHITE);
outtextxy(530,122,itoa(wccount,p,10));
outtextxy(530,142,itoa(bccount,p,10));
setcolor(INFBKCOLOR);
rectangle(470,115,490,135);
rectangle(470,135,490,155);
setcolor(curchess);
if(wccount+bccount>0){
if(curchess==WC)
rectangle(470,115,490,135);
else
rectangle(470,135,490,155);
}
}
/*画信息框*/
void drawinf()
{
int cr;
int color;
int x1=480,y1=125;
cr=DET/2-10;
color=WC;
setcolor(color);
circle(x1,y1,cr-3);
setfillstyle(SOLID_FILL,color);
floodfill(x1,y1,color);
color=BC;
x1=480;y1=145;
setcolor(color);
circle(x1,y1,cr-3);
setfillstyle(SOLID_FILL,color);
floodfill(x1,y1,color);
}
/*画凸框*/
void drawboxt(int x1,int y1,int x2,int y2)
{
setcolor(WHITE);
line(x1,y1,x1,y2);
line(x1,y1,x2,y1);
setcolor(DARKGRAY);
line(x2,y1,x2,y2);
line(x2,y2,x1,y2);
}
/*画凹框*/
void drawboxa(int x1,int y1,int x2,int y2)
{
setcolor(DARKGRAY);
line(x1,y1,x1,y2);
line(x1,y1,x2,y1);
setcolor(WHITE);
line(x2,y1,x2,y2);
line(x2,y2,x1,y2);
}
/*画窗体*/
void drawwin(int x1,int y1,int x2,int y2,int color)
{
drawbox(x1,y1,x2,y2,color);
setcolor(WHITE);
line(x1,y1,x1,y2);
line(x1,y1,x2,y1);
setcolor(DARKGRAY);
line(x2,y1,x2,y2);
line(x2,y2,x1,y2);
}
/*画被选中的菜单条*/
void drawmenuselect(int selectmenu)
{
switch(selectmenu){
case 1:
drawboxa(460,250,590,255+20);
break;
case 2:
drawboxa(460,260+25,590,290+20);
break;
case 3:
drawboxa(460,295+25,590,325+20);
break;
}
}
/*清除菜单的选择框*/
void clearmenubox()
{
setcolor(7);
rectangle(460,250,590,255+20);
rectangle(460,260+25,590,290+20);
rectangle(460,295+25,590,325+20);
}
/*画当前所在的菜单条*/
void drawmenucur(int curmenu)
{
switch(curmenu){
case 1:
drawboxt(460,250,590,255+20);
break;
case 2:
drawboxt(460,260+25,590,290+20);
break;
case 3:
drawboxt(460,295+25,590,325+20);
break;
}
}
/*初始化菜单与信息框*/
void printinfbw()
{
Byte *bottomlabel[]={"↑↓←→键—移动 空格键—放棋 ESC键—主菜单"};
Byte *menubar[]={"主菜单","人机大战","双人对战","退出游戏"};
int i;
int size=10;
flag16=open("hzk16",O_RDWR|O_BINARY);
if(flag16==-1){printf("Can not Open HZK16\n");exit(0);}
drawwin(450,110,600,160,INFBKCOLOR);
drawinf();
out16hz(490,215,size,YELLOW,*(menubar+0));
drawwin(450,240,600,356,7);
for(i=1;i<4;i++)
out16hz(475,255+35*(i-1),size,BLUE,*(menubar+i));
drawwin(0,455,639,479,BLUE);
out16hz(15,460,size,WHITE,*(bottomlabel+0));
close(flag16);
}
/******************************************************************************/
/*放棋子*/
void putchess(int r,int c,int color)
{
if(chess[r][c].flag==0)
drawchess(r,c,color);
}
/*开始时自动放的4个棋子*/
void autoput()
{
int t;
randomize();
t=random(6)+1;
initchesstable();
/*6种自动布局*/
switch(t){
case 1:
putchess(4,4,WC);
putchess(4,5,WC);
putchess(5,4,BC);
putchess(5,5,BC);
break;
case 2:
putchess(4,4,BC);
putchess(4,5,BC);
putchess(5,4,WC);
putchess(5,5,WC);
break;
case 3:
putchess(4,4,BC);
putchess(4,5,WC);
putchess(5,4,BC);
putchess(5,5,WC);
break;
case 4:
putchess(4,4,WC);
putchess(4,5,BC);
putchess(5,4,WC);
putchess(5,5,BC);
break;
case 5:
putchess(4,4,WC);
putchess(4,5,BC);
putchess(5,4,BC);
putchess(5,5,WC);
break;
case 6:
putchess(4,4,BC);
putchess(4,5,WC);
putchess(5,4,WC);
putchess(5,5,BC);
}
drawedge(curr,curc,curchess);
wccount=2;bccount=2;
printscore();
}
/*得到按键的代码*/
int specialkey()
{
int key;
while(bioskey(1)==0);
key=bioskey(0);
key=key&0xff?key&0xff:key>>8;
return(key);
}
/*初始化棋盘*/
void initchesstable()
{
int i,j;
for(i=1;i<9;i++)
for(j=1;j<9;j++){
chess[i][j].color=-1;
chess[i][j].flag=0;
}
}
/*当前颜色的棋子是否有地方可以放*/
int canputcurchess()
{
int r,c;
int i,temp=0;
for(r=1;r<=8&&temp==0;r++)
for(c=1;c<=8&&temp==0;c++){
if(chess[r][c].flag==0){
{/*向上找*/
i=1;
while(chess[r-i][c].flag==1&&chess[r-i][c].color!=curchess&&(r-i)>0)i++;
if(i!=1)
if(chess[r-i][c].flag==1&&chess[r-i][c].color==curchess&&(r-i)>0)
temp=1;
}
{/*向左找*/
i=1;
while(chess[r][c-i].flag==1&&chess[r][c-i].color!=curchess&&(c-i)>0)i++;
if(i!=1)
if(chess[r][c-i].flag==1&&chess[r][c-i].color==curchess&&(c-i)>0)
temp=1;
}
{/*向下找*/
i=1;
while(chess[r+i][c].flag==1&&chess[r+i][c].color!=curchess&&(r+i)<9)i++;
if(i!=1)
if(chess[r+i][c].flag==1&&chess[r+i][c].color==curchess&&(r+i)<9)
temp=1;
}
{/*向右找*/
i=1;
while(chess[r][c+i].flag==1&&chess[r][c+i].color!=curchess&&(c+i)<9)i++;
if(i!=1)
if(chess[r][c+i].flag==1&&chess[r][c+i].color==curchess&&(c+i)<9)
temp=1;
}
{/*向左上找*/
i=1;
while(chess[r-i][c-i].flag==1&&chess[r-i][c-i].color!=curchess&&(r-i)>0&&(c-i)>0)i++;
if(i!=1)
if(chess[r-i][c-i].flag==1&&chess[r-i][c-i].color==curchess&&(r-i)>0&&(c-i)>0)
temp=1;
}
{/*向右下找*/
i=1;
while(chess[r+i][c+i].flag==1&&chess[r+i][c+i].color!=curchess&&(r+i)<9&&(c+i)<9)i++;
if(i!=1)
if(chess[r+i][c+i].flag==1&&chess[r+i][c+i].color==curchess&&(r+i)<9&&(c+i)<9)
temp=1;
}
{/*向左下找*/
i=1;
while(chess[r+i][c-i].flag==1&&chess[r+i][c-i].color!=curchess&&(r+i)<9&&(c-i)>0)i++;
if(i!=1)
if(chess[r+i][c-i].flag==1&&chess[r+i][c-i].color==curchess&&(r+i)<9&&(c-i)>0)
temp=1;
}
{/*向右上找*/
i=1;
while(chess[r-i][c+i].flag==1&&chess[r-i][c+i].color!=curchess&&(r-i)>0&&(c+i)<9)i++;
if(i!=1)
if(chess[r-i][c+i].flag==1&&chess[r-i][c+i].color==curchess&&(r-i)>0&&(c+i)<9)
temp=1;
}
}
}
return(temp);
}
/*计算机走棋*/
void computerput()
{
int r,c,i,j,temp=0;
for(r=1;r<=8&&temp==0;r++)
for(c=1;c<=8&&temp==0;c++){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -