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

<channel>
	<title>attrip</title>
	<atom:link href="https://attrip.jp/feed/" rel="self" type="application/rss+xml"/>
	<link>https://attrip.jp</link>
	<description>（アットトリップ）</description>
	<lastBuildDate>Thu, 20 Aug 2026 22:11:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://attrip.jp/wp-content/uploads/2012/06/tumblr_m6q29cvCCd1rphkdfo1_250-150x150.jpg</url>
	<title>attrip</title>
	<link>https://attrip.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">42198381</site>	<xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item>
		<title>AIエージェントの途中を見せるUI集『AIcss』。この記事を作る流れで15の使いどころを試す</title>
		<link>https://attrip.jp/224038/</link>
					<comments>https://attrip.jp/224038/#respond</comments>
		
		<dc:creator><![CDATA[attrip]]></dc:creator>
		<pubDate>Thu, 20 Aug 2026 22:11:58 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Webデザイン]]></category>
		<category><![CDATA[AIcss]]></category>
		<category><![CDATA[AIエージェント]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Svelte]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[Vue]]></category>
		<guid isPermaLink="false">https://attrip.jp/224038/</guid>

					<description><![CDATA[<p>AIcssの公式14コンポーネントを、AIが紹介記事を調べ、下書きし、確認を頼む流れで実演。Web検索を加えた15の状態を操作して確かめます。</p>
<p>The post <a href="https://attrip.jp/224038/">AIエージェントの途中を見せるUI集『AIcss』。この記事を作る流れで15の使いどころを試す</a> first appeared on <a href="https://attrip.jp">attrip</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">AIエージェントの画面は、答えだけを出しても使いにくい。いま考えているのか、調べているのか、変更を提案しているのか、こちらの許可を待っているのかを分けて見せると、任せる範囲を判断できる。</p>



<p class="wp-block-paragraph">無料の<a href="https://www.aicss.dev/">AIcss</a>は、その途中の状態を作るためのUIコンポーネント集だ。Beta V1.2時点で、Thinking &amp; Reasoning、Tool &amp; Action States、Text Outputs、Structured Outputs、Rich &amp; Interactiveの5カテゴリに分かれている。React / Vue / Svelteのコードを切り替えてコピーする形式。</p>



<p class="wp-block-paragraph">この記事では、AIに「AIcssを紹介する記事を作って」と頼んだ場面を小さく再現する。下の画面はAIcss本体のコードではない。依存なしのHTML / CSS / JavaScriptで、各部品が何を担当するかを操作できるようにした独自デモだ。実際に組み込む時は、AIのイベント、検索結果、生成ジョブ、承認APIなどの実データへ接続する必要がある。</p>



<section class="aicss-article-lab" aria-label="AIcssを記事作成フローで試すデモ">
  <style>
    .aicss-article-lab{--a-bg:#f6f6f3;--a-panel:#fff;--a-text:#171716;--a-muted:#686861;--a-line:#dddcd6;--a-accent:#205bd7;--a-soft:#eaf0ff;--a-good:#18794e;--a-good-bg:#e8f7ef;--a-bad:#b42318;--a-bad-bg:#fff0ef;--a-code:#171a20;--a-shadow:0 10px 28px rgba(25,25,20,.08);box-sizing:border-box;max-width:760px;margin:28px auto;padding:clamp(14px,3vw,28px);background:var(--a-bg);color:var(--a-text);font:15px/1.65 system-ui,-apple-system,BlinkMacSystemFont,"Hiragino Sans",sans-serif;border:1px solid var(--a-line);border-radius:18px;overflow:hidden}
    .aicss-article-lab *{box-sizing:border-box}.aicss-article-lab button,.aicss-article-lab input,.aicss-article-lab textarea{font:inherit}.aicss-article-lab a{color:var(--a-accent);overflow-wrap:anywhere}.aicss-article-lab button{min-height:44px;max-width:100%;border:1px solid var(--a-line);border-radius:10px;padding:9px 12px;background:var(--a-panel);color:var(--a-text);cursor:pointer}.aicss-article-lab button:hover{border-color:var(--a-accent)}.aicss-article-lab button:focus-visible,.aicss-article-lab a:focus-visible,.aicss-article-lab input:focus-visible,.aicss-article-lab textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--a-accent) 45%,transparent);outline-offset:2px}.aicss-article-lab .a-primary{background:var(--a-accent);color:#fff;border-color:var(--a-accent)}.aicss-article-lab .a-danger{color:var(--a-bad)}
    .aicss-article-lab .a-head{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid var(--a-line)}.aicss-article-lab h2{font-size:clamp(20px,5vw,28px);line-height:1.3;margin:0}.aicss-article-lab p{margin:6px 0}.aicss-article-lab .a-kicker,.aicss-article-lab .a-meta{font-size:12px;color:var(--a-muted);letter-spacing:.04em}.aicss-article-lab .a-flow{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:4px;margin:16px 0}.aicss-article-lab .a-flow span{padding:5px 4px;text-align:center;font-size:11px;border-radius:6px;background:var(--a-line);color:var(--a-muted)}.aicss-article-lab .a-flow .is-now{background:var(--a-accent);color:#fff}
    .aicss-article-lab .a-grid{display:grid;gap:12px}.aicss-article-lab .a-card{min-width:0;padding:16px;background:var(--a-panel);border:1px solid var(--a-line);border-radius:14px;box-shadow:var(--a-shadow)}.aicss-article-lab .a-card h3{font-size:16px;margin:0 0 5px}.aicss-article-lab .a-card h3 a{text-decoration:none;color:inherit}.aicss-article-lab .a-card h3 a:hover{text-decoration:underline}.aicss-article-lab .a-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.aicss-article-lab .a-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
    .aicss-article-lab .a-thinking{display:inline-flex;gap:7px;align-items:center;color:var(--a-muted);font-weight:650}.aicss-article-lab .a-thinking:before{content:"";width:9px;height:9px;border-radius:50%;background:var(--a-accent);animation:aicssPulse 1.1s ease-in-out infinite}.aicss-article-lab .a-reasoning{overflow:hidden}.aicss-article-lab .a-reasoning[hidden]{display:none}.aicss-article-lab .a-reasoning p{padding:7px 0;border-bottom:1px solid var(--a-line);font-size:14px}.aicss-article-lab .a-orbs{position:relative;height:88px;display:grid;place-items:center;overflow:hidden;background:radial-gradient(circle at 50% 50%,var(--a-soft),transparent 66%)}.aicss-article-lab .a-orbs i{position:absolute;width:28px;height:28px;border-radius:50%;background:var(--a-accent);filter:blur(1px);opacity:.75;animation:aicssOrbit 2.4s linear infinite}.aicss-article-lab .a-orbs i:nth-child(2){background:#8b63e8;animation-delay:-.8s}.aicss-article-lab .a-orbs i:nth-child(3){background:#33a474;animation-delay:-1.6s}
    .aicss-article-lab .a-search{display:grid;gap:7px}.aicss-article-lab .a-search-row{display:flex;gap:8px;align-items:center;padding:9px;border-radius:8px;background:var(--a-bg);font-size:13px}.aicss-article-lab .a-search-row b{color:var(--a-good)}.aicss-article-lab .a-search-row[hidden]{display:none}.aicss-article-lab .a-diff{overflow:auto;border:1px solid var(--a-line);border-radius:9px;font:12px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace}.aicss-article-lab .a-diff-head{display:flex;justify-content:space-between;gap:12px;padding:8px;background:var(--a-bg);white-space:nowrap}.aicss-article-lab .a-line{display:grid;grid-template-columns:28px 20px minmax(280px,1fr);gap:4px;padding:3px 8px;white-space:pre}.aicss-article-lab .a-add{background:var(--a-good-bg);color:var(--a-good)}.aicss-article-lab .a-del{background:var(--a-bad-bg);color:var(--a-bad)}.aicss-article-lab .a-image{min-height:144px;display:grid;place-items:center;border-radius:10px;background:linear-gradient(115deg,#d8deea 8%,#f4f6fb 18%,#d8deea 33%);background-size:220% 100%;color:#171716;animation:aicssShimmer 1.8s linear infinite}.aicss-article-lab .a-image[data-done="true"]{animation:none;background:linear-gradient(140deg,#c9d8ff,#f6f3df 52%,#b5e8dd)}.aicss-article-lab .a-image figure{text-align:center;margin:0}.aicss-article-lab .a-image .a-mountain{font-size:50px;line-height:1}.aicss-article-lab .a-stream{min-height:50px}.aicss-article-lab .a-caret{display:inline-block;width:2px;height:1em;margin-left:2px;background:currentColor;vertical-align:-.14em;animation:aicssBlink .8s steps(1) infinite}.aicss-article-lab .a-citations sup a{display:inline-grid;place-items:center;min-width:19px;height:19px;padding:0 4px;background:var(--a-soft);border-radius:99px;text-decoration:none;font-size:11px}.aicss-article-lab .a-refs{padding:8px 0 0;margin:10px 0 0;border-top:1px solid var(--a-line);font-size:12px}.aicss-article-lab pre{margin:0;max-width:100%;overflow:auto;padding:12px;border-radius:9px;background:var(--a-code);color:#eef0f3;font:12px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace}.aicss-article-lab code{overflow-wrap:anywhere}.aicss-article-lab .a-todo{padding:0;margin:8px 0;list-style:none}.aicss-article-lab .a-todo li{display:flex;align-items:center;gap:8px;min-height:35px}.aicss-article-lab .a-todo input{width:19px;height:19px;accent-color:var(--a-good)}.aicss-article-lab .a-todo input:checked+span{text-decoration:line-through;color:var(--a-muted)}.aicss-article-lab .a-scroll{max-width:100%;overflow:auto;border:1px solid var(--a-line);border-radius:9px}.aicss-article-lab table{width:100%;min-width:430px;border-collapse:collapse;font-size:13px}.aicss-article-lab th,.aicss-article-lab td{padding:9px;text-align:left;border-bottom:1px solid var(--a-line)}.aicss-article-lab th{background:var(--a-bg)}.aicss-article-lab .a-yes{color:var(--a-good);font-weight:700}.aicss-article-lab .a-no{color:var(--a-muted)}
    .aicss-article-lab .a-input{display:grid;gap:8px}.aicss-article-lab textarea{width:100%;min-height:88px;padding:10px;resize:vertical;border:1px solid var(--a-line);border-radius:9px;background:var(--a-panel);color:var(--a-text)}.aicss-article-lab .a-choice{display:flex;flex-wrap:wrap;gap:7px}.aicss-article-lab .a-choice button[aria-pressed="true"]{border-color:var(--a-accent);background:var(--a-soft)}.aicss-article-lab .a-approval{border-left:4px solid #e9a826}.aicss-article-lab .a-result{font-size:13px;color:var(--a-muted)}.aicss-article-lab .a-note{padding:12px;border-radius:10px;background:var(--a-soft);font-size:14px}.aicss-article-lab .a-replay{white-space:nowrap}
    @keyframes aicssPulse{50%{opacity:.25;transform:scale(.72)}}@keyframes aicssOrbit{to{transform:rotate(360deg) translateX(28px) rotate(-360deg)}}@keyframes aicssShimmer{to{background-position:-220% 0}}@keyframes aicssBlink{50%{opacity:0}}
    @media (min-width:620px){.aicss-article-lab .a-grid{grid-template-columns:1fr 1fr}.aicss-article-lab .a-span{grid-column:1/-1}}@media (max-width:380px){.aicss-article-lab{margin-inline:0;border-radius:0;padding:12px}.aicss-article-lab .a-head{align-items:stretch;flex-direction:column}.aicss-article-lab .a-replay{width:100%}.aicss-article-lab .a-line{grid-template-columns:24px 16px minmax(250px,1fr)}}
    @media (prefers-color-scheme:dark){.aicss-article-lab:not([data-theme="light"]){--a-bg:#151614;--a-panel:#20211e;--a-text:#f1f1eb;--a-muted:#b5b5ab;--a-line:#3a3b36;--a-soft:#182748;--a-code:#0e0f12;--a-good:#71d9a4;--a-good-bg:#123826;--a-bad:#ff958f;--a-bad-bg:#431f20}}
    :root[data-theme="dark"] .aicss-article-lab{--a-bg:#151614;--a-panel:#20211e;--a-text:#f1f1eb;--a-muted:#b5b5ab;--a-line:#3a3b36;--a-soft:#182748;--a-code:#0e0f12;--a-good:#71d9a4;--a-good-bg:#123826;--a-bad:#ff958f;--a-bad-bg:#431f20}
    @media (prefers-reduced-motion:reduce){.aicss-article-lab *{animation-duration:.001ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important}}
  </style>
  <div class="a-head">
    <div><p class="a-kicker">AIcss × ARTICLE MAKING / 15 STATES</p><h2>「AIcssを紹介して」を、読者が追える作業にする</h2></div>
    <button type="button" class="a-replay a-primary" data-aicss-replay>最初から再生</button>
  </div>
  <div class="a-flow" aria-label="記事作成の進行"><span class="is-now">依頼</span><span>調査</span><span>下書き</span><span>確認</span><span>完了</span></div>
  <p class="a-note">操作できるのは見せ方です。検索・画像生成・公開は実行しません。各見出しから公式の部品ページを開けます。</p>
  <div class="a-grid">
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/thinking-state" target="_blank" rel="noopener">1. Thinking State ↗</a></h3><p>まずは「記事の目的を読み取っている」とだけ知らせる。短い処理なら、これで待つ理由が分かる。</p><p class="a-thinking" data-thinking>依頼を読んでいます</p></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/thinking-reasoning" target="_blank" rel="noopener">2. Thinking + Reasoning ↗</a></h3><p>長い仕事では、結論に至る前の観点を畳んで置く。推論の生ログではなく、確認できる作業の要約にする。</p><button type="button" aria-expanded="false" data-reason-toggle>考えたことを開く</button><div class="a-reasoning" hidden data-reasoning><p>公式ページのカテゴリと部品名を確認。</p><p>「一覧」ではなく記事作成の順番で並べる。</p><p>公開操作は承認待ちとして分離。</p></div></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/orbs" target="_blank" rel="noopener">3. Orbs ↗</a></h3><p>内容を断定しない待機や、複数の軽い処理が走る時間に向く。飾りではなく、まだ答えがない状態の印。</p><div class="a-orbs" aria-label="3つの処理が待機中"><i></i><i></i><i></i></div></article>
    <article class="a-card"><h3>4. Web Search <small class="a-meta">（記事用の補助例）</small></h3><p>現行Beta V1.2の公式14部品には含まれないが、調査の開始・取得・読み込みを分けると、利用者は次の結果を待つか判断できる。</p><div class="a-search" aria-live="polite" data-search><div class="a-search-row"><b>待機</b> AIcss UI components</div><div class="a-search-row" hidden><b>取得</b> aicss.dev を読んでいます</div><div class="a-search-row" hidden><b>完了</b> 公式カテゴリを確認</div></div><div class="a-actions"><button type="button" data-search-start>調査を再現</button></div></article>
    <article class="a-card a-span"><h3><a href="https://www.aicss.dev/components/file-diff" target="_blank" rel="noopener">5. File Diff ↗</a></h3><p>AIが本文やコードを変えるなら、何を消し、何を足すかを先に見せる。人間がレビューする地点を作る部品。</p><div class="a-diff" role="region" aria-label="本文の変更案"><div class="a-diff-head"><b>content/aicss-ai-agent-ui-components.md</b><span><b class="a-yes">+2</b> <b class="a-danger">-1</b></span></div><div class="a-line"><span>24</span><span> </span><code>AIcssはUIコンポーネント集だ。</code></div><div class="a-line a-del"><span>25</span><span>−</span><code>見た目がきれい。</code></div><div class="a-line a-add"><span>25</span><span>+</span><code>AIの状態と人間の判断をつなぐ。</code></div><div class="a-line a-add"><span>26</span><span>+</span><code>実データへの接続は別途必要。</code></div></div></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/image-generation" target="_blank" rel="noopener">6. Image Generation ↗</a></h3><p>アイキャッチ生成中は、完成品のふりをしない。サイズ、プロンプト、生成中を見せる。</p><div class="a-image" role="img" aria-label="記事用アイキャッチを生成中" data-image><figure><div class="a-mountain" aria-hidden="true">◒</div><figcaption data-image-label>1200 × 630 / 生成中</figcaption></figure></div><div class="a-actions"><button type="button" data-image-start>生成を完了表示</button></div></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/text-response" target="_blank" rel="noopener">7. Text Response ↗</a></h3><p>通常の回答は、読み物として落ち着かせる。<code>status: draft</code>のような短い値だけをコード扱いにして、本文を読ませる。</p><p>結論：AIcssは、AIの途中を利用者が判断できる形へ整えるのに向く。</p></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/streaming-text" target="_blank" rel="noopener">8. Streaming Text ↗</a></h3><p>返答が届く途中を示す。全文を隠して待たせるより、確定したところから読める。</p><p class="a-stream" aria-live="polite" data-stream></p><div class="a-actions"><button type="button" data-stream-start>下書きを流す</button></div></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/inline-citations" target="_blank" rel="noopener">9. Inline Citations ↗</a></h3><p class="a-citations">AIcssはBeta V1.2として、AIエージェントが会話中に見せる部品を「copy-paste blocks」として公開している<sup><a href="#aicss-source-1">1</a></sup>。</p><p class="a-refs" id="aicss-source-1">1. <a href="https://www.aicss.dev/" target="_blank" rel="noopener">AIcss 公式トップ</a></p></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/code-block" target="_blank" rel="noopener">10. Code Block ↗</a></h3><p>実装者へ渡す最小の接続例。コピー対象と説明文を分ける。</p><pre><code data-code>agent.on("status", ({ phase }) =&gt; {
  ui.setThinking(phase === "research");
});</code></pre><div class="a-actions"><button type="button" data-copy>コードをコピー</button><span class="a-result" aria-live="polite" data-copy-result></span></div></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/task-list" target="_blank" rel="noopener">11. To-do List ↗</a></h3><p>長い依頼は、作業の終了点を先に見せる。クリックで完了を切り替えられる。</p><ul class="a-todo" data-todos><li><input id="a-t1" type="checkbox" checked><span>公式ページを確認</span></li><li><input id="a-t2" type="checkbox"><span>本文を下書き</span></li><li><input id="a-t3" type="checkbox"><span>参照元を入れる</span></li><li><input id="a-t4" type="checkbox"><span>公開前の承認を受ける</span></li></ul><p class="a-result" aria-live="polite" data-todo-result>1 / 4 完了</p></article>
    <article class="a-card a-span"><h3><a href="https://www.aicss.dev/components/data-table" target="_blank" rel="noopener">12. Data Table ↗</a></h3><p>候補を並べて、判断材料を渡す。小さい画面では横にスクロールし、列を潰さない。</p><div class="a-scroll"><table><thead><tr><th>部品</th><th>記事制作での使い道</th><th>人が見ること</th></tr></thead><tbody><tr><td>Thinking</td><td>調査中</td><td>待つか止めるか</td></tr><tr><td>File Diff</td><td>本文変更案</td><td>変更を採るか</td></tr><tr><td>Approval Card</td><td>公開前</td><td>許可するか</td></tr></tbody></table></div></article>
    <article class="a-card a-span"><h3><a href="https://www.aicss.dev/components/comparison-table" target="_blank" rel="noopener">13. Comparison Table ↗</a></h3><p>「どちらがよいか」をYes / Noだけで見せる。エージェントが決め切る場所と、人間に戻す場所を混ぜない。</p><div class="a-scroll"><table><thead><tr><th>工程</th><th>AIが進める</th><th>人が決める</th></tr></thead><tbody><tr><td>公式ページの読み取り</td><td class="a-yes">✓</td><td class="a-no">—</td></tr><tr><td>本文の下書き</td><td class="a-yes">✓</td><td>方向を確認</td></tr><tr><td>本番公開</td><td>準備まで</td><td class="a-yes">✓</td></tr></tbody></table></div></article>
    <article class="a-card"><h3><a href="https://www.aicss.dev/components/ai-agent-input" target="_blank" rel="noopener">14. AI Agent Input ↗</a></h3><p>曖昧な依頼を、次の一手が決まる質問へ変える。自由記述も残す。</p><div class="a-input"><label for="aicss-request">記事の読者</label><textarea id="aicss-request">AIエージェントの画面を作っている人。コードの前に、何を見せるべきか知りたい。</textarea><div class="a-choice" data-choices><button type="button" aria-pressed="true">入門者向け</button><button type="button" aria-pressed="false">実装者向け</button><button type="button" aria-pressed="false">両方</button></div><p class="a-result" aria-live="polite" data-choice-result>選択：入門者向け</p></div></article>
    <article class="a-card a-approval"><h3><a href="https://www.aicss.dev/components/approval-card" target="_blank" rel="noopener">15. Approval Card ↗</a></h3><p>公開は、AIが勝手に進めない。対象と影響を短く固定し、明示的な許可を待つ。</p><p><b>提案：</b>下書きをCMSへ送信する<br><span class="a-meta">影響：公開URLなし / 既存記事・画像は変更しない</span></p><div class="a-actions"><button type="button" class="a-primary" data-approve>下書き保存を許可</button><button type="button" class="a-danger" data-reject>今回は止める</button></div><p class="a-result" aria-live="polite" data-approval-result>未承認。ここでは外部送信しません。</p></article>
  </div>
</section>
<script>
(() => {
  const root = document.currentScript?.previousElementSibling;
  if (!root || root.dataset.aicssReady === "true") return;
  root.dataset.aicssReady = "true";
  const reduce = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
  const $ = (s) => root.querySelector(s);
  let streamTimer, searchTimers = [];
  const streamText = "AIcssは、AIが何をしているかを見せるための部品集です。答えだけでなく、調査・変更・承認待ちを分けると、利用者が次の判断をしやすくなります。";
  const reset = () => {
    clearInterval(streamTimer); searchTimers.forEach(clearTimeout); searchTimers = [];
    $("[data-stream]").textContent = "";
    const rows = root.querySelectorAll("[data-search] .a-search-row"); rows.forEach((row, i) => { row.hidden = i !== 0; });
    const image = $("[data-image]"); image.dataset.done = "false"; $("[data-image-label]").textContent = "1200 × 630 / 生成中";
    $("[data-approval-result]").textContent = "未承認。ここでは外部送信しません。";
  };
  $("[data-aicss-replay]").addEventListener("click", reset);
  $("[data-reason-toggle]").addEventListener("click", (event) => { const panel = $("[data-reasoning]"); const next = panel.hidden; panel.hidden = !next; event.currentTarget.setAttribute("aria-expanded", String(next)); event.currentTarget.textContent = next ? "考えたことを閉じる" : "考えたことを開く"; });
  $("[data-search-start]").addEventListener("click", () => { const rows = root.querySelectorAll("[data-search] .a-search-row"); rows.forEach((row, i) => { row.hidden = i > 0; }); searchTimers = [setTimeout(() => { rows[1].hidden = false; }, reduce ? 0 : 450), setTimeout(() => { rows[2].hidden = false; }, reduce ? 0 : 900)]; });
  $("[data-image-start]").addEventListener("click", () => { const image = $("[data-image]"); image.dataset.done = "true"; $("[data-image-label]").textContent = "1200 × 630 / 生成完了"; });
  $("[data-stream-start]").addEventListener("click", () => { clearInterval(streamTimer); let i = 0; const out = $("[data-stream]"); const write = () => { i += reduce ? streamText.length : 2; out.textContent = streamText.slice(0, i); if (i < streamText.length) out.append(Object.assign(document.createElement("span"), { className: "a-caret", "aria-hidden": "true" })); if (i >= streamText.length) clearInterval(streamTimer); }; write(); if (i < streamText.length) streamTimer = setInterval(write, 18); });
  $("[data-copy]").addEventListener("click", async () => { const result = $("[data-copy-result]"); try { await navigator.clipboard.writeText($("[data-code]").textContent); result.textContent = "コピーしました"; } catch { result.textContent = "コピーできません。コードを選択してください。"; } });
  const updateTodos = () => { const checks = root.querySelectorAll("[data-todos] input"); $("[data-todo-result]").textContent = `${[...checks].filter((box) => box.checked).length} / ${checks.length} 完了`; }; root.querySelectorAll("[data-todos] input").forEach((box) => box.addEventListener("change", updateTodos));
  root.querySelectorAll("[data-choices] button").forEach((button) => button.addEventListener("click", () => { root.querySelectorAll("[data-choices] button").forEach((item) => item.setAttribute("aria-pressed", "false")); button.setAttribute("aria-pressed", "true"); $("[data-choice-result]").textContent = `選択：${button.textContent}`; }));
  $("[data-approve]").addEventListener("click", () => { $("[data-approval-result]").textContent = "許可を記録しました。これはデモなので保存・送信はしません。"; });
  $("[data-reject]").addEventListener("click", () => { $("[data-approval-result]").textContent = "停止を記録しました。作業はここで止まります。"; });
})();
</script>



<h2 class="wp-block-heading">AIcssは「AIっぽい飾り」のためではない</h2>



<p class="wp-block-paragraph">AIcssの価値は、単に見た目の部品を並べたことではない。考え中、ツール実行、文章出力、構造化した比較、質問、承認という順で、AIの状態と人間の判断をつなげられることにある。</p>



<p class="wp-block-paragraph">たとえば記事作成なら、調査中はThinking、事実を示すならInline Citations、下書きの変更はFile Diff、公開はApproval Cardで止める。利用者は「待つ」「読む」「直す」「許可する」を混同しなくてよい。</p>



<h2 class="wp-block-heading">まずは1つだけ実データにつなぐ</h2>



<p class="wp-block-paragraph">全部を一度に入れる必要はない。最初の1本なら、次の順番が安全だ。</p>



<ol class="wp-block-list">
    <li>長い処理にThinking Stateを置く</li>
    <li>進行が複数あるならTo-do Listへ実際のタスク状態を渡す</li>
    <li>副作用がある操作の前にApproval Cardを置く</li>
</ol>



<p class="wp-block-paragraph">公式サイトでは各部品のReact / Vue / Svelte実装を切り替えられる。コピー後は、見本の文章やタイマーを残さず、アプリ側の状態に置き換える。特に「検索完了」「画像生成完了」「公開済み」は、UIだけで決めず、実際のAPI結果と同期させたい。</p>



<h2 class="wp-block-heading">参照元</h2>



<ul class="wp-block-list">
    <li><a href="https://www.aicss.dev/">AIcss 公式トップ：Beta V1.2、5カテゴリ、各コンポーネント</a></li>
    <li><a href="https://www.aicss.dev/components/thinking-state">Thinking／Reasoning：Thinking State / Thinking + Reasoning / Orbs</a></li>
    <li><a href="https://www.aicss.dev/components/file-diff">Tool／Action States：File Diff / Image Generation</a></li>
    <li><a href="https://www.aicss.dev/components/text-response">Text Outputs：Text Response / Streaming Text / Inline Citations / Code Block</a></li>
    <li><a href="https://www.aicss.dev/components/data-table">Structured Outputs：To-do List / Data Table / Comparison Table</a></li>
    <li><a href="https://www.aicss.dev/components/ai-agent-input">Rich／Interactive：AI Agent Input / Approval Card</a></li>
</ul>



<p class="wp-block-paragraph">※上のデモは公式コードをコピーせず、記事作成の文脈で挙動を独自実装したもの。実装時は各公式ページの現行コードと、アプリ側の実データを接続する。</p>



<p class="wp-block-paragraph">※Web Searchは現行の公式一覧にないため、記事制作で隣接して必要になる状態として独自デモに加えた。公式コンポーネントは14点。記事内のデモは15点ある。</p><p>The post <a href="https://attrip.jp/224038/">AIエージェントの途中を見せるUI集『AIcss』。この記事を作る流れで15の使いどころを試す</a> first appeared on <a href="https://attrip.jp">attrip</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://attrip.jp/224038/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">224038</post-id>	</item>
		<item>
		<title>オセロで勝つための考え方【2026年版】序盤・中盤・終盤を練習盤で学ぶ</title>
		<link>https://attrip.jp/224027/</link>
					<comments>https://attrip.jp/224027/#respond</comments>
		
		<dc:creator><![CDATA[attrip]]></dc:creator>
		<pubDate>Mon, 17 Aug 2026 04:43:33 +0000</pubDate>
				<category><![CDATA[オセロ]]></category>
		<category><![CDATA[オセロ 勝ち方]]></category>
		<category><![CDATA[オセロ 必勝法]]></category>
		<category><![CDATA[中割り]]></category>
		<category><![CDATA[偶数理論]]></category>
		<guid isPermaLink="false">https://attrip.jp/224027/</guid>

					<description><![CDATA[<p>オセロの勝ち方を序盤・中盤・終盤に分けて解説。1枚返し、中割り、角と辺、終盤の偶奇を、実際に盤面をクリックする練習問題で学べます。</p>
<p>The post <a href="https://attrip.jp/224027/">オセロで勝つための考え方【2026年版】序盤・中盤・終盤を練習盤で学ぶ</a> first appeared on <a href="https://attrip.jp">attrip</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">オセロに完全な必勝法はありません。ただし、序盤・中盤・終盤で見る場所を変えると、勝ちやすい手を選べるようになります。</p>



<p class="wp-block-paragraph">このページでは、昔からある「1枚だけ返して後半に勝負する」という考え方を入口にします。さらに、相手の打てる場所を減らす中割り、角と辺の危険、終盤の空きマスまで、実際の盤面で練習します。</p>



<div class="attrip-othello-learning-map" aria-label="オセロ練習の進め方">
  <strong>基本3問＋仕上げ3問・約6分で練習</strong>
  <ol>
    <li><a href="#othello-practice-01">序盤：少なく返す</a></li>
    <li><a href="#othello-practice-02">中盤：相手の手を減らす</a></li>
    <li><a href="#othello-practice-03">終盤：石数と空きマスを読む</a></li>
    <li><a href="#othello-finish">仕上げ：詰めオセロ風3問</a></li>
  </ol>
  <p>盤面を見て先に予想し、クリック後に返った石と相手の合法手を確認します。</p>
</div>



<h2 class="wp-block-heading">序盤は石の枚数より打てる場所を見る</h2>



<p class="wp-block-paragraph">序盤に石をたくさん取ると、勝っているように見えます。しかし、自分の石が盤面の外側へ広がると、相手が打てる場所も増えます。</p>



<p class="wp-block-paragraph">最初は次の順番で考えます。</p>



<ol class="wp-block-list">
    <li>相手に角を取られないか</li>
    <li>自分の打てる場所が残るか</li>
    <li>相手の打てる場所を増やしすぎないか</li>
    <li>迷ったら、返す枚数の少ない手を選ぶ</li>
</ol>



<p class="wp-block-paragraph">「1枚返し」は、この4番目の判断です。1枚返しだけを守れば勝てる、という意味ではありません。</p>



<div class="attrip-othello-story" data-othello-story="opening">
  <div class="attrip-othello-story__intro">
    <p class="attrip-othello-practice__label">盤面で見る / OPENING</p>
    <h3>中央に置くと、次の選択肢が残る</h3>
    <p>黒番の合法手数と、黒がD3へ置いたあとの白の合法手数を比べます。</p>
  </div>
  <div class="attrip-othello-board-wrap">
    <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
    <div class="attrip-othello-board-row">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
      <div class="attrip-othello-board" data-story-board></div>
    </div>
  </div>
  <div class="attrip-othello-stats" data-story-stats aria-live="polite">
    <div><span>黒の合法手</span><strong data-story-stat="self">—</strong></div>
    <div><span>次の白の合法手</span><strong data-story-stat="opponent">—</strong></div>
    <div><span>返した石</span><strong data-story-stat="flipped">—</strong></div>
  </div>
  <button type="button" class="attrip-othello-reset" data-story-action>手を置いてみる</button>
  <p class="attrip-othello-result" data-story-result aria-live="polite" tabindex="-1">盤面を見てから「手を置いてみる」を押してください。</p>
</div>



<h2 class="wp-block-heading">序盤の練習盤：最初の4手から考える</h2>



<p class="wp-block-paragraph">黒番です。盤面の中で、黒が打てる場所をクリックしてください。最初の4か所は、回転させると同じ形です。ここで角を狙わず、中央の選択肢を残す感覚を覚えます。</p>



<div class="attrip-othello-practice" id="othello-practice-01" data-othello-practice>
  <div class="attrip-othello-practice__intro">
    <p class="attrip-othello-practice__label">PRACTICE 01 / OPENING</p>
    <h3>黒番：最初の一手を選ぶ</h3>
    <p>合法手だけが押せます。4か所すべてが教材上の正解です。</p>
    <p class="attrip-othello-practice__focus"><strong>見る場所：</strong>角ではなく、中央の選択肢</p>
  </div>
  <div class="attrip-othello-board-wrap">
    <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
    <div class="attrip-othello-board-row">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
      <div class="attrip-othello-board" data-board="opening"></div>
    </div>
  </div>
  <div class="attrip-othello-stats" data-stats aria-live="polite">
    <div><span>候補手</span><strong data-stat="moves">—</strong></div>
    <div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div>
    <div><span>返した石</span><strong data-stat="flipped">—</strong></div>
  </div>
  <p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p>
  <button type="button" class="attrip-othello-reset" data-reset>もう一度</button>
</div>



<h2 class="wp-block-heading">中盤は中割りと二択づくりで攻める</h2>



<p class="wp-block-paragraph">中割りは、相手の石に囲まれた盤面の内側へ打つ手です。少ない枚数を返しながら、自分の石を外側へ広げすぎないようにします。</p>



<p class="wp-block-paragraph">中割りの目的は、単に1枚返すことではありません。</p>



<ul class="wp-block-list">
    <li>自分の打てる場所を残す</li>
    <li>相手の打てる場所を増やしすぎない</li>
    <li>相手に角や危険な辺を渡さない</li>
</ul>



<p class="wp-block-paragraph">この3つを同時に見る手が、中割りとして価値を持ちます。</p>



<h3 class="wp-block-heading">中割りで間違えやすい考え方</h3>



<p class="wp-block-paragraph">「1枚返す手なら必ず良い」は間違いです。辺で1枚返して相手に角を渡すなら、悪手になります。</p>



<p class="wp-block-paragraph">「相手の手数を0にすればよい」も間違いです。相手を追い詰めた結果、自分がX打ちやC打ちを強制されることがあります。</p>



<p class="wp-block-paragraph">手数は数だけでなく、質を見ます。自分の合法手が10か所あっても、危険な場所ばかりなら安心できません。3か所しかなくても、中央や安全な辺が残っているなら十分です。</p>



<h3 class="wp-block-heading">中盤の攻め方は「相手の次の手」から逆算する</h3>



<p class="wp-block-paragraph">中盤の攻めは、自分がたくさん返すことではありません。相手の次の候補を悪い場所へ寄せ、自分には次の攻め手を残すことです。次の順番で考えます。</p>



<ol class="wp-block-list">
    <li><strong>自分の合法手を全部出す。</strong> まず「置ける手」を見落とさない。最初から一番返せそうな手に決めない。</li>
    <li><strong>各候補のあと、相手の合法手を数える。</strong> 手数が少ないほど有利とは限らないので、X打ち・C打ち・角に近い手が混ざっていないか確認する。</li>
    <li><strong>相手の良い返しを一つに絞る。</strong> 相手がどこへ打っても安全なら、その手は攻めになっていない。相手に「中央へ返す手」と「危険な辺へ出る手」のような二択を残し、どちらを選ばれても次の一手を用意する。</li>
    <li><strong>相手の一手後に、もう一度数え直す。</strong> 中盤は予定通りに打つ場所を決める場面ではない。相手の返しで形が変わったら、候補手・角・辺を最初から見直す。</li>
</ol>



<p class="wp-block-paragraph">この練習盤では、黒の候補手ごとの白の合法手数は次のようになります。</p>



<table style="width:100%;border-collapse:collapse;">
  <thead><tr><th style="padding:.45rem .35rem;border-bottom:1px solid #9aa5ae;text-align:left;">黒の手</th><th style="padding:.45rem .35rem;border-bottom:1px solid #9aa5ae;text-align:left;">次の白の合法手</th><th style="padding:.45rem .35rem;border-bottom:1px solid #9aa5ae;text-align:left;">読み方</th></tr></thead>
  <tbody>
    <tr><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">C2・E2</td><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">7か所</td><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">白の選択肢を広げやすい</td></tr>
    <tr><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">C3・C5・C6</td><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">6か所</td><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">中央を保ちつつ、次の形を読める</td></tr>
    <tr><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">E6</td><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">5か所</td><td style="padding:.45rem .35rem;border-bottom:1px solid #d8dee4;vertical-align:top;">手数は最小。ただし返しの質も確認する</td></tr>
    <tr><td style="padding:.45rem .35rem;vertical-align:top;">C7</td><td style="padding:.45rem .35rem;vertical-align:top;">9か所</td><td style="padding:.45rem .35rem;vertical-align:top;">外側へ広がり、白の手を増やしやすい</td></tr>
  </tbody>
</table>



<p class="wp-block-paragraph">ここで大切なのは、<strong>「相手の手数が最小の手」を自動的に選ばないこと</strong>です。E6は5か所まで減らしますが、C5は中央の形と自分の次の候補を残します。実戦では、手数・危険な場所・自分の次の手をセットで比べます。</p>



<p class="wp-block-paragraph">#### 1枚返しでも攻めになる場面</p>



<p class="wp-block-paragraph">1枚返しが悪いのではありません。次の3つを同時に満たす1枚返しなら、攻めの準備になります。</p>



<ul class="wp-block-list">
    <li>相手の合法手を増やさない</li>
    <li>相手の石を外側へ押し出し、自分は中央に残る</li>
    <li>相手の返しのあと、自分に2か所以上の候補が残る</li>
</ul>



<p class="wp-block-paragraph">この形を作れたら、次の手で相手の選択肢をさらに分けます。逆に、1枚しか返さなくても自分の石が辺や角の近くへ出て、相手に中央の手をたくさん与えるなら、それは守勢に回る手です。</p>



<p class="wp-block-paragraph">中盤では、毎手「自分の手数 → 相手の手数 → 相手の手の質 → 自分の次の候補」の4つを声に出して確認すると、攻めと無理な突撃を区別しやすくなります。</p>



<h3 class="wp-block-heading">中盤で特に意識する5つ</h3>



<p class="wp-block-paragraph">中盤の盤面を見たら、次の5つを順番に確認します。</p>



<ol class="wp-block-list">
    <li><strong>相手の打てる場所を先に見る。</strong> 自分がどこへ打ちたいかより、「相手が次に一番楽になる場所はどこか」を先に探します。</li>
    <li><strong>自分の石の外周を増やしすぎない。</strong> 空きマスに接している石が多いと、相手がそこを利用して打ちやすくなります。少なく返すだけでなく、外側へ石を押し出さないことが重要です。</li>
    <li><strong>自分の次の候補を2つ以上残す。</strong> 1手で形を決め切らず、相手の返しのあとにも中央の候補が残る手を選びます。</li>
    <li><strong>角・X打ち・C打ちへの道を確認する。</strong> 今すぐ角を取られなくても、相手の次の一手で角へつながる空きが生まれるなら危険です。</li>
    <li><strong>石数を評価に使わない。</strong> 中盤で石が多いことは、相手に返される外側の石が多いことでもあります。石数は終盤に数え、中盤は形と手数を優先します。</li>
</ol>



<h3 class="wp-block-heading">中盤でやってはいけないこと</h3>



<ul class="wp-block-list">
    <li><strong>一度にたくさん返す。</strong> 相手の石を外側へ押し出し、相手の合法手を増やすことがあります。</li>
    <li><strong>辺を取れば安全だと考える。</strong> 角とつながっていない辺は、相手の攻めの入口になることがあります。</li>
    <li><strong>相手の手数を0にすることだけを目指す。</strong> 相手がパスした後、自分に危険な手しか残らないなら、手数を減らした意味がありません。</li>
    <li><strong>最初に決めた予定手を変えない。</strong> 相手の返しで角や辺の状況は変わります。毎回、相手の最善手から読み直します。</li>
</ul>



<p class="wp-block-paragraph">迷ったときは、候補手を一つ選び、次の3問だけを確認します。</p>



<ol class="wp-block-list">
    <li>この手のあと、相手の一番良い返しはどこか。</li>
    <li>その返しのあと、自分に中央の候補が2つ以上残るか。</li>
    <li>相手に角、X打ち、危険な辺を許していないか。</li>
</ol>



<p class="wp-block-paragraph">3問のうち2つ以上に自信を持てない手は、返す枚数が多くても見送ります。これが、中盤で「攻めているつもりの悪手」を減らす具体的な基準です。</p>



<div class="attrip-othello-story" data-othello-story="middle">
  <div class="attrip-othello-story__intro">
    <p class="attrip-othello-practice__label">盤面で見る / MOBILITY</p>
    <h3>中割りは、相手の手数を減らす</h3>
    <p>黒番の候補手を確認し、黒がC5へ置いたあとに白の合法手がいくつ残るかを見ます。</p>
  </div>
  <div class="attrip-othello-board-wrap">
    <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
    <div class="attrip-othello-board-row">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
      <div class="attrip-othello-board" data-story-board></div>
    </div>
  </div>
  <div class="attrip-othello-stats" data-story-stats aria-live="polite">
    <div><span>黒の合法手</span><strong data-story-stat="self">—</strong></div>
    <div><span>次の白の合法手</span><strong data-story-stat="opponent">—</strong></div>
    <div><span>返した石</span><strong data-story-stat="flipped">—</strong></div>
  </div>
  <button type="button" class="attrip-othello-reset" data-story-action>手を置いてみる</button>
  <p class="attrip-othello-result" data-story-result aria-live="polite" tabindex="-1">盤面を見てから「手を置いてみる」を押してください。</p>
</div>



<h2 class="wp-block-heading">中盤の練習盤：1枚返しより中割りを選ぶ</h2>



<p class="wp-block-paragraph">黒番です。C5とE6は、盤面の内側に打つ中割り候補です。合法手を押して、1枚返しと中割りの違いを確認してください。</p>



<div class="attrip-othello-practice" id="othello-practice-02" data-othello-practice>
  <div class="attrip-othello-practice__intro">
    <p class="attrip-othello-practice__label">PRACTICE 02 / MOBILITY</p>
    <h3>黒番：中割り候補を選ぶ</h3>
    <p>この問題の教材上の正解はC5とE6です。中央に打ち、次の手を残します。</p>
    <p class="attrip-othello-practice__focus"><strong>見る場所：</strong>返す枚数より、次の相手の手数</p>
  </div>
  <div class="attrip-othello-board-wrap">
    <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
    <div class="attrip-othello-board-row">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
      <div class="attrip-othello-board" data-board="middle"></div>
    </div>
  </div>
  <div class="attrip-othello-stats" data-stats aria-live="polite">
    <div><span>候補手</span><strong data-stat="moves">—</strong></div>
    <div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div>
    <div><span>返した石</span><strong data-stat="flipped">—</strong></div>
  </div>
  <p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p>
  <button type="button" class="attrip-othello-reset" data-reset>もう一度</button>
</div>



<h2 class="wp-block-heading">角と辺は「取る場所」ではなく「安全を確認する場所」</h2>



<p class="wp-block-paragraph">角の石はひっくり返りません。角を起点に辺へ広がった石も、確定石になりやすいです。そのため、相手に角を取られないことは基本です。</p>



<p class="wp-block-paragraph">一方で、角の斜め隣のX打ちや、角の横のC打ちは、角が空いているときに危険になりやすい場所です。置いた瞬間に相手が角を取れるなら、返す枚数が少なくても悪手です。</p>



<p class="wp-block-paragraph">辺も同じです。辺は強そうに見えますが、角とつながっていない辺はまだ安定していません。辺へ置く前に、次の3点を確認します。</p>



<ul class="wp-block-list">
    <li>相手がその辺へ入り込めないか</li>
    <li>その辺から角を取られないか</li>
    <li>辺を取ったあと、自分の中央の手が残るか</li>
</ul>



<p class="wp-block-paragraph">初心者は「角を取る」「X打ちを避ける」と覚えて大丈夫です。慣れてきたら、角とのつながりと相手の次の手まで見ます。</p>



<h2 class="wp-block-heading">終盤は空きマスの偶奇と石数を読む</h2>



<p class="wp-block-paragraph">終盤は、石の枚数を正確に数えます。序盤のように「少なく返す」を優先すると、最後の石数で負けることがあります。</p>



<p class="wp-block-paragraph">空きマスがいくつの地域に分かれているかも見ます。偶数個の空きがまとまった場所では、相手に先に打たせて自分が最後に打つ流れが有利になりやすいです。ただし、角や辺の形によって変わるため、偶数なら必ず勝てるわけではありません。</p>



<div class="attrip-othello-story" data-othello-story="endgame">
  <div class="attrip-othello-story__intro">
    <p class="attrip-othello-practice__label">盤面で見る / ENDGAME</p>
    <h3>終盤は、空きマスと返す石を数える</h3>
    <p>黒番の合法手を確認し、黒がD3へ置いたあとに盤面がどう変わるかを見ます。</p>
  </div>
  <div class="attrip-othello-board-wrap">
    <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
    <div class="attrip-othello-board-row">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
      <div class="attrip-othello-board" data-story-board></div>
    </div>
  </div>
  <div class="attrip-othello-stats" data-story-stats aria-live="polite">
    <div><span>黒の合法手</span><strong data-story-stat="self">—</strong></div>
    <div><span>次の白の合法手</span><strong data-story-stat="opponent">—</strong></div>
    <div><span>返した石</span><strong data-story-stat="flipped">—</strong></div>
  </div>
  <button type="button" class="attrip-othello-reset" data-story-action>手を置いてみる</button>
  <p class="attrip-othello-result" data-story-result aria-live="polite" tabindex="-1">盤面を見てから「手を置いてみる」を押してください。</p>
</div>



<h2 class="wp-block-heading">終盤の練習盤：最後の石数まで読む</h2>



<p class="wp-block-paragraph">黒番です。空きマスが少ないので、ここでは中割りよりも読み切りを優先します。この問題の最善手はD3またはC4です。どちらを選んでも、教材盤面では黒の石差が最も大きくなります。</p>



<div class="attrip-othello-practice" id="othello-practice-03" data-othello-practice>
  <div class="attrip-othello-practice__intro">
    <p class="attrip-othello-practice__label">PRACTICE 03 / ENDGAME</p>
    <h3>黒番：最後の数手を読む</h3>
    <p>この問題の教材上の正解はD3とC4です。石数を見て選びます。</p>
    <p class="attrip-othello-practice__focus"><strong>見る場所：</strong>空きマスの数と、最後に打つ順番</p>
  </div>
  <div class="attrip-othello-board-wrap">
    <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
    <div class="attrip-othello-board-row">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
      <div class="attrip-othello-board" data-board="endgame"></div>
    </div>
  </div>
  <div class="attrip-othello-stats" data-stats aria-live="polite">
    <div><span>候補手</span><strong data-stat="moves">—</strong></div>
    <div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div>
    <div><span>返した石</span><strong data-stat="flipped">—</strong></div>
  </div>
  <p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p>
  <button type="button" class="attrip-othello-reset" data-reset>もう一度</button>
</div>



<h2 class="wp-block-heading">AI時代も「手数を見る」基本は変わらない</h2>



<p class="wp-block-paragraph">AIは、盤面ごとの最善手を大量に比較できます。人間が定石を丸暗記するだけでは、見たことのない形で迷います。</p>



<p class="wp-block-paragraph">それでも、AIの判断を理解する入口は変わりません。まず自分で次の順番を考えます。</p>



<ol class="wp-block-list">
    <li>相手の合法手を数える</li>
    <li>角と危険な辺を確認する</li>
    <li>自分の次の手を残す</li>
    <li>最後に石数と偶奇を読む</li>
</ol>



<p class="wp-block-paragraph">AIに答えを聞くなら、「なぜこの手がよいのか」「相手の候補手は何か」「1枚返しの手と何が違うのか」まで確認します。答えの座標だけを覚えるより、次の盤面で再現しやすくなります。</p>



<h2 class="wp-block-heading">1枚返しから始めて、手数の質を見る</h2>



<p class="wp-block-paragraph">「1枚だけ返す」は、素人が始めるときに役立つ簡単な勝ち方です。ただし、これは最終ルールではありません。</p>



<p class="wp-block-paragraph">序盤は少なく返し、中盤は中割りで相手の手を減らし、終盤は石数と偶奇を読みます。角や辺では、返す枚数よりも相手に角を渡さないことを優先します。</p>



<p class="wp-block-paragraph">昔の考え方は間違いではありません。2026年度版では、その考え方を「相手の手数」「自分の手数」「角の安全」まで広げると、実戦で使える理論になります。</p>



<h2 class="wp-block-heading">仕上げ：詰めオセロ風に一手を選ぶ</h2>



<p class="wp-block-paragraph">最後まで打ち切る必要はありません。まず黒の一手を選び、代表的な白の返し、その後の黒の手までを見て、流れを読む練習にします。正解は「この盤面で先を読んだ教材上の推奨手」です。</p>



<div id="othello-finish" class="attrip-othello-finish">
  <p class="attrip-othello-finish__lead"><strong>一手を選んだら、黒 → 白 → 黒の読み筋を確認。</strong>最後まで打たず、次の交換で何が起きるかを見ます。</p>

  <div class="attrip-othello-practice" id="othello-finish-01" data-othello-practice>
    <div class="attrip-othello-practice__intro">
      <p class="attrip-othello-practice__label">FINISH 01 / CORNER</p>
      <h3>角を取る順番を選ぶ</h3>
      <p>合法手の中から、この盤面で最も石差を残しやすい一手を選びます。</p>
      <p class="attrip-othello-practice__focus"><strong>考え方：</strong>角を取れるときも、どの角を先に取るかを読む</p>
    </div>
    <div class="attrip-othello-board-wrap">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
      <div class="attrip-othello-board-row">
        <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
        <div class="attrip-othello-board" data-board="finish01"></div>
      </div>
    </div>
    <div class="attrip-othello-stats" data-stats aria-live="polite">
      <div><span>候補手</span><strong data-stat="moves">—</strong></div>
      <div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div>
      <div><span>返した石</span><strong data-stat="flipped">—</strong></div>
    </div>
    <p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p>
    <button type="button" class="attrip-othello-reset" data-reset>もう一度</button>
  </div>

  <div class="attrip-othello-practice" id="othello-finish-02" data-othello-practice>
    <div class="attrip-othello-practice__intro">
      <p class="attrip-othello-practice__label">FINISH 02 / EDGE</p>
      <h3>角を相手に渡さない</h3>
      <p>角に見える候補が2つあります。相手の次の角取りまで考えて選びます。</p>
      <p class="attrip-othello-practice__focus"><strong>考え方：</strong>今取れる石より、次に相手へ渡す場所を見る</p>
    </div>
    <div class="attrip-othello-board-wrap">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
      <div class="attrip-othello-board-row">
        <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
        <div class="attrip-othello-board" data-board="finish02"></div>
      </div>
    </div>
    <div class="attrip-othello-stats" data-stats aria-live="polite">
      <div><span>候補手</span><strong data-stat="moves">—</strong></div>
      <div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div>
      <div><span>返した石</span><strong data-stat="flipped">—</strong></div>
    </div>
    <p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p>
    <button type="button" class="attrip-othello-reset" data-reset>もう一度</button>
  </div>

  <div class="attrip-othello-practice" id="othello-finish-03" data-othello-practice>
    <div class="attrip-othello-practice__intro">
      <p class="attrip-othello-practice__label">FINISH 03 / LAST MOVE</p>
      <h3>最後に残す場所を読む</h3>
      <p>空きマスが連続しています。端の一手を選び、最後の形を想像します。</p>
      <p class="attrip-othello-practice__focus"><strong>考え方：</strong>一番多く返す手ではなく、終局の形を読む</p>
    </div>
    <div class="attrip-othello-board-wrap">
      <div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div>
      <div class="attrip-othello-board-row">
        <div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div>
        <div class="attrip-othello-board" data-board="finish03"></div>
      </div>
    </div>
    <div class="attrip-othello-stats" data-stats aria-live="polite">
      <div><span>候補手</span><strong data-stat="moves">—</strong></div>
      <div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div>
      <div><span>返した石</span><strong data-stat="flipped">—</strong></div>
    </div>
    <p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p>
    <button type="button" class="attrip-othello-reset" data-reset>もう一度</button>
  </div>

  <div class="attrip-othello-finish-extra" data-othello-finish-extra>
    <h3>実戦でよく出る読み筋10問</h3>
    <p>角の見落とし、危険なX打ち、辺の先取り、1枚返し、強制手、偶奇を選びます。各問は最後まで進めず、代表的な3手だけを表示します。</p>

    <div class="attrip-othello-practice" id="othello-finish-04" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 04 / CORNER</p><h3>角を見つけたら、まず取る</h3><p>合法手の中に角があります。辺を広げる前に、角を取った後の相手の返しを読みます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>角を取れる手を見落とさない</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish04"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-05" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 05 / X-SQUARE</p><h3>危険なX打ちを避ける</h3><p>角がまだ空いている盤面です。X打ち候補に飛びつかず、相手の角取りを止める手を探します。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>X打ちの後に角を取られないか</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish05"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-06" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 06 / EDGE</p><h3>辺は先取りせず、返しを読む</h3><p>辺の候補が見えます。取った石の数ではなく、相手の次の返しがどこへ向くかを見ます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>辺の先に相手の角がないか</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish06"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-07" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 07 / MOBILITY</p><h3>1枚返しで次の手を残す</h3><p>返す枚数が少ない手と、外側へ広がる手を比べます。白の次の候補まで予想します。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>返す枚数より、次の候補</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish07"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-08" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 08 / FRONTIER</p><h3>少なく返して入口を減らす</h3><p>一度に多く返す手より、相手が次に入れる場所を減らす手を選びます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>自分の石の外周を増やさない</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish08"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-09" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 09 / TWO OPTIONS</p><h3>中央を保って二択を残す</h3><p>相手の返しの後、自分に候補が残る手を選びます。今の石数ではなく、次の分岐を見ます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>次の自分の候補が2つ以上あるか</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish09"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-10" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 10 / FORCED</p><h3>候補が少ないときの強制手</h3><p>候補が2つだけの局面です。どちらが相手の返しを限定し、自分の次の手を残すかを比べます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>合法手が少ないときほど、次の返しを見る</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish10"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-11" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 11 / PARITY</p><h3>終盤の偶奇を読む</h3><p>空きマスが少なく、角も絡みます。どちらが先に地域へ入るかを考えます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>空きマスの地域と手番</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish11"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-12" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 12 / CORNER LINE</p><h3>角を取った後の順番</h3><p>角を取れる候補が複数あります。角を取った後、相手がどの辺へ返せるかまで見ます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>角の後の相手の返し</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish12"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
    <div class="attrip-othello-practice" id="othello-finish-13" data-othello-practice><div class="attrip-othello-practice__intro"><p class="attrip-othello-practice__label">FINISH 13 / LAST THREE</p><h3>最後の3手を読む</h3><p>最後まで打ち切らず、黒の一手から白、黒の3手だけを読みます。</p><p class="attrip-othello-practice__focus"><strong>見る場所：</strong>最後に自分が打つ空きマス</p></div><div class="attrip-othello-board-wrap"><div class="attrip-othello-coordinates attrip-othello-coordinates--top" aria-hidden="true"><span></span><span>A</span><span>B</span><span>C</span><span>D</span><span>E</span><span>F</span><span>G</span><span>H</span></div><div class="attrip-othello-board-row"><div class="attrip-othello-coordinates attrip-othello-coordinates--side" aria-hidden="true"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="attrip-othello-board" data-board="finish13"></div></div></div><div class="attrip-othello-stats" data-stats aria-live="polite"><div><span>候補手</span><strong data-stat="moves">—</strong></div><div><span>次の相手の合法手</span><strong data-stat="opponent">—</strong></div><div><span>返した石</span><strong data-stat="flipped">—</strong></div></div><p class="attrip-othello-result" data-result aria-live="polite" tabindex="-1">黒番の合法手を選んでください。</p><button type="button" class="attrip-othello-reset" data-reset>もう一度</button></div>
  </div>
</div>



<h2 class="wp-block-heading">関連記事</h2>



<ul class="wp-block-list">
    <li><a href="https://attrip.jp/101028/">オセロで勝つために覚えておきたい考え方</a></li>
</ul>



<h2 class="wp-block-heading">参照元</h2>



<div class="attrip-reference-links">
  <ul>
    <li><a style="color:#8ab4ff;text-decoration:underline;" href="https://www.othello.org/lesson/" target="_blank" rel="noopener">Othello! JAPAN「初心者のためのオセロ講座」</a></li>
    <li><a style="color:#8ab4ff;text-decoration:underline;" href="https://www.worldothello.org/download_file/view/f231b8d8-439f-4b05-8015-2cb3f1918bf3/590" target="_blank" rel="noopener">World Othello Federation「Othello: A Minute to Learn, A Lifetime to Master」</a></li>
    <li><a style="color:#8ab4ff;text-decoration:underline;" href="https://www.othello.gr.jp/rule" target="_blank" rel="noopener">日本オセロ連盟「日本オセロ連盟競技ルール」</a></li>
  </ul>
</div>



<style>
.attrip-othello-learning-map{margin:1.25rem 0;padding:1rem 1.1rem;border-left:4px solid #197443;border-radius:12px;background:#eef7f1;color:#24292f}
.attrip-othello-learning-map strong{display:block;margin-bottom:.4rem}
.attrip-othello-learning-map ol{display:grid;grid-template-columns:repeat(3,1fr);gap:.35rem;margin:.5rem 0;padding-left:1.25rem}
.attrip-othello-learning-map a{color:#0d5d37;font-weight:700;text-decoration:underline}
.attrip-othello-learning-map p{margin:.55rem 0 0;font-size:.92rem}
.attrip-othello-finish{margin:1.5rem 0}
.attrip-othello-finish__lead{margin:0;padding:.85rem 1rem;border-left:4px solid #c58b00;border-radius:10px;background:#fff7df}
.attrip-othello-story{margin:1.5rem 0;padding:1rem;border:1px solid #c9d9cf;border-radius:16px;background:#f4faf6;color:#24292f}
.attrip-othello-story__intro{margin-bottom:1rem}
.attrip-othello-story__intro h3{margin:.2rem 0 .5rem;font-size:1.15rem}
.attrip-othello-story__intro p{margin:.35rem 0}
.attrip-othello-practice{margin:1.5rem 0;padding:1rem;border:1px solid #d8dee4;border-radius:16px;background:#f6f8fa;color:#24292f}
.attrip-othello-practice__intro{margin-bottom:1rem}
.attrip-othello-practice__intro h3{margin:.2rem 0 .5rem;font-size:1.15rem}
.attrip-othello-practice__intro p{margin:.35rem 0}
.attrip-othello-practice__focus{font-size:.9rem;color:#176b3d}
.attrip-othello-practice__label{font-size:.76rem;letter-spacing:.08em;font-weight:700;color:#5b6570}
.attrip-othello-board-wrap{max-width:440px;margin:1rem auto}
.attrip-othello-coordinates{display:grid;grid-template-columns:repeat(9,1fr);text-align:center;font-size:.72rem;font-weight:700;color:#5b6570}
.attrip-othello-coordinates--top{margin-left:1.35rem;margin-bottom:.2rem}
.attrip-othello-board-row{display:grid;grid-template-columns:1.35rem 1fr;gap:.2rem}
.attrip-othello-coordinates--side{grid-template-columns:1fr;grid-template-rows:repeat(8,1fr);align-items:center}
.attrip-othello-board{display:grid;grid-template-columns:repeat(8,1fr);aspect-ratio:1;background:#197443;border:3px solid #0d4f2d;border-radius:8px;overflow:hidden}
.attrip-othello-cell{position:relative;display:grid;place-items:center;min-width:0;aspect-ratio:1;padding:0;border:0;border-right:1px solid #42a66e;border-bottom:1px solid #42a66e;background:transparent;cursor:default}
.attrip-othello-cell--legal{cursor:pointer;background:rgba(255,255,255,.12)}
.attrip-othello-cell--legal:hover,.attrip-othello-cell--legal:focus-visible{background:rgba(255,255,255,.3);outline:2px solid #fff;outline-offset:-3px}
.attrip-othello-disc{width:72%;height:72%;border-radius:50%;box-shadow:inset -2px -3px 4px rgba(0,0,0,.28),0 1px 2px rgba(0,0,0,.25)}
.attrip-othello-disc--black{background:#121820}
.attrip-othello-disc--white{background:#f7f7f2}
.attrip-othello-disc--changed{animation:attrip-othello-pop .35s ease-out}
.attrip-othello-mark{width:25%;height:25%;border-radius:50%;background:#f8e36b;box-shadow:0 0 0 2px rgba(0,0,0,.15)}
.attrip-othello-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;margin:.8rem 0}
.attrip-othello-stats>div{padding:.55rem .65rem;border-radius:10px;background:#e9eef2;text-align:center}
.attrip-othello-stats span,.attrip-othello-stats strong{display:block}
.attrip-othello-stats span{font-size:.72rem;color:#5b6570}
.attrip-othello-stats strong{margin-top:.2rem;font-size:1.05rem;color:#24292f}
.attrip-othello-result{min-height:2.6em;margin:.8rem 0;padding:.7rem;border-radius:10px;background:#fff;color:#24292f}
.attrip-othello-result[data-state="good"]{background:#e7f6ec;border-left:4px solid #1f8f4d}
.attrip-othello-result[data-state="try"]{background:#fff7df;border-left:4px solid #c58b00}
.attrip-othello-reset{min-height:44px;padding:.6rem 1rem;border:1px solid #7a8793;border-radius:999px;background:#fff;color:#24292f;font-weight:700;cursor:pointer}
.attrip-othello-reset:hover,.attrip-othello-reset:focus-visible{background:#eef2f5;outline:2px solid #197443;outline-offset:2px}
@media (prefers-color-scheme:dark){
  .attrip-othello-learning-map{background:#10281b;color:#f0f6fc}
  .attrip-othello-finish__lead{background:#3a2f0d;color:#f0f6fc}
  .attrip-othello-story{border-color:#3d6650;background:#10281b;color:#f0f6fc}
  .attrip-othello-learning-map a,.attrip-othello-practice__focus{color:#8ee0aa}
  .attrip-othello-practice{border-color:#3d444d;background:#161b22;color:#f0f6fc}
  .attrip-othello-label,.attrip-othello-practice__label,.attrip-othello-coordinates{color:#b7c2cc}
  .attrip-othello-result,.attrip-othello-reset{background:#0d1117;color:#f0f6fc;border-color:#687482}
  .attrip-othello-result[data-state="good"]{background:#12351f}
  .attrip-othello-result[data-state="try"]{background:#3a2f0d}
  .attrip-othello-stats>div{background:#252d35}
  .attrip-othello-stats span{color:#b7c2cc}
  .attrip-othello-stats strong{color:#f0f6fc}
}
:root[data-theme="dark"] .attrip-othello-learning-map{background:#10281b;color:#f0f6fc}
:root[data-theme="dark"] .attrip-othello-finish__lead{background:#3a2f0d;color:#f0f6fc}
:root[data-theme="dark"] .attrip-othello-story{border-color:#3d6650;background:#10281b;color:#f0f6fc}
:root[data-theme="dark"] .attrip-othello-learning-map a,:root[data-theme="dark"] .attrip-othello-practice__focus{color:#8ee0aa}
:root[data-theme="dark"] .attrip-othello-practice{border-color:#3d444d;background:#161b22;color:#f0f6fc}
:root[data-theme="dark"] .attrip-othello-label,:root[data-theme="dark"] .attrip-othello-practice__label,:root[data-theme="dark"] .attrip-othello-coordinates{color:#b7c2cc}
:root[data-theme="dark"] .attrip-othello-result,:root[data-theme="dark"] .attrip-othello-reset{background:#0d1117;color:#f0f6fc;border-color:#687482}
:root[data-theme="dark"] .attrip-othello-result[data-state="good"]{background:#12351f}
:root[data-theme="dark"] .attrip-othello-result[data-state="try"]{background:#3a2f0d}
:root[data-theme="dark"] .attrip-othello-stats>div{background:#252d35}
:root[data-theme="dark"] .attrip-othello-stats span{color:#b7c2cc}
:root[data-theme="dark"] .attrip-othello-stats strong{color:#f0f6fc}
@keyframes attrip-othello-pop{0%{transform:scale(.72);opacity:.4}70%{transform:scale(1.08)}100%{transform:scale(1);opacity:1}}
@media (max-width:520px){
  .attrip-othello-learning-map ol{grid-template-columns:1fr}
  .attrip-othello-stats{gap:.3rem}
  .attrip-othello-stats>div{padding:.5rem .25rem}
  .attrip-othello-stats span{font-size:.66rem}
}
@media (prefers-reduced-motion:reduce){.attrip-othello-disc--changed{animation:none}}
</style>
<script>
(function(){
  const puzzles={
    opening:{turn:'X',answer:['D3','C4','E6','F5'],reason:'最初の4手は回転させると同じ形です。角ではなく中央の選択肢から始めます。'},
    middle:{turn:'X',answer:['C5','E6'],reason:'中央に入り、少ない枚数で相手の手を増やしにくい中割り候補です。'},
    endgame:{turn:'X',answer:['D3','C4'],reason:'空きマスが少ないため、枚数と次の返しを読んだ教材上の最善手です。'},
    finish01:{turn:'X',answer:['A8'],reason:'この盤面ではA8を先に取ると、残りの角と空きマスを読みやすく、終局の石差を残しやすい一手です。',line:['A8','A2','H1']},
    finish02:{turn:'X',answer:['A8'],reason:'A8を取ると角を確保できます。F8を先に取ると、相手に角側の主導権を渡しやすくなります。',line:['A8','A2','F8']},
    finish03:{turn:'X',answer:['H8'],reason:'H8を先に取ると、連続した端の空きマスを自分の形にできます。大きく返す手より終局の形を優先します。',line:['H8','G8','H2']},
    finish04:{turn:'X',answer:['H8'],reason:'角が取れるなら、返す枚数より角の確保を優先します。角を見落として辺へ逃げるのがよくある失敗です。',line:['H8','A5','C1'],title:'角を見つけたら、まず取る',label:'FINISH 04 / CORNER',prompt:'合法手の中に角があります。辺を広げる前に、角を取った後の相手の返しを読みます。',focus:'角を取れる手を見落とさない'},
    finish05:{turn:'X',answer:['H4'],reason:'H4はX打ちに見えない場所で相手の角を直接開けません。角が空いているときのX打ちは、相手の角取りを許すため避けます。',line:['H4','E2','C1'],title:'危険なX打ちを避ける',label:'FINISH 05 / X-SQUARE',prompt:'角がまだ空いている盤面です。X打ち候補に飛びつかず、相手の角取りを止める手を探します。',focus:'X打ちの後に角を取られないか'},
    finish06:{turn:'X',answer:['H6'],reason:'辺へ出る手でも、角とつながらず相手の選択肢を増やすなら急ぎません。この例ではH6で相手の返しを限定します。',line:['H6','D1','C1'],title:'辺は先取りせず、返しを読む',label:'FINISH 06 / EDGE',prompt:'辺の候補が見えます。取った石の数ではなく、相手の次の返しがどこへ向くかを見ます。',focus:'辺の先に相手の角がないか'},
    finish07:{turn:'X',answer:['C4'],reason:'C4は1枚返しで中央の形を保ち、白の候補を6か所に抑える教材上の推奨手です。大きく返す手より次の手を残します。',line:['C4','B6','E2'],title:'1枚返しで次の手を残す',label:'FINISH 07 / MOBILITY',prompt:'返す枚数が少ない手と、外側へ広がる手を比べます。白の次の候補まで予想します。',focus:'返す枚数より、次の候補'},
    finish08:{turn:'X',answer:['D7'],reason:'D7は1枚だけ返し、自分の石を外側へ広げません。少なく返すことが、相手の入口を増やさない攻めになる例です。',line:['D7','B2','B1'],title:'少なく返して入口を減らす',label:'FINISH 08 / FRONTIER',prompt:'一度に多く返す手より、相手が次に入れる場所を減らす手を選びます。',focus:'自分の石の外周を増やさない'},
    finish09:{turn:'X',answer:['C2'],reason:'C2で中央の形を保つと、白の返しの後にも黒の候補が残ります。先に外側へ出ると、白に主導権を渡しやすくなります。',line:['C2','A3','B3'],title:'中央を保って二択を残す',label:'FINISH 09 / TWO OPTIONS',prompt:'相手の返しの後、自分に候補が残る手を選びます。今の石数ではなく、次の分岐を見ます。',focus:'次の自分の候補が2つ以上あるか'},
    finish10:{turn:'X',answer:['D6'],reason:'合法手が少ないときも、相手の返し後に中央へ戻れる手を選びます。C5だけに決め打ちすると、次の形を失います。',line:['D6','D7','C3'],title:'候補が少ないときの強制手',label:'FINISH 10 / FORCED',prompt:'候補が2つだけの局面です。どちらが相手の返しを限定し、自分の次の手を残すかを比べます。',focus:'合法手が少ないときほど、次の返しを見る'},
    finish11:{turn:'X',answer:['H2'],reason:'空きマスが10個ほどになると、手数の多さより空きマスの順番が重要です。H2で相手に先に地域へ入らせます。',line:['H2','C1','A1'],title:'終盤の偶奇を読む',label:'FINISH 11 / PARITY',prompt:'空きマスが少なく、角も絡みます。どちらが先に地域へ入るかを考えます。',focus:'空きマスの地域と手番'},
    finish12:{turn:'X',answer:['A1'],reason:'A1を先に取ると、相手の角側の返しを制限できます。角を取るだけでなく、次の角の順番まで読みます。',line:['A1','C1','A2'],title:'角を取った後の順番',label:'FINISH 12 / CORNER LINE',prompt:'角を取れる候補が複数あります。角を取った後、相手がどの辺へ返せるかまで見ます。',focus:'角の後の相手の返し'},
    finish13:{turn:'X',answer:['A2'],reason:'残り4空きでは、最も多く返す手ではなく、最後の手番を確保する手を選びます。A2の後は白A4、黒A6と続きます。',line:['A2','A4','A6'],title:'最後の3手を読む',label:'FINISH 13 / LAST THREE',prompt:'最後まで打ち切らず、黒の一手から白、黒の3手だけを読みます。',focus:'最後に自分が打つ空きマス'}
  };
  const stories={
    opening:{turn:'X',move:'D3',reason:'D3へ置くと中央で1枚返しになり、序盤の選択肢を残せます。'},
    middle:{turn:'X',move:'C5',reason:'C5へ置くと中割りになり、外側へ広げすぎず相手の手数を確認できます。'},
    endgame:{turn:'X',move:'D3',reason:'D3へ置くと空きマスが減り、返した石と次の手を具体的に読めます。'}
  };
  const boards={
    opening:'......../......../......../...OX.../...XO.../......../......../........',
    middle:'......../......../...O..../..XOX.../...OXX../...O..../......../........',
    endgame:'XXXXOOOO/XXXXOOOO/XX..OOOO/XX.O.OOO/XXOO.OOO/XXOOOOOO/XXOOOOOO/XXXXXXXX',
    finish01:'XXXXXXX./.XXOX.XO/XXXOXXOO/XXXOXXXO/XXXOXXXX/XOOOXOXX/XOOOOXXX/.XOOX.X.',
    finish02:'XXXXXXXX/.XXOOOXX/XXXOOOOX/XXXOXOXX/XXXOXOXX/XOOOXOXX/XOOOOXXX/.XOOX.X.',
    finish03:'OXXXXXXX/OOOOOOO./OOXXXXOX/OXXXXOOX/OOXXOOOX/OOOOOOOX/OOOXOOOX/..XXX...',
    finish04:'.X.OX.X./..XXOXX./.XXOOXX./.XOOOOX./.XOOOXXO/.O.XOXOO/.XXXXO.O/...XOOO.',
    finish05:'.X.O..X./..XO.X../..XXXXO./...XXOO./.XXXOXOO/...O.XXX/..O..X../........',
    finish06:'......X./...X.X../...XX.../...XXO../..OXO.O./...O..../..O...../........',
    finish07:'......O./.....O../..XXOO../...XO.../.XXOX.../..O.X.../......../........',
    finish08:'......O./X....O../XXO.O.../XOOOOOOO/XXOOO.O./XXO..O../......O./........',
    finish09:'.XXXXXXX/...OXXX./..OOOX../XOOOOO../OOOOOX../OXOOOO../OX....O./OX......',
    finish10:'....X.../...XXX../....X.X./.OOOOOOO/...OO.X./..O.O..X/....OO../....O...',
    finish11:'.X.OOOOO/.OXXXXO./OOOOOOX./.XXOOOXX/XXXOOXXX/.XOXOXOX/.OXXXO.X/O.OXXXXX',
    finish12:'.X.OOOOO/.OXXXXX./OOOOOXX./.XXOXOX./XXXXOXXO/.XXXOXOO/.XXXXO.O/..OXXXXX',
    finish13:'OOOOOOOO/.OOOXXOO/OOOOOOOO/.XXOOOOX/XXXOOOXX/.XOXOXXX/.XXXXXXX/OXXXXXXX'
  };
  const dirs=[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];
  const opposite={X:'O',O:'X'};
  const name=(r,c)=>String.fromCharCode(65+c)+(r+1);
  function inside(r,c){return r>=0?r<8?c>=0?c<8:false:false:false;}
  function parse(value){return value.split('/').map(row=>row.split(''));}
  function point(coord){return {r:Number(coord.slice(1))-1,c:coord.charCodeAt(0)-65};}
  function legal(board,player){
    const result=[];
    for(let r=0;r<8;r++) for(let c=0;c<8;c++){
      if(board[r][c]!=='.') continue;
      let ok=false;
      for(const [dr,dc] of dirs){
        let rr=r+dr,cc=c+dc,count=0;
        while(inside(rr,cc)){
          if(board[rr][cc]!==opposite[player]) break;
          count++;rr+=dr;cc+=dc;
        }
        if(count){
          if(inside(rr,cc)){
            if(board[rr][cc]===player){ok=true;break;}
          }
        }
      }
      if(ok) result.push(name(r,c));
    }
    return result;
  }
  function flipsForMove(board,coord,player){
    const {r,c}=point(coord);
    if(r<0||r>7||c<0||c>7||board[r][c]!=='.') return [];
    const flips=[];
    for(const [dr,dc] of dirs){
      const line=[];
      let rr=r+dr,cc=c+dc;
      while(inside(rr,cc)){
        if(board[rr][cc]!==opposite[player]) break;
        line.push({r:rr,c:cc});rr+=dr;cc+=dc;
      }
      if(line.length){
        if(inside(rr,cc)){
          if(board[rr][cc]===player) flips.push(...line);
        }
      }
    }
    return flips;
  }
  function play(board,coord,player){
    const next=board.map(row=>row.slice());
    const {r,c}=point(coord);
    const flips=flipsForMove(board,coord,player);
    next[r][c]=player;
    flips.forEach(({r:fr,c:fc})=>{next[fr][fc]=player;});
    return {board:next,flips};
  }
  function render(root,board= parse(boards[root.dataset.board]),interactive=true,changed=[]){
    const puzzle=puzzles[root.dataset.board];
    const boardEl=root;
    const legalMoves=interactive?legal(board,puzzle.turn):[];
    boardEl.innerHTML='';
    for(let r=0;r<8;r++) for(let c=0;c<8;c++){
      const cell=document.createElement('button');
      const coord=name(r,c);
      const isLegalMove=interactive?legalMoves.includes(coord):false;
      cell.type='button';
      cell.className='attrip-othello-cell';
      cell.setAttribute('aria-label',coord+(board[r][c]==='.'?(legalMoves.includes(coord)?' 合法手':' 空きマス'):' 石'));
      if(board[r][c]==='X'||board[r][c]==='O'){
        const disc=document.createElement('span');
        disc.className='attrip-othello-disc attrip-othello-disc--'+(board[r][c]==='X'?'black':'white');
        if(changed.includes(coord)) disc.classList.add('attrip-othello-disc--changed');
        cell.appendChild(disc);
        cell.disabled=true;
      } else if(isLegalMove){
        cell.classList.add('attrip-othello-cell--legal');
        const mark=document.createElement('span');
        mark.className='attrip-othello-mark';
        mark.setAttribute('aria-hidden','true');
        cell.appendChild(mark);
        cell.addEventListener('click',function(){
          const card=root.closest('[data-othello-practice]');
          const result=card.querySelector('[data-result]');
          const good=puzzle.answer.includes(coord);
          const move=play(board,coord,puzzle.turn);
          const opponentMoves=legal(move.board,opposite[puzzle.turn]).length;
          const lineText=puzzle.line?' 読み筋例：'+puzzle.line.join(' → ')+'。':'';
          result.dataset.state=good?'good':'try';
          result.textContent=(good?'正解です。':'合法手ですが、この問題の推奨手ではありません。')+' '+coord+'。'+puzzle.reason+' 次の相手の合法手は'+opponentMoves+'か所です。'+lineText;
          const stats=card.querySelector('[data-stats]');
          stats.querySelector('[data-stat="moves"]').textContent=coord;
          stats.querySelector('[data-stat="opponent"]').textContent=opponentMoves+'か所';
          stats.querySelector('[data-stat="flipped"]').textContent=move.flips.length+'枚';
          render(boardEl,move.board,false,[coord,...move.flips.map(({r:fr,c:fc})=>name(fr,fc))]);
          result.focus({preventScroll:true});
        });
      } else {
        cell.disabled=true;
      }
      boardEl.appendChild(cell);
    }
  }
  document.querySelectorAll('[data-othello-practice]').forEach(card=>{
    const board=card.querySelector('[data-board]');
    const reset=()=>{
      const result=card.querySelector('[data-result]');
      const stats=card.querySelector('[data-stats]');
      const puzzle=puzzles[board.dataset.board];
      const initial=parse(boards[board.dataset.board]);
      result.dataset.state='';
      result.textContent='黒番の合法手を選んでください。';
      stats.querySelector('[data-stat="moves"]').textContent=legal(initial,puzzle.turn).length+'か所';
      stats.querySelector('[data-stat="opponent"]').textContent='—';
      stats.querySelector('[data-stat="flipped"]').textContent='—';
      render(board,initial);
    };
    card.querySelector('[data-reset]').addEventListener('click',reset);
    reset();
  });
  document.querySelectorAll('[data-othello-story]').forEach(card=>{
    const story=stories[card.dataset.othelloStory];
    const board=card.querySelector('[data-story-board]');
    const stats=card.querySelector('[data-story-stats]');
    const result=card.querySelector('[data-story-result]');
    const action=card.querySelector('[data-story-action]');
    let current;
    let played=false;
    board.dataset.board=card.dataset.othelloStory;
    const reset=()=>{
      current=parse(boards[card.dataset.othelloStory]);
      played=false;
      render(board,current,false);
      stats.querySelector('[data-story-stat="self"]').textContent=legal(current,story.turn).length+'か所';
      stats.querySelector('[data-story-stat="opponent"]').textContent='—';
      stats.querySelector('[data-story-stat="flipped"]').textContent='—';
      result.textContent='盤面を見てから「手を置いてみる」を押してください。';
      action.textContent='手を置いてみる';
    };
    action.addEventListener('click',()=>{
      if(played){reset();return;}
      const move=play(current,story.move,story.turn);
      current=move.board;
      played=true;
      const opponentMoves=legal(current,opposite[story.turn]).length;
      render(board,current,false,[story.move,...move.flips.map(({r,c})=>name(r,c))]);
      stats.querySelector('[data-story-stat="self"]').textContent=story.move;
      stats.querySelector('[data-story-stat="opponent"]').textContent=opponentMoves+'か所';
      stats.querySelector('[data-story-stat="flipped"]').textContent=move.flips.length+'枚';
      result.textContent=story.move+'へ置き、'+move.flips.length+'枚返しました。'+story.reason+' 次の相手の合法手は'+opponentMoves+'か所です。';
      action.textContent='もう一度';
      result.focus({preventScroll:true});
    });
    reset();
  });
}());
</script><p>The post <a href="https://attrip.jp/224027/">オセロで勝つための考え方【2026年版】序盤・中盤・終盤を練習盤で学ぶ</a> first appeared on <a href="https://attrip.jp">attrip</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://attrip.jp/224027/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">224027</post-id>	</item>
		<item>
		<title>トリケラトプスはどう動いた？骨格・数学・プログラムで歩き方を考える</title>
		<link>https://attrip.jp/224003/</link>
					<comments>https://attrip.jp/224003/#respond</comments>
		
		<dc:creator><![CDATA[attrip]]></dc:creator>
		<pubDate>Sun, 16 Aug 2026 07:11:19 +0000</pubDate>
				<category><![CDATA[雑学]]></category>
		<category><![CDATA[トリケラトプス]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[古生物学]]></category>
		<category><![CDATA[恐竜]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[骨格]]></category>
		<guid isPermaLink="false">https://attrip.jp/224003/</guid>

					<description><![CDATA[<p>トリケラトプスは何類で、何に似ていたのか。骨格写真、足跡、重心、支持範囲、逆運動学を使って、恐竜の動きを人間にもプログラマーにもわかるように整理します。</p>
<p>The post <a href="https://attrip.jp/224003/">トリケラトプスはどう動いた？骨格・数学・プログラムで歩き方を考える</a> first appeared on <a href="https://attrip.jp">attrip</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">トリケラトプスは、トカゲのように脚を横へ張り出して歩く動物ではありません。太い4本の脚で大きな頭と胴体を支え、低い植物を食べながら安定して進んだ恐竜です。</p>



<p class="wp-block-paragraph">ただし、化石を見ただけで歩行動画が完成するわけではありません。骨格からわかるのは、動くための条件です。足跡からわかるのは、実際に地面へ残った動きです。数学やプログラムは、その間をつなぐ検証道具です。</p>



<p class="wp-block-paragraph">この記事では、次の3つを分けて考えます。</p>



<ul class="wp-block-list">
    <li>化石や研究から確認できること</li>
    <li>研究者が推定していること</li>
    <li>4脚の動きを作るために置いたモデル上の仮定</li>
</ul>



<h2 class="wp-block-heading">トリケラトプスは体の下に脚を置いた</h2>



<p class="wp-block-paragraph">トリケラトプスは、サイのような重さを感じさせますが、サイではありません。トカゲのように脚を体の横へ張り出して歩いたとも考えにくい動物です。</p>



<p class="wp-block-paragraph">歩き方を短くまとめると、次のようになります。</p>



<ul class="wp-block-list">
    <li>生物としては、鳥盤類に属する角竜類の恐竜です</li>
    <li>前脚は体の下へ寄せ、肘を少し外へ逃がして体重を受けます</li>
    <li>後脚は曲げ伸ばしで胴体を前へ送ります</li>
    <li>大きな頭と胴体を、最低3本の脚で支える低速歩行をモデルにしています</li>
    <li>サイは重さの比較、トカゲは脚を上げる順番の比較に使います</li>
</ul>



<p class="wp-block-paragraph">ただし、前脚の角度、歩く速さ、肉付き、頭の揺れは、化石からそのまま読める数字ではありません。ここでは、化石と研究を出発点にして、数学とプログラムで検証できる形へ置き換えています。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-evidence-layers.png" alt="化石の事実、研究者の推定、制作モデルの3層" /></p>



<p class="wp-block-paragraph"><em>オリジナル図。右へ進むほど仮定が増えます。</em></p>



<p class="wp-block-paragraph">この図は、記事全体の読み方を示しています。左側の骨の形や足跡ほど証拠に近く、右側のピクセル座標や歩行周期ほど制作上の設定です。右側の設定は、研究と矛盾しないかを確認するための仮説であり、化石から発見された事実ではありません。</p>



<h2 class="wp-block-heading">トリケラトプスはどの分類の生物か</h2>



<p class="wp-block-paragraph">トリケラトプスは、広くいえば爬虫類に含まれる恐竜です。分類を簡単に並べると、次のようになります。</p>



<p class="wp-block-paragraph"><code>動物界 → 脊索動物門 → 恐竜類 → 鳥盤類 → 角竜類 → ケラトプス科 → Chasmosaurinae → Triceratops</code></p>



<p class="wp-block-paragraph">ロンドン自然史博物館の分類では、トリケラトプスは <code>Dinosauria / Ornithischia / Ceratopsidae / Chasmosaurinae</code> に置かれています。4本脚で歩く植物食恐竜として紹介されています（<a href="https://www.nhm.ac.uk/discover/dino-directory/triceratops.html">Natural History Museum</a>）。</p>



<p class="wp-block-paragraph">「角があるからサイの仲間」と思いやすいですが、サイは哺乳類です。トリケラトプスとは近縁ではありません。</p>



<p class="wp-block-paragraph">それでも似て見えるのは、重い体を4本の脚で支え、頭に角があり、地面近くの植物を食べるという条件が似ていたからです。別の系統の生物が似た形になることを、収斂進化と呼びます（<a href="https://www.nhm.ac.uk/discover/dino-directory/triceratops.html">Natural History Museumの比較解説</a>）。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-classification-comparison-20260817.jpg" alt="トリケラトプスとサイとトカゲの分類・見た目比較" /></p>



<p class="wp-block-paragraph"><em>オリジナル比較図。トリケラトプスとサイは近縁ではありません。サイは体の重さや角のある頭、トカゲは脚を動かす順番を比べる資料として使います。</em></p>



<h2 class="wp-block-heading">比較相手は「似ている」ではなく役割で選ぶ</h2>



<p class="wp-block-paragraph">ここで、比較対象を選ぶ思考過程を整理します。最初は「4本足だからトカゲと比べればよい」と考えやすいのですが、トカゲの脚は体の横へ張り出す姿勢です。トリケラトプスのように、大きな頭と胴体を体の下の脚で受ける動物のモデルへ、そのまま移すことはできません。</p>



<p class="wp-block-paragraph">そこで比較の目的を3つに分けました。</p>



<ul class="wp-block-list">
    <li>骨格と足跡：トリケラトプス自身を最優先する</li>
    <li>重心、荷重、重い歩行：サイ・ゾウ・カバを主比較にする</li>
    <li>脚を動かす順番：トカゲを補助比較にする</li>
</ul>



<p class="wp-block-paragraph">鳥は恐竜の進化を考えるうえでは重要ですが、現生鳥類は二足歩行に特化しています。4本足のトリケラトプスを歩かせるときの主モデルにはせず、恐竜から鳥へ続く系統や、二足歩行の力学を比べる資料として扱います（<a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC5821450/">鳥類の歩行を使った獣脚類の力学研究</a>）。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-comparison-choice-20260817.jpg" alt="比較相手は似ている動物ではなく役割で選ぶ" /></p>



<p class="wp-block-paragraph"><em>オリジナル図。骨格と足跡はトリケラトプス、荷重と歩行感は大型草食動物、脚の順番だけトカゲを使います。</em></p>



<h3 class="wp-block-heading">サイは「低い胴体」と「重い歩行」を見る</h3>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-rhino-reference.jpg" alt="草地を歩くシロサイ" /></p>



<p class="wp-block-paragraph"><em>草地を歩くシロサイ。撮影：Jozef020 / <a href="https://commons.wikimedia.org/wiki/File:White_Rhinoceros_4.jpg">Wikimedia Commons</a>。CC BY-SA 4.0。</em></p>



<p class="wp-block-paragraph">サイから借りるのは、関節の座標ではありません。低い胴体を太い脚で支え、頭を前方に置いたときの見た目です。トリケラトプスの前脚をサイの脚へ置き換えるのではなく、「脚を細く長くしすぎていないか」を確認する基準にします。</p>



<h3 class="wp-block-heading">ゾウは「重心」と「支持脚」を見る</h3>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-elephant-reference.jpg" alt="草原を歩くアフリカゾウ" /></p>



<p class="wp-block-paragraph"><em>草原を歩くアフリカゾウ。撮影：Stephen Jacobs（Why Steve） / <a href="https://commons.wikimedia.org/wiki/File:African_elephant_walking.jpg">Wikimedia Commons</a>。CC BY 4.0。</em></p>



<p class="wp-block-paragraph">ゾウはトリケラトプスの形に近いという意味ではなく、大きな体重を4本の脚で受ける力学を見るために使います。ゾウでは前脚と後脚が、歩行中の制動と推進の両方に関わることが報告されています（<a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC2872429/">ゾウの四肢力学研究</a>）。この考え方を、トリケラトプスの重心が支持範囲から外れないか確認するモデルへ応用します。</p>



<p class="wp-block-paragraph">ただし、ゾウの脚はより直立的で、足の構造も異なります。ゾウの関節角をそのままコピーしてはいけません。</p>



<h3 class="wp-block-heading">カバは「低い胴体」と「ゆっくりした接地」を見る</h3>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-hippo-reference-side.jpg" alt="草地を歩くカバ" /></p>



<p class="wp-block-paragraph"><em>草地を歩くカバ。撮影：Prof Chen Hualin / <a href="https://commons.wikimedia.org/wiki/File:A_hippopotamus_walking_on_the_grass_land_in_Seregeti_National_Park_in_the_morning.jpg">Wikimedia Commons</a>。CC BY-SA 4.0。</em></p>



<p class="wp-block-paragraph">カバは、低い胴体と太い脚の見た目を確認する補助資料です。ただし水辺での生活に適応した動物なので、足の使い方をそのまま陸上のトリケラトプスへ移しません。ここでも採用するのは、腹の最低位置、地面との距離、接地の安定感です。</p>



<p class="wp-block-paragraph">この比較から、モデルへ入れるものと入れないものを分けます。</p>



<ul class="wp-block-list">
    <li>入れる：重心、支持脚、腹の高さ、接地率、歩幅</li>
    <li>入れない：サイやゾウの関節座標、カバの足構造、トカゲの横向き姿勢</li>
    <li>固定する：トリケラトプスの肩・股関節・肘・膝・足首・指先の順番</li>
</ul>



<p class="wp-block-paragraph">つまり、比較対象は一種類に決めません。目的ごとに役割を分担させ、最後の関節座標はトリケラトプスの骨格と足跡へ戻して確認します。</p>



<h2 class="wp-block-heading">骨格写真を見るときは脚の付け根を見る</h2>



<p class="wp-block-paragraph"><img decoding="async" src="https://upload.wikimedia.org/wikipedia/commons/b/b2/Skeleton_of_triceratops.jpg" alt="トリケラトプスの全身骨格" /></p>



<p class="wp-block-paragraph"><em>スミソニアン国立自然史博物館のトリケラトプス骨格。撮影：Austin Moon / <a href="https://commons.wikimedia.org/wiki/File:Skeleton_of_triceratops.jpg">Wikimedia Commons</a>。CC BY-SA 4.0。</em></p>



<p class="wp-block-paragraph">骨格写真では、角やフリルに目が行きます。動きを考えるときは、肩、肘、手首、骨盤、膝、足首、指先を順番に見ます。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://upload.wikimedia.org/wikipedia/commons/4/45/Triceratops_skull_houston.JPG" alt="ヒューストン自然科学博物館に展示されているトリケラトプスの実物頭骨" /></p>



<p class="wp-block-paragraph"><em>ヒューストン自然科学博物館のトリケラトプス頭骨。鼻の角、左右の角、フリル、くちばしの位置を確認できます。撮影：Nekarius / <a href="https://commons.wikimedia.org/wiki/File:Triceratops_skull_houston.JPG">Wikimedia Commons</a>。パブリックドメイン。</em></p>



<p class="wp-block-paragraph">頭骨を見ると、トリケラトプスの重心が前方へ寄りやすい理由もわかります。頭は体の一部というより、歩行中に首と前脚が支える大きな荷重です。</p>



<p class="wp-block-paragraph">骨格写真と頭骨写真を見るときは、次の順番で確認すると動きにつながります。</p>



<ul class="wp-block-list">
    <li>全身骨格で、肩と股関節がどの高さにあるかを見る</li>
    <li>上腕、大腿、下腿、前腕の長さを比べる</li>
    <li>手首や足首から先が、地面へどう向くかを見る</li>
    <li>頭骨の大きさを、首と前脚が支える荷重として考える</li>
</ul>



<p class="wp-block-paragraph">角やフリルの大きさだけを先に写すと、見た目はトリケラトプスでも、脚の動きは別の動物になります。</p>



<p class="wp-block-paragraph">前脚は、</p>



<p class="wp-block-paragraph"><code>肩 → 肘 → 手首 → 中手骨 → 指先</code></p>



<p class="wp-block-paragraph">後脚は、</p>



<p class="wp-block-paragraph"><code>股関節 → 膝 → 足首 → 中足骨 → 指先</code></p>



<p class="wp-block-paragraph">という連鎖です。</p>



<p class="wp-block-paragraph">この順番を間違えると、見た目がトリケラトプスでも、歩かせたときに関節が逆へ曲がります。</p>



<h2 class="wp-block-heading">前脚はトカゲの脚とは違う</h2>



<p class="wp-block-paragraph">トカゲは、脚を体の横へ張り出す姿勢で歩きます。歩くときは、背骨や胴体の左右の動きも使います。</p>



<p class="wp-block-paragraph">一方、角竜類の前脚は、大型の体を支える必要があります。前脚を完全に横へ広げると、体重を受ける効率が悪くなります。</p>



<p class="wp-block-paragraph">国立科学博物館は、トリケラトプスの前脚について、肘を横へ突き出さず、手の甲を外側へ向けた復元を紹介しています（<a href="https://www.kahaku.go.jp/exhibitions/ueno/special/2011/dinosaur/main.html">国立科学博物館「恐竜博2011」</a>）。</p>



<p class="wp-block-paragraph">研究論文でも、角竜類の前腕は、現代のトカゲのように前腕を大きくひねる構造ではなかった可能性が示されています（<a href="https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0074842">VanBuren and Bonnan, 2013</a>）。前脚は、トカゲのように自由に回る脚ではなく、ある程度向きを保ったまま地面を受けていたと考えるほうが自然です。</p>



<p class="wp-block-paragraph">ただし、「前脚が完全に垂直だった」と単純化するのも危険です。トリケラトプスは、ゾウのような完全な柱状の脚でもありません。近い表現は、体の下へ寄せた半ば矢状面の前脚です。肘は少し外向きになった可能性があります。</p>



<h2 class="wp-block-heading">脚が長く見える原因は骨だけではない</h2>



<p class="wp-block-paragraph">トリケラトプスのモデルを作ると、脚が長すぎるように見えることがあります。</p>



<p class="wp-block-paragraph">このとき、すぐに大腿骨や脛骨を短くするとは限りません。見た目の脚長は、次の比率で変わります。</p>



<ul class="wp-block-list">
    <li>腹の最低位置から地面までの距離</li>
    <li>胴体の厚み</li>
    <li>肩と股関節の高さ</li>
    <li>上腕や大腿部の太さ</li>
    <li>足先の幅</li>
    <li>頭とフリルの大きさ</li>
</ul>



<p class="wp-block-paragraph">骨が同じ長さでも、胴体を薄くすると脚が長く見えます。逆に、腹や肩まわりを厚くし、脚の付け根を肉で覆うと、同じ骨格でも大型獣らしく見えます。</p>



<p class="wp-block-paragraph">これは、古生物学の問題とデザインの問題が重なる場所です。化石から骨の位置を推定し、肉付きは現生動物と筋肉の付着位置、関節の可動範囲、体重を支えられる形から絞り込みます。特に、化石では関節軟骨が失われるため、乾燥した骨の端をそのまま生体の関節面として扱えません（<a href="https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0013120">Hollidayほか, 2010</a>）。</p>



<p class="wp-block-paragraph">肉付きを骨へぴったり貼り付けるだけの復元は、シュリンクラップと呼ばれる不自然な表現になりやすいです。大きな頭を支える首、肩の筋肉、腹の厚みを残す必要があります。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-limb-visibility-20260817.jpg" alt="骨の長さと外から見える脚の長さ" /></p>



<p class="wp-block-paragraph"><em>オリジナル模式図。緑は肉付き、淡色の線は骨の連鎖です。上腕と大腿の一部は胴体の内側に入ります。</em></p>



<h2 class="wp-block-heading">サイには似ているが、同じ動物ではない</h2>



<p class="wp-block-paragraph">サイを参考にしてよい部分はあります。</p>



<ul class="wp-block-list">
    <li>大きな胴体を低い位置で支える</li>
    <li>太い脚で体重を受ける</li>
    <li>頭を前方へ保つ</li>
    <li>速さより安定性が目立つ</li>
</ul>



<p class="wp-block-paragraph">サイからそのまま借りてはいけない部分もあります。</p>



<ul class="wp-block-list">
    <li>肩や骨盤の形</li>
    <li>前脚の手首と中手骨</li>
    <li>足先の指の数と向き</li>
    <li>フリルと角の動き</li>
    <li>恐竜の骨格にない筋肉の配置</li>
</ul>



<p class="wp-block-paragraph">トカゲは、足を上げる順番や遊脚の動きを考える参考になります。サイは、重い動物の見た目を考える参考になります。関節の座標は、トリケラトプスの骨格と研究を基準にします。</p>



<h2 class="wp-block-heading">サイとトリケラトプスを同じ4脚モデルで比べる</h2>



<p class="wp-block-paragraph">見た目が似ていても、同じ骨格データでは歩かせられません。違いを一つずつモデルへ入れると、脚の役割が見えてきます。</p>



<h3 class="wp-block-heading">1. まず関節の並びを分ける</h3>



<p class="wp-block-paragraph">サイは哺乳類で、ウマやバクに近い四肢の筋肉構成を持ちます。重い体に適応していますが、ゾウのような完全な柱状脚ではありません。脚を曲げたまま歩き、速い歩法ではギャロップもできます。</p>



<p class="wp-block-paragraph">トリケラトプスは角竜類です。特に前腕は、哺乳類のように橈骨と尺骨を交差させて手を自由に回す構造ではありません。手の向きをある程度保ち、肘を少し外へ逃がして体重を受ける形にします。</p>



<p class="wp-block-paragraph">制作モデルでは、骨を次の連鎖へ分けました。</p>



<ul class="wp-block-list">
    <li>前脚：肩 → 肘 → 手首 → 中手骨 → 指先</li>
    <li>後脚：股関節 → 膝 → 足首 → 中足骨 → 指先</li>
</ul>



<h3 class="wp-block-heading">2. 前脚は支え、後脚は前へ送る</h3>



<p class="wp-block-paragraph">現在のトリケラトプスモデルでは、前脚の肩を<code>-8〜10度</code>、肘を<code>12〜30度</code>に制限しています。動きを小さくし、重い頭とフリルを支える脚として扱うためです。</p>



<p class="wp-block-paragraph">後脚は、股関節を<code>-16〜18度</code>、膝を<code>18〜42度</code>にしています。前脚より曲げ幅を大きくし、胴体を前へ送る役割を持たせています。</p>



<p class="wp-block-paragraph">これは化石の関節角を直接測った値ではありません。化石から外れない姿勢を探すための制作設定です。</p>



<h3 class="wp-block-heading">3. 足の裏ではなく接地の移り方を見る</h3>



<p class="wp-block-paragraph"><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC6525597/">シロサイの足圧研究</a>では、歩行中の圧力が複数の指へ徐々に移り、脂肪パッド周辺の圧力が低くなる傾向が報告されています。サイは指と足裏の軟部組織を含む足全体で荷重を移します。</p>



<p class="wp-block-paragraph">トリケラトプスモデルでは、同じ足裏をコピーしません。手首・足首から中手骨・中足骨を通り、最後に指先へ荷重を渡します。接地中の指先は固定し、地面を滑らせません。</p>



<h3 class="wp-block-heading">4. 歩行周期を変える</h3>



<p class="wp-block-paragraph">サイは重い動物ですが、歩行だけでなく速歩やギャロップもできます。<a href="https://doi.org/10.1111/j.1469-7998.1992.tb04344.x">シロサイの移動と骨強度を調べた研究</a>では、走行映像と四肢骨が合わせて検討されています。</p>



<p class="wp-block-paragraph">一方、現在のトリケラトプスモデルは低速歩行だけに絞っています。</p>



<ul class="wp-block-list">
    <li>1周期：1800ms</li>
    <li>接地率：78%</li>
    <li>同時に振り出す脚：最大1本</li>
    <li>接地を保つ脚：最低3本</li>
    <li>順番：後脚（手前）→ 前脚（奥）→ 後脚（奥）→ 前脚（手前）</li>
</ul>



<p class="wp-block-paragraph">4本を同時に動かさず、空中へ浮く時間も作りません。サイの重い歩行感は参考にしても、サイのギャロップをトリケラトプスの証拠にはしないためです。</p>



<h3 class="wp-block-heading">モデルで見える一番大きな違い</h3>



<p class="wp-block-paragraph">サイは、重い体を支えながら速い歩法にも切り替えられる、曲がった哺乳類の脚です。トリケラトプスモデルは、重い頭を前脚で受け、後脚で胴体を送り、3本以上の指先接地を長く保つ脚です。</p>



<p class="wp-block-paragraph">似ているのは重量感です。骨格、足の構造、関節の動かし方は別に作る必要があります。</p>



<h2 class="wp-block-heading">骨格を動かす数学</h2>



<p class="wp-block-paragraph">プログラマーが恐竜を動かすとき、まず必要なのは、肉の絵ではなく関節の座標です。</p>



<h3 class="wp-block-heading">4脚IKとは</h3>



<p class="wp-block-paragraph">IKは「逆運動学（Inverse Kinematics）」です。脚先の目標位置を先に決め、そこへ届くように肘・膝・手首・足首の角度を逆算します。</p>



<p class="wp-block-paragraph">トリケラトプスでは、4本の脚をそれぞれ計算します。</p>



<pre><code class="language-text">前脚：肩 → 肘 → 手首 → 中手骨 → 指先
後脚：股関節 → 膝 → 足首 → 中足骨 → 指先</code></pre>



<p class="wp-block-paragraph">例えば右前脚の指先を少し前へ出すと、IKが肘と手首の曲がり方を決めます。接地中の指先を地面に残すことで、足が滑る問題も確認できます。</p>



<h3 class="wp-block-heading">重心COMとは</h3>



<p class="wp-block-paragraph">COMは <code>Center of Mass</code> の略で、体全体の重さが1点に集まっていると仮定した位置です。頭が重ければ前へ、尾が重ければ後ろへ移動します。</p>



<p class="wp-block-paragraph">4本の足先を結んだ支持多角形の内側にCOMの真下があれば、静止姿勢は倒れにくいと判定できます。外へ出たときは、次の脚を早く接地する、歩幅を短くするなどの調整が必要です。</p>



<h3 class="wp-block-heading">逆運動学で指先を地面に置く</h3>



<p class="wp-block-paragraph">脚を複数の線分として扱い、指先の位置から途中の関節を計算します。これが逆運動学、IKです。</p>



<p class="wp-block-paragraph">前脚なら、</p>



<p class="wp-block-paragraph"><code>肩 → 肘 → 手首 → 指先</code></p>



<p class="wp-block-paragraph">後脚なら、</p>



<p class="wp-block-paragraph"><code>股関節 → 膝 → 足首 → 指先</code></p>



<p class="wp-block-paragraph">です。</p>



<p class="wp-block-paragraph">指先を <code>groundY</code> に置き、骨の長さを固定すれば、歩くたびに足が地面から浮いたり、地面へ沈んだりする問題を減らせます。</p>



<p class="wp-block-paragraph">2本の骨で単純化した場合、目標の指先までの距離 <code>d</code> は、骨の長さ <code>L₁</code> と <code>L₂</code> に対して次の範囲に入る必要があります。</p>



<p class="wp-block-paragraph"><code>|L₁ - L₂| ≤ d ≤ L₁ + L₂</code></p>



<p class="wp-block-paragraph"><code>d = √((xₜ - x₀)² + (yₜ - y₀)²)</code></p>



<p class="wp-block-paragraph">範囲の外に目標地点を置くと、IKは関節を正しく曲げられません。そのため、歩幅を大きくしすぎると、足が伸び切るか、地面に届かない状態になります。これは化石から直接得た数値ではなく、骨長を壊さずに動かすための数学的制約です。</p>



<p class="wp-block-paragraph">例えば、前脚の上腕を68px、前腕の機能長を57.8pxとすると、2本だけで届く距離はおよそ10.2〜125.8pxです。指先の目標が125.8pxより遠ければ、肩や胴体を動かしても、その脚だけでは届きません。逆に10.2pxより近すぎる目標も、設定した2本の骨では折りたためません。</p>



<p class="wp-block-paragraph">この計算があると、「脚が長いから短くする」という修正の前に、歩幅が大きすぎるのか、肩の位置が高すぎるのか、前腕の長さが不適切なのかを分けて考えられます。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-locomotion-model-20260817.jpg" alt="トリケラトプスの骨格を4脚IKと重心で確認する説明図" /></p>



<p class="wp-block-paragraph"><em>オリジナルの説明図。橙色が前脚、青色が後脚、赤い点がモデル上の重心、黄色の範囲が接地脚による支持範囲です。化石標本をそのまま描いた図ではありません。</em></p>



<p class="wp-block-paragraph"><img decoding="async" src="https://attrip.jp/wp-content/uploads/2026/08/triceratops-com-support-ik-20260818.jpg" alt="重心と支持多角形、4脚IKの関係" /></p>



<p class="wp-block-paragraph"><em>オリジナル制作図。周期、接地率、荷重比、重量は制作モデルの設定値で、化石の測定値ではありません。</em></p>



<h3 class="wp-block-heading">重心を計算する</h3>



<p class="wp-block-paragraph">体を頭、胴体、脚、尾などの部品に分け、それぞれに重さと位置を設定します。</p>



<p class="wp-block-paragraph"><code>COM = Σ(mᵢ × rᵢ) / Σmᵢ</code></p>



<p class="wp-block-paragraph"><code>mᵢ</code> は部品の重さ、<code>rᵢ</code> は部品の位置です。これで全体の重心、COMを求められます。</p>



<p class="wp-block-paragraph">頭が大きいトリケラトプスでは、頭の重さを無視できません。頭を大きくしたのに重心を胴体の中央へ固定すると、見た目と力学がずれます。</p>



<h3 class="wp-block-heading">支持範囲を見る</h3>



<p class="wp-block-paragraph">地面についている脚の指先を線で結ぶと、支持範囲ができます。</p>



<p class="wp-block-paragraph">3本の脚が接地していれば三角形です。4本なら四角形に近い範囲になります。重心の真下がこの範囲に入っていれば、静止姿勢は安定して見えます。</p>



<p class="wp-block-paragraph">側面図だけで確認する簡易判定なら、接地した指先の最小・最大位置を使って、次のように書けます。</p>



<p class="wp-block-paragraph"><code>min(x₁, x₂, ...) ≤ COMₓ ≤ max(x₁, x₂, ...)</code></p>



<p class="wp-block-paragraph">実際の安定性は横方向や脚の幅も含む支持多角形で判定します。記事の図では、まず横から見た確認を行い、その後に4脚の接地点へ広げています。</p>



<p class="wp-block-paragraph">歩行中に重心が支持範囲の外へ出る場合は、次のどれかを調整します。</p>



<ul class="wp-block-list">
    <li>次に接地する脚を早く出す</li>
    <li>胴体の上下動を小さくする</li>
    <li>歩幅を短くする</li>
    <li>頭の振り幅を小さくする</li>
    <li>脚の荷重を見直す</li>
</ul>



<p class="wp-block-paragraph">これは「本物のトリケラトプスの正確な計算」ではありません。骨格が倒れないかを確かめる設計モデルです。</p>



<h3 class="wp-block-heading">歩行周期を設定する</h3>



<p class="wp-block-paragraph">脚の動きは、時間を周期で割って作れます。</p>



<p class="wp-block-paragraph"><code>phase = (time / period + phaseOffset) mod 1</code></p>



<p class="wp-block-paragraph"><code>period</code> は1歩の長さです。<code>phaseOffset</code> は脚ごとの開始位置です。</p>



<p class="wp-block-paragraph">例えば、前脚と後脚の位相を少しずらすと、3本以上の脚が接地した安定した歩き方を作れます。</p>



<p class="wp-block-paragraph">ここで使う1800ms、接地率78%、歩幅60pxといった値は、現在のmanifestに合わせた制作モデルの設定値です。化石から直接発見された数字ではありません。</p>



<h2 class="wp-block-heading">恐竜を動かすプログラムの設計</h2>



<p class="wp-block-paragraph">恐竜の絵と歩行計算は分けて作ります。最初に肉付きまで描くと、骨格、IK、歩行周期、見た目の問題を同時に直すことになるからです。</p>



<p class="wp-block-paragraph">基本の流れは次の4層です。</p>



<pre><code class="language-text">研究データ
  ↓
関節モデル
  ↓
歩行計算
  ↓
SVG表示</code></pre>



<p class="wp-block-paragraph">この分離ができると、骨長、歩幅、頭部質量、肉付きのどれが不自然さの原因なのかを個別に検証できます。</p>



<details>
  <summary>実装リファレンスを開く：JSON・IK・COM・検証</summary>
  <p>現在のmanifestに合わせた最小契約です。数値は制作モデルの設定値です。</p>
  <p><strong>最小データ契約</strong></p>
  <pre><code>{
  "groundY": 650,
  "supportLegMinimum": 3,
  "legs": {
    "hind": ["hip", "knee", "ankle", "metatarsal", "toe"],
    "fore": ["shoulder", "elbow", "wrist", "metacarpal", "toe"]
  },
  "gait": {
    "cycleMs": 1800,
    "stanceRatio": 0.78,
    "stridePx": 60,
    "phaseOffsets": {
      "hind": {"near": 0, "far": 0.5},
      "fore": {"near": 0.75, "far": 0.25}
    }
  },
  "centerOfMass": [579.055, 455.61],
  "maxSlipPx": 1
}</code></pre>
  <p><strong>IKの呼び出し順</strong></p>
  <pre><code>for (const leg of legs) {
  const target = footTarget(leg, phase);
  const joints = solveIK(leg.chain, target);
  validateBoneLength(joints, leg.boneLengths);
  if (leg.isStance) keepWorldPosition(leg.toe, target);
}</code></pre>
  <p><strong>COMと支持範囲</strong></p>
  <p><code>COM = Σ(mᵢ × rᵢ) / Σmᵢ</code></p>
  <p>COMを地面へ投影した点が、接地中の足先で作る支持多角形の内側にあるかを確認します。側面の簡易判定は、<code>min(接地足のx) ≤ COMₓ ≤ max(接地足のx)</code>です。</p>
  <p><strong>検証条件</strong></p>
  <ul>
    <li>支持脚：最低3本</li>
    <li>接地滑り：1px以下を許容</li>
    <li>骨長誤差：0%に近づける</li>
    <li>支持範囲：COMの投影点が範囲内</li>
  </ul>
</details>



<h3 class="wp-block-heading">座標系を最初に固定する</h3>



<p class="wp-block-paragraph">今回の側面モデルでは、座標を次のように定義します。</p>



<pre><code class="language-text">x：前後方向
y：高さ方向
groundY：地面の高さ</code></pre>



<p class="wp-block-paragraph">SVGでは、通常は右がxのプラス、下がyのプラスです。数学で使う座標系とは上下が逆になるため、地面から足を持ち上げる計算は <code>groundY - lift</code> になります。</p>



<h3 class="wp-block-heading">FKとIKを使い分ける</h3>



<p class="wp-block-paragraph">FK（順運動学）は、肩や股関節の角度から肘、膝、指先の位置を順番に求めます。IK（逆運動学）は、指先の目標位置から途中の関節を逆算します。</p>



<p class="wp-block-paragraph">歩行中は「接地した指先を同じ地面位置へ残す」必要があるため、脚にはIKが向いています。一方、頭、フリル、尾の小さな揺れは、付け根の角度から動かせるためFKで十分です。</p>



<h3 class="wp-block-heading">IKに関節制限を付ける</h3>



<p class="wp-block-paragraph">IKは、数学的に届く位置を求めるだけでは、生物として自然な方向を選びません。そのため、関節ごとに最小角度、最大角度、曲げる側を設定します。</p>



<pre><code class="language-text">前脚：肘を少し外へ逃がす
後脚：膝を体の下で前方へ曲げる
手首・足首：指先が地面へ向く範囲に抑える</code></pre>



<p class="wp-block-paragraph">これらは化石から直接得た一つの正解角度ではありません。関節面と研究上の姿勢から外れないように設定した、制作モデルの制限です。</p>



<h3 class="wp-block-heading">4本の脚を状態機械として扱う</h3>



<p class="wp-block-paragraph">1周期のアニメーションを一枚として作らず、各脚を次の状態へ分けます。</p>



<pre><code class="language-text">支持期：指先を地面へ固定する
離地：指先を持ち上げる
遊脚期：次の接地点へ送る
接地：指先を地面へ戻す</code></pre>



<p class="wp-block-paragraph">脚ごとに同じ状態を持ち、<code>phaseOffset</code>だけをずらします。これにより、4本を同時に振り出さず、最低3本を接地させた低速歩行を作れます。</p>



<h3 class="wp-block-heading">支持期の足滑りを止める</h3>



<p class="wp-block-paragraph">歩行で最も目立つ失敗は、体が進んでいるのに接地中の指先まで地面を滑ることです。</p>



<pre><code class="language-text">接地した瞬間の世界座標を保存
  ↓
支持期は同じ世界座標へ固定
  ↓
離地後だけ次の接地点へ移動</code></pre>



<p class="wp-block-paragraph">体から見たローカル座標だけで足先を毎フレーム計算すると、体の移動量が足へ加わり、支持脚が滑ります。接地位置は世界座標で保存し、描画するときに体の移動量を引きます。</p>



<h3 class="wp-block-heading">重心と支持範囲を毎フレーム検証する</h3>



<p class="wp-block-paragraph">側面図の簡易判定は次の式です。</p>



<p class="wp-block-paragraph"><code>min(接地足のx) ≤ COMₓ ≤ max(接地足のx)</code></p>



<p class="wp-block-paragraph">ただし、これは前後方向だけの確認です。上から見たモデルでは、接地している3本または4本の足で支持多角形を作り、その内側に重心の投影点があるか確認します。</p>



<p class="wp-block-paragraph">今回の確認ページでは、1周期を601点に分けて検証し、支持脚の指先滑り0px、最低支持脚3本、支持範囲逸脱0回、IK到達限界0回を確認しました。</p>



<h3 class="wp-block-heading">作る順番</h3>



<pre><code class="language-text">静止骨格を置く
  ↓
1本の脚をIKで動かす
  ↓
支持期の足滑りを止める
  ↓
前脚と後脚の役割を分ける
  ↓
4本の位相を設定する
  ↓
重心と支持範囲を検証する
  ↓
肉付きを重ねる
  ↓
頭・尾・胴体の小さな動きを加える</code></pre>



<p class="wp-block-paragraph">プログラムも同じ責務で分けます。</p>



<pre><code class="language-text">gait       脚ごとの状態と位相
footTarget 指先の目標世界座標
ikSolver   肘・膝・手首・足首の計算
body       胴体・頭・尾の配置
validation 足滑り・骨長・重心・支持脚の監査</code></pre>



<p class="wp-block-paragraph"><a href="https://attrip.jp/wp-content/themes/attrip-lab/tools/dino/triceratops-rig-lab.html">公開中のトリケラトプス歩行リグ確認画面</a>では、速度と位相を変えながら、支持脚数、足滑り、骨長誤差、重心位置を確認できます。</p>



<p class="wp-block-paragraph">画面の表示は、次のように読みます。</p>



<ul class="wp-block-list">
    <li>青い点：その瞬間に地面へ接地している指先</li>
    <li>赤い点：制作モデルの重心、COM</li>
    <li>支持脚：3本以上なら、低速歩行の条件を満たす</li>
    <li>接地滑り：0pxに近いほど、足が地面に残っている</li>
    <li>骨長誤差：0%に近いほど、IKで骨が伸び縮みしていない</li>
</ul>



<p class="wp-block-paragraph">ここで数値が合格しても、脚が細すぎる、頭が軽く見える、胴体が浮いて見えることはあります。数値の検証と、人間がシルエットを見る確認は別に行います。</p>



<h3 class="wp-block-heading">見た目の問題をコードへ戻す</h3>



<p class="wp-block-paragraph">画面で感じた違和感は、次のように切り分けます。</p>



<ul class="wp-block-list">
    <li>脚が長く見える：骨長だけでなく、腹の高さ、肩と股関節の位置、脚の太さを確認する</li>
    <li>足が滑る：接地中の足先を世界座標で固定する</li>
    <li>トカゲのように見える：前脚の横への張り出しと肘の可動範囲を確認する</li>
    <li>軽く見える：頭、フリル、胴体の質量とCOMを確認する</li>
    <li>倒れて見える：接地脚の支持範囲とCOMの位置を確認する</li>
</ul>



<p class="wp-block-paragraph">この切り分けをしてから数値を変えると、骨格の問題を肉付きで隠したり、歩行の問題をSVGの形だけで直したりする失敗を減らせます。</p>



<h2 class="wp-block-heading">足跡は骨格より動きに近い証拠になる</h2>



<p class="wp-block-paragraph">骨格は、動物の形と関節の条件を教えてくれます。足跡は、実際に地面へ加わった動きを教えてくれます。</p>



<p class="wp-block-paragraph">足跡の間隔からは、歩幅や速度を推定できます。前脚と後脚の跡が残っていれば、四足歩行だったかも検討できます（<a href="https://www.nhm.ac.uk/discover/dinosaur-footprints.html">Natural History Museum「Dinosaur footprints」</a>）。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Ceratopsian_and_hadrosaur_footprint_price.jpg/3840px-Ceratopsian_and_hadrosaur_footprint_price.jpg" alt="角竜類とハドロサウルス類の足跡化石" /></p>



<p class="wp-block-paragraph"><em>ユタ州のBlackhawk Formationから見つかった自然鋳型。左が角竜類の後ろ足で、4本の指の跡が見えます。右はハドロサウルス類の足跡です。撮影：Jens Lallensack / <a href="https://commons.wikimedia.org/wiki/File:Ceratopsian_and_hadrosaur_footprint_price.jpg">Wikimedia Commons</a>。CC BY-SA 4.0。</em></p>



<p class="wp-block-paragraph">この写真は、トリケラトプス本人の足跡ではありません。角竜類の足跡を見て、指の数、足の幅、地面への接地を考えるための比較資料です。</p>



<p class="wp-block-paragraph">ただし、足跡からトリケラトプスという種名まで決められるとは限りません。角竜類の足跡として記録されることも多く、足跡だけで特定の個体を描くことはできません。足跡は骨と違って行動の直接的な記録ですが、地面の硬さや保存状態で形が変わるためです（<a href="https://www.nhm.ac.uk/discover/dinosaur-footprints.html">Natural History Museum「Dinosaur footprints」</a>）。</p>



<p class="wp-block-paragraph">体格が違う動物の移動を比較するときは、フルード数を使えます。恐竜の歩幅や速度の比較にも使われてきた無次元量です（<a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC1634776/">Dinosaur biomechanics</a>）。</p>



<p class="wp-block-paragraph"><code>Fr = v² / (gL)</code></p>



<p class="wp-block-paragraph"><code>v</code>は速度、<code>g</code>は重力加速度、<code>L</code>は脚長です。時速だけでなく、脚の長さに対する速度としてサイ、トカゲ、トリケラトプスを比較できます。</p>



<p class="wp-block-paragraph">ただし、生体時の関節軟骨で脚長は変わります。トリケラトプスの最高速度を一つの数字へ断定することはできません。</p>



<h2 class="wp-block-heading">頭は低く、必要なときだけ前を向いた</h2>



<p class="wp-block-paragraph">頭部のCT研究では、トリケラトプスの警戒時の頭を、角とフリルが前を向き、くちばしが地面側へ傾く姿勢として復元しています。低い植物を食べる姿勢とも合います（<a href="https://peerj.com/articles/9888/">Sakagami and Kawabe, 2020</a>）。</p>



<p class="wp-block-paragraph">この姿勢なら、歩きながら頭を高く振り続けるより、地面の植物を探し、危険を感じたときに頭と角を前へ向ける動きが考えやすくなります。</p>



<p class="wp-block-paragraph">ただし、内耳の形から頭の姿勢を復元する方法には限界があります。頭が常に同じ角度だったと断定はできません。</p>



<h2 class="wp-block-heading">角は押し合いにも使われた可能性がある</h2>



<p class="wp-block-paragraph">トリケラトプスの頭骨には、治癒した傷や骨の反応が残っています。</p>



<p class="wp-block-paragraph"><img decoding="async" src="https://commons.wikimedia.org/wiki/Special:Redirect/file/Triceratops%20lesions.jpg" alt="トリケラトプス頭骨に見られる病変の分布" /></p>



<p class="wp-block-paragraph"><em>Farke, Wolff, Tankeによる頭骨病変の分布図。出典：<a href="https://commons.wikimedia.org/wiki/File:Triceratops_lesions.jpg">Wikimedia Commons</a>／PLOS ONE。CC BY 2.5。</em></p>



<p class="wp-block-paragraph">トリケラトプスとセントロサウルスの頭骨を比べた研究では、トリケラトプスのフリルの骨に傷が多く、同種間で角を使った争いがあったという仮説と合う結果が出ています（<a href="https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0004252">Farkeほか, 2009</a>）。</p>



<p class="wp-block-paragraph">ここから考えられるのは、必ずしも遠くから突進する動きではありません。頭を下げ、角を近づけ、4本の脚で体を固定しながら押し合う動きです。</p>



<p class="wp-block-paragraph">ただし、頭骨の傷だけで、争いのすべてを再現することはできません。角が求愛、威嚇、防御、同種間の競争のどれにどれほど使われたかは、まだ分かれている部分があります。</p>



<h2 class="wp-block-heading">化石の事実とプログラムの仮定を分ける</h2>



<p class="wp-block-paragraph">ここを混ぜると、記事もプログラムも不安定になります。</p>



<p class="wp-block-paragraph">化石から確認できるものは、骨の形、関節の位置、頭骨の傷、皮膚痕、足跡です。</p>



<p class="wp-block-paragraph">研究から推定するものは、前脚の姿勢、頭の向き、食べ方、角の使い方、速度です。</p>



<p class="wp-block-paragraph">制作モデルで決めるものは、ピクセル座標、周期、歩幅、重さ、重心の初期値、脚の位相です。</p>



<p class="wp-block-paragraph">現在の制作モデルは、周期1800ms、接地率78%、歩幅60px、後脚荷重50%、前脚荷重50%、総重量82（相対値）、<code>groundY = 650px</code>を使います。重心の初期値は<code>[579.055, 455.610]px</code>、静止時の接地支持域は前後方向で<code>x = 438〜718px</code>です。すべて制作上の仮定です。前後荷重を50対50にしたのは、Alexander（1985）の模型計算で示された前脚48〜51%、後脚49〜52%を制作上の基準にしたためです。</p>



<p class="wp-block-paragraph">静的SVGのDOM IDは13件、manifestの関節は19件です。13件はアクセシビリティ用メタデータ3件と視覚部品10件の識別子です。19件はIKが使う骨格関節です。同じ対象を数えた数字ではありません。</p>



<p class="wp-block-paragraph">プログラムがきれいに動いたからといって、それが古代の実際の歩行だったとは言えません。逆に、化石の研究があるからといって、画面上の脚が自然に見えるとも限りません。</p>



<p class="wp-block-paragraph">研究と制作は、次の順番でつなぐと安全です。</p>



<ul class="wp-block-list">
    <li>化石から関節の順番を決める</li>
    <li>研究から姿勢の候補を絞る</li>
    <li>数学で重心と接地を確認する</li>
    <li>IKで脚を動かす</li>
    <li>人間が見た目の脚長、肉付き、重さを確認する</li>
</ul>



<h2 class="wp-block-heading">トリケラトプスは「サイのような恐竜」ではない</h2>



<p class="wp-block-paragraph">見た目や歩行感はサイに似ています。しかし、生物分類では別の系統です。</p>



<p class="wp-block-paragraph">トリケラトプスは、角竜類の恐竜として、恐竜の骨格、鳥盤類の体の構造、角とフリル、くちばしを持っていました。</p>



<p class="wp-block-paragraph">サイは、哺乳類として、別の骨格、別の脚、別の筋肉、別の進化史を持っています。</p>



<p class="wp-block-paragraph">似ている部分は、重い体を4本の脚で支えることです。似ていない部分を残すことが、トリケラトプスらしさになります。</p>



<h2 class="wp-block-heading">骨格・足跡・数学から歩きを考える</h2>



<p class="wp-block-paragraph">トリケラトプスの動きは、骨格だけでも、サイの動きだけでも決まりません。</p>



<p class="wp-block-paragraph">骨格は、前脚と後脚がどのようにつながっているかを教えます。足跡は、実際に歩いたときの歩幅や速度を教えます。重心、支持範囲、IKは、その条件を画面上で試す道具です。</p>



<p class="wp-block-paragraph">だから、自然なトリケラトプスを作るには、脚を短くするだけでは足りません。胴体の厚み、肩と股関節の高さ、頭の重さ、足先の幅、接地の順番まで一緒に見直す必要があります。</p>



<p class="wp-block-paragraph">一番安全な復元は、断定から始めない復元です。どこまでが化石で、どこからが研究者の推定で、どこからが自分のモデルなのかを表示する。これが、人間にもプログラマーにもわかる恐竜の動きの説明になります。</p>



<h2 class="wp-block-heading">参照元</h2>



<ul class="wp-block-list">
    <li><a href="https://www.nhm.ac.uk/discover/dino-directory/triceratops.html">Natural History Museum「Triceratops」</a>：分類、四足歩行、サイとの収斂進化、食性、角とフリル。</li>
    <li><a href="https://www.kahaku.go.jp/exhibitions/ueno/special/2011/dinosaur/main.html">国立科学博物館「恐竜博2011」</a>：トリケラトプスの前脚復元。</li>
    <li><a href="https://doi.org/10.1371/journal.pone.0074842">VanBuren / Bonnan, Forearm Posture and Mobility in Quadrupedal Dinosaurs</a>：角竜類を含む恐竜の前腕姿勢と回転性。</li>
    <li><a href="https://doi.org/10.1371/journal.pone.0013120">Hollidayほか, Cartilaginous Epiphyses in Extant Archosaurs</a>：関節軟骨と脚長からの速度推定。</li>
    <li><a href="https://doi.org/10.7717/peerj.9888">Sakagami / Kawabe, Endocranial anatomy of the ceratopsid dinosaur Triceratops</a>：頭部姿勢、採食、頭の動き。</li>
    <li><a href="https://doi.org/10.1371/journal.pone.0004252">Farkeほか, Evidence of Combat in Triceratops</a>：頭骨の傷と同種間の争い。</li>
    <li><a href="https://www.nhm.ac.uk/discover/dinosaur-footprints.html">Natural History Museum「Dinosaur footprints」</a>：足跡から四足歩行や速度を推定する方法。</li>
    <li><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC1634776/">Dinosaur biomechanics</a>：フルード数と歩幅・速度の比較方法。</li>
    <li><a href="https://doi.org/10.1016/j.cretres.2023.105738">de Rooijほか, 2024</a>：トリケラトプス四肢骨の長さ、骨周、骨皮質厚の実測値。</li>
    <li><a href="https://doi.org/10.1111/j.1096-3642.1985.tb00871.x">Alexander, 1985</a>：恐竜模型による重心位置と前後脚の荷重推定。</li>
    <li><a href="https://link.springer.com/article/10.1007/s41513-023-00226-6">角竜類の足跡研究レビュー</a>：足跡から姿勢を読む方法と保存状態による限界。</li>
    <li><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC8121076/">Etienneほか, Limb myology and muscle architecture of rhinoceroses</a>：サイの四肢筋と大型化への適応。</li>
    <li><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC6525597/">Panagiotopoulouほか, Foot pressure distribution in White Rhinoceroses</a>：歩行中の足圧と指への荷重移動。</li>
    <li><a href="https://doi.org/10.1111/j.1469-7998.1992.tb04344.x">Alexander / Pond, Locomotion and bone strength of the white rhinoceros</a>：走行映像と四肢骨強度。</li>
    <li><a href="https://commons.wikimedia.org/wiki/File:Skeleton_of_triceratops.jpg">Wikimedia Commons「Skeleton of triceratops.jpg」</a>：記事内の骨格写真。撮影：Austin Moon。CC BY-SA 4.0。</li>
    <li><a href="https://commons.wikimedia.org/wiki/File:Triceratops_lesions.jpg">Wikimedia Commons「Triceratops lesions」</a>：頭骨病変の図。Farke, Wolff, Tanke。CC BY 2.5。</li>
    <li><a href="https://commons.wikimedia.org/wiki/File:Triceratops_skull_houston.JPG">Wikimedia Commons「Triceratops skull houston.JPG」</a>：ヒューストン自然科学博物館の実物頭骨。撮影：Nekarius。パブリックドメイン。</li>
    <li><a href="https://commons.wikimedia.org/wiki/File:Ceratopsian_and_hadrosaur_footprint_price.jpg">Wikimedia Commons「Ceratopsian and hadrosaur footprint price.jpg」</a>：角竜類とハドロサウルス類の足跡化石。撮影：Jens Lallensack。CC BY-SA 4.0。</li>
</ul>



<p class="wp-block-paragraph">メタディスクリプション：トリケラトプスは何類で何に似ていたのか。骨格写真、足跡、重心、支持範囲、逆運動学を使い、化石の事実と研究者の推定、プログラム上の仮定を分けて歩き方を解説します。</p><p>The post <a href="https://attrip.jp/224003/">トリケラトプスはどう動いた？骨格・数学・プログラムで歩き方を考える</a> first appeared on <a href="https://attrip.jp">attrip</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://attrip.jp/224003/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">224003</post-id>	</item>
	</channel>
</rss>