原理

计算

  • 计算每个落子点的“权值”,找到权值最大的落子点
  • 对于每个空白点,分别计算周围的八个方向
  • 不妨以该空白点作为参照原点,以水平向右作为X轴正方向,以竖直向下为Y轴正方向建立平面直角坐标系
  • 因为在计算某个方向时,正向和反向需同时考虑,实际上只需要四个方向,即向量(1,0)的方向、向量(1,1)方向、向量(0,1)方向和向量(-1,1)方向,图示如下(灵魂画图,请勿吐槽 滑稽)

走棋原理

产生效果

  • 黑棋走这个点
产生效果 评分
连2 10
死3 30
活3 40
死4 60
活4 200
连5 20000

  • 如果白棋(AI)走这个点
产生效果 评分
连1 5
连2 10
死3 25
活3 50
死4 55
活4 300
连5 30000

权值计算

  • chessData.h
void calcScore(ChessData* data);
  • chessData.cpp
#include <string>
void calcScore(ChessData* data){
if(!data) return; //统计玩家或AI连子
int personNum = 0; //玩家
int botNum = 0; //AI
int 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){
//死3
data->scoreMap[row][col] += 30;
}else if(emptyNum == 2){
//活3
data->scoreMap[row][col] += 40;
}
}else if(personNum == 3){
if(empty == 1){
//死4
data->scoreMap[row][col] += 60;
}else if (emptyNum == 2){
//活4
data->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){
//连1
data->scoreMap[row][col] += 5;
}else if(botNum == 1){
//活2
data->scoreMap[row][col] += 10;
}else if(botNum == 2){
if(emptyNum == 1){
//死3
data->scoreMap[row][col] += 25;
}else if(emptyNum == 2){
//活3
data->scoreMap[row][col] += 50;
}
}else if(botNum == 3){
if(emptyNum == 1){
//死4
data->scoreMap[row][col] += 55;
}else if(botNum == 2){
//活4
data->scoreMap[row][col] += 300;
}
}else if(botNum >= 4){
//活5
data->scoreMap[row][col] += 30000;
} } }
}
}
}

C++五子棋(四)——走棋原理及权值计算的更多相关文章

  1. css权值计算

    外部样式表<内部样式表<内联样式: HTML 标签选择器的权值为 1: Class 类选择器的权值为 10: ID 选择器的权值为 100: 内联样式表的权值最高 1000: !impor ...

  2. Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)

    Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...

  3. HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  5. Textrank权值提取文本标签提取:

    Textrank权值提取文本标签提取: 我已经爬取到了指定博主的新浪微博,然后我想从微博中提取出可以代表该博主兴趣特征的100个关键词,然后由这100个关键词提取出10个标签,代表博主的兴趣.我们此处 ...

  6. NOIp 2014 #2 联合权值 Label:图论 !!!未AC

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  7. ZOJ-2342 Roads 二分图最小权值覆盖

    题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...

  8. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  9. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

随机推荐

  1. springcloud报错-------关于 hystrix 的异常 FallbackDefinitionException:fallback method wasn't found

    典型如下 第一种import java.util.List;@RestController@RequestMapping("/order")@DefaultProperties(d ...

  2. 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

    前言 以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newt ...

  3. 6月7日 python 复习 collections

    collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>> ...

  4. Linux服务器上搭建Centos7.0+Apache+php+Mysql网站

    一.安装Linux系统 1.1虚拟机搭建Linux Centos7.0版本,搭建过程省略. 二. 安装apache.php.mysql.php-gd等组件. 2.1安装Apache服务程序(apach ...

  5. 前端好用API之Fullscreen

    前情 在前端开发需求中,特别网页有视频需求时,需要做视频全屏功能,或者在某些可视化大屏项目也要做全屏. Fullscreen介绍 让你可以简单地控制浏览器,使得一个元素与其子元素,如果存在的话,可以占 ...

  6. 女朋友汇总表格弄了大半天,我实在看不下去了,用40行代码解决问题 | Python使用openpyxl库读写表格Excel(xlsx)

    1.openpyxl基本操作 python程序从excel文件中读数据基本遵循以下步骤: 1.import openpyxl 2.调用openpyxl模块下的load_workbook('你的文件名. ...

  7. 浅谈systemd原理和应用

    多不说,直接上代码(可谓配置): [Unit] Description=demo app After=network-is-online.target [Service] Type=Simple Ex ...

  8. request和response——请求响应对象

    请求对象--request 获取get请求的值 一次请求,返回一个响应. 地址栏:http://127.0.0.1:8000/day3/get_request?lan=python 问号:代表请求参数 ...

  9. JVM知识(一) 求你了,别再说Java对象都是在堆内存上分配空间的了!

    求你了,别再说Java对象都是在堆内存上分配空间的了! https://baijiahao.baidu.com/s?id=1661296872935371634&wfr=spider& ...

  10. Oacle 插入多条记录的语法理解;INSERT ALL INTO ....... SELECT 1 FROM dual;

    单表Insert into的语句就不说了,这里主要说插入多条语句的说明 For a multitable insert operation, each expression in the values ...