人机对战五子棋游戏算法

人机对战五子棋游戏算法
20070829 星期三 20:07
此算法计算机会辨别在同一条直线或者对角线上的棋子个数是玩家的多还是计算机的多.若玩家的多,计算机就
会把棋子下到玩家最有可能获胜的位置上,相反如果计算机的多,计算机就会把棋子下到自己最有可能获胜的位
置上.
此函数为自定义函数,表示轮到玩家下棋
工装管理系统
void CFiveChessDlg::computerTurn()
{
      //计算玩家在空格子中的获胜分数
      for(i=0;i<10;i++)
      {  for(j=0;j<10;j++)//
          {    playerGrades[i][j]=0;
              if(2==board[i][j])
              {
                  for(k=0;k<192;k++)
                  {
                      if(playerTable[i][j][k])
                      {
                          switch(chessCount[0][k])
                          {
                          case 1:
                              playerGrades[i][j]+=5;
                              break;
                          case 2:
                              playerGrades[i][j]+=50;
                              break;
                          case 3:
                              playerGrades[i][j]+=100;
                              break;
                          case 4:
                              playerGrades[i][j]+=400;
                              break;
                          }
                      }
                  }
              }
          }
      }
      //计算计算机在空格子中的获胜分数测量空间
      for(i=0;i<10;i++)
      {
          for(j=0;j<10;j++)
          {
              computerGrades[i][j]=0;
              if(2==board[i][j])
              {
                  for(k=0;k<192;k++)
                  {
                      if(computerTable[i][j][k])
                      {
                          switch(chessCount[1][k])
                          {
                          case 1:
                              computerGrades[i][j]+=5;
                              break;
                          case 2:
                              computerGrades[i][j]+=50;
                              break;
                          case 3:
                              computerGrades[i][j]+=100;
                              break;
                          case 4:
                              computerGrades[i][j]+=400;
                              break;
                          }
                      }
                  }
              }
          }
      }
      if(start==true)//游戏开始,计算机第一次下棋时执行
      {
          if(2==board[4][4])
          {
              m=4;
              n=4;
          }
          else
          {
              m=5;
              n=5;
          }
          start=false;
      }
      else
      {
          for(i=0;i<10;i++)
          {
              for(j=0;j<10;j++)
              {
                  if(2==board[i][j])
                  {
                      if(computerGrades[i][j]>=computerTopGrade)
                      {
                          computerTopGrade=computerGrades[i][j];
                          computerTopGradeX=i;
                          computerTopGradeY=j;
                      }
                      if(playerGrades[i][j]>=playerTopGrade)
                      {
                          playerTopGrade=playerGrades[i][j];
                          playerTopGradeX=i;
                          playerTopGradeY=j;
                      }
                  }
              }
          }
          if(computerTopGrade>=playerTopGrade)//攻击,计算机较具优势
          {
              m=computerTopGradeX; //将棋子摆在自己最有可能获胜的位置上进行攻击
              n=computerTopGradeY;
          }
          else
          {
             简易车棚 m=playerTopGradeX;  ///将棋子摆在玩家最有可能获胜的位置上进行防守
              n=playerTopGradeY;
          }
      }
      computerTopGrade=0;
      playerTopGrade=0;
      board[m][n]=1; //设定为计算机的棋子
     粉碎机器人 computerCount++;
      if((50==playerCount)&&(50==computerCount))
      {
          tie=true;
          over=true;
      }
      for(i=0;i<192;i++)
      {
          if(computerTable[m][n][i]&&chessCount[1][i]!=6)
          {
              chessCount[1][i]++;
          }
          if(playerTable[m][n][i])
          {
              playerTable[m][n][i]=false;
              chessCount[0][i]=6;
          }
      }
      player=true;
      computer=false;
}

OnTimer函数用来没间隔一段时间执行的函数,程序每间隔一段时间来判断是轮到计算机下棋还是玩家下棋,
然后贴上相应的棋子
void CFiveChessDlg::OnTimer(UINT nIDEvent)
{
      // TODO: Add your message handler code here and/or call default
      if(!over)
      {
          if(computer)
              computerTurn();
          for(i=0;i<=1;i++)
          {
              for(j=0;j<192;j++)
              {
                  if(5==chessCount[i][j]) //判断任一方在任意一个获胜组合中是否有
5个棋子
                  {
                      if(0==i)
                      {
                          playerWin=true;
                          over=true;
                          break;
                      }
                      else
                      {
                          computerWin=true;气胀式救生衣
                          over=true;
                          break;
                      }
                  }
                  if(over)
                      break;
              }
          }
      }
       
      GetDlgItem(IDC_TIPSTATIC)->SetWindowText("小样,该你下了......");//没有任一方获胜

      for(i=0;i<10;i++)
      {
          for(j=0;j<10;j++)
          {
              if(0==board[i][j])        //贴上玩家棋子
              {
                  BITMAP bm;
                  CDC dcMem;
                  CDC* pDC;
                  CBitmap *pGreenBmp;
                  CBitmap *pOldBitmap;
                  pDC=GetDC();
                 pGreenBmp=new CBitmap;
                  pGreenBmp->LoadBitmap(IDB_GREENBMP);
                  pGreenBmp->GetObject(sizeof(BITMAP),(LPVOID)&bm);
                  dcMem.CreateCompatibleDC(pDC);                               
                  pOldBitmap=dcMem.SelectObject(pGreenBmp);   
   
                  pDC->BitBlt(i*50+13,j*50+13,46,46,&dcMem,0,0,SRCCOPY);
                  delete pDC->SelectObject(pOldBitmap);
              }
              if(1==board[i][j])        //贴上计算机棋子
              {
                  BITMAP bm1;
                  CDC dcMem1;
                  CDC* pDC1;
                  CBitmap *pPurpleBmp;
                  CBitmap *pOldBitmap1;
                  pDC1=GetDC();
                  pPurpleBmp=new CBitmap;
   
                  pPurpleBmp->LoadBitmap(IDB_PURPLEBMP);
                  pPurpleBmp->GetObject(sizeof(BITMAP),(LPVOID)&bm1);
                  dcMem1.CreateCompatibleDC(pDC1);                               
                  pOldBitmap1=dcMem1.SelectObject(pPurpleBmp);   
   
号码池                  pDC1->BitBlt(i*50+13,j*50+13,46,46,&dcMem1,0,0,SRCCOPY);
                  delete pDC1->SelectObject(pOldBitmap1);
              }
          }
      }

      if(playerWin)
          GetDlgItem(IDC_TIPSTATIC)->SetWindowText("不错啊,你居然赢了,恭喜恭喜!");
      if(computerWin)
          GetDlgItem(IDC_TIPSTATIC)->SetWindowText("哎!你这倒霉孩子,可怜哦,输了!");
      if(tie)
          GetDlgItem(IDC_TIPSTATIC)->SetWindowText("功夫相当,平分秋!");

      CDialog::OnTimer(nIDEvent);
}

本文发布于:2024-09-22 09:42:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/203724.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:计算机   获胜   玩家   棋子   下棋   可能
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议