?? 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)
/*依次:字模指針、點陣大小、起始坐標(biāo)(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);
}
/*打印分?jǐn)?shù)*/
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);
}
/*畫當(dāng)前所在的菜單條*/
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[]={"主菜單","人機大戰(zhàn)","雙人對戰(zhàn)","退出游戲"};
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;
}
}
/*當(dāng)前顏色的棋子是否有地方可以放*/
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++){
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -