⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bwchess.c

📁 C语言版本的智能黑白对战
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -