您的位置:首页 > 编程语言 > C语言/C++

麻将出牌时检测孤立的牌

2017-08-21 15:37 316 查看
麻将机器人出牌时,肯定要选择弃一张孤立的牌。

那检查孤张自然是必须的

获得间隔2个空位不连续的单牌

// 从_indexBegin开始检索
// BYTE is unsigned char
// 例如牌型[1 222 5 88] 取出 5 和 8
int SRMahjong::getIntervalTwo(int _indexBegin) const {

for (int i = _indexBegin / 9; i < 3; ++i) {
const int& INDEX_BEGIN = (i * 9 > _indexBegin) ? i * 9 : _indexBegin;
const int& INDEX_END = i * 9 + 9;
for (int index_begin = INDEX_BEGIN; index_begin < INDEX_END; ++index_begin) {
// 没有牌 或者 牌在指定的范围之前 都选择跳过
if (cardIndex_[index_begin] == 0)
continue;

const int& arg1 = index_begin - 1, &arg2 = index_begin - 2;
const int& arg3 = index_begin + 1, &arg4 = index_begin + 2;

// 判断相邻
if ((arg1 >= INDEX_BEGIN && cardIndex_[arg1] > 0)
|| (arg2 >= INDEX_BEGIN && cardIndex_[arg2] > 0)
|| (arg3 < INDEX_END && cardIndex_[arg3] > 0)
|| (arg4 < INDEX_END && cardIndex_[arg4] > 0)) {
continue;
}

// 不连续的牌
return index_begin;
}
}
return -1;
}


这个函数可以检查不连续的麻将牌。

再做一些简单的循环就可以检查出所有的孤张。

根据权重的划分,再去除孤张中,将、刻的选项,通过一些算法确定要打出的牌型等等。随便啦,这都是你们的自由。

这个函数直接抽出来的,可能不能直接使用,需要稍微阅读理解一下,以后再给他填写文字说明。

// 比如说这样的简单调用
// 获得所有可供打出的不连续单张
int index;
std::vector<int> vec_index;
for (index = 0; (index = getIntervalOne(index)) != 0;) {
vec_index.push_back(index);
}
if (!vec_index.empty()) {
int i = rand() % vec_index.size();
int temp_index = vec_index.at(i);

// 遍历检查幺九牌型
for (auto x : vec_index) {
const int& temp = x % 9;
if (temp <= 1 || temp >= 7) {
temp_index = x;
break;
}
}
*_out_card = SRCardMagic::switchToCardData(index);
break;
}


有问题,我们可以再探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  麻将 棋牌 c++ 算法