{"id":119,"date":"2026-08-21T21:15:35","date_gmt":"2026-08-21T13:15:35","guid":{"rendered":"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/"},"modified":"2026-08-21T21:53:55","modified_gmt":"2026-08-21T13:53:55","slug":"play-american-mahjong-online-free","status":"publish","type":"page","link":"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/","title":{"rendered":"Play American Mahjong Online Free: Guided Beginner Game"},"content":{"rendered":"<style>:root{--ink:#17231d;--muted:#64736b;--cream:#f3efe4;--card:#fffdf8;--green:#124e3a;--green2:#1c6a50;--gold:#d9a441;--line:#ded9cc;--red:#a83432;--shadow:0 18px 55px rgba(25,48,37,.14)}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 15% 0,#dfeee5,transparent 30%),var(--cream);font-family:Inter,system-ui,-apple-system,\"Segoe UI\",sans-serif;color:var(--ink)}button{font:inherit}.amj-shell{width:min(1240px,calc(100% - 24px));margin:auto;padding:20px 0 70px}.amj-hero{display:flex;align-items:center;justify-content:space-between;gap:24px;background:linear-gradient(125deg,#0b382b,#1b6349);border-radius:26px;padding:28px 34px;color:#fff;box-shadow:var(--shadow)}.eyebrow{margin:0 0 7px;color:#e9bd62;font-size:12px;letter-spacing:.13em;text-transform:uppercase;font-weight:900}.amj-hero h1{font:700 clamp(32px,5vw,56px)\/1 Georgia,serif;margin:0 0 12px}.amj-hero p:last-child{margin:0;color:#d9e9e1}.hero-actions{display:flex;gap:8px;flex-shrink:0}.soft-btn,.secondary{border:1px solid rgba(255,255,255,.28);background:rgba(255,255,255,.1);color:#fff;padding:10px 14px;border-radius:12px;font-weight:750;cursor:pointer}.notice{margin:16px 0;background:#fff7dc;border-left:4px solid var(--gold);border-radius:10px;padding:13px 17px;color:#594c2f}.table{min-height:710px;display:grid;grid-template-columns:190px 1fr 190px;grid-template-rows:110px 260px auto;gap:12px;padding:18px;border-radius:28px;background:radial-gradient(circle,#2c7e60,#11503c 65%,#0c3c2d);box-shadow:inset 0 0 0 8px #6e3b29,var(--shadow);position:relative}.opponent{background:rgba(255,255,255,.94);border-radius:15px;padding:11px;display:flex;align-items:center;gap:9px;box-shadow:0 7px 18px rgba(0,0,0,.12)}.north{grid-column:2;grid-row:1;width:min(410px,100%);justify-self:center}.west{grid-column:1;grid-row:2;align-self:center;flex-wrap:wrap}.east{grid-column:3;grid-row:2;align-self:center;flex-wrap:wrap}.avatar{display:grid;place-items:center;width:35px;height:35px;background:var(--green);color:white;border-radius:50%;font-weight:900}.opponent strong,.opponent small{display:block}.opponent small{color:var(--muted);font-size:11px}.mini-rack{display:flex;gap:2px;margin-left:auto}.mini-rack i{display:block;width:8px;height:27px;border-radius:2px;background:linear-gradient(90deg,#e8e1d0,#fff);border-bottom:4px solid #b9a98e}.center{grid-column:2;grid-row:2;display:grid;place-items:center;align-content:center;gap:10px}.round-pill{display:flex;gap:12px;color:#fff;background:rgba(0,0,0,.18);padding:8px 13px;border-radius:99px}.round-pill strong{color:#f4cf79}.discard{min-width:150px;background:#fff;border-radius:14px;padding:10px 18px;text-align:center;box-shadow:0 8px 16px rgba(0,0,0,.18)}.discard span,.discard strong{display:block}.discard span{font-size:10px;color:var(--muted);text-transform:uppercase}.discard strong{font:700 24px Georgia;margin-top:3px}.discard-pool{display:flex;flex-wrap:wrap;justify-content:center;gap:3px;max-width:450px}.discard-pool span{padding:3px 5px;background:rgba(255,255,255,.9);border-radius:3px;font-size:10px}.player{grid-column:1\/4;grid-row:3;background:var(--card);border-radius:20px;padding:20px;align-self:end}.player-head,.action-row{display:flex;justify-content:space-between;align-items:center;gap:16px}.player-head h2{font:700 clamp(20px,3vw,30px) Georgia;margin:0}.target{text-align:right}.target span,.target strong{display:block}.target span{font-size:10px;color:var(--muted);text-transform:uppercase}.text-btn{border:0;background:none;color:var(--green2);text-decoration:underline;cursor:pointer;padding:3px}.rack-scroll{overflow-x:auto;padding:18px 4px 14px}.rack{min-width:800px;display:flex;gap:7px;justify-content:center}.tile{width:54px;height:75px;flex:0 0 54px;border:0;border-radius:8px;background:linear-gradient(145deg,#fff,#eee9dd);box-shadow:0 5px 0 #beb5a5,0 8px 12px rgba(0,0,0,.18);display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;transition:.16s}.tile:hover{transform:translateY(-4px)}.tile.selected{transform:translateY(-11px);outline:3px solid #e5b854;box-shadow:0 5px 0 #c78b25,0 12px 16px rgba(0,0,0,.18)}.tile .symbol{font:700 25px Georgia;color:#205b45}.tile.crak .symbol{color:#af302e}.tile.dot .symbol{color:#205b91}.tile.joker .symbol{font-size:17px;color:#7b3988}.tile small{font-size:8px;text-transform:uppercase;color:#6d756f;margin-top:5px;font-weight:800}.action-row{border-top:1px solid #ebe5da;padding-top:15px;color:var(--muted)}.action-row>div{display:flex;gap:8px}.primary,.secondary{border:0;border-radius:12px;padding:12px 18px;font-weight:850;cursor:pointer}.primary{background:var(--green);color:#fff;box-shadow:0 7px 16px rgba(18,78,58,.24)}.primary:disabled{background:#b4bdb7;box-shadow:none;cursor:not-allowed}.action-row .secondary{background:#edf3ef;color:var(--green);border:1px solid #ccdcd2}.coach{display:flex;gap:13px;margin:18px 0;background:#fff;border-radius:16px;padding:17px 20px;border-left:4px solid var(--green2);box-shadow:0 8px 30px rgba(30,50,40,.07)}.coach-mark{display:grid;place-items:center;background:var(--green);color:white;border-radius:50%;width:30px;height:30px;flex:0 0 30px}.coach p{margin:4px 0 0;color:var(--muted)}.rules-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.rules-grid article{background:#fff;border:1px solid var(--line);border-radius:18px;padding:22px}.rules-grid h2{font:700 24px Georgia;margin-top:0}.rules-grid li,.rules-grid p{line-height:1.6;color:#56665e}.rules-grid a{color:var(--green2);font-weight:800}.exposures{display:flex;gap:8px;min-height:0}.exposure{display:flex;gap:2px;background:#e6efe9;border-radius:8px;padding:5px}.modal[hidden]{display:none}.modal{position:fixed;inset:0;background:rgba(7,25,18,.7);display:grid;place-items:center;padding:16px;z-index:100}.modal-card{position:relative;width:min(650px,100%);background:#fffdf8;border-radius:24px;padding:30px;box-shadow:0 30px 90px rgba(0,0,0,.35)}.modal-card>button[aria-label]{position:absolute;right:15px;top:12px;border:0;background:none;font-size:28px;cursor:pointer}.modal-card h2{font:700 32px Georgia;margin-top:0}.goal-groups{display:flex;flex-wrap:wrap;gap:12px}.goal-group{display:flex;gap:3px;border:1px solid var(--line);padding:7px;border-radius:9px}.goal-tile{background:#f3eee1;padding:8px 6px;border-radius:5px;font-weight:850}.result{text-align:center}.score-circle{display:grid;place-items:center;width:90px;height:90px;margin:15px auto;border-radius:50%;background:var(--green);color:#fff;font-size:32px;font-weight:900}.result-stats{display:flex;justify-content:center;gap:12px;margin:18px 0}.result-stats span{background:#eef3ef;padding:9px 12px;border-radius:9px}@media(max-width:780px){.amj-shell{width:min(100% - 12px,1240px);padding-top:6px}.amj-hero{align-items:flex-start;flex-direction:column;padding:22px;border-radius:18px}.table{grid-template-columns:1fr 1fr;grid-template-rows:auto auto auto auto;min-height:700px;padding:12px}.north{grid-column:1\/3;grid-row:1}.west{grid-column:1;grid-row:2}.east{grid-column:2;grid-row:2}.center{grid-column:1\/3;grid-row:3}.player{grid-column:1\/3;grid-row:4;padding:15px}.player-head,.action-row{align-items:flex-start;flex-direction:column}.target{text-align:left}.action-row>div,.action-row button{width:100%}.rules-grid{grid-template-columns:1fr}.rack{justify-content:flex-start}.tile{width:50px;flex-basis:50px;height:70px}.mini-rack{display:none}}\n.play-guide{max-width:920px;margin:28px auto 0;background:#fffdf8;border:1px solid var(--line);border-radius:24px;padding:clamp(24px,5vw,54px);box-shadow:var(--shadow)}\n.play-guide>header{border-bottom:1px solid var(--line);padding-bottom:23px}\n.play-guide>header h2{font:700 clamp(30px,4vw,46px)\/1.08 Georgia,serif;margin:0 0 14px}\n.play-guide>header>p:last-child{font-size:18px;line-height:1.65;color:#53635b}\n.guide-nav{display:flex;align-items:center;flex-wrap:wrap;gap:9px;margin:22px 0 34px;padding:13px 15px;background:#eef5f0;border-radius:12px}\n.guide-nav a{color:var(--green);font-weight:750;text-decoration:none;padding:5px 8px}\n.play-guide section{scroll-margin-top:25px;margin:36px 0}\n.play-guide h3{font:700 28px\/1.2 Georgia,serif;margin:0 0 13px}\n.play-guide h4{font-size:17px;margin:20px 0 7px}\n.play-guide p,.play-guide li,.play-guide dd{color:#4e6057;line-height:1.75}\n.play-guide a{color:var(--green2);font-weight:750}\n.plain-example,.decision-list{background:#f4f0e5;border-left:4px solid var(--gold);border-radius:10px;padding:16px 19px;margin:20px 0;line-height:1.65}\n.decision-list h4{margin-top:0}.decision-list ul{margin-bottom:0}\n.play-guide dt{font-weight:850;margin-top:17px}.play-guide dd{margin:4px 0 0}\n.guide-faq details{border-top:1px solid var(--line);padding:15px 3px}\n.guide-faq summary{font-weight:850;cursor:pointer}.guide-faq details p{margin-bottom:2px}\n@media(max-width:780px){.game-sitebar{padding:7px 7px 14px}.game-logo small{display:none}.game-sitebar>div{gap:0}.game-sitebar>div a{font-size:11px;padding:8px}.play-guide{border-radius:18px;padding:24px 19px}.guide-nav{align-items:flex-start;flex-direction:column}.play-guide h3{font-size:24px}}\n.page-id-119 .close-sticky.main-menus,.page-id-119 .main-header-box,.page-id-119 .feature-header,.page-id-119 #sidebar,.page-id-119 #comments{display:none!important}\n.page-id-119 #content{padding:0!important;margin:0!important}\n.page-id-119 #content>.container{width:100%!important;max-width:none!important;padding:0!important;margin:0!important}\n.page-id-119 #content>.container>.row{margin:0!important}\n.page-id-119 #content .col-lg-9{flex:0 0 100%!important;max-width:100%!important;width:100%!important;padding:0!important;margin:0!important}\n.page-id-119 .page-single,.page-id-119 .post-content{padding:0!important;margin:0!important;background:transparent!important;box-shadow:none!important}\n.page-id-119{background:#f3efe4!important;overflow-x:hidden!important}\n.page-id-119 .amj-hero h1{color:#fff!important;text-shadow:none!important}\n.page-id-119 .amj-hero p{color:#d9e9e1!important}\n.game-sitebar{display:flex;align-items:center;justify-content:space-between;gap:22px;padding:8px 4px 18px}\n.game-logo{display:flex;align-items:center;gap:10px;color:var(--ink)!important;text-decoration:none!important;font-size:17px;font-weight:900;letter-spacing:.06em}\n.game-logo>span:last-child{display:flex;flex-direction:column}.game-logo small{font-size:9px;color:var(--muted);font-weight:700;letter-spacing:.08em;text-transform:uppercase}\n.logo-tile{display:grid!important;place-items:center;width:40px;height:46px;border-radius:7px;background:linear-gradient(145deg,#fff,#ece6d8);color:var(--green);font:800 24px Georgia;box-shadow:0 4px 0 #c8beaa,0 7px 13px rgba(0,0,0,.12)}\n.game-sitebar>div{display:flex;align-items:center;gap:8px}.game-sitebar>div a{color:#3e5148!important;text-decoration:none!important;font-size:13px;font-weight:800;padding:9px 13px;border-radius:999px}.game-sitebar>div a:hover{background:#e4ece7;color:var(--green)!important}\n<\/style>\n<p><main class=\"amj-shell\" id=\"amjGame\"><\/p>\n<nav class=\"game-sitebar\" aria-label=\"Game navigation\"><a class=\"game-logo\" href=\"https:\/\/www.mrsfa.com\/\"><span class=\"logo-tile\">M<\/span><span>MRSFA <small>Mahjong made clearer<\/small><\/span><\/a><\/p>\n<div><a href=\"https:\/\/www.mrsfa.com\/\">Home<\/a><a href=\"https:\/\/www.mrsfa.com\/index.php\/mahjong-tools\/\">Free Tools<\/a><a href=\"#game-setup\">How to Play<\/a><\/div>\n<\/nav>\n<header class=\"amj-hero\">\n<div>\n<p class=\"eyebrow\">Free guided browser game<\/p>\n<h1>Play American Mahjong Online<\/h1>\n<p>Learn a complete round against three computer players\u2014no account or annual card required.<\/p>\n<\/div>\n<div class=\"hero-actions\"><button id=\"languageBtn\" class=\"soft-btn\">\u4e2d\u6587<\/button><button id=\"soundBtn\" class=\"soft-btn\" aria-pressed=\"true\">\u266a Sound<\/button><\/div>\n<\/header>\n<section class=\"notice\"><strong>Practice mode:<\/strong> This game teaches the flow of American Mahjong with an original training goal. It does not reproduce or replace the current NMJL card.<\/section>\n<section class=\"table\" aria-label=\"American Mahjong table\">\n<div class=\"opponent north\"><span class=\"avatar\">N<\/span><\/p>\n<div><strong>Riley<\/strong><small id=\"northCount\">13 tiles<\/small><\/div>\n<div class=\"mini-rack\" id=\"northRack\"><\/div>\n<\/div>\n<div class=\"opponent west\"><span class=\"avatar\">W<\/span><\/p>\n<div><strong>Jordan<\/strong><small id=\"westCount\">13 tiles<\/small><\/div>\n<div class=\"mini-rack\" id=\"westRack\"><\/div>\n<\/div>\n<div class=\"opponent east\"><span class=\"avatar\">E<\/span><\/p>\n<div><strong>Casey<\/strong><small id=\"eastCount\">13 tiles<\/small><\/div>\n<div class=\"mini-rack\" id=\"eastRack\"><\/div>\n<\/div>\n<div class=\"center\">\n<div class=\"round-pill\"><span id=\"phaseLabel\">Setup<\/span><strong id=\"wallCount\">Wall: 0<\/strong><\/div>\n<div class=\"discard\" id=\"lastDiscard\"><span>Latest discard<\/span><strong>\u2014<\/strong><\/div>\n<div class=\"discard-pool\" id=\"discardPool\"><\/div>\n<\/div>\n<div class=\"player\">\n<div class=\"player-head\">\n<div>\n<p class=\"eyebrow\" id=\"turnLabel\">Your rack<\/p>\n<h2 id=\"instruction\">Starting a new round\u2026<\/h2>\n<\/div>\n<div class=\"target\"><span>Practice goal<\/span><strong id=\"targetName\">Loading\u2026<\/strong><button id=\"targetHelp\" class=\"text-btn\">View goal<\/button><\/div>\n<\/div>\n<div id=\"exposures\" class=\"exposures\"><\/div>\n<div class=\"rack-scroll\">\n<div id=\"playerRack\" class=\"rack\"><\/div>\n<\/div>\n<div class=\"action-row\"><span id=\"selectionText\">Select tiles when prompted.<\/span><\/p>\n<div><button id=\"skipBtn\" class=\"secondary\" hidden>Skip call<\/button><button id=\"claimBtn\" class=\"secondary\" hidden>Call Pung<\/button><button id=\"mainBtn\" class=\"primary\" disabled>Continue<\/button><\/div>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"coach\">\n<div class=\"coach-mark\">\u25ce<\/div>\n<div><strong id=\"coachTitle\">Beginner coach<\/strong><\/p>\n<p id=\"coachText\">The game will guide you through each step.<\/p>\n<\/div>\n<\/section>\n<section class=\"rules-grid\">\n<article>\n<h2>What you will practice<\/h2>\n<ul>\n<li>A full three-pass Charleston<\/li>\n<li>Drawing and discarding in turn<\/li>\n<li>Calling matching groups from discards<\/li>\n<li>Using Jokers in groups of three or more<\/li>\n<\/ul>\n<\/article>\n<article>\n<h2>How this training goal works<\/h2>\n<p>Your goal contains four groups and one pair. Match the displayed tile types. Jokers may substitute inside three- or four-tile groups, but not the pair.<\/p>\n<p><a href=\"https:\/\/www.mrsfa.com\/index.php\/american-mahjong-trainer\/\">Practice only the Charleston \u2192<\/a><\/article>\n<\/section>\n<article class=\"play-guide\">\n<header>\n<p class=\"eyebrow\">Read this before your first round<\/p>\n<h2>How to Play This American Mahjong Practice Game<\/h2>\n<p>You do not need to know every American Mahjong rule before you begin. Keep this guide open below the table, take one decision at a time, and use the practice goal shown beside your rack.<\/p>\n<\/header>\n<nav class=\"guide-nav\" aria-label=\"Game guide contents\"><strong>Jump to:<\/strong><a href=\"#game-setup\">Setup<\/a><a href=\"#charleston-help\">Charleston<\/a><a href=\"#draw-discard\">Draw and discard<\/a><a href=\"#calls-jokers\">Calls and Jokers<\/a><a href=\"#winning\">Winning<\/a><\/nav>\n<section id=\"game-setup\">\n<h3>1. Start with the practice goal\u2014not the whole card<\/h3>\n<p>American Mahjong is normally played with a current annual card that lists the hands allowed for that year. This free game does not reproduce that card. Instead, each round gives you one original training goal made from four groups and one pair. It lets you practice the rhythm of the game without asking you to search dozens of card lines on your first attempt.<\/p>\n<p>Select <strong>View goal<\/strong> before passing any tiles. A group marked three times needs three matching tiles; the pair needs two matching tiles. The name above the rack\u2014such as \u201cBalanced Groups\u201d\u2014helps you remember the shape, but the individual tiles are what matter.<\/p>\n<div class=\"plain-example\"><strong>Example:<\/strong> If the goal shows three 2 Dots, three 6 Dots, three 4 Bams, three East Winds, and two 8 Craks, those are the tiles worth protecting. An unrelated 7 Bam may be easy to release unless it forms a useful pair.<\/div>\n<\/section>\n<section>\n<h3>2. Read your rack before touching a tile<\/h3>\n<p>Your rack begins with 13 tiles. Scan it from left to right and notice three things: exact matches for the practice goal, pairs or triples, and Jokers. Those tiles usually deserve protection. Flowers and unrelated single tiles are more likely to become passes or discards in this training mode.<\/p>\n<p>Do not keep a tile simply because its number is close. The goal calls for exact tiles. A 3 Dot does not replace a required 2 Dot.<\/p>\n<\/section>\n<section id=\"charleston-help\">\n<h3>3. Complete the three Charleston passes<\/h3>\n<p>The Charleston happens before normal drawing and discarding. For each pass, select exactly three tiles, then press <strong>Pass 3 tiles<\/strong>. You will receive three tiles from another player and your rack will change.<\/p>\n<ol>\n<li><strong>First pass:<\/strong> release three tiles that do not help the goal. Avoid passing Jokers, useful pairs, or exact target tiles.<\/li>\n<li><strong>Second pass:<\/strong> examine the new rack instead of repeating your first idea. A received pair can be more useful than a weak tile you planned to keep.<\/li>\n<li><strong>Third pass:<\/strong> protect the clearest direction in your rack. By now, several target groups may be taking shape.<\/li>\n<\/ol>\n<p>All computer players pass at the same time. For more detailed feedback, use the separate <a href=\"https:\/\/www.mrsfa.com\/index.php\/american-mahjong-trainer\/\">Charleston trainer<\/a>.<\/p>\n<\/section>\n<section id=\"draw-discard\">\n<h3>4. Draw one tile, then discard one tile<\/h3>\n<p>After the Charleston, press <strong>Draw a tile<\/strong>. Your rack temporarily grows from 13 tiles to 14. Compare the new tile with the goal, select one tile you no longer need, and press <strong>Discard selected tile<\/strong>. Your rack returns to 13 tiles.<\/p>\n<p>The three computer players then take their turns. Their latest discard appears in the center, while recent discards remain visible below it. When the turn returns to you, draw again.<\/p>\n<div class=\"decision-list\">\n<h4>A quick discard check<\/h4>\n<ul>\n<li>Is this exact tile required by the practice goal?<\/li>\n<li>Is it part of a pair or a three-tile group?<\/li>\n<li>Is it a Joker that could finish a group?<\/li>\n<li>If none is true, is there a weaker tile in the rack?<\/li>\n<\/ul>\n<\/div>\n<p>There is no timer. A careful choice is more useful than a fast one during your first few rounds.<\/p>\n<\/section>\n<section id=\"calls-jokers\">\n<h3>5. What \u201cCall Pung\u201d means<\/h3>\n<p>If a computer discards a tile and you hold two matching tiles\u2014or one matching tile plus a Joker\u2014the game may offer <strong>Call Pung<\/strong>. Taking the discard creates a visible group of three. Because you called instead of drawing, you must discard one tile immediately afterward.<\/p>\n<p>Calling can finish a required group, but it also reveals part of your hand. Call when the group appears in your goal. Choose <strong>Skip call<\/strong> when it does not help.<\/p>\n<h4>How Jokers work here<\/h4>\n<p>A Joker may replace a missing tile inside a group of three or more. It cannot complete the pair. Two 6 Dots plus a Joker can satisfy a three\u20136 Dot group, but one 8 Crak plus a Joker does not make a pair of 8 Craks.<\/p>\n<p>For more examples, read the <a href=\"https:\/\/www.mrsfa.com\/index.php\/2026\/07\/30\/american-mahjong-joker-rules\/\">American Mahjong Joker rules<\/a>.<\/p>\n<\/section>\n<section id=\"winning\">\n<h3>6. How to complete the round<\/h3>\n<p>You win when your concealed tiles and exposed groups satisfy every part of the displayed training goal. When the rack is complete, the main action changes to <strong>Declare Mahjong<\/strong>. Select it to finish the round and see your score.<\/p>\n<p>The score rewards completing the hand with fewer draws and discards. It is a personal practice measure, not official tournament scoring. If a computer finishes first or the wall runs out, start another round and try a different approach.<\/p>\n<\/section>\n<section>\n<h3>A sample first turn<\/h3>\n<ol>\n<li>Open <strong>View goal<\/strong> and note the required pair.<\/li>\n<li>Find every exact goal tile already in your rack.<\/li>\n<li>During each Charleston pass, choose three unrelated singles.<\/li>\n<li>After the third pass, press <strong>Draw a tile<\/strong>.<\/li>\n<li>If the drawn tile matches the goal, keep it and discard a weaker tile.<\/li>\n<li>Call a Pung only when that group belongs in your goal.<\/li>\n<li>Repeat until someone declares Mahjong or the wall is empty.<\/li>\n<\/ol>\n<\/section>\n<section>\n<h3>Common first-game mistakes<\/h3>\n<dl>\n<dt>Passing a Joker<\/dt>\n<dd>Jokers are scarce and can complete several groups. Keep them in this training mode.<\/dd>\n<dt>Breaking a useful pair too early<\/dt>\n<dd>The pair is harder to finish because a Joker cannot fill it. Check the goal first.<\/dd>\n<dt>Calling every available Pung<\/dt>\n<dd>A legal call is not automatically useful. Expose a group only when it supports your goal.<\/dd>\n<dt>Looking only at the newest tile<\/dt>\n<dd>Every draw is a reason to compare the whole rack again. The best discard may be an older tile.<\/dd>\n<\/dl>\n<\/section>\n<section class=\"guide-faq\">\n<h3>Questions beginners usually ask<\/h3>\n<details>\n<summary>Is this the same as a real NMJL game?<\/summary>\n<p>It follows the familiar flow\u2014Charleston, drawing, discarding, calls, Jokers, and a 14-tile goal\u2014but uses original training hands. Use the current official card for league or table play.<\/p>\n<\/details>\n<details>\n<summary>Can I play against real people?<\/summary>\n<p>Not in this version. Riley, Jordan, and Casey are computer players, so you can pause and learn without holding up a live table.<\/p>\n<\/details>\n<details>\n<summary>Why can\u2019t I use a Joker in the pair?<\/summary>\n<p>American Mahjong Jokers are generally used in groups of three or more, not singles or pairs. This game enforces that distinction.<\/p>\n<\/details>\n<details>\n<summary>What should I learn next?<\/summary>\n<p>Continue with <a href=\"https:\/\/www.mrsfa.com\/index.php\/2026\/08\/17\/how-to-read-nmjl-card\/\">How to Read the NMJL Card<\/a> and the <a href=\"https:\/\/www.mrsfa.com\/index.php\/2026\/08\/17\/american-mahjong-terms\/\">American Mahjong terms glossary<\/a>.<\/p>\n<\/details>\n<\/section>\n<\/article>\n<p><\/main><\/p>\n<div class=\"modal\" id=\"goalModal\" hidden>\n<div class=\"modal-card\"><button id=\"closeGoal\" aria-label=\"Close\">\u00d7<\/button><\/p>\n<p class=\"eyebrow\">Your training hand<\/p>\n<h2 id=\"goalModalTitle\"><\/h2>\n<div id=\"goalTiles\" class=\"goal-groups\"><\/div>\n<p>Complete all displayed groups plus the pair. This is an original practice pattern\u2014not an official NMJL hand.<\/p>\n<\/div>\n<\/div>\n<div class=\"modal\" id=\"resultModal\" hidden>\n<div class=\"modal-card result\">\n<p class=\"eyebrow\">Round complete<\/p>\n<h2 id=\"resultTitle\">You won!<\/h2>\n<div class=\"score-circle\" id=\"resultScore\">0<\/div>\n<p id=\"resultText\">\n<div class=\"result-stats\" id=\"resultStats\"><\/div>\n<p><button id=\"againBtn\" class=\"primary\">Play another round<\/button><\/div>\n<\/div>\n<p><script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"VideoGame\",\"name\":\"MRSFA Guided American Mahjong Practice Game\",\"applicationCategory\":\"GameApplication\",\"gamePlatform\":\"Web browser\",\"isAccessibleForFree\":true,\"url\":\"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/\"}<\/script><script>(()=>{'use strict'; const suits=[['dot','\u25cf'],['bam','\u25a5'],['crak','\u842c']],honors=[['honor','E'],['honor','S'],['honor','W'],['honor','N'],['honor','R'],['honor','G'],['honor','0']]; const goals=[  {name:'Balanced Groups',groups:[['dot',2,3],['dot',6,3],['bam',4,3],['honor','E',3],['crak',8,2]]},  {name:'Two-Suit Builder',groups:[['bam',2,3],['bam',5,3],['crak',3,3],['crak',7,3],['honor','R',2]]},  {name:'Numbers and Winds',groups:[['dot',1,3],['dot',9,3],['crak',5,3],['honor','N',3],['bam',6,2]]} ]; const el=id=>document.getElementById(id), rackEl=el('playerRack'), mainBtn=el('mainBtn'), claimBtn=el('claimBtn'), skipBtn=el('skipBtn'); let deck=[],hands=[[],[],[],[]],discards=[],exposed=[[],[],[],[]],selected=new Set(),phase='setup',charleston=0,turn=0,pendingDiscard=null,goal=goals[0],draws=0,playerDiscards=0,sound=true,language='en',startTime=0; const words={en:{yourRack:'Your rack',select3:'Select exactly three tiles to pass',pass:'Pass 3 tiles',draw:'Draw a tile',discard:'Choose one tile to discard',discardBtn:'Discard selected tile',wait:'Computer players are taking their turns\u2026',call:'You can call this discard to expose a Pung.',skip:'Skip call',claim:'Call Pung',win:'Declare Mahjong',coach:'Beginner coach'},zh:{yourRack:'\u4f60\u7684\u624b\u724c',select3:'\u9009\u62e9\u4e09\u5f20\u724c\u4f20\u51fa',pass:'\u4f20\u51fa\u4e09\u5f20\u724c',draw:'\u6478\u4e00\u5f20\u724c',discard:'\u9009\u62e9\u4e00\u5f20\u724c\u6253\u51fa',discardBtn:'\u6253\u51fa\u6240\u9009\u724c',wait:'\u7535\u8111\u73a9\u5bb6\u6b63\u5728\u884c\u52a8\u2026\u2026',call:'\u4f60\u53ef\u4ee5\u7528\u8fd9\u5f20\u5f03\u724c\u7ec4\u6210\u660e\u523b\u3002',skip:'\u8df3\u8fc7',claim:'\u78b0\u724c',win:'\u5ba3\u5e03 Mahjong',coach:'\u65b0\u624b\u6559\u7ec3'}}; function uuid(){return Math.random().toString(36).slice(2)+Date.now().toString(36)} function buildDeck(){const d=[];for(const[s,m]of suits)for(let n=1;n<=9;n++)for(let i=0;i<4;i++)d.push({s,n,m,id:uuid()});for(const[s,m]of honors)for(let i=0;i<4;i++)d.push({s,n:m,m,id:uuid()});for(let i=0;i<8;i++)d.push({s:'flower',n:'Flower',m:'\u273f',id:uuid()});for(let i=0;i<8;i++)d.push({s:'joker',n:'Joker',m:'J',id:uuid()});for(let i=d.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[d[i],d[j]]=[d[j],d[i]]}return d} function name(t){if(!t)return'\u2014';if(['dot','bam','crak'].includes(t.s))return`${t.n} ${t.s==='dot'?'Dot':t.s==='bam'?'Bam':'Crak'}`;return String(t.n)} function key(t){return`${t.s}:${t.n}`} function sort(r){const o={dot:0,bam:1,crak:2,honor:3,flower:4,joker:5};r.sort((a,b)=>o[a.s]-o[b.s]||(Number(a.n)||20)-(Number(b.n)||20))} function strength(t,r){if(t.s==='joker')return 99;if(t.s==='flower')return 8;const same=r.filter(x=>key(x)===key(t)).length;let v=same*8;const goalNeed=goal.groups.some(g=>g[0]===t.s?g[1]===t.n:false);if(goalNeed)v+=12;if(['dot','bam','crak'].includes(t.s))v+=r.filter(x=>x.s===t.s?Math.abs(x.n-t.n)<=2:false).length;return v} function tileHTML(t,button=true){return`<${button?'button':'span'} class=\"tile ${t.s}${selected.has(t.id)?' selected':''}\" ${button?`data-id=\"${t.id}\" aria-label=\"${name(t)}\"`:''}><span class=\"symbol\">${t.s==='dot'?t.n+'\u25cf':t.s==='bam'?t.n+'\u25a5':t.s==='crak'?t.n+'\u842c':t.m}<\/span><small>${name(t)}<\/small><\/${button?'button':'span'}>`} function setCoach(text,title=words[language].coach){el('coachTitle').textContent=title;el('coachText').textContent=text} function beep(freq=520){if(!sound)return;try{const a=new AudioContext(),o=a.createOscillator(),g=a.createGain();o.frequency.value=freq;g.gain.value=.035;o.connect(g);g.connect(a.destination);o.start();g.gain.exponentialRampToValueAtTime(.001,a.currentTime+.09);o.stop(a.currentTime+.1)}catch{}} function countMini(id,n){el(id).innerHTML=Array.from({length:Math.min(14,n)},()=>'<i><\/i>').join('')} function render(){sort(hands[0]);rackEl.innerHTML=hands[0].map(t=>tileHTML(t)).join('');rackEl.querySelectorAll('.tile').forEach(b=>b.onclick=()=>choose(b.dataset.id));['north','west','east'].forEach((x,i)=>{const p=[2,3,1][i];el(x+'Count').textContent=`${hands[p].length} tiles \u00b7 ${exposed[p].length} calls`;countMini(x+'Rack',hands[p].length)});el('wallCount').textContent=`Wall: ${deck.length}`;el('lastDiscard').innerHTML=`<span>Latest discard<\/span><strong>${name(pendingDiscard)}<\/strong>`;el('discardPool').innerHTML=discards.slice(-24).map(t=>`<span>${name(t)}<\/span>`).join('');el('exposures').innerHTML=exposed[0].map(g=>`<\/p>\n<div class=\"exposure\">${g.map(t=>tileHTML(t,false)).join('')}<\/div>\n<p>`).join('');el('phaseLabel').textContent=phase==='charleston'?`Charleston ${charleston+1}\/3`:phase==='over'?'Round over':phase==='setup'?'Setup':`Play \u00b7 turn ${draws+1}`;el('targetName').textContent=goal.name;updateAction()} function choose(id){if(!['charleston','discard'].includes(phase))return;if(selected.has(id))selected.delete(id);else{if(phase==='charleston'){if(selected.size>=3)selected.clear()}if(phase==='discard')selected.clear();selected.add(id)}render()} function updateAction(){const w=words[language];el('turnLabel').textContent=w.yourRack;claimBtn.hidden=true;skipBtn.hidden=true;if(phase==='charleston'){el('instruction').textContent=w.select3;el('selectionText').textContent=`${selected.size} \/ 3 selected`;mainBtn.textContent=w.pass;mainBtn.disabled=selected.size!==3}else if(phase==='draw'){el('instruction').textContent=w.draw;el('selectionText').textContent='Your turn';mainBtn.textContent=w.draw;mainBtn.disabled=!deck.length}else if(phase==='discard'){el('instruction').textContent=w.discard;el('selectionText').textContent=selected.size?name(hands[0].find(t=>selected.has(t.id))):'Select one tile';mainBtn.textContent=isWinning(hands[0])?w.win:w.discardBtn;mainBtn.disabled=isWinning(hands[0])?false:selected.size!==1}else if(phase==='claim'){el('instruction').textContent=w.call;el('selectionText').textContent=name(pendingDiscard);mainBtn.disabled=true;claimBtn.hidden=false;skipBtn.hidden=false;claimBtn.textContent=w.claim;skipBtn.textContent=w.skip}else{mainBtn.disabled=true}} function computerPass(r){return[...r].sort((a,b)=>strength(a,r)-strength(b,r)).slice(0,3)} function doCharleston(){if(selected.size!==3)return;const choices=[hands[0].filter(t=>selected.has(t.id)),...hands.slice(1).map(computerPass)],offset=[1,2,3][charleston],all=new Set(choices.flat().map(t=>t.id)),next=hands.map(r=>r.filter(t=>!all.has(t.id)));for(let p=0;p<4;p++)next[(p+offset)%4].push(...choices[p]);hands=next;selected.clear();charleston++;beep(640);if(charleston===3){phase='draw';setCoach(language==='en'?'The Charleston is complete. Draw one tile, compare it with your goal, then discard the least useful tile.':'Charleston \u5df2\u5b8c\u6210\u3002\u6478\u4e00\u5f20\u724c\uff0c\u5bf9\u7167\u76ee\u6807\uff0c\u7136\u540e\u6253\u51fa\u5e2e\u52a9\u6700\u5c0f\u7684\u724c\u3002')}else setCoach(language==='en'?`Pass ${charleston+1}: look again\u2014your rack changed after receiving three tiles.`:`\u7b2c ${charleston+1} \u8f6e\uff1a\u6536\u5230\u4e09\u5f20\u724c\u540e\u91cd\u65b0\u5224\u65ad\u624b\u724c\u3002`);render()} function drawPlayer(){if(!deck.length)return end(false,'The wall is empty.');hands[0].push(deck.pop());draws++;phase='discard';selected.clear();setCoach(language==='en'?'Keep exact goal tiles, matching groups, and Jokers. Select one less useful tile to discard.':'\u4fdd\u7559\u76ee\u6807\u724c\u3001\u76f8\u540c\u7ec4\u5408\u548c Joker\uff0c\u9009\u62e9\u4e00\u5f20\u5e2e\u52a9\u8f83\u5c0f\u7684\u724c\u6253\u51fa\u3002');beep();render()} function playerDiscard(){if(isWinning(hands[0]))return end(true,'You completed the training hand.');const t=hands[0].find(x=>selected.has(x.id));if(!t)return;hands[0]=hands[0].filter(x=>x.id!==t.id);pendingDiscard=t;discards.push(t);playerDiscards++;selected.clear();phase='computer';render();setTimeout(()=>computerCycle(1),500)} function canPung(r,t){if(!t)return false;if(['flower','joker'].includes(t.s))return false;const same=r.filter(x=>key(x)===key(t)).length,j=r.filter(x=>x.s==='joker').length;if(same>=2)return true;return same>=1?j>=1:false} function takeForPung(){const needed=[];for(const t of hands[0])if(key(t)===key(pendingDiscard)){if(needed.length<2)needed.push(t)}for(const t of hands[0])if(t.s==='joker'){if(needed.length<2)needed.push(t)}if(needed.length<2)return;const ids=new Set(needed.map(t=>t.id));hands[0]=hands[0].filter(t=>!ids.has(t.id));exposed[0].push([...needed,pendingDiscard]);discards.pop();pendingDiscard=null;phase='discard';selected.clear();setCoach(language==='en'?'Pung exposed. Because you called a discard, choose one tile to discard without drawing.':'\u660e\u523b\u5df2\u4eae\u51fa\u3002\u7531\u4e8e\u4f60\u53eb\u4e86\u5f03\u724c\uff0c\u73b0\u5728\u4e0d\u6478\u724c\uff0c\u76f4\u63a5\u9009\u62e9\u4e00\u5f20\u6253\u51fa\u3002');beep(700);render()} function computerCycle(p){if(phase==='over')return;if(!deck.length)return end(false,'The wall is empty.');turn=p;const r=hands[p];r.push(deck.pop());if(draws>7){if(Math.random()<Math.min(.03+draws\/700,.12))return end(false,`${['You','Casey','Riley','Jordan'][p]} completed a hand first.`)}const out=[...r].sort((a,b)=>strength(a,r)-strength(b,r))[0];hands[p]=r.filter(t=>t.id!==out.id);pendingDiscard=out;discards.push(out);render();if(canPung(hands[0],out)){phase='claim';setCoach(language==='en'?`You hold enough matching tiles to call ${name(out)}. Calling reveals a Pung; skipping keeps your hand concealed.`:`\u4f60\u6709\u8db3\u591f\u7684\u76f8\u540c\u724c\u53ef\u4ee5\u78b0 ${name(out)}\u3002\u78b0\u724c\u4f1a\u516c\u5f00\u7ec4\u5408\uff0c\u8df3\u8fc7\u5219\u7ee7\u7eed\u9690\u85cf\u624b\u724c\u3002`);render();return}const next=p===3?0:p+1;if(next===0){phase='draw';setCoach(language==='en'?'The turn returns to you. Draw from the wall.':'\u8f6e\u5230\u4f60\u4e86\uff0c\u4ece\u724c\u5899\u6478\u4e00\u5f20\u3002');render()}else setTimeout(()=>computerCycle(next),420)} function skipClaim(){phase='computer';const next=turn===3?0:turn+1;if(next===0){phase='draw';setCoach(language==='en'?'You skipped the call. Draw normally.':'\u4f60\u8df3\u8fc7\u4e86\u78b0\u724c\uff0c\u73b0\u5728\u6b63\u5e38\u6478\u724c\u3002');render()}else setTimeout(()=>computerCycle(next),350)} function isWinning(r){const counts={};for(const t of r)counts[key(t)]=(counts[key(t)]||0)+1;let jokers=counts['joker:Joker']||0;for(let i=0;i<goal.groups.length;i++){const[s,n,need]=goal.groups[i],have=counts[`${s}:${n}`]||0;if(need===2){if(have<2)return false}else{const missing=Math.max(0,need-have);jokers-=missing;if(jokers<0)return false}}return true} function end(win,msg){phase='over';const seconds=Math.max(1,Math.round((Date.now()-startTime)\/1000)),score=Math.max(10,(win?1000:350)-draws*8-playerDiscards*2);el('resultTitle').textContent=win?(language==='en'?'Mahjong! You completed the hand.':'Mahjong\uff01\u4f60\u5b8c\u6210\u4e86\u76ee\u6807\u624b\u724c\u3002'):(language==='en'?'Round complete':'\u672c\u5c40\u7ed3\u675f');el('resultScore').textContent=score;el('resultText').textContent=msg;el('resultStats').innerHTML=`<span>${draws} draws<\/span><span>${playerDiscards} discards<\/span><span>${seconds}s<\/span>`;el('resultModal').hidden=false;beep(win?820:330);render()} function showGoal(){el('goalModalTitle').textContent=goal.name;el('goalTiles').innerHTML=goal.groups.map(g=>`<\/p>\n<div class=\"goal-group\">${Array.from({length:g[2]},()=>`<span class=\"goal-tile\">${g[0]==='honor'?g[1]:g[1]+' '+g[0]}<\/span>`).join('')}<\/div>\n<p>`).join('');el('goalModal').hidden=false} function newGame(){deck=buildDeck();hands=[[],[],[],[]];exposed=[[],[],[],[]];discards=[];selected.clear();pendingDiscard=null;goal=goals[Math.floor(Math.random()*goals.length)];for(let n=0;n<13;n++)for(let p=0;p<4;p++)hands[p].push(deck.pop());charleston=0;turn=0;draws=0;playerDiscards=0;phase='charleston';startTime=Date.now();el('resultModal').hidden=true;setCoach(language==='en'?'Start the Charleston. Keep pairs, Jokers, and tiles shown in your practice goal; pass three weak tiles.':'\u5f00\u59cb Charleston\u3002\u4fdd\u7559\u5bf9\u5b50\u3001Joker \u548c\u76ee\u6807\u724c\uff0c\u4f20\u51fa\u4e09\u5f20\u8f83\u5f31\u7684\u724c\u3002');render()} mainBtn.onclick=()=>phase==='charleston'?doCharleston():phase==='draw'?drawPlayer():phase==='discard'?playerDiscard():null;claimBtn.onclick=takeForPung;skipBtn.onclick=skipClaim;el('targetHelp').onclick=showGoal;el('closeGoal').onclick=()=>el('goalModal').hidden=true;el('againBtn').onclick=newGame;el('soundBtn').onclick=e=>{sound=!sound;e.currentTarget.textContent=sound?'\u266a Sound':'\u00d7 Muted';e.currentTarget.setAttribute('aria-pressed',sound);if(sound)beep()};el('languageBtn').onclick=()=>{language=language==='en'?'zh':'en';el('languageBtn').textContent=language==='en'?'\u4e2d\u6587':'English';el('coachTitle').textContent=words[language].coach;render()};newGame(); })(); <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Play a free guided American Mahjong round against three computer players. Practice the Charleston, drawing, discarding, calls, Jokers, and winning.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-119","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Play American Mahjong Online Free: Guided Beginner Game - mahjong tiles online,free majong,Mahjong Strategy Guide<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Play American Mahjong Online Free: Guided Beginner Game - mahjong tiles online,free majong,Mahjong Strategy Guide\" \/>\n<meta property=\"og:description\" content=\"Play a free guided American Mahjong round against three computer players. Practice the Charleston, drawing, discarding, calls, Jokers, and winning.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/\" \/>\n<meta property=\"og:site_name\" content=\"mahjong tiles online,free majong,Mahjong Strategy Guide\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-21T13:53:55+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mrsfa.com\\\/index.php\\\/play-american-mahjong-online-free\\\/\",\"url\":\"https:\\\/\\\/www.mrsfa.com\\\/index.php\\\/play-american-mahjong-online-free\\\/\",\"name\":\"Play American Mahjong Online Free: Guided Beginner Game - mahjong tiles online,free majong,Mahjong Strategy Guide\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mrsfa.com\\\/#website\"},\"datePublished\":\"2026-08-21T13:15:35+00:00\",\"dateModified\":\"2026-08-21T13:53:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mrsfa.com\\\/index.php\\\/play-american-mahjong-online-free\\\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mrsfa.com\\\/index.php\\\/play-american-mahjong-online-free\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mrsfa.com\\\/index.php\\\/play-american-mahjong-online-free\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\\\/\\\/www.mrsfa.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Play American Mahjong Online Free: Guided Beginner Game\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mrsfa.com\\\/#website\",\"url\":\"https:\\\/\\\/www.mrsfa.com\\\/\",\"name\":\"mahjong tiles online,free majong,Mahjong Strategy Guide\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mrsfa.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Play American Mahjong Online Free: Guided Beginner Game - mahjong tiles online,free majong,Mahjong Strategy Guide","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:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/","og_locale":"zh_CN","og_type":"article","og_title":"Play American Mahjong Online Free: Guided Beginner Game - mahjong tiles online,free majong,Mahjong Strategy Guide","og_description":"Play a free guided American Mahjong round against three computer players. Practice the Charleston, drawing, discarding, calls, Jokers, and winning.","og_url":"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/","og_site_name":"mahjong tiles online,free majong,Mahjong Strategy Guide","article_modified_time":"2026-08-21T13:53:55+00:00","twitter_card":"summary_large_image","twitter_misc":{"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/","url":"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/","name":"Play American Mahjong Online Free: Guided Beginner Game - mahjong tiles online,free majong,Mahjong Strategy Guide","isPartOf":{"@id":"https:\/\/www.mrsfa.com\/#website"},"datePublished":"2026-08-21T13:15:35+00:00","dateModified":"2026-08-21T13:53:55+00:00","breadcrumb":{"@id":"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.mrsfa.com\/index.php\/play-american-mahjong-online-free\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.mrsfa.com\/"},{"@type":"ListItem","position":2,"name":"Play American Mahjong Online Free: Guided Beginner Game"}]},{"@type":"WebSite","@id":"https:\/\/www.mrsfa.com\/#website","url":"https:\/\/www.mrsfa.com\/","name":"mahjong tiles online,free majong,Mahjong Strategy Guide","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mrsfa.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"}]}},"_links":{"self":[{"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/pages\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":6,"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/pages\/119\/revisions"}],"predecessor-version":[{"id":128,"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/pages\/119\/revisions\/128"}],"wp:attachment":[{"href":"https:\/\/www.mrsfa.com\/index.php\/wp-json\/wp\/v2\/media?parent=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}