<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lưu trữ Báo cáo so sánh đội hình vô địch Pokémon Champions - vnGAME</title>
	<atom:link href="https://vngame.tv/tag/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/feed/" rel="self" type="application/rss+xml" />
	<link>https://vngame.tv/tag/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/</link>
	<description>TẢI GAME MIỄN PHÍ</description>
	<lastBuildDate>Sat, 15 Aug 2026 22:01:13 +0000</lastBuildDate>
	<language>vi</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://vngame.tv/wp-content/uploads/2020/12/favion-2020-70x70.png</url>
	<title>Lưu trữ Báo cáo so sánh đội hình vô địch Pokémon Champions - vnGAME</title>
	<link>https://vngame.tv/tag/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">128554084</site>	<item>
		<title>Báo cáo so sánh đội hình Pokémon Champions</title>
		<link>https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/</link>
					<comments>https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Thu, 13 Aug 2026 19:34:58 +0000</pubDate>
				<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[Báo cáo so sánh đội hình vô địch Pokémon Champions]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=17641</guid>

					<description><![CDATA[<p>Hiểu rõ đội hình của mình chỉ là một nửa của quá trình chuẩn bị. Nửa còn lại — và là phần mà hầu hết người chơi bỏ qua vì quá tốn thời gian khi làm thủ công — là so sánh đội hình của mình với đội hình của đối thủ cụ thể trước khi trận đấu bắt đầu. Cho dù bạn đang chuẩn bị cho một đối thủ xếp hạng đã biết, nghiên cứu danh sách đội hình công khai của đối thủ trong giải đấu, hay chỉ đơn giản là thử nghiệm đội hình của mình với [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/" data-wpel-link="internal">Báo cáo so sánh đội hình Pokémon Champions</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hiểu rõ đội hình của mình chỉ là một nửa của quá trình chuẩn bị. Nửa còn lại — và là phần mà hầu hết người chơi bỏ qua vì quá tốn thời gian khi làm thủ công — là so sánh đội hình của mình với đội hình của đối thủ cụ thể trước khi trận đấu bắt đầu. Cho dù bạn đang chuẩn bị cho một đối thủ xếp hạng đã biết, nghiên cứu danh sách đội hình công khai của đối thủ trong giải đấu, hay chỉ đơn giản là thử nghiệm đội hình của mình với bạn bè, việc so sánh hai đội hình sáu Pokémon đầy đủ, từng chỉ số và từng loại, sẽ tốn rất nhiều thời gian nếu làm thủ công.</p>



<p class="wp-block-paragraph">Giới thiệu&nbsp;<strong>Matchup Scanner</strong>&nbsp;(được cung cấp bởi&nbsp;<strong>PokehubGuide.com</strong>&nbsp;), một tiện ích công nghệ cao thiết yếu trong bộ&nbsp;<em>công cụ Pokémon Champions</em>&nbsp;của chúng tôi . Thay vì kiểm tra Tốc độ và khả năng bao phủ hệ của từng Pokémon một, công cụ này sẽ xem xét toàn bộ đội hình cùng lúc và tạo ra báo cáo so sánh hoàn chỉnh chỉ bằng một cú nhấp chuột.</p>



<!-- ============================================================
     MATCHUP SCANNER — Báo Cáo Đối Đầu Đội Hình Pokémon Champions
     (bởi PokehubGuide.com)
     Dán toàn bộ khối này vào trang HTML của bạn.
     Dùng tiền tố "pvt-" nên không xung đột với các tool khác.
     Cấp độ cố định 50 vì Champions tự động quy mọi Pokémon về Lv.50.
     ============================================================ -->
<div id="pvt-root">
  <style>
    #pvt-root {
      --pvt-bg: #0b0d10;
      --pvt-panel: #14171c;
      --pvt-red: #e3350d;
      --pvt-red-dim: #7a1c08;
      --pvt-amber: #ffb703;
      --pvt-green: #4bd68b;
      --pvt-gold: #f4c542;
      --pvt-you: #f4c542;
      --pvt-opp: #8a919c;
      --pvt-text: #eef1f4;
      --pvt-muted: #8a919c;
      --pvt-line: #262b33;
      font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
      color: var(--pvt-text);
      background: var(--pvt-bg);
      max-width: 1020px;
      margin: 0 auto;
      padding: 28px;
      border-radius: 20px;
      position: relative;
      overflow: hidden;
      box-shadow: 0 0 0 1px var(--pvt-line), 0 30px 60px -20px rgba(0,0,0,0.6);
    }
    #pvt-root::before {
      content: "";
      position: absolute; inset: 0;
      background: repeating-linear-gradient(
        to bottom, rgba(255,255,255,0.015) 0px, rgba(255,255,255,0.015) 1px,
        transparent 1px, transparent 3px
      );
      pointer-events: none; z-index: 5;
    }
    #pvt-root * { box-sizing: border-box; }

    .pvt-head { display: flex; align-items: center; gap: 14px; margin-bottom: 8px; }
    .pvt-lens {
      width: 22px; height: 22px; border-radius: 50%;
      background: radial-gradient(circle at 35% 30%, #fff3c4, #f4c542 45%, #8a6a0a 100%);
      box-shadow: 0 0 0 4px #1a1e24, 0 0 14px rgba(244,197,66,0.55);
      flex-shrink: 0;
    }
    .pvt-brand {
      font-family: 'Space Mono', monospace; font-size: 10px; letter-spacing: 0.16em;
      text-transform: uppercase; color: var(--pvt-amber); margin-bottom: 3px;
    }
    .pvt-brand b { color: var(--pvt-text); font-weight: 700; }
    .pvt-head h1 {
      font-family: 'Space Mono', monospace; font-size: 20px; letter-spacing: 0.14em;
      text-transform: uppercase; margin: 0; color: var(--pvt-text);
    }
    .pvt-head span {
      display: block; font-family: 'Space Mono', monospace; font-size: 11px;
      color: var(--pvt-gold); letter-spacing: 0.08em; margin-top: 2px;
    }
    .pvt-dots { margin-left: auto; display: flex; gap: 6px; }
    .pvt-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--pvt-line); display: block; }
    .pvt-dots i:nth-child(1) { background: var(--pvt-red); }
    .pvt-dots i:nth-child(2) { background: var(--pvt-amber); }
    .pvt-dots i:nth-child(3) { background: var(--pvt-green); }

    .pvt-level-pill {
      display: inline-flex; align-items: center; gap: 8px; margin: 12px 0 18px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--pvt-gold);
      background: rgba(244,197,66,0.1); border: 1px solid rgba(244,197,66,0.3);
      padding: 8px 14px; border-radius: 999px;
    }

    .pvt-teams-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
    @media (max-width: 820px) { .pvt-teams-grid { grid-template-columns: 1fr; } }

    .pvt-panel {
      background: var(--pvt-panel); border: 1px solid var(--pvt-line);
      border-radius: 14px; padding: 16px; margin-bottom: 16px;
    }
    .pvt-panel.pvt-you { border-top: 3px solid var(--pvt-you); }
    .pvt-panel.pvt-opp { border-top: 3px solid var(--pvt-opp); }
    .pvt-panel h2 {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
      text-transform: uppercase; margin: 0 0 12px; display: flex; align-items: center; gap: 8px;
    }
    .pvt-panel.pvt-you h2 { color: var(--pvt-you); }
    .pvt-panel.pvt-opp h2 { color: var(--pvt-opp); }

    .pvt-slot {
      display: grid; grid-template-columns: 1.2fr 1fr 1fr 0.9fr 0.9fr; gap: 6px;
      align-items: center; padding: 6px 0; border-bottom: 1px solid var(--pvt-line);
    }
    .pvt-slot:last-child { border-bottom: none; }
    @media (max-width: 500px) { .pvt-slot { grid-template-columns: 1fr 1fr; row-gap: 4px; } }

    #pvt-root input[type=text], #pvt-root input[type=number], #pvt-root select {
      width: 100%; background: #0e1114; border: 1px solid var(--pvt-line);
      color: var(--pvt-text); font-family: 'Space Mono', monospace; font-size: 11.5px;
      padding: 6px 7px; border-radius: 6px; outline: none; appearance: none;
    }
    #pvt-root input[type=text]::placeholder, #pvt-root input[type=number]::placeholder {
      color: #b8bfc8;
      opacity: 1;
    }
    #pvt-root select {
      background-image: linear-gradient(45deg, transparent 50%, var(--pvt-muted) 50%),
                         linear-gradient(135deg, var(--pvt-muted) 50%, transparent 50%);
      background-position: calc(100% - 10px) center, calc(100% - 6px) center;
      background-size: 4px 4px, 4px 4px; background-repeat: no-repeat; cursor: pointer;
    }
    #pvt-root input:focus, #pvt-root select:focus { border-color: var(--pvt-gold); }

    .pvt-btn {
      font-family: 'Space Mono', monospace; font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase;
      padding: 13px; border-radius: 10px; width: 100%; cursor: pointer; border: none;
      background: linear-gradient(180deg, var(--pvt-gold), #c9a02f); color: #0b0d10; font-weight: 700;
      box-shadow: 0 6px 18px -6px rgba(244,197,66,0.5); margin-bottom: 18px;
    }

    .pvt-report-panel {
      background: var(--pvt-panel); border: 1px solid var(--pvt-line); border-radius: 14px; padding: 18px; margin-bottom: 16px;
    }
    .pvt-report-panel h2 {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
      text-transform: uppercase; color: var(--pvt-muted); margin: 0 0 14px;
      display: flex; align-items: center; gap: 8px;
    }
    .pvt-report-panel h2::before { content: ""; width: 6px; height: 6px; background: var(--pvt-gold); display: inline-block; border-radius: 1px; }

    .pvt-lb-row { display: grid; grid-template-columns: 26px 1fr 80px; align-items: center; gap: 10px; margin-bottom: 6px; }
    .pvt-lb-rank { font-family: 'Space Mono', monospace; font-size: 11px; color: var(--pvt-muted); text-align: center; }
    .pvt-lb-bar-wrap { background: #0e1114; border: 1px solid var(--pvt-line); border-radius: 8px; overflow: hidden; }
    .pvt-lb-bar {
      display: flex; align-items: center; height: 30px; padding: 0 10px;
      font-family: 'Space Mono', monospace; font-size: 11.5px; color: #0b0d10; font-weight: 700;
      white-space: nowrap; overflow: hidden; transition: width .35s ease;
    }
    .pvt-lb-bar.pvt-bar-you { background: var(--pvt-you); }
    .pvt-lb-bar.pvt-bar-opp { background: var(--pvt-opp); color: var(--pvt-text); }
    .pvt-lb-speed { font-family: 'Space Mono', monospace; font-size: 13px; font-weight: 700; text-align: right; color: var(--pvt-text); }

    .pvt-summary-strip { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 14px; }
    @media (max-width: 560px) { .pvt-summary-strip { grid-template-columns: 1fr; } }
    .pvt-summary-chip { background: #0e1114; border: 1px solid var(--pvt-line); border-radius: 10px; padding: 14px; text-align: center; }
    .pvt-summary-chip .pvt-sc-label { font-family: 'Space Mono', monospace; font-size: 10px; color: var(--pvt-muted); text-transform: uppercase; margin-bottom: 6px; }
    .pvt-summary-chip .pvt-sc-value { font-family: 'Space Mono', monospace; font-size: 22px; font-weight: 700; }

    .pvt-danger-table { width: 100%; border-collapse: collapse; font-family: 'Space Mono', monospace; font-size: 12px; }
    .pvt-danger-table th, .pvt-danger-table td { padding: 8px; text-align: center; border-bottom: 1px solid var(--pvt-line); }
    .pvt-danger-table th { color: var(--pvt-muted); font-weight: 400; text-transform: uppercase; font-size: 9.5px; }
    .pvt-danger-table td.pvt-dtype { text-align: left; font-weight: 700; }
    .pvt-danger-high { color: var(--pvt-red); font-weight: 700; }
    .pvt-danger-med { color: var(--pvt-amber); font-weight: 700; }
    .pvt-danger-low { color: var(--pvt-muted); }

    .pvt-footer-note { margin-top: 14px; font-size: 11px; color: var(--pvt-muted); line-height: 1.5; }

    .pvt-credit {
      margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--pvt-line);
      display: flex; align-items: center; justify-content: center; gap: 6px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--pvt-muted); letter-spacing: 0.03em;
    }
    .pvt-credit .pvt-credit-mark {
      width: 16px; height: 16px; border-radius: 4px;
      background: linear-gradient(135deg, var(--pvt-gold), var(--pvt-amber));
      display: inline-block; flex-shrink: 0;
    }
    .pvt-credit a {
      color: var(--pvt-text); font-weight: 700; text-decoration: none;
      border-bottom: 1px solid var(--pvt-red-dim); transition: border-color .15s, color .15s;
    }
    .pvt-credit a:hover { color: var(--pvt-amber); border-color: var(--pvt-amber); }
  </style>

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&#038;family=DM+Sans:wght@400;500;700&#038;display=swap" rel="stylesheet">

  <div class="pvt-head">
    <div class="pvt-lens"></div>
    <div>
      <div class="pvt-brand">Pokehub<b>Guide</b>.com</div>
      <h1>Máy Quét Đối Đầu</h1>
      <span>ĐƠN VỊ BÁO CÁO ĐỐI ĐẦU ĐỘI HÌNH — POKÉMON CHAMPIONS</span>
    </div>
    <div class="pvt-dots"><i></i><i></i><i></i></div>
  </div>

  <div class="pvt-level-pill">● Cố định ở Cấp 50 — Pokémon Champions tự động quy mọi Pokémon về cấp này trong trận</div>

  <div class="pvt-teams-grid">
    <div class="pvt-panel pvt-you">
      <h2>Đội Hình Của Bạn</h2>
      <div id="pvt-you-slots"></div>
    </div>
    <div class="pvt-panel pvt-opp">
      <h2>Đội Hình Đối Thủ</h2>
      <div id="pvt-opp-slots"></div>
    </div>
  </div>

  <button class="pvt-btn" id="pvt-generate">Tạo Báo Cáo Đối Đầu</button>

  <div id="pvt-report"></div>

  <div class="pvt-credit">
    <span class="pvt-credit-mark"></span>
    Cung cấp bởi <a href="https://pokehubguide.com" target="_blank" rel="noopener external noreferrer" class="local-link" data-wpel-link="external">PokehubGuide.com</a>
  </div>

  <!-- ============================================================
       TEMPLATE cho mỗi dòng Pokémon — nhãn/tuỳ chọn tĩnh (placeholder,
       "— Hệ 2 —", "Tốc độ Min/Max"...) nằm ngoài <script> nên luôn
       hiển thị đúng. JS chỉ clone và điền option hệ.
       ============================================================ -->
  <template id="pvt-slot-template">
    <div class="pvt-slot">
      <input type="text" class="pvt-name" placeholder="">
      <select class="pvt-type1"></select>
      <select class="pvt-type2"><option value="">— Hệ 2 —</option></select>
      <input type="number" class="pvt-base-spe" placeholder="Tốc độ gốc">
      <select class="pvt-spe-tier">
        <option value="min">Tốc độ Min</option>
        <option value="max" selected>Tốc độ Max</option>
        <option value="scarf">Max+Khăn</option>
      </select>
    </div>
  </template>
</div>

<script>
(function () {
  // ------------------------------------------------------------------
  // FIX: chữ có dấu và ký hiệu non-ASCII (&#x26a0;, &#x2694;, —...) nằm trong
  // <script> có thể bị nền tảng lưu trang entity-hoá và hiển thị sai.
  // Nhãn tĩnh của mỗi dòng Pokémon đã chuyển ra <template> ở trên; toàn
  // bộ chuỗi tiếng Việt còn lại buộc phải nằm trong JS (tiêu đề báo
  // cáo, ghi chú, tên cột...) viết bằng escape Unicode \uXXXX — mã
  // nguồn 100% ASCII nên không có gì để nền tảng entity-hoá. Toàn bộ
  // báo cáo động cũng dựng bằng DOM API thay vì ghép chuỗi HTML, tránh
  // luôn rủi ro lồng thẻ sai khi nền tảng xử lý lại trang.
  // ------------------------------------------------------------------
  const TXT = {
    namePlaceholderPrefix: "Pok\u00e9mon ",
    fillTeamsNote: "\u0110i\u1ec1n \u00edt nh\u1ea5t 1 Pok\u00e9mon cho m\u1ed7i \u0111\u1ed9i (t\u00ean/h\u1ec7 kh\u00f4ng b\u1eaft bu\u1ed9c, nh\u01b0ng c\u1ea7n T\u1ed1c \u0111\u1ed9 g\u1ed1c \u0111\u1ec3 xem b\u00e1o c\u00e1o t\u1ed1c \u0111\u1ed9) r\u1ed3i t\u1ea1o b\u00e1o c\u00e1o l\u1ea1i.",
    speedComparisonTitle: "So S\u00e1nh T\u1ed1c \u0110\u1ed9",
    addSpeedNote: "Nh\u1eadp T\u1ed1c \u0111\u1ed9 g\u1ed1c \u0111\u1ec3 xem so s\u00e1nh.",
    speedLegendNote: "Thanh m\u00e0u v\u00e0ng l\u00e0 \u0111\u1ed9i c\u1ee7a b\u1ea1n, thanh m\u00e0u x\u00e1m l\u00e0 \u0111\u1ed9i \u0111\u1ed1i th\u1ee7 \u2014 s\u1eafp x\u1ebfp t\u1eeb nhanh \u0111\u1ebfn ch\u1eadm.",
    noSharedWeakness: "Kh\u00f4ng ph\u00e1t hi\u1ec7n \u0111i\u1ec3m y\u1ebfu chung tr\u01b0\u1edbc c\u00e1c h\u1ec7 STAB kh\u1ea3 d\u0129 c\u1ee7a \u0111\u1ed1i th\u1ee7 \u2014 \u0111i\u1ec1n h\u1ec7 cho c\u1ea3 2 \u0111\u1ed9i \u0111\u1ec3 ki\u1ec3m tra.",
    colTypeOpponentCarries: "H\u1ec7 \u0110\u1ed1i Th\u1ee7 C\u00f3 Th\u1ec3 S\u1edf H\u1eefu",
    colHowManyWeak: "S\u1ed1 Pok\u00e9mon \u0110\u1ed9i B\u1ea1n B\u1ecb Y\u1ebfu Th\u1ebf",
    yourThreatsTitle: "\u26a0 M\u1ed1i \u0110e D\u1ecda \u0110\u1ed9i B\u1ea1n Y\u1ebfu Th\u1ebf",
    theirThreatsTitle: "\u2694 M\u1ed1i \u0110e D\u1ecda \u0110\u1ed1i Th\u1ee7 Y\u1ebfu Th\u1ebf",
    quickSummaryTitle: "T\u00f3m T\u1eaft Nhanh",
    outspeedLabel: "S\u1ed1 Pok\u00e9mon C\u1ee7a B\u1ea1n Nhanh H\u01a1n To\u00e0n \u0110\u1ed9i \u0110\u1ed1i Th\u1ee7",
    biggestWeaknessLabel: "\u0110i\u1ec3m Y\u1ebfu Chung L\u1edbn Nh\u1ea5t C\u1ee7a B\u1ea1n",
    dash: "\u2014"
  };

  const LEVEL = 50;
  const TYPES = ["Normal","Fire","Water","Electric","Grass","Ice","Fighting","Poison","Ground","Flying","Psychic","Bug","Rock","Ghost","Dragon","Dark","Steel","Fairy"];

  const CHART = {
    Normal:   { Rock:0.5, Ghost:0, Steel:0.5 },
    Fire:     { Fire:0.5, Water:0.5, Grass:2, Ice:2, Bug:2, Rock:0.5, Dragon:0.5, Steel:2 },
    Water:    { Fire:2, Water:0.5, Grass:0.5, Ground:2, Rock:2, Dragon:0.5 },
    Electric: { Water:2, Electric:0.5, Grass:0.5, Ground:0, Flying:2, Dragon:0.5 },
    Grass:    { Fire:0.5, Water:2, Grass:0.5, Poison:0.5, Ground:2, Flying:0.5, Bug:0.5, Rock:2, Dragon:0.5, Steel:0.5 },
    Ice:      { Fire:0.5, Water:0.5, Grass:2, Ice:0.5, Ground:2, Flying:2, Dragon:2, Steel:0.5 },
    Fighting: { Normal:2, Ice:2, Poison:0.5, Flying:0.5, Psychic:0.5, Bug:0.5, Rock:2, Ghost:0, Dark:2, Steel:2, Fairy:0.5 },
    Poison:   { Grass:2, Poison:0.5, Ground:0.5, Rock:0.5, Ghost:0.5, Steel:0, Fairy:2 },
    Ground:   { Fire:2, Electric:2, Grass:0.5, Poison:2, Flying:0, Bug:0.5, Rock:2, Steel:2 },
    Flying:   { Electric:0.5, Grass:2, Fighting:2, Bug:2, Rock:0.5, Steel:0.5 },
    Psychic:  { Fighting:2, Poison:2, Psychic:0.5, Dark:0, Steel:0.5 },
    Bug:      { Fire:0.5, Grass:2, Fighting:0.5, Poison:0.5, Flying:0.5, Psychic:2, Ghost:0.5, Dark:2, Steel:0.5, Fairy:0.5 },
    Rock:     { Fire:2, Ice:2, Fighting:0.5, Ground:0.5, Flying:2, Bug:2, Steel:0.5 },
    Ghost:    { Normal:0, Psychic:2, Ghost:2, Dark:0.5 },
    Dragon:   { Dragon:2, Steel:0.5, Fairy:0 },
    Dark:     { Fighting:0.5, Psychic:2, Ghost:2, Dark:0.5, Fairy:0.5 },
    Steel:    { Fire:0.5, Water:0.5, Electric:0.5, Ice:2, Rock:2, Steel:0.5, Fairy:2 },
    Fairy:    { Fire:0.5, Fighting:2, Poison:0.5, Dragon:2, Dark:2, Steel:0.5 }
  };
  function singleMult(atk, def) { const row = CHART[atk] || {}; return row[def] !== undefined ? row[def] : 1; }
  function dualMult(atk, def1, def2) { let m = singleMult(atk, def1); if (def2) m *= singleMult(atk, def2); return m; }

  function speedAt(base, tier) {
    // Min = 0 EV trung tính | Max = 252 EV +Tính cách | Scarf = Max * 1.5
    const min = Math.floor((Math.floor((2 * base * LEVEL) / 100) + 5) * 1.0);
    const max = Math.floor((Math.floor(((2 * base + 31 + 63) * LEVEL) / 100) + 5) * 1.1);
    const scarf = Math.floor(max * 1.5);
    if (tier === "min") return min;
    if (tier === "scarf") return scarf;
    return max;
  }

  function buildSlots(containerId) {
    const wrap = document.getElementById(containerId);
    const slotTemplate = document.getElementById("pvt-slot-template");
    for (let i = 1; i <= 6; i++) {
      const frag = slotTemplate.content.cloneNode(true);
      frag.querySelector(".pvt-name").placeholder = TXT.namePlaceholderPrefix + i;

      const t1 = frag.querySelector(".pvt-type1");
      const t2 = frag.querySelector(".pvt-type2");
      TYPES.forEach(t => {
        const o1 = document.createElement("option"); o1.value = t; o1.textContent = t; t1.appendChild(o1);
        const o2 = document.createElement("option"); o2.value = t; o2.textContent = t; t2.appendChild(o2);
      });
      wrap.appendChild(frag);
    }
  }
  buildSlots("pvt-you-slots");
  buildSlots("pvt-opp-slots");

  function readTeam(containerId) {
    const rows = Array.from(document.querySelectorAll("#" + containerId + " .pvt-slot"));
    return rows.map((r, i) => {
      const name = r.querySelector(".pvt-name").value.trim();
      const t1 = r.querySelector(".pvt-type1").value;
      const t2 = r.querySelector(".pvt-type2").value;
      const base = parseFloat(r.querySelector(".pvt-base-spe").value);
      const tier = r.querySelector(".pvt-spe-tier").value;
      if (!name && !t1 && !base) return null;
      return {
        name: name || (TXT.namePlaceholderPrefix + (i + 1)),
        t1, t2,
        speed: base ? speedAt(base, tier) : null
      };
    }).filter(Boolean);
  }

  // ---------- Các hàm tiện ích dựng DOM ----------
  function el(tag, className, text) {
    const e = document.createElement(tag);
    if (className) e.className = className;
    if (text !== undefined) e.textContent = text;
    return e;
  }

  function buildReportPanel(titleText) {
    const panel = el("div", "pvt-report-panel");
    panel.appendChild(el("h2", null, titleText));
    return panel;
  }

  function buildSpeedPanel(speedEntries, maxSpeed) {
    const panel = buildReportPanel(TXT.speedComparisonTitle);
    if (speedEntries.length > 0) {
      speedEntries.forEach((e, i) => {
        const pct = Math.max(10, (e.speed / maxSpeed) * 100);

        const row = el("div", "pvt-lb-row");
        row.appendChild(el("div", "pvt-lb-rank", "#" + (i + 1)));

        const barWrap = el("div", "pvt-lb-bar-wrap");
        const bar = el("div", "pvt-lb-bar " + (e.side === "you" ? "pvt-bar-you" : "pvt-bar-opp"), e.name);
        bar.style.width = pct + "%";
        barWrap.appendChild(bar);
        row.appendChild(barWrap);

        row.appendChild(el("div", "pvt-lb-speed", e.speed));
        panel.appendChild(row);
      });
    } else {
      panel.appendChild(el("div", "pvt-footer-note", TXT.addSpeedNote));
    }
    panel.appendChild(el("div", "pvt-footer-note", TXT.speedLegendNote));
    return panel;
  }

  function buildDangerPanel(titleText, rows, teamSize) {
    const panel = buildReportPanel(titleText);
    if (rows.length === 0) {
      panel.appendChild(el("div", "pvt-footer-note", TXT.noSharedWeakness));
    } else {
      const table = document.createElement("table");
      table.className = "pvt-danger-table";

      const headRow = document.createElement("tr");
      headRow.appendChild(el("th", null, TXT.colTypeOpponentCarries));
      headRow.appendChild(el("th", null, TXT.colHowManyWeak));
      table.appendChild(headRow);

      rows.slice(0, 6).forEach(r => {
        const cls = r.weakCount >= 3 ? "pvt-danger-high" : r.weakCount === 2 ? "pvt-danger-med" : "pvt-danger-low";
        const tr = document.createElement("tr");
        tr.appendChild(el("td", "pvt-dtype", r.atkType));
        tr.appendChild(el("td", cls, r.weakCount + " / " + teamSize));
        table.appendChild(tr);
      });

      panel.appendChild(table);
    }
    return panel;
  }

  function buildSummaryPanel(youOutspeedCount, youLength, biggestWeaknessType) {
    const panel = buildReportPanel(TXT.quickSummaryTitle);
    const strip = el("div", "pvt-summary-strip");

    const chip1 = el("div", "pvt-summary-chip");
    chip1.appendChild(el("div", "pvt-sc-label", TXT.outspeedLabel));
    const val1 = el("div", "pvt-sc-value", youOutspeedCount + " / " + youLength);
    val1.style.color = "var(--pvt-you)";
    chip1.appendChild(val1);
    strip.appendChild(chip1);

    const chip2 = el("div", "pvt-summary-chip");
    chip2.appendChild(el("div", "pvt-sc-label", TXT.biggestWeaknessLabel));
    const val2 = el("div", "pvt-sc-value", biggestWeaknessType || TXT.dash);
    val2.style.color = "var(--pvt-red)";
    chip2.appendChild(val2);
    strip.appendChild(chip2);

    panel.appendChild(strip);
    return panel;
  }

  function renderReport() {
    const you = readTeam("pvt-you-slots");
    const opp = readTeam("pvt-opp-slots");
    const reportEl = document.getElementById("pvt-report");
    reportEl.innerHTML = "";

    if (you.length === 0 || opp.length === 0) {
      const panel = buildReportPanel("");
      panel.querySelector("h2").remove();
      panel.appendChild(el("div", "pvt-footer-note", TXT.fillTeamsNote));
      reportEl.appendChild(panel);
      return;
    }

    // ---------- Bảng Xếp Hạng Tốc Độ ----------
    const speedEntries = you.filter(p => p.speed !== null).map(p => ({ ...p, side: "you" }))
      .concat(opp.filter(p => p.speed !== null).map(p => ({ ...p, side: "opp" })));
    speedEntries.sort((a, b) => b.speed - a.speed);
    const maxSpeed = Math.max(...speedEntries.map(e => e.speed), 1);

    let youOutspeedCount = 0;
    const oppMaxSpeeds = opp.filter(p => p.speed !== null).map(p => p.speed);
    you.filter(p => p.speed !== null).forEach(p => {
      if (oppMaxSpeeds.every(os => p.speed > os)) youOutspeedCount++;
    });

    // ---------- Báo Cáo Điểm Yếu Theo Hệ ----------
    function dangerReport(defTeam, atkTeam) {
      return TYPES.map(atkType => {
        const weakCount = defTeam.filter(p => dualMult(atkType, p.t1, p.t2) > 1).length;
        const attackerHasType = atkTeam.some(p => p.t1 === atkType || p.t2 === atkType);
        return { atkType, weakCount, attackerHasType };
      }).filter(r => r.weakCount > 0 && r.attackerHasType)
        .sort((a, b) => b.weakCount - a.weakCount);
    }

    const yourDanger = dangerReport(you, opp);
    const oppDanger = dangerReport(opp, you);

    reportEl.appendChild(buildSummaryPanel(youOutspeedCount, you.length, yourDanger.length ? yourDanger[0].atkType : null));
    reportEl.appendChild(buildSpeedPanel(speedEntries, maxSpeed));
    reportEl.appendChild(buildDangerPanel(TXT.yourThreatsTitle, yourDanger, you.length));
    reportEl.appendChild(buildDangerPanel(TXT.theirThreatsTitle, oppDanger, opp.length));
  }

  document.getElementById("pvt-generate").addEventListener("click", renderReport);
})();
</script>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Một bản báo cáo, ba góc nhìn</mark></h2>



<p class="wp-block-paragraph">Matchup Scanner kết hợp logic của hai công cụ hiện có của chúng tôi — <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Công cụ tính toán cấp độ tốc độ Pokémon</a> và <a href="https://vngame.tv/cong-cu-phan-tich-diem-yeu-cua-doi-pokemon/" class="local-link" data-wpel-link="internal">Công cụ phân tích điểm yếu của đội Pokémon</a>  — thành một kết quả đầu ra duy nhất được xây dựng đặc biệt để so sánh hai đội trực tiếp:</p>



<ul class="wp-block-list">
<li><strong>So sánh tốc độ</strong> — tất cả Pokémon của cả hai đội được xếp hạng cùng nhau trên một bảng xếp hạng, giúp bạn dễ dàng nhận thấy tốc độ của đội mình và đội đối phương nằm ở mức nào.</li>



<li><strong>Các mối đe dọa mà bạn dễ bị tổn thương</strong> — sử dụng hệ của đối thủ làm thước đo cho các đòn tấn công STAB tiềm năng của chúng, điều này cho thấy những hệ nào mà chúng có thể mang theo và đe dọa nhiều Pokémon trong đội của bạn cùng một lúc.</li>



<li><strong>Các mối đe dọa mà chúng yếu thế trước</strong> — cùng một thao tác kiểm tra nhưng theo chiều ngược lại, cho bạn thấy loại tấn công nào sẽ gây sát thương lớn nhất cho đội của chúng.</li>
</ul>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Cách sử dụng</mark></h2>



<ol class="wp-block-list">
<li><strong>Hãy điền thông tin đội của bạn</strong> — tên (tùy chọn, chỉ để dễ đọc), một hoặc hai loại, Tốc độ cơ bản và mức đầu tư nhanh (Tối thiểu cho đội chưa đầu tư, Tối đa cho đội đầu tư tối đa với chỉ số Tốc độ cộng thêm, hoặc Tối đa cộng thêm Khăn choàng).</li>



<li><strong>Hãy điền thông tin về đội hình đối thủ</strong> theo cách tương tự — dựa trên danh sách đội hình đã được theo dõi, danh sách đội hình công khai của một giải đấu, hoặc dựa trên dự đoán tốt nhất của bạn về đội hình mà họ có khả năng sử dụng.</li>



<li><strong>Nhấp vào “Tạo báo cáo so sánh”</strong> và đọc ba phần: phần Tóm tắt nhanh sẽ cho bạn biết ngay lập tức có bao nhiêu Pokémon của bạn nhanh hơn toàn bộ đội hình của đối phương và điểm yếu chung lớn nhất của cả hai bên là gì, trước khi bạn xem đến các bảng chi tiết bên dưới.</li>
</ol>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Tại sao cách này hiệu quả hơn việc kiểm tra từng Pokémon một?</mark></h2>



<p class="wp-block-paragraph">Một lần kiểm tra Tốc độ hay một lần so sánh hệ chỉ cho bạn biết về một sự kết hợp cụ thể. Câu hỏi thực sự trước trận đấu rộng hơn:&nbsp;<strong>trên toàn bộ đội hình, đâu là những vấn đề lặp đi lặp lại?</strong>&nbsp;Một hệ chỉ đe dọa một trong số Pokémon của bạn chỉ là một sự bất tiện nhỏ; một hệ đe dọa ba hoặc bốn Pokémon cùng lúc — hiển thị ngay lập tức trong bảng “Những mối đe dọa bạn yếu thế” — là loại lỗ hổng quyết định trận đấu trước khi nó bắt đầu. Việc nhìn thấy cả hai đội hình được trình bày cùng nhau, thay vì ghép nối từ sáu lần kiểm tra riêng lẻ, chính là điều làm cho báo cáo trước trận đấu thực sự hữu ích chứ không chỉ đơn thuần là cung cấp thông tin.</p>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Câu hỏi thường gặp</mark></h2>



<p class="wp-block-paragraph"><strong>Tôi có thể lấy thông tin đội hình đối thủ trước trận đấu ở đâu?</strong> Đối với các đối thủ trong chế độ Xếp hạng, bạn thường không thể biết trước – hãy sử dụng công cụ này với đội hình mà bạn dự đoán dựa trên xu hướng meta hiện tại (xem <a href="https://vngame.tv/chuyen-muc/pokemon-champions/tier-list-champion/" class="local-link" data-wpel-link="internal">Bảng xếp hạng</a> của chúng tôi ). Đối với các giải đấu có danh sách đội hình công khai, hoặc các trận đấu thông thường với đối thủ đã biết, hãy nhập đội hình thực tế của họ để có báo cáo chính xác hơn.</p>



<p class="wp-block-paragraph"><strong>Báo cáo "Mối đe dọa" có tính đến bộ chiêu thức thực tế, chứ không chỉ là hệ?</strong>&nbsp;Không — nó sử dụng hệ của mỗi Pokémon làm đại diện cho đòn tấn công cùng hệ (STAB) có khả năng nhất, đây là một giả định hợp lý trong hầu hết các trường hợp nhưng không đảm bảo bộ chiêu thức thực tế của chúng. Một Pokémon sử dụng các chiêu thức có phạm vi tấn công bất thường nằm ngoài hệ của nó sẽ không xuất hiện trong báo cáo này.</p>



<p class="wp-block-paragraph"><strong>“Max + Scarf” có nghĩa là gì nếu đối thủ thực sự không sử dụng Choice Scarf?</strong>&nbsp;Nó được dùng như một trường hợp xấu nhất để kiểm tra – nếu bạn vẫn nhanh hơn Pokémon của họ ngay cả khi giả định họ dùng Choice Scarf, bạn có thể tự tin về trận đấu đó bất kể họ thực sự chọn vật phẩm nào. Nếu bạn chỉ nhanh hơn Pokémon cấp “Max” của họ nhưng không nhanh hơn “Max + Scarf”, đó là một rủi ro thực sự cần phải lên kế hoạch cẩn thận.</p>



<p class="wp-block-paragraph"><strong>Tôi có thể sử dụng công cụ này cho cả các trận đấu đơn chứ không chỉ đôi không?</strong>&nbsp;Có – logic về tốc độ và phạm vi loại áp dụng giống nhau bất kể thể thức nào. Công cụ này không phân biệt giữa đơn và đôi vì cả hai đều sử dụng cùng một cơ chế thống kê và loại cơ bản.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Các công cụ liên quan: <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Công cụ tính toán cấp độ tốc độ</a> — cho một trận đấu chi tiết hơn. <a href="https://vngame.tv/cong-cu-phan-tich-diem-yeu-cua-doi-pokemon/" class="local-link" data-wpel-link="internal">Công cụ phân tích điểm yếu của đội</a> — cho bản đồ nhiệt đầy đủ về đội của bạn mà không cần đối thủ. <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Biểu đồ chuẩn tốc độ Meta</a> — tham khảo nhanh tốc độ của các mối đe dọa hàng đầu trong thể thức này.</em></p>
<p>Bài viết <a href="https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/" data-wpel-link="internal">Báo cáo so sánh đội hình Pokémon Champions</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17641</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: vngame.tv @ 2026-10-14 14:29:51 by W3 Total Cache
-->