📄 bot.cpp
字号:
if (m_Hand.m_TileSets[i].type & (HT_OPENKONG | HT_OPENPUNG | HT_CLOSEDKONG)) { const CTile &t = m_Hand.m_TileSets[i].first; if (t.GetSuit() == TILESUIT_DRAGON || t == ((gpGame->GetRound() == TURN_EAST) ? CTile("EW") : CTile("SW"))) fanpai_fixed = true; if (t == ((m_iTurn == TURN_EAST) ? CTile("EW") : CTile("SW"))) fanpai_fixed = true; } } for (x = 0; x < m_BotBrain.num_handresult; x++) { CHand &r = m_BotBrain.handresult[x]; p.num = 0; v2_num = 0; for (i = 0; i < r.m_iNumTileSets; i++) { if (r.m_TileSets[i].type & (HT_PAIR | HT_TOCHOW)) { v2_num++; } } for (i = 0; i < r.m_iNumTileSets; i++) { if (r.m_TileSets[i].type & (HT_OPENCHOW | HT_CLOSEDCHOW)) { for (j = 0; j < 3; j++) { p.tile[p.num] = r.m_TileSets[i].first() + j; p.point[p.num] = 1000; p.num++; assert(p.num <= MAX_HANDTILE); } } else if (r.m_TileSets[i].type & (HT_OPENPUNG | HT_CLOSEDPUNG | HT_OPENKONG | HT_CLOSEDKONG)) { for (j = 0; j < 3; j++) { p.tile[p.num] = r.m_TileSets[i].first; p.point[p.num] = 1000; p.num++; assert(p.num <= MAX_HANDTILE); } } else if (r.m_TileSets[i].type & HT_PAIR) { int tile_rest = CTile::RemainingTile(r.m_TileSets[i].first); for (j = 0; j < 2; j++) { p.tile[p.num] = r.m_TileSets[i].first; if (v2_num == 1) { p.point[p.num] = 500; } else { p.point[p.num] = 250 + 30 * tile_rest; } p.num++; assert(p.num <= MAX_HANDTILE); } } else if (r.m_TileSets[i].type & HT_TOCHOW) { int tile_rest = 0; CTile t = r.m_TileSets[i].first() + 1; if (r.m_TileSets[i].type & HT_TOCHOWMIDDLE) { t = r.m_TileSets[i].first() + 2; } if (r.m_TileSets[i].type & HT_TOCHOWLOWER) { tile_rest += CTile::RemainingTile(r.m_TileSets[i].first() - 1); } if (r.m_TileSets[i].type & HT_TOCHOWMIDDLE) { tile_rest += CTile::RemainingTile(r.m_TileSets[i].first() + 1); } if (r.m_TileSets[i].type & HT_TOCHOWUPPER) { tile_rest += CTile::RemainingTile(r.m_TileSets[i].first() + 2); } for (j = 0; j < 2; j++) { p.tile[p.num] = (j ? r.m_TileSets[i].first : t); p.point[p.num] = 250 + 30 * tile_rest; p.num++; assert(p.num <= MAX_HANDTILE); } } } for (i = 0; i < r.m_iNumTiles; i++) { if (r.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } int pnt = 0; CTile &t = r.m_Tiles[i].tile; CTile prev = t() - 1, prev2 = prev() - 1; CTile next = t() + 1, next2 = next() + 1; if (t.GetValue() <= 1) { prev = prev2 = 0; } if (t.GetValue() <= 2) { prev2 = 0; } if (t.GetValue() >= 9) { next = next2 = 0; } if (t.GetValue() >= 8) { next2 = 0; } for (j = 0; j < r.m_iNumTileSets; j++) { if (r.m_TileSets[j].type & HT_PAIR) { if (r.m_TileSets[j].first == prev || r.m_TileSets[j].first == prev2 || r.m_TileSets[j].first == next || r.m_TileSets[j].first == next2) { pnt = 250; } } else if (r.m_TileSets[j].type & HT_TOCHOW) { CTile a1 = r.m_TileSets[j].first; CTile a2 = a1() + 1; if (r.m_TileSets[j].type & HT_TOCHOWMIDDLE) { a2 = r.m_TileSets[j].first() + 2; } if (a1 == t || a2 == t || a1 == next || a1 == next2 || a2 == prev || a2 == prev2) { pnt = 250; } } } p.tile[p.num] = t; if (pnt > 0) { p.point[p.num] = pnt; } else { pnt = CTile::RemainingTile(t) * 2; pnt += CTile::RemainingTile(next); pnt += CTile::RemainingTile(prev); p.point[p.num] = pnt * 30; } p.num++; assert(p.num <= MAX_HANDTILE); } for (i = 0; i < p.num; i++) { for (j = i; j < p.num; j++) { if (p.tile[i] > p.tile[j] || p.tile[i] == p.tile[j] && p.point[i] > p.point[j]) { CTile t = p.tile[i]; p.tile[i] = p.tile[j]; p.tile[j] = t; int t1 = p.point[i]; p.point[i] = p.point[j]; p.point[j] = t1; } } } if (x == 0) { result_pnt = p; } else { assert(p.num == result_pnt.num); for (i = 0; i < p.num; i++) { assert(p.tile[i] == result_pnt.tile[i]); result_pnt.point[i] += p.point[i]; } } }#ifdef BOT_DEBUG fprintf(stdout, "result_pnt.num = %d\n", result_pnt.num); for (j = 0; j < result_pnt.num; j++) { fprintf(stdout, "result_pnt.tile[%d] = %s, point[%d] = %d\n", j, result_pnt.tile[j].GetCode(), j, result_pnt.point[j]); }#endif if (result_pnt.num > 0) { for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } for (j = 0; j < result_pnt.num; j++) { if (m_Hand.m_Tiles[i].tile == result_pnt.tile[j]) { break; } } assert(j < result_pnt.num); m_BotBrain.tilevalue[i] = result_pnt.point[j] / m_BotBrain.num_handresult; } } bool open = !m_Hand.IsConcealed(); switch (m_BotBrain.goal) { case GOAL_ALLMINOR: for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].tile.IsMajor()) { m_BotBrain.tilevalue[i] += (open ? 0 : 100); } else { m_BotBrain.tilevalue[i] += (open ? 500 : 300); } } break; case GOAL_ALLPUNG: { int kinds[5][9]; for (i = 0; i < 5; i++) { for (j = 0; j < 9; j++) { kinds[i][j] = 0; } } for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } CTile &t = m_Hand.m_Tiles[i].tile; kinds[t.index1()][t.index2()]++; } for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } CTile &t = m_Hand.m_Tiles[i].tile; switch (kinds[t.index1()][t.index2()]) { case 1: m_BotBrain.tilevalue[i] += (CTile::RemainingTile(t) > 2) ? 100 : 0; break; case 2: m_BotBrain.tilevalue[i] += CTile::RemainingTile(t) ? 300 : 100; break; case 3: case 4: m_BotBrain.tilevalue[i] += 500; break; } } } break; case GOAL_ALLCHAR: for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } CTile &t = m_Hand.m_Tiles[i].tile; int suit = t.GetSuit(); if (suit & (TILESUIT_CHAR | TILESUIT_DRAGON | TILESUIT_WIND)) { m_BotBrain.tilevalue[i] += 500; } else { m_BotBrain.tilevalue[i] += (open ? 0 : 250); } } break; case GOAL_ALLBAMBOO: for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } CTile &t = m_Hand.m_Tiles[i].tile; int suit = t.GetSuit(); if (suit & (TILESUIT_BAMBOO | TILESUIT_DRAGON | TILESUIT_WIND)) { m_BotBrain.tilevalue[i] += 500; } else { m_BotBrain.tilevalue[i] += (open ? 0 : 250); } } break; case GOAL_ALLCIRCLE: for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } CTile &t = m_Hand.m_Tiles[i].tile; int suit = t.GetSuit(); if (suit & (TILESUIT_CIRCLE | TILESUIT_DRAGON | TILESUIT_WIND)) { m_BotBrain.tilevalue[i] += 500; } else { m_BotBrain.tilevalue[i] += (open ? 0 : 250); } } break; case GOAL_FANPAI: if (!fanpai_fixed) { for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } const CTile &t = m_Hand.m_Tiles[i].tile; if (t.GetSuit() == TILESUIT_DRAGON || t == ((gpGame->GetRound() == TURN_EAST) ? CTile("EW") : CTile("SW"))) { m_BotBrain.tilevalue[i] += 500; } else if (t == ((m_iTurn == TURN_EAST) ? CTile("EW") : CTile("SW"))) { m_BotBrain.tilevalue[i] += 500; } } } break; } for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (rests[i] > m_BotBrain.handresult_rest) { if (m_BotBrain.handresult_rest == 1) { m_BotBrain.tilevalue[i] += 500; } else if (m_BotBrain.handresult_rest == 2) { m_BotBrain.tilevalue[i] += 300; } else if (m_BotBrain.handresult_rest == 3) { m_BotBrain.tilevalue[i] += 100; } } }}void CBot::AnalyzeDora(){ int i; float r[MAX_HANDTILE], r_max = 0; for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } r[i] = 0; CTile &t = m_Hand.m_Tiles[i].tile; if (gpGame->IsDora(t)) { r[i] += 8; } if (t.GetValue() < 9 && gpGame->IsDora(t() + 1)) { r[i] += 4; } if (t.GetValue() > 1 && gpGame->IsDora(t() - 1)) { r[i] += 4; } if (t.GetValue() < 8 && gpGame->IsDora(t() + 2)) { r[i] += 2; } if (t.GetValue() > 2 && gpGame->IsDora(t() - 2)) { r[i] += 2; } r[i] *= m_BotBrain.tilevalue[i]; if (r_max < r[i]) { r_max = r[i]; } } for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_LOCKED | HT_TOCHOW)) { continue; } float x; if (r_max > 0) { x = r[i] * 100 / r_max; } else { x = 0; } m_BotBrain.tilevalue[i] += x; }}void CBot::AnalyzeColor(){ const float param = 100.f; int i; float r[MAX_HANDTILE], r_max = param / 3, b = param / 3 / 200, d = param / 3 / 100; float ch = b, cir = b, bam = b, wd = 0; for (i = 0; i < m_Hand.m_iNumTiles; i++) { r[i] = 0; if (m_Hand.m_Tiles[i].flags & (HT_OPEN | HT_TOCHOW)) { continue; } if (m_Hand.m_Tiles[i].tile.GetSuit() == TILESUIT_CHAR) { ch += d; } else if (m_Hand.m_Tiles[i].tile.GetSuit() == TILESUIT_CIRCLE) { cir += d; } else if (m_Hand.m_Tiles[i].tile.GetSuit() == TILESUIT_BAMBOO) { bam += d; } else { wd += d; } } for (i = 0; i < m_Hand.m_iNumTileSets; i++) { if (m_Hand.m_TileSets[i].type & HT_OPEN) { if (m_Hand.m_TileSets[i].first.GetSuit() == TILESUIT_CHAR) { cir = bam = b; } else if (m_Hand.m_TileSets[i].first.GetSuit() == TILESUIT_CIRCLE) { ch = bam = b; } else if (m_Hand.m_TileSets[i].first.GetSuit() == TILESUIT_BAMBOO) { ch = cir = b; } } } if (ch > cir && ch > bam) { ch += wd / 2; wd += ch / 2; } else if (cir > ch && cir > bam) { cir += wd / 2; wd += cir / 2; } else if (bam > ch && bam > cir) { bam += wd / 2; wd += bam / 2; } i = (m_Hand.IsConcealed() ? 1 : 2); ch *= ch * i; cir *= cir * i; bam *= bam * i; wd *= wd * i; for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (m_Hand.m_Tiles[i].flags & (HT_OPEN | HT_TOCHOW)) { continue; } if (m_Hand.m_Tiles[i].tile.GetSuit() == TILESUIT_CHAR) { r[i] = ch / 3; } else if (m_Hand.m_Tiles[i].tile.GetSuit() == TILESUIT_CIRCLE) { r[i] = cir / 3; } else if (m_Hand.m_Tiles[i].tile.GetSuit() == TILESUIT_BAMBOO) { r[i] = bam / 3; } else { r[i] = wd / 3; } if (r[i] > r_max) { r_max = r[i]; } } for (i = 0; i < m_Hand.m_iNumTiles; i++) { if (r_max != 0) { b = r[i] * param / 3 / r_max; } else { b = 0; } m_BotBrain.tilevalue[i] += b; }#ifdef BOT_DEBUG fprintf(stdout, "-=-=-=-=-=-=-=-= AnalyzeColor() =-=-=-=-=-=-=-=-\n"); for (i = 0; i < m_Hand.m
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -