正文

五子棋2006-03-18 18:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/11132.html

分享到:

/*******************************************************************************************\      计算机胜时画最后一个子,但人赢时却不画最后的黑子 ???????????      还有智能化需改进      2006.2.16   21:34\********************************************************************************************//* */#include <graphics.h>#include <stdio.h>#include <stdlib.h>#include <bios.h>#include <time.h>#include <math.h>#include <conio.h>#define  PAN_X 120   /*棋盘初始位置,左上角坐标(120,70) */#define  PAN_Y 70#define  MAX    15#define  NN     7   /* 8:趋向防守,7:趋向进攻*/#define  A      1         /*各边代号*/#define  B      2#define  NONE   0 void kongpan();     /*画棋盘  */void baizi();       /*画棋子  */void xiangying();   /*键盘响应*/void init();        /*初始化  */void game();        /*游戏过程*/void load();        /*读取游戏*/int checka(int );  /*检查是否结束*/void save();        /*保存游戏*/int  menu(int x);   /*菜单    */void self();        /*智能化  */ int a[MAX][MAX];      /*棋子状况 0-无 1-白 2-黑*/int stepa=0,stepb=0;       /*各方步数*/int white_x=5,white_y=7;   /*白方光标*/int black_x=7,black_y=7;   /*黑方光标*/int self_control=0;        /*二人对战*/time_t *tim,begin,tim_a,tim_b; main(){    int gdriver=DETECT,gmode ;        /*初始化显示模式*/    registerbgidriver(EGAVGA_driver); /*  bgiobj egavga  / tlib lib\graphics.lib+egavga*/    initgraph(&gdriver,&gmode,"");    cleardevice();    settextstyle(DEFAULT_FONT,HORIZ_DIR,2);    menu(0);} void init()  /*初始化数据*/{    int i,j ;    begin=time(tim);               /* 开始记时时刻 */    for(i=0;i<MAX;i++)    for(j=0;j<MAX;j++) a[i][j]=0 ; /* 清空棋盘 状态 */    stepa=0;stepb=0 ;              /* 下棋步数清零  */    white_x=5;white_y=7 ;          /* 白方初始位置  */    black_x=7;black_y=7 ;          /* 黑方初始位置  */    tim_a=0  ;tim_b=0 ;    game();} void game(){    cleardevice(); /*死循环*/    while(1)    {        kongpan();        baizi();        if (checka(1)) menu(1); /* 只有进入menu才能选择退出循环 */        if (checka(2)) menu(2);        xiangying();    }} /* 菜单 兼报胜负  0-无  2- 黑方胜  1- 白方胜*/int menu(int x){    int key ;    if(x==0)cleardevice();    setcolor(YELLOW);    settextstyle(TRIPLEX_FONT,HORIZ_DIR,6);    switch(x)    {        case  2:  if(self_control==0)outtextxy(40,22,"White Side-^Q^-Winner");                  else outtextxy(40,22,"Computer ^Q^ Winner"); break;        case  1:  outtextxy(40,22,"Black Side-^Q^-Winner");    break;    }    if(x!=0)  {key=bioskey(0); cleardevice();}     setcolor(YELLOW);    settextstyle(GOTHIC_FONT,HORIZ_DIR,8);    outtextxy(70,90,"Five Checkers");    setcolor(GREEN);    settextstyle(GOTHIC_FONT,HORIZ_DIR,2);    outtextxy(150,180,"**************************************");    outtextxy(150,350,"**************************************");    setcolor(GREEN);    settextstyle(GOTHIC_FONT,VERT_DIR,2);    outtextxy(149,188,"********************");    outtextxy(457,188,"********************");    setcolor(GREEN);    settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);    outtextxy(150,370,"Compiled  Chuwenbo in XiAndianzi ");    outtextxy(150,400,"All rights reserved @ 2005.5");    setcolor(MAGENTA);    settextstyle(SMALL_FONT,HORIZ_DIR,8);    outtextxy(170,200,"F1.  Game Start");    outtextxy(170,230,"F2.  V.s. Mode");    outtextxy(170,260,"F3.  Save The Game");    outtextxy(170,290,"F4.  Load The Game");    outtextxy(170,320,"F5.  Exit");    while(1)    {        key=bioskey(0); /* printf("%d",key);     检查键盘码  */        switch(key)        {            case 0x3b00 : self_control=1 ; init();            case 0x3c00 : self_control=0 ; init();            case 0x3d00 : save();            case 0x3e00 : load();            case 0x3f00 : exit(0);        }    }}/* ********************智能化部分********************** */void self( const int tempx,const int tempy ){    int i,j,k,p,m,n,max=0 ;    int b[MAX][MAX],c[MAX][MAX],q_temp ;    for(i=0;i<MAX;i++)for(j=0;j<MAX;j++)  /*在空位(0)上加权为1   */    {        if(a[i][j]==0) b[i][j]=1 ; else b[i][j]=0 ;    }    /*在黑方走子的周围加权为3*/    if(a[tempx-1][tempy]==0)     b[tempx-1][tempy]+=1 ;       /*左*/    if(a[tempx+1][tempy]==0)     b[tempx+1][tempy]+=1 ;       /*右*/    if(a[tempx][tempy+1]==0)     b[tempx][tempy+1]+=1 ;       /*上*/    if(a[tempx][tempy-1]==0)     b[tempx][tempy-1]+=1 ;       /*下*/    if(a[tempx-1][tempy+1]==0)   b[tempx-1][tempy+1]+=1 ;    /*左上*/    if(a[tempx-1][tempy-1]==0)   b[tempx-1][tempy-1]+=1 ;    /*左下*/    if(a[tempx+1][tempy+1]==0)   b[tempx+1][tempy+1]+=1 ;    /*右上*/    if(a[tempx+1][tempy-1]==0)   b[tempx+1][tempy-1]+=1 ;    /*右下*/    for(i=0;i<MAX;i++) for(j=0;j<MAX;j++)  c[i][j]=b[i][j];    /* c[][]用于对白子做类似加权操作 */     /*  此空位a[tempx][tempy]周围为黑子, if( a[m][n]==2 )  b[i][j]++ ;*/    for(i=0;i<MAX;i++) for(j=0;j<MAX;j++)    {        q_temp=0 ; m=i ; n=j ;        while(b[i][j]!=0)              /* 空位 */        {            m--; n--;                        if(m<0||m==MAX||n<0||n==MAX)  /* 范围之外 */            {                if(q_temp>b[i][j]) b[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j]) b[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(b[i][j]>=NN) q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }        m=i ; n=j ;        while(b[i][j]!=0)        {            m++; n++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(b[i][j]>=NN) q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }        m=i ; n=j ; q_temp=0 ;        while(b[i][j]!=0)        {            m++; n--;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(b[i][j]>=NN)q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }        m=i ; n=j ;        while(b[i][j]!=0)        {            m--; n++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(b[i][j]>=NN)q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }        m=i ; n=j ; q_temp=0 ;          while(b[i][j]!=0)      /* 左  */        {            m--;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>b[i][j])b[i][j]=q_temp ;                break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j])b[i][j]=q_temp ;                break ;            }            q_temp+=2 ;            if(b[i][j]>=NN)q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }        m=i ; n=j ;        while(b[i][j]!=0)        {            m++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>b[i][j])b[i][j]=q_temp ;                break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j])b[i][j]=q_temp ;                break ;            }            q_temp+=2 ;            if(b[i][j]>=NN)q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }        m=i ; n=j ; q_temp=0 ;        while(b[i][j]!=0)        {            n++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(b[i][j]>=NN)q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }        m=i ; n=j ;        while(b[i][j]!=0)        {            n--;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==1)            {                if(q_temp>b[i][j])b[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(b[i][j]>=NN)q_temp+=20 ;            if(b[i][j]>=20+NN)q_temp+=9000 ;        }    }        /*白子加权c[i][j]********************  if( a[m][n]==1 )  c[i][j]++ ;*/        for(i=0;i<MAX;i++) for(j=0;j<MAX;j++)    {        m=i ; n=j ; q_temp=0 ;        while(c[i][j]!=0)        {            m--; n--;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN) q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }        m=i ; n=j ;        while(c[i][j]!=0)        {            m++; n++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN)q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }        m=i ;  n=j ; q_temp=0 ;        while(c[i][j]!=0)        {                        m++;  n--;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN)q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }        m=i ; n=j ;        while(c[i][j]!=0)        {            m--; n++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN) q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }        m=i ; n=j ; q_temp=0 ;        while(c[i][j]!=0)   /* 左  */        {            m--;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN)q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }        m=i ; n=j ;        while(c[i][j]!=0)        {            m++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN)q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }        m=i ; n=j ; q_temp=0 ;        while(c[i][j]!=0)        {            n++;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN)q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }        m=i ; n=j ;        while(c[i][j]!=0)        {            n--;            if(m<0||m==MAX||n<0||n==MAX)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            if(a[m][n]==0||a[m][n]==2)            {                if(q_temp>c[i][j])c[i][j]=q_temp ; break ;            }            q_temp+=2 ;            if(q_temp>=NN)  q_temp+=100 ;            if(q_temp>=100+NN)q_temp+=500 ;        }    }    /*白子加权c[i][j]  if( a[m][n]==1 )  c[i][j]++ ;*/        for(i=0;i<MAX;i++)   /*扫描b[][],c[][]找权值最大位的位置(i,j)*/    for(j=0;j<MAX;j++)    {        if(b[i][j]>max) {  max=b[i][j];  white_x=i ; white_y=j ; }        if(c[i][j]>max) {  max=c[i][j];  white_x=i ; white_y=j ; }        if(b[i][j]==max) /* 使尽量棋子向中心靠 */           if( (i-7)*(i-7)+(j-7)*(j-7)<(white_x-7)*(white_x-7)+(white_y-7)*(white_y-7) ){ white_x=i ; white_y=j ;}        if(c[i][j]==max)           if( (i-7)*(i-7)+(j-7)*(j-7)<(white_x-7)*(white_x-7)+(white_y-7)*(white_y-7) ){ white_x=i ; white_y=j ;}    }    a[white_x][white_y]=2 ;/* 计算机为白方 */    stepa = stepa+1 ;    tim_a = time(tim)-begin-tim_b ;    return ;}/* ********************智能化部分********************** */ void save(){    int i,j ;    char fname[13];    char c= 'n';    FILE *fp ;    while(c=='n')    {        setcolor(GREEN);        outtextxy(180,270,"save filename:");        setcolor(YELLOW);        gotoxy(42,19);        scanf("%s",fname);        if((fp=fopen(fname,"r"))!=NULL)        {            gotoxy(50,19);            printf("Overwrite %s y/n?",fname);            c=getche();            if(c=='y')            {                fclose(fp);                fp=fopen(fname,"w");            }        }        else         {            fclose(fp);            fp=fopen(fname,"w");            c='y';        }    }        for(i=0;i<MAX;i++)      for(j=0;j<MAX;j++) fprintf(fp,"%d",a[i][j]);    fprintf(fp,"%d%d",stepa,stepb);    fprintf(fp,"%d%d",white_x,white_y);    fprintf(fp,"%d%d",black_x,black_y);    fprintf(fp,"%d%d",tim_a,tim_b);    fclose(fp);    menu(0);} void load(){    int i,j ;    char fname[13];    FILE *fp ;    setcolor(GREEN);    outtextxy(175,305,"load filename:");    gotoxy(42,21); scanf("%s",fname);    if((fp=fopen(fname,"r"))==NULL)    {        outtextxy(200,100,"File  not found"); getch(); menu(0);    }    for(i=0;i<MAX;i++)       for(j=0;j<MAX;j++)  a[i][j] =(int)(fgetc(fp))-48 ;    stepa = (int)(fgetc(fp))-48 ;   stepb = (int)(fgetc(fp))-48 ;    white_x=(int)(fgetc(fp))-48 ;   white_y=(int)(fgetc(fp))-48 ;    black_x=(int)(fgetc(fp))-48 ;   black_y=(int)(fgetc(fp))-48 ;    tim_a = (int)(fgetc(fp))-48 ;   tim_b = (int)(fgetc(fp))-48 ;    fclose(fp);    game();} int checka(int k)   /* 对整个棋盘状态扫描判断 */{    int i,j,m,n,p,q=0 ;    for(i=0;i<MAX;i++) /* 横竖判满 */    {        q=0 ; p=0 ;        for(j=0;j<MAX;j++)        {            if(a[i][j]==k)    q++;            if(a[j][i]==k)    p++;            if( q>=5||p>=5 )  return k;            if(a[i][j]!=k)    q=0 ;            if(a[j][i]!=k)    p=0 ;        }    }    /*斜判满*/    for(i=0;i<MAX;i++) for(j=0;j<MAX;j++)    {        q=0 ; p=0 ; m=i ; n=j ;        while(a[m][n]==k)        {            q++; m--; n--;            if(m<0||m==MAX||n<0||n==MAX)  break ;  /* 在范围之外 */        }        m=i+1 ; n=j+1 ;        while(a[m][n]==k)        {            q++; m++; n++;            if(m<0||m==MAX||n<0||n==MAX)  break ;        }        m=i ; n=j ;        while(a[m][n]==k)        {            p++; m++; n--;            if(m<0||m==MAX||n<0||n==MAX)  break ;        }        m=i-1 ; n=j+1 ;        while(a[m][n]==k)        {            p++; m--; n++;            if(m<0||m==MAX||n<0||n==MAX)  break ;        }        if(q>=5||p>=5) return k;    }    return 0;} void xiangying(){    int key,i;    char ti[40];    time_t temp ;    while(1)    {        setcolor(RED);        gotoxy(3,MAX);        if(self_control==0)printf("%4d",tim_a);        gotoxy(70,MAX);        printf("%4d",tim_b);        if(stepa<stepb)   /* 白方下子时画白方的头像(左边) */        {            circle(PAN_X-80,PAN_Y+90,28);            arc(PAN_X-60,PAN_Y+70,-50,140,10);                      /* 右耳朵 */            arc(PAN_X-100,PAN_Y+70,40,230,10);                      /* 左耳朵 */            circle(PAN_X-68,PAN_Y+77,6);                            /*  眼睛  */            circle(PAN_X-92,PAN_Y+77,6);            for(i=0;i<8;i++)ellipse(PAN_X-80,PAN_Y+100,0,360,i,i-2);/* 嘴巴  */        }        else        {            circle(PAN_X+445,PAN_Y+90,28);            arc(PAN_X+465,PAN_Y+70,-50,140,10);            arc(PAN_X+425,PAN_Y+70,40,230,10);            circle(PAN_X+457,PAN_Y+77,6);            circle(PAN_X+433,PAN_Y+77,6);            for(i=0;i<8;i++)ellipse(PAN_X+445,PAN_Y+100,0,360,i,i-2);        }        key=bioskey(0); /* printf("%d",key);*/        switch(key)        {            case 0x1177 : white_y=(white_y>0)?--white_y:14 ; return ;            case 0x1f73 : white_y=(white_y<14)?++white_y:0 ; return ;            case 0x1e61 : white_x=(white_x>0)?--white_x:14 ; return ;            case 0x2064 : white_x=(white_x<14)?++white_x:0 ; return ;            case 0x4800 : black_y=(black_y>0)?--black_y:14 ; return ;            case 0x5000 : black_y=(black_y<14)?++black_y:0 ; return ;            case 0x4b00 : black_x=(black_x>0)?--black_x:14 ; return ;            case 0x4d00 : black_x=(black_x<14)?++black_x:0 ; return ;            case 0x3920 :  /* 二人战时 白方用 SPACE 确定,智能化时总是无效 */            if(self_control==1 || stepa>=stepb||a[white_x][white_y]!=0)  return ;            else             {                a[white_x][white_y]=2 ;                stepa=stepa+1 ;                tim_a=time(tim)-begin-tim_b ;                return ;            }            case 0x1c0d : /*  黑方用 ENTER 确定 */            if(stepa<stepb||a[black_x][black_y]!=0) return ; /* 无效着子,直接返回 */            else            /* 黑方无效着子条件:黑方下的步数多,这个位置不是空位,*/            {                a[black_x][black_y]=1 ;                stepb=stepb+1 ;                tim_b=time(tim)-begin-tim_a ;                if(self_control==1) { /* 智能化时计算机着子 */                  if (checka(1)) menu(1);                  if (checka(2)) menu(2);                  self(black_x,black_y);                }                return ;            }            case 0x011b : menu(0);            default : key=bioskey(0);   /*没有按键或者按其它键时*/        }    }} void baizi(){    int i,j,p ;    setcolor(YELLOW);    rectangle((PAN_X+white_x*25)-12,(PAN_Y+12+white_y*25)-24,(PAN_X+white_x*25)+12,(PAN_Y+white_y*25)+12);    setcolor(BLACK);    rectangle((PAN_X+black_x*25)-12,(PAN_Y+12+black_y*25)-24,(PAN_X+black_x*25)+12,(PAN_Y+black_y*25)+12);    for(i=0;i<MAX;i++)      for(j=0;j<MAX;j++)      {         if(a[i][j]==NONE) continue ;         if(a[i][j]==A)         {             setcolor(BLACK);             for(p=0;p<12;p++) circle(PAN_X+i*25,PAN_Y+j*25,p);         }         else          {            setcolor(YELLOW);            for(p=0;p<12;p+=1) circle(PAN_X+i*25,PAN_Y+j*25,p);         }      }} void kongpan(){    int i,j ;    setbkcolor(BLACK);    bar3d(PAN_X-30,PAN_Y-30,PAN_X+380,PAN_Y+380,7,5);    setcolor(RED);    bar3d(PAN_X-120,PAN_Y+30,PAN_X-40,PAN_Y+180,2,1);    bar3d(PAN_X+400,PAN_Y+30,PAN_X+490,PAN_Y+180,2,1);    setpalette(WHITE,2);    setcolor(YELLOW);    for(i=0;i<MAX;i++)    {        line(PAN_X+25*i,PAN_Y,PAN_X+25*i,PAN_Y+350);        line(PAN_X,PAN_Y+25*i,PAN_X+350,PAN_Y+25*i);    }    for(i=0;i<4;i++)    {        circle(PAN_X+175,PAN_Y+175,i);        circle(PAN_X+75,PAN_Y+75,i);        circle(PAN_X+275,PAN_Y+275,i);        circle(PAN_X+75,PAN_Y+275,i);        circle(PAN_X+275,PAN_Y+75,i);    }}

阅读(14216) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册