{"id":13552,"date":"2026-04-30T23:41:15","date_gmt":"2026-04-30T15:41:15","guid":{"rendered":"https:\/\/tiffanysmandarin.com\/?p=13552"},"modified":"2026-05-03T13:41:42","modified_gmt":"2026-05-03T05:41:42","slug":"chinese-food-matching-game","status":"publish","type":"post","link":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/","title":{"rendered":"Chinese Food Matching Game"},"content":{"rendered":"\n<div style=\"height:6px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Let\u2019s see if you can read a Chinese menu<\/h2>\n\n\n\n<div style=\"height:72px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!DOCTYPE html>\n<html lang=\"zh-TW\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\n<title>Food Matching Game<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Fraunces:opsz,wght@9..144,700&#038;family=DM+Sans:wght@400;500;600&#038;display=swap\" rel=\"stylesheet\">\n<style>\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n:root {\n  --bg: #faf8f4; --surface: #ffffff;\n  --ink: #1c1917; --ink2: #78716c;\n  --border: rgba(28,25,23,.10); --border-h: rgba(28,25,23,.24);\n  --sel-bg: #1c1917; --sel-fg: #faf8f4;\n  --r: clamp(7px, 1.4vw, 12px);\n  --gap: clamp(4px, 0.9vw, 8px);\n  --pad: clamp(10px, 3vw, 24px);\n\n  \/* All font sizes scale fluidly with viewport width *\/\n  --fs-h1:     clamp(16px, 3.2vw, 28px);\n  --fs-sub:    clamp(10px, 1.5vw, 14px);\n  --fs-tab:    clamp(11px, 1.4vw, 14px);\n  --fs-stage:  clamp(12px, 1.6vw, 15px);\n  --fs-hint:   clamp(10px, 1.3vw, 13px);\n  --fs-tile:   clamp(11px, 2.1vw, 16px);\n  --fs-sname:  clamp(11px, 1.5vw, 14px);\n  --fs-sitems: clamp(10px, 1.2vw, 12px);\n  --fs-fb:     clamp(11px, 1.3vw, 13px);\n  --fs-btn:    clamp(11px, 1.3vw, 13px);\n  --fs-trans:  clamp(15px, 2.4vw, 22px);\n  --fs-end:    clamp(17px, 3vw, 26px);\n\n  \/* Category colours *\/\n  --cy-bg:#fff7e0;--cy-t:#7a5500;--cy-b:#f2c84b;\n  --cg-bg:#e8f5e1;--cg-t:#2a5a18;--cg-b:#8ecb6a;\n  --cb-bg:#deeeff;--cb-t:#0a3c7a;--cb-b:#7ab4ee;\n  --cp-bg:#eeeefe;--cp-t:#38319a;--cp-b:#b4b0f4;\n  --co-bg:#fde9d8;--co-t:#7a2e0c;--co-b:#f0a06a;\n  --ct-bg:#d8f5ef;--ct-t:#0a5540;--ct-b:#72ccb8;\n}\n\nhtml, body { width: 100%; height: 100%; overflow-x: clip; -webkit-text-size-adjust: 100%; }\nhtml { overflow-y: auto; }\n\nbody {\n  background: var(--bg);\n  color: var(--ink);\n  font-family: 'DM Sans', sans-serif;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  \/* Safe-area aware padding \u2014 no shorthand to avoid iOS Safari env() parse bug *\/\n  padding-top:    max(var(--pad), env(safe-area-inset-top));\n  padding-left:   max(var(--pad), env(safe-area-inset-left));\n  padding-right:  max(var(--pad), env(safe-area-inset-right));\n  padding-bottom: max(var(--pad), env(safe-area-inset-bottom));\n  min-height: 100%;\n}\n\n\/* Central column \u2014 max 640px, stretches to fill height *\/\n.inner {\n  width: 100%;\n  max-width: 640px;\n  margin: 0 auto;\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  gap: clamp(5px, 1.2vh, 14px);\n}\n\n\/* \u2500\u2500 Header \u2500\u2500 *\/\n.hdr { text-align: center; flex-shrink: 0; }\nh1 {\n  font-family: 'Fraunces', Georgia, serif;\n  font-size: var(--fs-h1);\n  font-weight: 700; letter-spacing: .01em; line-height: 1.1;\n}\n.subtitle { font-size: var(--fs-sub); color: var(--ink2); margin-top: 2px; }\n\n\/* \u2500\u2500 Script toggle \u2500\u2500 *\/\n.script-toggle {\n  display: flex; align-items: center;\n  border: 1.5px solid var(--border-h); border-radius: 20px;\n  overflow: hidden; align-self: center; flex-shrink: 0;\n}\n.script-toggle button {\n  padding: clamp(4px,.8vh,7px) clamp(12px,2.5vw,20px);\n  border: none; background: transparent; cursor: pointer;\n  color: var(--ink2); font-size: var(--fs-tab); font-weight: 500;\n  font-family: 'DM Sans', sans-serif;\n  transition: background .15s, color .15s; line-height: 1;\n}\n.script-toggle button.active { background: var(--ink); color: #fff; }\n.script-divider { width: 1px; height: 26px; background: var(--border-h); flex-shrink: 0; }\n\n\/* \u2500\u2500 Game & End screens \u2500\u2500 *\/\n#game, #end-screen {\n  width: 100%; display: flex;\n  flex-direction: column;\n  gap: clamp(4px, .8vh, 9px);\n  flex: 1;\n}\n#end-screen { display: none; text-align: center; }\n\n\/* \u2500\u2500 Top bar \u2500\u2500 *\/\n.top-bar { display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; }\n.stage-title { font-size: var(--fs-stage); font-weight: 600; }\n.stage-num   { font-size: var(--fs-hint); color: var(--ink2); }\n.hint-bar    { font-size: var(--fs-hint); color: var(--ink2); text-align: center; min-height: 1.4em; flex-shrink: 0; }\n\n\/* \u2500\u2500 Solved rows \u2500\u2500 *\/\n.solved-area { display: flex; flex-direction: column; gap: clamp(3px,.5vh,5px); flex-shrink: 0; }\n.srow {\n  border-radius: var(--r);\n  padding: clamp(5px,1vh,10px) clamp(10px,2vw,16px);\n  width: 100%;\n  display: flex; flex-direction: column; align-items: center; justify-content: center;\n  min-height: clamp(36px,6.5vh,54px);\n  animation: revealRow .5s cubic-bezier(.34,1.56,.64,1) both;\n}\n@keyframes revealRow {\n  from { opacity:0; transform:scaleY(.6) translateY(-6px); }\n  to   { opacity:1; transform:scaleY(1) translateY(0); }\n}\n.srow .sname  { font-size: var(--fs-sname); font-weight: 600; }\n.srow .sitems { font-size: var(--fs-sitems); margin-top: 2px; opacity: .82; text-align: center; }\n\n.cy{background:var(--cy-bg);border:1px solid var(--cy-b)}.cy .sname,.cy .sitems{color:var(--cy-t)}\n.cg{background:var(--cg-bg);border:1px solid var(--cg-b)}.cg .sname,.cg .sitems{color:var(--cg-t)}\n.cb{background:var(--cb-bg);border:1px solid var(--cb-b)}.cb .sname,.cb .sitems{color:var(--cb-t)}\n.cp{background:var(--cp-bg);border:1px solid var(--cp-b)}.cp .sname,.cp .sitems{color:var(--cp-t)}\n.co{background:var(--co-bg);border:1px solid var(--co-b)}.co .sname,.co .sitems{color:var(--co-t)}\n.ct{background:var(--ct-bg);border:1px solid var(--ct-b)}.ct .sname,.ct .sitems{color:var(--ct-t)}\n\n\/* \u2500\u2500 Tile grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   aspect-ratio: height tracks width automatically \u2192 no overflow\n   \u2500\u2500 *\/\n.grid {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: var(--gap);\n  width: 100%;\n  flex-shrink: 1;   \/* shrink if vertical space is tight *\/\n}\n.tile {\n  width: 100%;\n  aspect-ratio: 3 \/ 2;   \/* fluid height, proportional to width *\/\n  padding: 4px 3px;\n  border-radius: var(--r);\n  border: 1.5px solid var(--border);\n  background: var(--surface);\n  font-size: var(--fs-tile); font-weight: 500; color: var(--ink);\n  cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  text-align: center; user-select: none; line-height: 1.25;\n  word-break: break-all; overflow-wrap: break-word; overflow: hidden;\n  transition: background .12s, border-color .12s, color .12s, transform .1s, box-shadow .12s;\n  -webkit-tap-highlight-color: transparent;\n}\n.tile:hover  { border-color:var(--border-h); transform:translateY(-1px); box-shadow:0 3px 8px rgba(0,0,0,.07); }\n.tile.sel    { background:var(--sel-bg); color:var(--sel-fg); border-color:var(--sel-bg); transform:scale(1.04); box-shadow:0 4px 14px rgba(0,0,0,.18); }\n.tile.bounce { animation:bnc .5s ease; }\n@keyframes bnc  { 0%,100%{transform:translateY(0) scale(1)} 30%{transform:translateY(-10px) scale(1.06)} 60%{transform:translateY(-3px) scale(1.02)} }\n.tile.shake  { animation:shk .4s ease; }\n@keyframes shk  { 0%,100%{transform:translateX(0)} 20%{transform:translateX(-7px)} 40%{transform:translateX(7px)} 60%{transform:translateX(-5px)} 80%{transform:translateX(4px)} }\n.tile.pop    { animation:ppop .2s ease; }\n@keyframes ppop { 0%{transform:scale(1)} 50%{transform:scale(1.12)} 100%{transform:scale(1.04)} }\n\n\/* \u2500\u2500 Feedback \u2500\u2500 *\/\n.fb { text-align:center; font-size:var(--fs-fb); min-height:1.4em; color:var(--ink2); flex-shrink:0; }\n.fb.in { animation:fdin .3s ease; }\n@keyframes fdin { from{opacity:0;transform:translateY(-4px)} to{opacity:1;transform:translateY(0)} }\n\n\/* \u2500\u2500 Buttons \u2500\u2500 *\/\n.btn-row { display:flex; gap:clamp(6px,1.5vw,10px); justify-content:center; flex-shrink:0; }\n.btn {\n  padding: clamp(6px,1vh,9px) clamp(14px,3vw,22px);\n  border-radius: 20px; border: 1.5px solid var(--border-h);\n  background: transparent; font-size: var(--fs-btn); font-weight: 500;\n  cursor: pointer; color: var(--ink);\n  transition: background .12s, transform .1s;\n  font-family: 'DM Sans', sans-serif;\n}\n.btn:hover  { background:rgba(28,25,23,.06); }\n.btn:active { transform:scale(.97); }\n.btn-primary {\n  background: var(--ink); color: var(--sel-fg); border-color: var(--ink);\n  padding: clamp(9px,1.4vh,13px) clamp(24px,5vw,40px);\n  font-size: clamp(13px,1.8vw,16px); border-radius: 24px;\n}\n.btn-primary:hover { background:#333; }\n\n\/* \u2500\u2500 Confetti canvas (outside body) \u2500\u2500 *\/\n#confetti-canvas { position:fixed; top:0; left:0; width:100%; height:100%; pointer-events:none; z-index:999; }\n\n\/* \u2500\u2500 Toast \u2500\u2500 *\/\n.toast {\n  position: fixed; top: -80px; left: 0; right: 0;\n  width: fit-content; max-width: 88%; margin: 0 auto;\n  background: var(--ink); color: #fff;\n  padding: clamp(8px,1.2vh,11px) clamp(14px,3vw,22px);\n  border-radius: 24px; font-size: var(--fs-btn); font-weight: 500;\n  text-align: center; z-index: 1000;\n  transition: top .35s cubic-bezier(.34,1.56,.64,1), opacity .3s;\n  opacity: 0; pointer-events: none;\n}\n.toast.show { top: clamp(10px,2vh,22px); opacity: 1; pointer-events: auto; }\n\n\/* \u2500\u2500 Transition overlay \u2500\u2500 *\/\n#transition-overlay {\n  position: fixed; inset: 0; background: rgba(250,248,244,.97);\n  z-index: 900; display: none;\n  align-items: center; justify-content: center; flex-direction: column;\n  text-align: center; gap: clamp(6px,1.2vh,14px);\n  padding: var(--pad); overflow-y: auto;\n}\n#transition-overlay.show { display: flex; }\n.trans-emoji { font-size: clamp(36px,8vw,56px); }\n.trans-title { font-family:'Fraunces',serif; font-size:var(--fs-trans); font-weight:700; }\n.trans-sub   { font-size:var(--fs-hint); color:var(--ink2); }\n.trans-groups { width:100%; max-width:480px; display:flex; flex-direction:column; gap:clamp(3px,.5vh,5px); }\n\n\/* \u2500\u2500 End screen \u2500\u2500 *\/\n.end-title { font-family:'Fraunces',serif; font-size:var(--fs-end); font-weight:700; }\n.end-sub   { font-size:var(--fs-hint); color:var(--ink2); }\n.end-all-groups { text-align:left; width:100%; }\n.end-stage-label {\n  font-size:var(--fs-hint); font-weight:600; color:var(--ink2);\n  text-transform:uppercase; letter-spacing:.07em;\n  margin: clamp(8px,1.4vh,14px) 0 4px;\n}\n\n\/* \u2500\u2500 Touch: no sticky hover \u2500\u2500 *\/\n@media (hover:none) {\n  .tile:hover { transform:none; box-shadow:none; border-color:var(--border); background:var(--surface); }\n  .btn:hover  { background:transparent; }\n}\n\n\/* \u2500\u2500 Landscape phone: compress rows \u2500\u2500 *\/\n@media (max-height:520px) and (orientation:landscape) {\n  .inner { gap: 3px; }\n  .subtitle { display: none; }\n  #game, #end-screen { gap: 3px; }\n  .srow { min-height: 28px; padding: 2px 8px; }\n  .hint-bar { display: none; }\n  .fb { min-height: .8em; }\n  .tile { aspect-ratio: 5 \/ 2; }  \/* flatter in landscape *\/\n}\n<\/style>\n<\/head>\n<canvas id=\"confetti-canvas\"><\/canvas>\n<body>\n<div class=\"inner\">\n\n  <div class=\"hdr\">\n    <h1>Food Matching Game<\/h1>\n    <p class=\"subtitle\">Find the connection \u2014 category names revealed only when you&#8217;re correct<\/p>\n  <\/div>\n\n  <div class=\"script-toggle\">\n    <button id=\"btn-tw\" class=\"active\" onclick=\"setScript('tw')\">\u7e41\u9ad4<\/button>\n    <div class=\"script-divider\"><\/div>\n    <button id=\"btn-cn\" onclick=\"setScript('cn')\">\u7b80\u4f53<\/button>\n  <\/div>\n\n  <div class=\"toast\" id=\"toast\"><\/div>\n\n  <div id=\"transition-overlay\">\n    <div class=\"trans-emoji\" id=\"trans-emoji\"><\/div>\n    <div class=\"trans-title\" id=\"trans-title\"><\/div>\n    <div class=\"trans-sub\"   id=\"trans-sub\"><\/div>\n    <div class=\"trans-groups\" id=\"trans-groups\"><\/div>\n    <button class=\"btn btn-primary\" id=\"trans-btn\"><\/button>\n  <\/div>\n\n  <div id=\"game\">\n    <div class=\"top-bar\">\n      <span class=\"stage-title\" id=\"top-title\"><\/span>\n      <span class=\"stage-num\"   id=\"top-stage\"><\/span>\n    <\/div>\n    <div class=\"hint-bar\" id=\"hint-bar\"><\/div>\n    <div class=\"solved-area\" id=\"solved-area\"><\/div>\n    <div class=\"grid\" id=\"grid\"><\/div>\n    <div class=\"fb\"   id=\"fb\"><\/div>\n    <div class=\"btn-row\">\n      <button class=\"btn\" onclick=\"doShuffle()\">Shuffle<\/button>\n      <button class=\"btn\" onclick=\"doClear()\">Clear<\/button>\n    <\/div>\n  <\/div>\n\n  <div id=\"end-screen\">\n    <div class=\"end-title\">\ud83c\udf89 All 4 Rounds Complete!<\/div>\n    <div class=\"end-sub\" id=\"end-sub\"><\/div>\n    <div class=\"end-all-groups\" id=\"end-all-groups\"><\/div>\n    <button class=\"btn btn-primary\" onclick=\"restartGame()\" style=\"margin-top:8px;align-self:center\">Play Again<\/button>\n  <\/div>\n\n<\/div>\n\n<script>\nlet scriptMode = 'tw';\n\nconst TW_TO_CN = {\n  '\u7d05\u863f\u8514':'\u80e1\u841d\u535c','\u99ac\u9234\u85af':'\u571f\u8c46','\u5496\u54e9':'\u5496\u55b1','\u70cf\u9f8d\u9eb5':'\u4e4c\u51ac\u9762',\n  '\u9baa\u9b5a':'\u91d1\u67aa\u9c7c','\u9bad\u9b5a':'\u4e09\u6587\u9c7c','\u6d77\u81bd':'\u6d77\u80c6','\u5e72\u8c9d':'\u6247\u8d1d',\n  '\u62c9\u9eb5':'\u62c9\u9762','\u53c9\u71d2\u8089':'\u53c9\u70e7\u8089','\u534a\u719f\u86cb':'\u6e8f\u5fc3\u86cb','\u7af9\u7b4d':'\u7af9\u7b0b',\n  '\u5c0f\u9ec3\u74dc':'\u9ec4\u74dc','\u756a\u8304':'\u897f\u7ea2\u67ff','\u751f\u83dc':'\u751f\u83dc','\u6a44\u6b16':'\u6a44\u6984',\n  '\u99ac\u672d\u745e\u62c9':'\u9a6c\u82cf\u91cc\u62c9','\u756a\u8304\u91ac':'\u756a\u8304\u9171','\u4e5d\u5c64\u5854':'\u7f57\u52d2','\u62ab\u85a9\u9905\u76ae':'\u62ab\u8428\u997c\u76ae',\n  '\u70b8\u96de':'\u70b8\u9e21','\u6f22\u5821':'\u6c49\u5821\u5305','\u85af\u689d':'\u85af\u6761','\u53ef\u6a02':'\u53ef\u4e50',\n  '\u70b8\u6392\u9aa8':'\u70b8\u6392\u9aa8','\u7092\u7da0\u82b1\u6930':'\u7092\u897f\u84dd\u82b1','\u84b8\u86cb':'\u84b8\u86cb\u7fb9','\u767d\u98ef':'\u767d\u7c73\u996d',\n  '\u706b\u934b\u6599':'\u706b\u9505\u6599','\u7f8a\u8089\u7247':'\u7f8a\u8089\u7247','\u9ad8\u9e97\u83dc':'\u5377\u5fc3\u83dc','\u9999\u83c7':'\u9999\u83c7',\n  '\u7092\u624b':'\u6284\u624b','\u6c34\u9903':'\u6c34\u997a','\u934b\u8cbc':'\u9505\u8d34','\u991b\u98e9':'\u9984\u9968',\n  '\u73cd\u73e0':'\u73cd\u73e0','\u7d05\u8336':'\u7ea2\u8336','\u725b\u5976':'\u725b\u5976','\u7cd6':'\u7cd6',\n  '\u85cd\u8393':'\u84dd\u8393','\u512a\u683c':'\u9178\u5976','\u5947\u4e9e\u7c7d':'\u5947\u4e9a\u7c7d','\u8349\u8393':'\u8349\u8393',\n  '\u86cb\u9905':'\u86cb\u997c','\u5410\u53f8\u539a\u7247':'\u539a\u7247\u5410\u53f8','\u9435\u677f\u9eb5':'\u94c1\u677f\u9762','\u4e09\u660e\u6cbb':'\u4e09\u660e\u6cbb',\n  '\u725b\u8089':'\u725b\u8089','\u5bb6\u5e38\u9eb5':'\u5bb6\u5e38\u9762','\u725b\u8089\u6e6f':'\u725b\u8089\u6c64','\u8525':'\u8471',\n  '\u7092\u7c73\u7c89':'\u7092\u7c73\u7c89','\u6ef7\u8089\u98ef':'\u5364\u8089\u996d','\u8089\u5713':'\u8089\u5706','\u81ed\u8c46\u8150':'\u81ed\u8c46\u8150',\n  '\u5473\u564c':'\u5473\u564c','\u8c46\u8150':'\u8c46\u8150','\u5c0f\u9b5a\u4e7e':'\u5c0f\u9c7c\u5e72','\u7d2b\u83dc':'\u7d2b\u83dc',\n  '\u5de7\u514b\u529b':'\u5de7\u514b\u529b','\u5976\u9165':'\u5976\u9165','\u5927\u849c':'\u5927\u849c',\n  '\u5e15\u5c3c\u5c3c':'\u5e15\u5c3c\u5c3c','\u53ef\u980c':'\u53ef\u9882','\u78da\u58d3':'\u7816\u538b','\u746a\u82ac':'\u9a6c\u82ac',\n  '\u5730\u74dc\u8449':'\u833c\u84bf','\u6c34\u84ee':'\u6cb9\u9ea6\u83dc','\u7a7a\u5fc3\u83dc':'\u7a7a\u5fc3\u83dc','\u9752\u6c5f\u83dc':'\u4e0a\u6d77\u9752',\n  '\u5473\u564c\u6e6f':'\u5473\u564c\u6c64','\u5496\u54e9\u70cf\u9f8d':'\u5496\u55b1\u4e4c\u51ac','\u58fd\u53f8':'\u5bff\u53f8','\u8c5a\u9aa8\u62c9\u9eb5':'\u732a\u9aa8\u62c9\u9762',\n  '\u9e79\u6c34\u96de':'\u76d0\u6c34\u9e21','\u9e79\u9165\u96de':'\u54b8\u9165\u9e21','\u5730\u74dc\u7403':'\u5730\u74dc\u7403','\u6ef7\u5473':'\u5364\u5473',\n  '\u725b\u8089\u9eb5':'\u725b\u8089\u9762','\u6392\u9aa8\u4fbf\u7576':'\u6392\u9aa8\u4fbf\u5f53','\u9903\u5b50':'\u997a\u5b50','\u5c0f\u706b\u934b':'\u5c0f\u706b\u9505',\n  '\u62ab\u85a9':'\u62ab\u8428','\u901f\u98df':'\u5feb\u9910','\u679c\u6614':'\u679c\u6614','\u6c99\u62c9':'\u6c99\u62c9',\n  '\u91d1\u6c99\u8766\u7403':'\u91d1\u6c99\u867e\u7403','\u8525\u7206\u725b\u8089':'\u8471\u7206\u725b\u8089','\u6dbc\u62cc\u7af9\u7b4d':'\u51c9\u62cc\u7af9\u7b0b','\u7cd6\u918b\u9b5a\u7247':'\u7cd6\u918b\u9c7c\u7247',\n  '\u767e\u9999\u679c':'\u767e\u9999\u679c','\u9cf3\u68a8':'\u83e0\u841d','\u897f\u74dc':'\u897f\u74dc','\u6728\u74dc':'\u6728\u74dc',\n  '\u73cd\u73e0\u5976\u8336':'\u73cd\u73e0\u5976\u8336','\u53f0\u7063\u65e9\u9910':'\u53f0\u6e7e\u65e9\u9910','\u50b3\u7d71\u5c0f\u5403':'\u4f20\u7edf\u5c0f\u5403',\n  '\u5410\u53f8\u53e3\u5473':'\u5410\u53f8\u53e3\u5473','\u65e9\u5348\u9910\u9eb5\u5305':'\u65e9\u5348\u9910\u9762\u5305','\u9752\u83dc':'\u9752\u83dc',\n  '\u65e5\u672c\u6599\u7406':'\u65e5\u672c\u6599\u7406','\u591c\u5e02\u5c0f\u5403':'\u591c\u5e02\u5c0f\u5403','\u53f0\u7063\u6599\u7406':'\u53f0\u6e7e\u6599\u7406',\n  '\u897f\u5f0f\u6599\u7406':'\u897f\u5f0f\u6599\u7406','\u71b1\u7092':'\u70ed\u7092','\u6c34\u679c':'\u6c34\u679c',\n};\nconst t = w => scriptMode==='tw' ? w : (TW_TO_CN[w] ?? w);\n\nfunction setScript(mode) {\n  if (scriptMode === mode) return;\n  scriptMode = mode;\n  document.getElementById('btn-tw').classList.toggle('active', mode==='tw');\n  document.getElementById('btn-cn').classList.toggle('active', mode==='cn');\n  document.querySelectorAll('.tile').forEach(el => el.textContent = t(el.dataset.word));\n  document.querySelectorAll('.srow').forEach(row => {\n    row.querySelector('.sname').textContent = t(row.dataset.twname);\n    row.querySelector('.sitems').textContent = row.dataset.twitems.split('|').map(w=>t(w)).join('\u3001');\n  });\n  document.getElementById('hint-bar').textContent = STAGES[si].hint;\n}\n\nconst STAGES = [\n  { title:\"Round 1 \u2014 Ingredients\", hint:\"Select 4 ingredients that belong to the same dish\",\n    groups:[\n      {name:\"\u5496\u54e9\u70cf\u9f8d\",color:\"cy\",items:[\"\u7d05\u863f\u8514\",\"\u99ac\u9234\u85af\",\"\u5496\u54e9\",\"\u70cf\u9f8d\u9eb5\"]},\n      {name:\"\u58fd\u53f8\",    color:\"cg\",items:[\"\u9baa\u9b5a\",\"\u9bad\u9b5a\",\"\u6d77\u81bd\",\"\u5e72\u8c9d\"]},\n      {name:\"\u8c5a\u9aa8\u62c9\u9eb5\",color:\"cb\",items:[\"\u62c9\u9eb5\",\"\u53c9\u71d2\u8089\",\"\u534a\u719f\u86cb\",\"\u7af9\u7b4d\"]},\n      {name:\"\u6c99\u62c9\",    color:\"cp\",items:[\"\u5c0f\u9ec3\u74dc\",\"\u756a\u8304\",\"\u751f\u83dc\",\"\u6a44\u6b16\"]},\n      {name:\"\u62ab\u85a9\",    color:\"co\",items:[\"\u99ac\u672d\u745e\u62c9\",\"\u756a\u8304\u91ac\",\"\u4e5d\u5c64\u5854\",\"\u62ab\u85a9\u9905\u76ae\"]},\n      {name:\"\u901f\u98df\",    color:\"ct\",items:[\"\u70b8\u96de\",\"\u6f22\u5821\",\"\u85af\u689d\",\"\u53ef\u6a02\"]},\n    ]},\n  { title:\"Round 2 \u2014 Ingredients\", hint:\"Select 4 ingredients that belong to the same dish\",\n    groups:[\n      {name:\"\u6392\u9aa8\u4fbf\u7576\",color:\"cy\",items:[\"\u70b8\u6392\u9aa8\",\"\u7092\u7da0\u82b1\u6930\",\"\u84b8\u86cb\",\"\u767d\u98ef\"]},\n      {name:\"\u5c0f\u706b\u934b\",  color:\"cg\",items:[\"\u706b\u934b\u6599\",\"\u7f8a\u8089\u7247\",\"\u9ad8\u9e97\u83dc\",\"\u9999\u83c7\"]},\n      {name:\"\u9903\u5b50\",    color:\"cb\",items:[\"\u7092\u624b\",\"\u6c34\u9903\",\"\u934b\u8cbc\",\"\u991b\u98e9\"]},\n      {name:\"\u73cd\u73e0\u5976\u8336\",color:\"cp\",items:[\"\u73cd\u73e0\",\"\u7d05\u8336\",\"\u725b\u5976\",\"\u7cd6\"]},\n      {name:\"\u679c\u6614\",    color:\"co\",items:[\"\u85cd\u8393\",\"\u512a\u683c\",\"\u5947\u4e9e\u7c7d\",\"\u8349\u8393\"]},\n      {name:\"\u53f0\u7063\u65e9\u9910\",color:\"ct\",items:[\"\u86cb\u9905\",\"\u5410\u53f8\u539a\u7247\",\"\u9435\u677f\u9eb5\",\"\u4e09\u660e\u6cbb\"]},\n    ]},\n  { title:\"Round 3 \u2014 Ingredients\", hint:\"Select 4 ingredients that belong to the same dish\",\n    groups:[\n      {name:\"\u725b\u8089\u9eb5\",    color:\"cy\",items:[\"\u725b\u8089\",\"\u5bb6\u5e38\u9eb5\",\"\u725b\u8089\u6e6f\",\"\u8525\"]},\n      {name:\"\u50b3\u7d71\u5c0f\u5403\",  color:\"cg\",items:[\"\u7092\u7c73\u7c89\",\"\u6ef7\u8089\u98ef\",\"\u8089\u5713\",\"\u81ed\u8c46\u8150\"]},\n      {name:\"\u5473\u564c\u6e6f\",    color:\"cb\",items:[\"\u5473\u564c\",\"\u8c46\u8150\",\"\u5c0f\u9b5a\u4e7e\",\"\u7d2b\u83dc\"]},\n      {name:\"\u5410\u53f8\u53e3\u5473\",  color:\"cp\",items:[\"\u5de7\u514b\u529b\",\"\u8349\u8393\",\"\u5976\u9165\",\"\u5927\u849c\"]},\n      {name:\"\u65e9\u5348\u9910\u9eb5\u5305\",color:\"co\",items:[\"\u5e15\u5c3c\u5c3c\",\"\u53ef\u980c\",\"\u78da\u58d3\",\"\u746a\u82ac\"]},\n      {name:\"\u9752\u83dc\",      color:\"ct\",items:[\"\u5730\u74dc\u8449\",\"\u6c34\u84ee\",\"\u7a7a\u5fc3\u83dc\",\"\u9752\u6c5f\u83dc\"]},\n    ]},\n  { title:\"Round 4 \u2014 Categories\", hint:\"Select 4 dishes or foods that belong to the same category\",\n    groups:[\n      {name:\"\u65e5\u672c\u6599\u7406\",color:\"cp\",items:[\"\u5473\u564c\u6e6f\",\"\u5496\u54e9\u70cf\u9f8d\",\"\u58fd\u53f8\",\"\u8c5a\u9aa8\u62c9\u9eb5\"]},\n      {name:\"\u591c\u5e02\u5c0f\u5403\",color:\"cb\",items:[\"\u9e79\u6c34\u96de\",\"\u9e79\u9165\u96de\",\"\u5730\u74dc\u7403\",\"\u6ef7\u5473\"]},\n      {name:\"\u53f0\u7063\u6599\u7406\",color:\"cg\",items:[\"\u725b\u8089\u9eb5\",\"\u6392\u9aa8\u4fbf\u7576\",\"\u9903\u5b50\",\"\u5c0f\u706b\u934b\"]},\n      {name:\"\u897f\u5f0f\u6599\u7406\",color:\"cy\",items:[\"\u62ab\u85a9\",\"\u901f\u98df\",\"\u679c\u6614\",\"\u6c99\u62c9\"]},\n      {name:\"\u71b1\u7092\",    color:\"co\",items:[\"\u91d1\u6c99\u8766\u7403\",\"\u8525\u7206\u725b\u8089\",\"\u6dbc\u62cc\u7af9\u7b4d\",\"\u7cd6\u918b\u9b5a\u7247\"]},\n      {name:\"\u6c34\u679c\",    color:\"ct\",items:[\"\u767e\u9999\u679c\",\"\u9cf3\u68a8\",\"\u897f\u74dc\",\"\u6728\u74dc\"]},\n    ]},\n];\n\n\/\/ Audio\nconst AC = new (window.AudioContext||window.webkitAudioContext)();\nfunction tone(f,type,dur,vol=0.16){\n  const o=AC.createOscillator(),g=AC.createGain();\n  o.connect(g);g.connect(AC.destination);\n  o.type=type;o.frequency.value=f;\n  g.gain.setValueAtTime(vol,AC.currentTime);\n  g.gain.exponentialRampToValueAtTime(0.001,AC.currentTime+dur);\n  o.start();o.stop(AC.currentTime+dur);\n}\nconst playSelect  = ()=>tone(660,'sine',.08,.12);\nconst playCorrect = ()=>[523,659,784,1047].forEach((f,i)=>setTimeout(()=>tone(f,'sine',.18,.15),i*70));\nconst playWrong   = ()=>{tone(220,'sawtooth',.12,.12);setTimeout(()=>tone(196,'sawtooth',.15,.1),120);};\nconst playWin     = ()=>[523,587,659,698,784,880,988,1047].forEach((f,i)=>setTimeout(()=>tone(f,'sine',.22,.13),i*55));\n\n\/\/ Confetti\nconst cvs=document.getElementById('confetti-canvas'),cx=cvs.getContext('2d');\nlet parts=[];\nfunction launchConfetti(n=90){\n  cvs.width=innerWidth;cvs.height=innerHeight;\n  const cols=['#fff7e0','#e8f5e1','#deeeff','#eeeefe','#fde9d8','#d8f5ef',\n              '#f2c84b','#8ecb6a','#7ab4ee','#b4b0f4','#f0a06a','#72ccb8'];\n  for(let i=0;i<n;i++) parts.push({\n    x:Math.random()*cvs.width,y:Math.random()*-cvs.height*.3-20,\n    r:Math.random()*7+3,color:cols[~~(Math.random()*cols.length)],\n    vx:(Math.random()-.5)*5,vy:Math.random()*5+3,\n    rot:Math.random()*360,vr:(Math.random()-.5)*8,\n    shape:Math.random()<.5?'rect':'circle'\n  });\n  if(!confRun) animConf();\n}\nlet confRun=false;\nfunction animConf(){\n  confRun=true;cx.clearRect(0,0,cvs.width,cvs.height);\n  parts=parts.filter(p=>p.y<cvs.height+20);\n  parts.forEach(p=>{\n    p.x+=p.vx;p.y+=p.vy;p.rot+=p.vr;p.vy+=.1;\n    cx.save();cx.translate(p.x,p.y);cx.rotate(p.rot*Math.PI\/180);\n    cx.fillStyle=p.color;\n    p.shape==='rect'?cx.fillRect(-p.r,-p.r\/2,p.r*2,p.r):(cx.beginPath(),cx.arc(0,0,p.r,0,Math.PI*2),cx.fill());\n    cx.restore();\n  });\n  parts.length?requestAnimationFrame(animConf):confRun=false;\n}\n\n\/\/ Toast\nlet toastT=null;\nfunction showToast(msg,dur=1600){\n  const el=document.getElementById('toast');\n  el.textContent=msg;el.classList.add('show');\n  clearTimeout(toastT);toastT=setTimeout(()=>el.classList.remove('show'),dur);\n}\n\n\/\/ Helpers\nconst shuffle=a=>{const b=[...a];for(let i=b.length-1;i>0;i--){const j=0|Math.random()*(i+1);[b[i],b[j]]=[b[j],b[i]];}return b;};\nconst qw=w=>document.querySelector(`.tile[data-word=\"${CSS.escape(w)}\"]`);\nconst CC={\n  cy:{bg:'var(--cy-bg)',t:'var(--cy-t)',b:'var(--cy-b)'},\n  cg:{bg:'var(--cg-bg)',t:'var(--cg-t)',b:'var(--cg-b)'},\n  cb:{bg:'var(--cb-bg)',t:'var(--cb-t)',b:'var(--cb-b)'},\n  cp:{bg:'var(--cp-bg)',t:'var(--cp-t)',b:'var(--cp-b)'},\n  co:{bg:'var(--co-bg)',t:'var(--co-t)',b:'var(--co-b)'},\n  ct:{bg:'var(--ct-bg)',t:'var(--ct-t)',b:'var(--ct-b)'},\n};\n\n\/\/ Game state\nlet si=0,tiles=[],selected=[],solved=[],errors=0,busy=false,totalErrors=0;\n\nfunction initStage(n){\n  si=n;busy=false;selected=[];solved=[];errors=0;\n  const S=STAGES[n];\n  tiles=shuffle(S.groups.flatMap(g=>g.items)).map(w=>({word:w}));\n  document.getElementById('top-title').textContent=S.title;\n  document.getElementById('top-stage').textContent=`Round ${n+1} \/ 4`;\n  document.getElementById('hint-bar').textContent=S.hint;\n  document.getElementById('solved-area').innerHTML='';\n  document.getElementById('game').style.display='flex';\n  document.getElementById('end-screen').style.display='none';\n  renderGrid();setFb('');\n}\n\nfunction renderGrid(){\n  const g=document.getElementById('grid');g.innerHTML='';\n  tiles.forEach(tw=>{\n    const el=document.createElement('div');\n    el.className='tile'+(selected.includes(tw.word)?' sel':'');\n    el.dataset.word=tw.word;el.textContent=t(tw.word);\n    el.onclick=()=>onTile(tw.word);\n    g.appendChild(el);\n  });\n}\n\nfunction onTile(w){\n  if(busy)return;\n  if(AC.state==='suspended')AC.resume();\n  const idx=selected.indexOf(w);\n  if(idx>=0){\n    selected.splice(idx,1);\n    const el=qw(w);if(el){el.classList.remove('sel');el.classList.add('pop');setTimeout(()=>el.classList.remove('pop'),200);}\n  } else {\n    if(selected.length>=4)return;\n    selected.push(w);playSelect();\n    const el=qw(w);if(el){el.classList.add('sel','pop');setTimeout(()=>el.classList.remove('pop'),200);}\n    if(selected.length===4)autoSubmit();\n  }\n}\n\nfunction autoSubmit(){\n  if(busy)return;busy=true;\n  const grp=STAGES[si].groups.find(g=>\n    selected.length===g.items.length&&selected.every(w=>g.items.includes(w))&&g.items.every(w=>selected.includes(w)));\n  if(grp){\n    solved.push(grp.name);playCorrect();\n    [...selected].forEach((w,i)=>{const el=qw(w);if(el){el.style.animationDelay=i*75+'ms';el.classList.add('bounce');}});\n    setTimeout(()=>{\n      addSolvedRow(grp);tiles=tiles.filter(tw=>!grp.items.includes(tw.word));\n      selected=[];renderGrid();\n      if(solved.length===STAGES[si].groups.length){\n        totalErrors+=errors;launchConfetti(60);playWin();\n        setTimeout(()=>{si<3?showTransition():showEnd();},700);\n      } else {setFb('\u2713 Correct! Keep going');busy=false;}\n    },580);\n  } else {\n    const oneAway=STAGES[si].groups.find(g=>selected.filter(w=>g.items.includes(w)).length===3);\n    errors++;totalErrors++;playWrong();\n    document.querySelectorAll('.tile.sel').forEach(el=>{el.classList.add('shake');setTimeout(()=>el.classList.remove('shake'),420);});\n    oneAway?showToast('So close! One away \ud83d\udd25'):setFb('Not quite \u2014 try again');\n    selected=[];document.querySelectorAll('.tile.sel').forEach(el=>el.classList.remove('sel'));\n    busy=false;\n  }\n}\n\nfunction addSolvedRow(grp){\n  const area=document.getElementById('solved-area');\n  const row=document.createElement('div');\n  row.className=`srow ${grp.color}`;\n  row.dataset.twname=grp.name;row.dataset.twitems=grp.items.join('|');\n  row.innerHTML=`<div class=\"sname\">${t(grp.name)}<\/div><div class=\"sitems\">${grp.items.map(w=>t(w)).join('\u3001')}<\/div>`;\n  area.appendChild(row);\n}\n\nfunction doShuffle(){\n  if(busy)return;\n  const sw=STAGES[si].groups.filter(g=>solved.includes(g.name)).flatMap(g=>g.items);\n  tiles=[...tiles.filter(tw=>sw.includes(tw.word)),...shuffle(tiles.filter(tw=>!sw.includes(tw.word)))];\n  renderGrid();\n}\nfunction doClear(){\n  if(busy)return;selected=[];\n  document.querySelectorAll('.tile.sel').forEach(el=>el.classList.remove('sel'));\n}\nfunction setFb(msg){\n  const el=document.getElementById('fb');\n  el.textContent=msg;el.classList.remove('in');void el.offsetWidth;if(msg)el.classList.add('in');\n}\n\nfunction showTransition(){\n  const S=STAGES[si];\n  document.getElementById('trans-emoji').textContent=['\ud83c\udf5c','\ud83c\udf71','\ud83c\udf63','\ud83c\udf89'][si]||'\ud83c\udf8a';\n  document.getElementById('trans-title').textContent=`Round ${si+1} Complete!`;\n  document.getElementById('trans-sub').textContent=errors===0?'Perfect round \u2014 no mistakes!':`${errors} mistake${errors>1?'s':''} this round`;\n  const tg=document.getElementById('trans-groups');tg.innerHTML='';\n  S.groups.forEach(g=>{\n    const c=CC[g.color];const row=document.createElement('div');\n    row.style.cssText=`border-radius:9px;background:${c.bg};border:1px solid ${c.b};padding:8px 14px;display:flex;gap:10px;align-items:baseline`;\n    row.innerHTML=`<span style=\"font-size:var(--fs-sname);font-weight:600;color:${c.t};min-width:72px\">${t(g.name)}<\/span><span style=\"font-size:var(--fs-sitems);color:${c.t};opacity:.82\">${g.items.map(w=>t(w)).join('\u3001')}<\/span>`;\n    tg.appendChild(row);\n  });\n  const btn=document.getElementById('trans-btn');\n  btn.textContent=si<3?`Go to Round ${si+2} \u2192`:'See Final Results';\n  btn.onclick=si<3?nextStage:showEnd;\n  document.getElementById('transition-overlay').classList.add('show');\n}\nfunction nextStage(){\n  document.getElementById('transition-overlay').classList.remove('show');initStage(si+1);\n}\n\nfunction showEnd(){\n  document.getElementById('transition-overlay').classList.remove('show');\n  document.getElementById('game').style.display='none';\n  const es=document.getElementById('end-screen');es.style.display='flex';\n  launchConfetti(120);playWin();setTimeout(playWin,600);\n  document.getElementById('end-sub').textContent=totalErrors===0\n    ?'Amazing \u2014 zero mistakes across all 4 rounds!'\n    :`${totalErrors} total mistake${totalErrors>1?'s':''} across all rounds`;\n  const ag=document.getElementById('end-all-groups');ag.innerHTML='';\n  STAGES.forEach(S=>{\n    const lbl=document.createElement('div');lbl.className='end-stage-label';lbl.textContent=S.title;ag.appendChild(lbl);\n    S.groups.forEach(g=>{\n      const c=CC[g.color];const row=document.createElement('div');\n      row.style.cssText=`border-radius:8px;background:${c.bg};border:1px solid ${c.b};padding:8px 12px;margin-bottom:4px;display:flex;gap:10px;align-items:baseline`;\n      row.innerHTML=`<span style=\"font-size:var(--fs-sname);font-weight:600;color:${c.t};min-width:72px\">${t(g.name)}<\/span><span style=\"font-size:var(--fs-sitems);color:${c.t};opacity:.82\">${g.items.map(w=>t(w)).join('\u3001')}<\/span>`;\n      ag.appendChild(row);\n    });\n  });\n}\n\nfunction restartGame(){\n  totalErrors=0;parts=[];cx.clearRect(0,0,cvs.width,cvs.height);\n  document.getElementById('end-screen').style.display='none';initStage(0);\n}\n\nwindow.addEventListener('resize',()=>{cvs.width=innerWidth;cvs.height=innerHeight;});\ninitStage(0);\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium is-resized\"><a href=\"https:\/\/ko-fi.com\/tiffanystalk\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"58\" src=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-300x58.png\" alt=\"\" class=\"wp-image-570\" style=\"width:150px;height:29px\" srcset=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-300x58.png 300w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-600x115.png 600w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-1024x197.png 1024w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-768x148.png 768w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-1536x296.png 1536w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-2048x394.png 2048w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-850x164.png 850w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Do you like it? \ud83d\ude42<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium is-resized\"><a href=\"https:\/\/tiffanysmandarin.com\/index.php\/food-words\/\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"86\" src=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-300x86.png\" alt=\"\" class=\"wp-image-571\" style=\"width:150px;height:43px\" srcset=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-300x86.png 300w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-600x171.png 600w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Let\u2019s see if you can read a Chinese menu Food Matching Game Food Matching Game Find the connection \u2014 category names revealed only when you&#8217;re correct \u7e41\u9ad4 \u7b80\u4f53 Shuffle Clear \ud83c\udf89 All 4 Rounds Complete! Play Again<\/p>\n","protected":false},"author":2,"featured_media":196,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[14,13],"tags":[],"class_list":["post-13552","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hsk3","category-hsk4"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Chinese Food Matching Game - OneDotDot Chinese<\/title>\n<meta name=\"description\" content=\"Let\u2019s see if you can read a Chinese menu\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Chinese Food Matching Game - OneDotDot Chinese\" \/>\n<meta property=\"og:description\" content=\"Let\u2019s see if you can read a Chinese menu\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/\" \/>\n<meta property=\"og:site_name\" content=\"OneDotDot Chinese\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-30T15:41:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-03T05:41:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/05\/food-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1300\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"tiffany\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tiffany\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/\"},\"author\":{\"name\":\"tiffany\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"headline\":\"Chinese Food Matching Game\",\"datePublished\":\"2026-04-30T15:41:15+00:00\",\"dateModified\":\"2026-05-03T05:41:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/\"},\"wordCount\":42,\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"image\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/food-1.png\",\"articleSection\":[\"HSK 3\",\"HSK 4\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/\",\"name\":\"Chinese Food Matching Game - OneDotDot Chinese\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/food-1.png\",\"datePublished\":\"2026-04-30T15:41:15+00:00\",\"dateModified\":\"2026-05-03T05:41:42+00:00\",\"description\":\"Let\u2019s see if you can read a Chinese menu\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/#primaryimage\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/food-1.png\",\"contentUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/food-1.png\",\"width\":1300,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/04\\\/30\\\/chinese-food-matching-game\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9801\",\"item\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Chinese Food Matching Game\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\",\"name\":\"OneDotDot Chinese\",\"description\":\"Learn a little Chinese every day\",\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tiffanysmandarin.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\",\"name\":\"tiffany\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"url\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"contentUrl\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"width\":214,\"height\":214,\"caption\":\"tiffany\"},\"logo\":{\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/tiffanys_talk\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tiffany-huang-mandarin\\\/\"],\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/author\\\/tiffany\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Chinese Food Matching Game - OneDotDot Chinese","description":"Let\u2019s see if you can read a Chinese menu","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/","og_locale":"en_US","og_type":"article","og_title":"Chinese Food Matching Game - OneDotDot Chinese","og_description":"Let\u2019s see if you can read a Chinese menu","og_url":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/","og_site_name":"OneDotDot Chinese","article_published_time":"2026-04-30T15:41:15+00:00","article_modified_time":"2026-05-03T05:41:42+00:00","og_image":[{"width":1300,"height":300,"url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/05\/food-1.png","type":"image\/png"}],"author":"tiffany","twitter_card":"summary_large_image","twitter_misc":{"Written by":"tiffany","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/#article","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/"},"author":{"name":"tiffany","@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"headline":"Chinese Food Matching Game","datePublished":"2026-04-30T15:41:15+00:00","dateModified":"2026-05-03T05:41:42+00:00","mainEntityOfPage":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/"},"wordCount":42,"publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"image":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/#primaryimage"},"thumbnailUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/05\/food-1.png","articleSection":["HSK 3","HSK 4"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/","url":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/","name":"Chinese Food Matching Game - OneDotDot Chinese","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/#primaryimage"},"image":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/#primaryimage"},"thumbnailUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/05\/food-1.png","datePublished":"2026-04-30T15:41:15+00:00","dateModified":"2026-05-03T05:41:42+00:00","description":"Let\u2019s see if you can read a Chinese menu","breadcrumb":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/#primaryimage","url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/05\/food-1.png","contentUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/05\/food-1.png","width":1300,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/04\/30\/chinese-food-matching-game\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9801","item":"https:\/\/tiffanysmandarin.com\/"},{"@type":"ListItem","position":2,"name":"Chinese Food Matching Game"}]},{"@type":"WebSite","@id":"https:\/\/tiffanysmandarin.com\/#website","url":"https:\/\/tiffanysmandarin.com\/","name":"OneDotDot Chinese","description":"Learn a little Chinese every day","publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tiffanysmandarin.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99","name":"tiffany","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","url":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","contentUrl":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","width":214,"height":214,"caption":"tiffany"},"logo":{"@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png"},"sameAs":["https:\/\/www.instagram.com\/tiffanys_talk\/","https:\/\/www.linkedin.com\/in\/tiffany-huang-mandarin\/"],"url":"https:\/\/tiffanysmandarin.com\/index.php\/author\/tiffany\/"}]}},"jetpack_featured_media_url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/05\/food-1.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/13552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/comments?post=13552"}],"version-history":[{"count":16,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/13552\/revisions"}],"predecessor-version":[{"id":13574,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/13552\/revisions\/13574"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/media\/196"}],"wp:attachment":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/media?parent=13552"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/categories?post=13552"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/tags?post=13552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}