日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++五子棋(四)——走棋原理及权值计算

發布時間:2025/3/21 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++五子棋(四)——走棋原理及权值计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原理

計算

  • 計算每個落子點的**“權值”**,找到權值最大的落子點
  • 對于每個空白點,分別計算周圍的八個方向
  • 不妨以該空白點作為參照原點,以水平向右作為X軸正方向,以豎直向下Y軸正方向建立平面直角坐標系
  • 因為在計算某個方向時,正向和反向需同時考慮,實際上只需要四個方向,即向量(1,0)的方向向量(1,1)方向向量(0,1)方向向量(-1,1)方向,圖示如下(靈魂畫圖,請勿吐槽 滑稽)

走棋原理

產生效果

  • 黑棋走這個點
產生效果評分
連210
死330
活340
死460
活4200
連520000

  • 如果白棋(AI)走這個點
產生效果評分
連15
連210
死325
活350
死455
活4300
連530000

權值計算

  • chessData.h
void calcScore(ChessData* data);
  • chessData.cpp
#include <string> void calcScore(ChessData* data){if(!data) return;//統計玩家或AI連子int personNum = 0; //玩家int botNum = 0; //AIint emptyNum = 0; //各方向空白位數//清空評分數組memset(data->scoreMap, 0, sizeof(data->scoreMap));for (int row = 0; row < BOARD_GRAD_SIZE; row++){for(int col = 0; col < BOARD_GRAD_SIZE; col++){//空白點計算if(row >= 0 && col >= 0 && data->chessMap[row][col] == 0){//遍歷四個方向,然后分別計算正反四個方向int directs[4][2] = {{1,0}, {1,1}, {0,1}, {-1,1}};for(int k = 0; k < 4; k++){int x = directs[k][0];int y = directs[k][1];//重置personNum = 0;botNum = 0;emptyNum = 0;//對黑棋評分(正向)for(int i = 1; i <= 4; i++){if(row + i * y >= 0 && row + i * y < BOARD_GRAD_SIZE && col + i * x >= 0 && col + i * x < BOARD_GRAD_SIZE && data->chessMap[row + i * y][col + i * x] == 1){//玩家的子personNum++;}else if(row + i * y >= 0 && row + i * y < BOARD_GRAD_SIZE &&col + i * x >= 0 && col + i * x < BOARD_GRAD_SIZE && data->chessMap[row + i * y][col + i * x] == 0){//空白位emptyNum++;break; //遇到空白位置停止該方向搜索}else{break; //出邊界或遇到白棋停止搜索}}//對黑棋評分(反向)for(int i = 1; i<= 4; i++){if(row - i * y >= 0 && row - i * y < BOARD_GRAD_SIZE && col - i * x >= 0 && col - i * x <BOARD_GRAD_SIZE && data->chessMap[row - i * y][col - i * x] == 1){personNum++;}else if(row - i * y >= 0 && row - i * y <BOARD_GRAD_SIZE && col - i * x >= 0 && col - i * x < BOARD_GRAD_SIZE &&data->chessMap[row -i * y][col - i * x] == 0){emptyNum++;break;}else{break;}}if(personNum == 1){data->scoreMap[row][col] += 10;}else if(personNum == 2){if(emptyNum == 1){//死3data->scoreMap[row][col] += 30;}else if(emptyNum == 2){//活3data->scoreMap[row][col] += 40;}}else if(personNum == 3){if(empty == 1){//死4data->scoreMap[row][col] += 60;}else if (emptyNum == 2){//活4data->scoreMap[row][col] += 200;}}else if(personNum == 4){data->scoreMap[row][col] += 20000;}emptyNum = 0; //清空//對白棋評分(正向)for(int i = 1; i <= 4; i++){if(row + i * y > 0 && row + i * y < BOARD_GRAD_SIZE && col + i * x > 0 && col + i * x < BOARD_GARD_SIZE &&data->chessMap[row + i * y][col + i * x == -1]){botNum++;}else if(row + i * y >0 && row + i * y < BOARD_GRAD_SIZE && col + i * x > 0 && col + i * x < BOARD_GRAD_SIZE && data->chessMap[row + i * y][col + i *x] == 0){emptyNum++;break;}else{break;}}//白棋評分(反向)for(int i = 1; i <= 4; i++){if(row - i * y > 0 && row - i * y <BOARD_GRAD_SIZE && col - i * x > 0 && col - i * x < BOARD_GRAD_SIZE && data->chessMap[row - i * y][col -i * x] == -1){botNum++;}else if (row - i * y >0 && row - i * y < BOARD_GRAD_SIZE &&col - i * x > 0 && col - i * x < BOARD_GRAD_SIZE &&data->chessMap[row - i * y][col - i * x] == 0){emptyNum++;break;}else{break; //出邊界}}if(botNum == 0){//連1data->scoreMap[row][col] += 5;}else if(botNum == 1){//活2data->scoreMap[row][col] += 10;}else if(botNum == 2){if(emptyNum == 1){//死3data->scoreMap[row][col] += 25;}else if(emptyNum == 2){//活3data->scoreMap[row][col] += 50;}}else if(botNum == 3){if(emptyNum == 1){//死4data->scoreMap[row][col] += 55;}else if(botNum == 2){//活4data->scoreMap[row][col] += 300;}}else if(botNum >= 4){//活5data->scoreMap[row][col] += 30000;}}}}} }

總結

以上是生活随笔為你收集整理的C++五子棋(四)——走棋原理及权值计算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。