⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bot.cpp

📁 上面上传的autotools一文(也就是《使用GNU autotools 改造一个软件项目》)配套的示例程序源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      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 + -