美文网首页
C++五子棋(六&七)——游戏结束

C++五子棋(六&七)——游戏结束

作者: 无聊的CairBin | 来源:发表于2021-07-15 21:44 被阅读0次

规则原理

如图

1 2 3 4 5

判断游戏结束

  • chessData.h
//row,col   表示当前落子
bool checkWin(ChessData* game, int row, int col);
  • 横、竖、斜(斜有两种)共四种情况,每种情况根据当前落子往后遍历5个子,有一种符合就胜利
  • chessData.cpp
bool checkWin(ChessData* game, int row, int col){
  //横
  for(int i = 0; i < 5; i++){
    if(col - i >= 0 &&
      col - i + 4 < BOARD_GRAD_SIZE &&
      game->chessMap[row][col-i] == game->chessMap[row][col-i+1] &&
      game->chessMap[row][col-i] == game->chessMap[row][col-i+2] &&
      game->chessMap[row][col-i] == game->chessMap[row][col-i+3] &&
      game->chessMap[row][col-i] == game->chessMap[row][col-i+4]){return true;}
  }
  
  //竖
  for(int i = 0; i < 5; i++){
    if(row - i >= 0 &&
      row - i + 4 < BOARD_GRAD_SIZE &&
      game->chessMap[row-i][col] == game->chessMap[row-i+1][col] &&
      game->chessMap[row-i][col] == game->chessMap[row-i+2][col] &&
      game->chessMap[row-i][col] == game->chessMap[row-i+3][col] &&
      game->chessMap[row-i][col] == game->chessMap[row-i+4][col]){return true;}
  }
  
  // “/”方向
  for(int i = 0; i < 5; i++){
    if(row + i < BOARD_GRAD_SIZE &&
       row + i - 4 >= 0 &&
       col - i >= 0 &&
       col - i + 4 < BOARD_GRAD_SIZE &&
      game->chessMap[row+i][col-i] == game->chessMap[row+i-1][col-i+1] &&
      game->chessMap[row+i][col-i] == game->chessMap[row+i-2][col-i+2] &&
      game->chessMap[row+i][col-i] == game->chessMap[row+i-3][col-i+3] &&
      game->chessMap[row+i][col-i] == game->chessMap[row+i-4][col-i+4]){return true;}
  }
  
  // “\”方向
  for(int i = 0; i < 5; i++){
    if(row - i >= 0 &&
       row - i - 4 < BOARD_GRAD_SIZE &&
       col - i >= 0 &&
       col - i + 4 < BOARD_GRAD_SIZE &&
      game->chessMap[row-i][col-i] == game->chessMap[row-i+1][col-i+1] &&
      game->chessMap[row-i][col-i] == game->chessMap[row-i+2][col-i+2] &&
      game->chessMap[row-i][col-i] == game->chessMap[row-i+3][col-i+3] &&
      game->chessMap[row-i][col-i] == game->chessMap[row-i+4][col-i+4]){return true;}
  }
  
  return false;
  
}

调用接口

  • main.cpp
#include <stdio.h>
bool checkOver(){
  if(checkWin(&game, clickPosRow, clickPosCol)){
    Sleep(1500);
    if(game.playFlag = false){
      //黑棋胜利,此时标记已经转为白棋落子
      mciSendString("play res/不错.mp3", 0, 0, 0);
      loadimage(0, "res/胜利.jpg");
      score += 100; //更新分数
    }else{
      mciSendString("play res/失败.mp3", 0, 0, 0);
      loadimage(0, "res/失败.jpg");
      score -= 100; //同理
    }
    
    
    //用于显示分数
    char scoreText[64];
    sprintf(scoreText, "当前分数:%d", score);
    outtextxy(310, 800, scoreText);
    
    //记录分数
    FILE* fp = fopen("score.data", "wb");
    fwrite(&score, sizeof(score), 1, fp);
    fclose(fp);
    
    
    getch();
    return true;
    
  }
  
  return false;
  
}

显示分数

  • main.cpp
#define INIT_SCORE 1000
int score; //全局变量
void initScore(){
  //分数字体设置
  settextcolor(WHITE); //color
  settextstyle(50, 0, "微软雅黑");  //style
  
  FILE *fp = fopen("score.data", "rb");
  if(fp == NULL){
    score = INIT_SCORE;
  }else{
    fread(&score, sizeof(score), 1, fp);
  }
  if (fp)fclose(fp);
  
}
  • 然后在main.cpp文件的 init() 函数定义中 继续 添加代码
initScore();    //这一行添加到init()函数定义中

main函数

  • main.cpp 代码如下
int main(void){
  init();
  
  while(1){
    //一直检测鼠标点击
    MOUSEMSG msg == GetMouseMsg();
    if(msg.uMsg == WM_LBUTTONDOWN){
      manGo();
      if(checkOver()){
        init();
        continue;
      }
      
      AI_GO();
      if(checkOver()){
        init();
        continue;
      }
      
    }
    
  }
  
  closegraph();
  return 0;
  
}

结束

到了这里我们的项目就结束了,这篇文章是我个人博客的那两篇文章合并版本,少了项目总结和个人开发感受(我认为这方面不大重要),如果想要看这部分内容可以访问我的个人博客

相关文章

网友评论

      本文标题:C++五子棋(六&七)——游戏结束

      本文链接:https://www.haomeiwen.com/subject/qtwmpltx.html