请把该六子棋代码优化,考虑对方眠五活五眠四活四的情况:int calcScore(int x, int y) { int center = GRIDSIZE / 2; int score = max(abs(x-center), abs(y-center)); if (gridInfo[x][y] != grid_blank) { return 0; } int oppoColor = -currBotColor; int myColor = currBotColor; // 检测周围是否有对方的四连或五连,然后进行堵截 for(int i=0; i<8; i++) { int cnt = 0, bx = x+dx[i], by = y+dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == oppoColor) { bx += dx[i]; by += dy[i]; cnt++; } if(cnt == 5) { score += 100000; } else if(cnt == 4) { score += 1000; } else if(cnt == 3) { score += 200; // 判断是否能够延续三连 int nx = bx+dx[i], ny = by+dy[i]; if(inMap(nx, ny) && gridInfo[nx][ny] == grid_blank) { score += 50; } } else if(cnt == 2) { score += 20; // 判断是否能够延续二连 int nx = bx+dx[i], ny = by+dy[i]; if(inMap(nx, ny) && gridInfo[nx][ny] == myColor) { score += 10; } } else if(cnt == 1) { score += 5; } else if(cnt == 0) { score += 1; } } // 判断是否能够形成我方的四连或五连 for(int i=0; i<8; i++) { int cnt = 0, bx = x+dx[i], by = y+dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == myColor) { bx += dx[i]; by += dy[i]; cnt++; } if(cnt == 4) { score += 500; } else if(cnt == 3) { score += 100; // 判断是否能够延续三连 int nx = bx+dx[i], ny = by+dy[i]; if(inMap(nx, ny) && gridInfo[nx][ny] == grid_blank) { score += 50; } } } // 判断是否能够同时堵住对方的四连和我方的三连或二连 for(int i=0; i<8; i++) { int cnt1 = 0, cnt2 = 0, bx = x+dx[i], by = y+dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == oppoColor) { bx += dx[i]; by += dy[i]; cnt1++; } bx += dx[i]; by += dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == myColor) { bx += dx[i]; by += dy[i]; cnt2++; } if(cnt1 == 4 && (cnt2 == 3 || cnt2 == 2)) { score += 1000; } } return score; }

时间: 2024-03-07 15:52:34 浏览: 11
首先,可以将判断对方的五连、四连和三连的代码抽取出来,形成一个公共的函数,避免重复代码。这个函数可以返回对应的分值,而不是直接修改score。类似的,可以将判断我方的五连、四连和三连的代码抽取出来,形成一个公共的函数。 其次,可以将判断是否能够延续三连的代码抽取出来,形成一个公共的函数,避免重复代码。这个函数可以返回对应的分值,而不是直接修改score。 最后,可以将判断是否能够同时堵住对方的四连和我方的三连或二连的代码抽取出来,形成一个公共的函数,避免重复代码。这个函数可以返回对应的分值,而不是直接修改score。 下面是优化后的代码: int getScore(int cnt) { if(cnt == 5) { return 100000; } else if(cnt == 4) { return 1000; } else if(cnt == 3) { return 200; } else if(cnt == 2) { return 20; } else if(cnt == 1) { return 5; } else { return 1; } } int getExtendScore(int cnt, int color) { if(cnt == 3) { return 50; } else if(cnt == 2 && color == currBotColor) { return 10; } else { return 0; } } int getDefendScore(int oppoCnt, int myCnt) { if(oppoCnt == 4 && (myCnt == 3 || myCnt == 2)) { return 1000; } else { return 0; } } int calcScore(int x, int y) { int center = GRIDSIZE / 2; int score = max(abs(x-center), abs(y-center)); if (gridInfo[x][y] != grid_blank) { return 0; } int oppoColor = -currBotColor; int myColor = currBotColor; for(int i=0; i<8; i++) { int cnt = 0, bx = x+dx[i], by = y+dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == oppoColor) { bx += dx[i]; by += dy[i]; cnt++; } score += getScore(cnt); score += getExtendScore(cnt, gridInfo[bx][by]); } for(int i=0; i<8; i++) { int cnt = 0, bx = x+dx[i], by = y+dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == myColor) { bx += dx[i]; by += dy[i]; cnt++; } score += getScore(cnt); score += getExtendScore(cnt, gridInfo[bx][by]); } for(int i=0; i<8; i++) { int oppoCnt = 0, myCnt = 0, bx = x+dx[i], by = y+dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == oppoColor) { bx += dx[i]; by += dy[i]; oppoCnt++; } bx += dx[i]; by += dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == myColor) { bx += dx[i]; by += dy[i]; myCnt++; } score += getDefendScore(oppoCnt, myCnt); } return score; }

相关推荐

最新推荐

recommend-type

MySQL数据库中把int转化varchar引发的慢查询

最近一周接连处理了2个由于int向varchar转换无法使用索引,从而引发的慢查询。 CREATE TABLE `appstat_day_prototype_201305` ( `day_key` date NOT NULL DEFAULT '1900-01-01', `appkey` varchar(20) NOT NULL ...
recommend-type

使用Java代码将IP地址转换为int类型的方法

主要介绍了使用Java代码将IP地址转换为int类型的方法,这也是各大计算机考试和ACM以及面试的常见基础问题,需要的朋友可以参考下
recommend-type

jquery把int类型转换成字符串类型的方法

jQuery中把获取的number类型数据转换成字符串类型 var val=$(“#id).val(); If(typeof val==”number”){ val+=' '; } 以上就是小编为大家带来的jquery把int类型转换成字符串类型的方法全部内容了,希望大家多多...
recommend-type

Keil MDK-ARM各种数据类型占用的字节数 char short int float double

Keil MDK-ARM各种数据类型占用的字节数 char short int float double占用字节数,uCOS-II
recommend-type

C++中int类型按字节打印输出的方法

主要给大家介绍了关于C++中int类型按字节打印输出的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。