`
ye_haiqiang
  • 浏览: 88400 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

黑白棋(人人对战、简单的人机对战)

 
阅读更多

最近期末测评的题目(实现黑白棋算法)具体实现代码如下:

#include "graphics.h" /*图形系统头文件*/
#define LEFT 0x4b00 /*光标左键值*/
#define RIGHT 0x4d00 /*光标右键值*/
#define DOWN 0x5000 /*光标下键值*/
#define UP 0x4800 /*光标上键值*/
#define ESC 0x011b /* ESC键值*/
#define ENTER 0x1c0d /* 回车键值*/
/*============================*/
/*      全局变量声明          */
/*============================*/
int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/
char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/
int startx=120,starty=80;
/*============================*/
/*      函数声明              */
/*============================*/
void DrawQp(void);/*画棋盘函数*/
void playtoplay();/*人人对战*/
void resetColor(int x,int y);/*清楚移动后的痕迹*/
void setQzColor(int t);/*设置棋子颜色*/
void playtocomputer();/*人机对战*/
void menu();/*菜单*/
void countScore();/*处理分数*/
void printScore(int playnum);/*输出成绩*/
void playWin();/*输出最后的胜利者结果*/
/*============================*/
/*              主函数        */
/*============================*/
void main(void)
{
    int gd=DETECT,gr;
    initgraph(&gd,&gr,"c:\\tc"); /*初始化图形系统*/
    menu();
    getch();
    closegraph();/*关闭图形系统*/
}
/*=============================================*/
/*               初始化棋盘                    */
/*
    系统函数说明
    画线函数:line()
    设置背景颜色:setbkcolor()
    填充模式:setfillstyle()
    椭圆显示位置以及大小:fillellipse()         */
/*                                              */
/*  15:白色     8:黑色                          */
/*==============================================*/
void DrawQp()
{
   int i,j;
   /*棋手一开始得分都为0*/
   setfillstyle(SOLID_FILL,BLUE);
   bar(120,80,420,420);
   score1=0;
   score2=0;
   setbkcolor(BLUE);
   setcolor(15);
   for(i=100;i<=420;i+=40)
   {
      line(100,i,420,i);/*画水平线*/
      line(i,100,i,420); /*画垂直线*/
   }
   setcolor(0);/*取消圆周围的白圈*/
   setfillstyle(SOLID_FILL,15);/*白色实体填充模式,SOLID_FILL为填满*/
   fillellipse(500,200,15,15); /*在显示得分的位置画棋*/

   setfillstyle(SOLID_FILL,8); /*黑色实体填充模式*/
   fillellipse(500,300,15,15);

   /*棋盘初始化位置*/
   a[3][3]=a[4][4]=1;/*初始两个黑棋*/
   a[3][4]=a[4][3]=2;/*初始两个白棋*/

   setfillstyle(SOLID_FILL,15);
   fillellipse(120+3*40,120+3*40,15,15);
   fillellipse(120+4*40,120+4*40,15,15);
   setfillstyle(SOLID_FILL,8);
   fillellipse(120+3*40,120+4*40,15,15);
   fillellipse(120+4*40,120+3*40,15,15);
   score1=score2=2;
   /*有棋后改变分数*/
   countScore();

}
/*==============================================*/
/*
    函数说明:人人对战
                                                */
/*==============================================*/
void playtoplay()
{
   int x,y,t=1,i,j,cc=0;
   while(1)
   {
        x=120,y=80;/*棋子初始坐标,x为行坐标,y为列坐标*/
        while(1)
        {
            printScore(1);/*输出棋手1的成绩*/
            printScore(2);/*输出棋手2的成绩*/
            setQzColor(t);
            fillellipse(x,y,15,15);/*棋子位置*/
            key=bioskey(0);/*接收按键*/
            if(key==ESC)
            {
                break;/*跳出循环,结束游戏*/
            }
            else if(key==ENTER)/*放下棋子*/
            {
                if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2)/*判断棋盘上有否有棋子*/
                {
                    if(t%2==1)
                    {
                        a[(x-120)/40][(y-120)/40]=1;
                        if(!changeQzColor(x,y,t))/*落子后判断棋盘的变化*/
                        {
                            a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/
                            cc++;/*开始统计尝试次数*/
                            if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/
                            {
                                resetColor(x,y);
                                fillellipse(x,y,15,15);
                                break;
                            }
                            else
                            {
                                continue;/*如果按键无效*/
                            }
                        }

                    }
                    else
                    {
                        a[(x-120)/40][(y-120)/40]=2;
                        if(!changeQzColor(x,y,t))/*落子后判断棋盘的变化*/
                        {
                            a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/
                            cc++;/*开始统计尝试次数*/
                            if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/
                            {
                                resetColor(x,y);
                                fillellipse(x,y,15,15);
                                break;
                            }
                            else
                            {
                                continue;/*如果按键无效*/
                            }
                        }
   
                    }
                    countScore();
                    break;
                }
                else
                {
                    continue;/*存在棋子继续循环*/
                }
            }
            else if(key==LEFT&&x>120)/*左按键*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                x=x-40;
                fillellipse(x,y,15,15);
            }
            else if(key==RIGHT&&x<400&&y>80)/*右*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                x=x+40;
                fillellipse(x,y,15,15);
            }
            else if(key==UP&&y>120)/*上*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                y=y-40;
                fillellipse(x,y,15,15);
            }
            else if(key==DOWN&&y<400)/*下*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                y=y+40;
                fillellipse(x,y,15,15);
            }
        }
        if(key==ESC)
        {
            break;
        }
        if((score1+score2)==64||score1==0||score2==0)
        {
            playWin();/*输出最后结果*/
            break;
        }
        t=t%2+1;/*换棋手*/
        cc=0;

   }
}
/*==============================================*/
/*
    函数功能:清楚移动后的痕迹
    参数:x为行坐标,y为列坐标
                                                */
/*==============================================*/
void resetColor(int x,int y)
{
    if(y<100)
    {
        setfillstyle(SOLID_FILL,BLUE);
    }
    else
    {
        if(a[(x-120)/40][(y-120)/40]==1)
        {
            setfillstyle(SOLID_FILL,15);
        }
        else if(a[(x-120)/40][(y-120)/40]==2)
        {
            setfillstyle(SOLID_FILL,8);
        }
        else
        {
            setfillstyle(SOLID_FILL,BLUE);
        }
    }
}
/*==============================================*/
/*
    函数功能:设置棋子颜色
    参数:t 为玩家
                                                */
/*==============================================*/
void setQzColor(int t)
{
    if(t%2==1)
    {
        setfillstyle(SOLID_FILL,15); /*白色*/
    }
    else
    {
        setfillstyle(SOLID_FILL,8);/*黑色*/
    }
}
/*==============================================*/
/*函数功能:8个方位的判断
    参数:x,y:棋子坐标,t: 棋手
*/
/*==============================================*/
int changeQzColor(int x,int y,int t)/*判断棋盘的变化*/
{
   int i,j,k,kk,ii,jj,yes;
   yes=0;
   i=(x-120)/40; /*计算数组元素的行下标*/
   j=(y-120)/40; /*计算数组元素的列下标*/
   setQzColor(t);/*设置棋子变化的颜色*/
   /*开始往8个方向判断变化*/
   if(j<6)/*往右边*/
   {
        for(k=j+1;k<8;k++)
        {
            if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/
            {
                break;
            }
        }
        if(a[i][k]!=0&&k<8)
        {
            for(kk=j+1;kk<k&&k<8;kk++)/*判断右边*/
            {
                a[i][kk]=a[i][j]; /*改变棋子颜色*/
                fillellipse(120+i*40,120+kk*40,15,15);
            }
            if(kk!=j+1) /*条件成立则有棋子改变过颜色*/
            {
                yes=1;
            }
        }
   }
   if(j>1)/*判断左边*/
   {
      for(k=j-1;k>=0;k--)
      {
        if(a[i][k]==a[i][j]||!a[i][k])
        {
            break;
        }
      }
      if(a[i][k]!=0&&k>=0)
      {
        for(kk=j-1;kk>k&&k>=0;kk--)
        {
            a[i][kk]=a[i][j];
            fillellipse(120+i*40,120+kk*40,15,15);
        }
        if(kk!=j-1)
        {
            yes=1;
        }
      }
   }
   if(i<6)/*判断下边*/
   {
      for(k=i+1;k<8;k++)
      {
        if(a[k][j]==a[i][j]||!a[k][j])
        {
            break;
        }
      }
      if(a[k][j]!=0&&k<8)
      {
        for(kk=i+1;kk<k&&k<8;kk++)
        {
            a[kk][j]=a[i][j];
            fillellipse(120+kk*40,120+j*40,15,15);
        }
        if(kk!=i+1)
        {
            yes=1;
        }
      }
    }
    if(i>1)/*判断上边*/
    {
      for(k=i-1;k>=0;k--)
      {
        if(a[k][j]==a[i][j]||!a[k][j])
        {
            break;
        }
      }
      if(a[k][j]!=0&&k>=0)
      {
        for(kk=i-1;kk>k&&k>=0;kk--)
        {
            a[kk][j]=a[i][j];
            fillellipse(120+kk*40,120+j*40,15,15);
        }
        if(kk!=i-1)
        {
            yes=1;
        }
      }
   }
   if(i>1&&j<6)/*右上*/
   {
      for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
      {
        if(a[k][kk]==a[i][j]||!a[k][kk])
         {
            break;
         }
      }
      if(a[k][kk]&&k>=0&&kk<8)
      {
        for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
        {
            a[ii][jj]=a[i][j];
            fillellipse(120+ii*40,120+jj*40,15,15);
        }
        if(ii!=i-1)
        {
            yes=1;
        }
      }
   }
   if(i<6&&j>1)/*左下*/
   {
      for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--) 
      {
        if(a[k][kk]==a[i][j]||!a[k][kk])
            break;
      }
      if(a[k][kk]!=0&&k<8&&kk>=0)
      {
        for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)
        {
            a[ii][jj]=a[i][j];
            fillellipse(120+ii*40,120+jj*40,15,15);
        }
        if(ii!=i+1)
        {
            yes=1;
        }
      }
   }
   if(i>1&&j>1)/*左上*/
   {
      for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
      {
        if(a[k][kk]==a[i][j]||!a[k][kk])
        {
            break;
        }
      }
      if(a[k][kk]!=0&&k>=0&&kk>=0)
      {
        for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
        {
            a[ii][jj]=a[i][j];
            fillellipse(120+ii*40,120+jj*40,15,15);
        }
        if(ii!=i-1)
        {
            yes=1;
        }
      }
   } 
   if(i<6&&j<6)/* 右下*/
   {
      for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
      {
        if(a[k][kk]==a[i][j]||!a[k][kk])
        {
            break;
        }
      }
      if(a[k][kk]!=0&&kk<8&&k<8)
      {
        for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)
        {
            a[ii][jj]=a[i][j];
            fillellipse(120+ii*40,120+jj*40,15,15);
        }
        if(ii!=i+1)
        {
            yes=1;
        }
      }
   }
   return yes;/*返回是否改变过棋子颜色的标记*/
}
void countScore()/*处理分数*/
{
   int i,j;
   score1=score2=0;/*重新开始计分数*/
   for(i=0;i<8;i++)
      for(j=0;j<8;j++)
        if(a[i][j]==1)/*分别统计两个人的分数*/
            score1++;
        else if(a[i][j]==2)
            score2++;
}
void printScore(int playnum)/*输出成绩*/
{
   if(playnum==1)/*清除以前的成绩*/
   {
      setfillstyle(SOLID_FILL,BLUE);
      bar(550,100,640,400);
   }
   setcolor(RED);
   settextstyle(0,0,4);/*设置文本输出样式*/
   if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/
   {
      sprintf(playone,"%d",score1);
      outtextxy(550,200,playone);


   }
   else
   {
      sprintf(playtwo,"%d",score2);
      outtextxy(550,300,playtwo);

   }
   setcolor(0);
}
/*人机交互*/
void playtocomputer()
{
    int x,y,t=1,i,j,cc=0;
    while(1)
    {
        x=120,y=80;/*棋子初始坐标,x为行坐标,y为列坐标*/
        while(1)
        {
            printScore(1);/*输出棋手1的成绩*/
            printScore(2);/*输出棋手2的成绩*/
            setfillstyle(SOLID_FILL,15); /*白色*/
            fillellipse(x,y,15,15);/*棋子位置*/
            key=bioskey(0);/*接收按键*/
            if(key==ESC)
            {
                break;/*跳出循环,结束游戏*/
            }
            else if(key==ENTER)/*放下棋子*/
            {
                if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2)/*判断棋盘上有否有棋子*/
                {
                    a[(x-120)/40][(y-120)/40]=1;
                    if(!changeQzColor(x,y,t))/*落子后判断棋盘的变化*/
                    {
                        a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/
                        cc++;/*开始统计尝试次数*/
                        if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/
                        {
                            resetColor(x,y);
                            fillellipse(x,y,15,15);
                            break;
                        }
                        else
                        {
                            continue;/*如果按键无效*/
                        }
                    }
                     for(i=0;i<8;i++)
                     {
                        for(j=0;j<8;j++)
                        {
                            if(a[i][j]!=1&&a[i][j]!=2)
                            {
                                a[i][j]=2;
                                if(changeQzColor(120+i*40,120+j*40,2))
                                {

                                    resetColor(120+i*40,120+j*40);
                                    fillellipse(120+i*40,120+j*40,15,15);
                                    break;
                                }
                                else
                                {   a[i][j]=0;
                                    resetColor(120+i*40,120+j*40);
                                    fillellipse(120+i*40,120+j*40,15,15);
                                    continue;
                                }
                            }
                            else
                            {
                                continue;
                            }
                        }
                        if(j!=8)
                        {
                          break;
                        }
                     }
                     countScore();
                    break;

                }
                else
                {
                    continue;/*存在棋子继续循环*/
                }
            }
            else if(key==LEFT&&x>120)/*左按键*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                x=x-40;
                fillellipse(x,y,15,15);
            }
            else if(key==RIGHT&&x<400&&y>80)/*右*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                x=x+40;
                fillellipse(x,y,15,15);
            }
            else if(key==UP&&y>120)/*上*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                y=y-40;
                fillellipse(x,y,15,15);
            }
            else if(key==DOWN&&y<400)/*下*/
            {
                resetColor(x,y);
                fillellipse(x,y,15,15);/*棋子位置*/
                setQzColor(t);
                y=y+40;
                fillellipse(x,y,15,15);
            }
        }

        if(key==ESC)
        {
            break;
        }
        if((score1+score2)==64||score1==0||score2==0)
        {
            playWin();/*输出最后结果*/
            break;
        }
   }
}
void playWin()/*输出最后的胜利者结果*/
{
    settextstyle(0,0,4);
   setcolor(12);
   if(score2>score1)/*开始判断最后的结果*/
      outtextxy(100,200,"black win!");
   else if(score2<score1)
   {
      outtextxy(100,200,"white win!");
   }
   else
   {
     outtextxy(60,200,"you all win!");
   }

}
void menu()
{
    int x1=201,x2=349,y1=161,y2=199;
    int key1;
    int flag=1;
    while(1)
    {
        setbkcolor(BLUE);

        settextstyle(0,0,2);/*设置文本输出样式*/
        setcolor(15);
        outtextxy(50,50,"Welcome to play Black white Games");
        setcolor(0);
        setfillstyle(SOLID_FILL,15);
        bar(200,160,350,200);
        bar(200,210,350,250);
        bar(200,260,350,300);
        setcolor(RED);
        settextstyle(0,0,1);/*设置文本输出样式*/
        outtextxy(250,180,"PlayOne");
        outtextxy(250,220,"PlayTwo");
        outtextxy(250,280,"EXIT");


        setfillstyle(SOLID_FILL,BLUE);
        bar(x1,y1,x2,y2);
        settextstyle(0,0,1);/*设置文本输出样式*/
        outtextxy(250,180,"PlayOne");
        outtextxy(250,220,"PlayTwo");
        outtextxy(250,280,"EXIT");
        key1=bioskey(0);/*接收按键*/

        if(key1==DOWN)
        {
            if(y1==261 || y2==299)
            {
                y1=161;
                y2=199;
            }
            else
            {
                y1+=50;
                y2+=50;
            }

        }
        else if(key1==UP)
        {
            if(y1==161 || y2==199)
            {
                y1=261;
                y2=299;
            }
            else
            {
                y1-=50;
                y2-=50;
            }

        }
        else if(key1==ESC)
        {

            break;
        }
        if(key1==ENTER)
        {


            if(y1==161 && y2==199)
            {
                DrawQp();
                playtocomputer();break;
            }
            else if(y1==211 && y2==249)
            {
                DrawQp();
                playtoplay();break;
            }
            else
            {
               break;
            }
            break;
        }

    }
    setcolor(0);
}

 

 

请大家多多指教~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics