?? bwchess.c
字號:
curr=r;curc=c;
if(canputchess(curr,curc)==1){
temp=1;
putchess(curr,curc,curchess);
drawedge(curr,curc,curchess);
wccount=0;bccount=0;
for(i=1;i<9;i++)
for(j=1;j<9;j++)
if(chess[i][j].flag==1){
if(chess[i][j].color==WC)wccount++;
else bccount++;
}
printscore();
}
}
if(temp==0)
if(curchess==WC)curchess=BC;
else curchess=WC;
}
/*可不可以放棋,0:不可放,1:可放*/
int canputchess(int r,int c)
{
int temp;
int tr,tc;
int i,j;
temp=0;
if(chess[r][c].flag==1)return(temp);/*此處有棋了*/
else{/*此處尚未有棋*/
{/*向上找*/
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;
for(j=r;j>=r-i;j--)
drawchessonly(j,c,curchess);
}
}
}
{/*向左找*/
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;
for(j=c;j>=c-i;j--)
drawchessonly(r,j,curchess);
}
}
}
{/*向下找*/
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;
for(j=r;j<=r+i;j++)
drawchessonly(j,c,curchess);
}
}
}
{/*向右找*/
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;
for(j=c;j<=c+i;j++)
drawchessonly(r,j,curchess);
}
}
}
{/*向左上找*/
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;
tr=r;tc=c;
while(tr>=r-i&&tc>=c-i)
drawchessonly(tr--,tc--,curchess);
}
}
}
{/*向右下找*/
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;
tr=r;tc=c;
while(tr<=r+i&&tc<=c+i)
drawchessonly(tr++,tc++,curchess);
}
}
}
{/*向左下找*/
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;
tr=r;tc=c;
while(tr<=r+i&&tc>=c-i)
drawchessonly(tr++,tc--,curchess);
}
}
}
{/*向右上找*/
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;
tr=r;tc=c;
while(tr>=r-i&&tc<=c+i)
drawchessonly(tr--,tc++,curchess);
}
}
}
return(temp);
}
}
/*若已經無法下子了,則自動下棋*/
void autochess()
{
int r,c,i,j,temp=0;
if(curchess==WC)curchess=BC;
else curchess=WC;
if(canputcurchess()==1)
drawedge(curr,curc,curchess);
else{
if(curchess==WC)curchess=BC;
else curchess=WC;
for(r=1;r<=8&&temp==0;r++)
for(c=1;c<=8&&temp==0;c++)
if(chess[r][c].flag==0){
putchess(r,c,curchess);
drawedge(r,c,curchess);
wccount=0;bccount=0;
for(i=1;i<9;i++)
for(j=1;j<9;j++)
if(chess[i][j].flag==1){
if(chess[i][j].color==WC)wccount++;
else bccount++;
}
printscore();
temp=1;
}
}
}
/*下棋等待按鍵*/
void waitkey()
{
int temp,i,j;
while((curkey=specialkey())!=ESC)
switch(curkey){
case UP:
drawedge(curr,curc,TABLECOLOR);
if(curr==1)curr=8;
else curr--;
drawedge(curr,curc,curchess);
break;
case DOWN:
drawedge(curr,curc,TABLECOLOR);
if(curr==8)curr=1;
else curr++;
drawedge(curr,curc,curchess);
break;
case LEFT:
drawedge(curr,curc,TABLECOLOR);
if(curc==1)curc=8;
else curc--;
drawedge(curr,curc,curchess);
break;
case RIGHT:
drawedge(curr,curc,TABLECOLOR);
if(curc==8)curc=1;
else curc++;
drawedge(curr,curc,curchess);
break;
case SPACE:/*放子*/
if(canputchess(curr,curc)==1){
putchess(curr,curc,curchess);
if(ptocflag==0) drawedge(curr,curc,curchess);
wccount=0;bccount=0;
for(i=1;i<9;i++)
for(j=1;j<9;j++)
if(chess[i][j].flag==1){
if(chess[i][j].color==WC)wccount++;
else bccount++;
}
printscore();
if(ptocflag==1){
drawedge(curr,curc,TABLECOLOR);
computerput();
}
if(canputcurchess()==0&&ptocflag==0)/*當前顏色的棋子沒地方放了*/
autochess();
if(wccount+bccount>=TOTALCHESS)
callend();
}else printf("\7");/*報警*/
break;
}
callend();
menuselect();
}
/*比賽結束,給出結果*/
void callend()
{
int tx=430,ty=390;
Byte *result[]={"比賽結果:","黑棋勝","白棋勝","平局"};
int size=10;
flag16=open("hzk16",O_RDWR|O_BINARY);
if(flag16==-1){printf("Can not Open HZK16\n");exit(0);}
out16hz(tx,ty,size,LIGHTBLUE,*(result+0));
if(wccount==bccount) out16hz(tx+130,ty,size,WHITE,*(result+3));
if(wccount>bccount) out16hz(tx+130,ty,size,WHITE,*(result+2));
if(wccount<bccount) out16hz(tx+130,ty,size,WHITE,*(result+1));
close(flag16);
menuselect();
}
/*顯示16點陣漢字*/
int out16hz(int x,int y,int z,int color ,char *p)
{
Word num,QM,WM,flag=0;
int record,i,j,k;
long pointer;
char Bit[32];
while((num=*p++)!=0)
{
if (num>0xa1)
if(flag==0){
QM=(num-0xa1)&0x07f;
flag=1;
}
else{
WM=(num-0xa1)&0x07f;
flag=0;
record=QM*94+WM;
pointer=record*32L;
lseek(flag16,pointer,SEEK_SET);
read(flag16,Bit,32);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if (convert(Bit[i*2+j],7-k))
putpixel(x+j*8+k,y+i,color);
x=x+z+16;
}
}
}
/*位轉換*/
int convert(Byte ch,int n)
{
return((ch>>n)&0x01);
}
/*菜單選擇*/
void menuselect()
{
int ck;
clearmenubox();
drawmenucur(curmenunum);
while(ck=specialkey())
switch(ck){
case UP:
clearmenubox();
if(curmenunum==1)curmenunum=3;
else curmenunum--;
drawmenucur(curmenunum);
break;
case DOWN:
clearmenubox();
if(curmenunum==3)curmenunum=1;
else curmenunum++;
drawmenucur(curmenunum);
break;
case ENTER:
selectmenunum=curmenunum;
clearmenubox();
drawmenuselect(selectmenunum);
drawbox(420,380,630,420,BLACK);
switch(selectmenunum){
case 1:/*人機大戰*/
ptocflag=1;
ptoc();
break;
case 2:/*二人對戰*/
ptocflag=0;
ptop();
break;
case 3:/*退出*/
exit(0);
}
}
}
/*二人對戰*/
void ptop()
{
resettable();
printinfbw();
autoput();
drawmenuselect(selectmenunum);
waitkey();
}
/*人機大戰*/
void ptoc()
{
ptop();
}
/*重新下棋*/
void resettable()
{
wccount=0;bccount=0;
setcolor(YELLOW);
drawtable(tablex0,tabley0);
}
/******************************************************************************/
/*主程序*/
main()
{
int driver,mode;
int tdet,titlex,titley;
int authorx,authory;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
/*初始化*/
setbkcolor(BKCOLOR);
tdet=150;
titlex=50;titley=20;
/*顯示標題信息*/
drawmat(titleh,64,titlex,titley,YELLOW);
drawmat(titleb,64,titlex+tdet,titley,YELLOW);
drawmat(titleq,64,titlex+tdet*2,titley,YELLOW);
authorx=450;authory=60;
drawmat(author1,24,authorx,authory,LIGHTBLUE);
drawmat(author2,24,authorx+24,authory,LIGHTBLUE);
drawmat(author3,24,authorx+24*2,authory,LIGHTBLUE);
drawmat(authorn1,24,authorx+24*3,authory,WHITE);
drawmat(authorn2,24,authorx+24*3+24,authory,WHITE);
drawmat(authorn3,24,authorx+24*3+24*2,authory,WHITE);
tablex0=70;tabley0=110;/*棋盤的左上角坐標*/
printinfbw();/*初始化菜單與信息框*/
printscore();/* 顯示當前黑白棋的個數分另為多少 */
resettable();/* 重置棋盤 */
menuselect();/* 菜單選擇 */
closegraph();
}
/******************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -