先日にGeminiで静かなカフェのジグソーパズル動画をつくってもらいましたが、これは100%Geminiにつくってもらいました。
そのため、私の方ではまったくどんな呪文が書かれているか理解できずにいますので、そのコードをGeminiに解読し手どんな命令を出しているのか教えてもらいました。
ある意味、リバースエンジニアリングのようなものですが、こうした通常の作業とは逆の手順を踏むことで、プログラミングというのもおぼろげに理解できそうです。
はい、承知いたしました。 このスクリプトが何をしているのか、各ブロックごとに日本語で解説します。
このスクリプトは、「ウェブページ上に100ピースのジグソーパズルを作り、どれか1ピースをクリックすると残りのピースが自動的に完成する」という動作を実現するための命令文です。
プログラムは上から下に順番に実行されます。大きく分けて、以下の命令のブロックで構成されています。
document.addEventListener('DOMContentLoaded', () => { ... });
日本語訳: 「ウェブページのHTML文書の読み込みが完了したら、{}
の中の処理を全部実行しなさい。」という、プログラム全体の開始を指示する命令です。
const puzzleBoard = document.getElementById('puzzle-board');
日本語訳: HTMLの中から id="puzzle-board"
という名前の要素を探してきて、puzzleBoard
という名前の変数(あだ名のようなもの)に入れなさい。
pieceContainer
と resetButton
も同様に、HTML要素に名前をつけて使いやすくしています。
if (!puzzleBoard || ...)
日本語訳: もし puzzleBoard
など、必要なHTML要素のどれか一つでも見つからなかったら、エラーメッセージを表示して、ここで処理を止めなさい。(安全装置の役割です)
const imageUrl = 'cafe.jpg';
日本語訳: これから使うパズルの画像は cafe.jpg
ですよ、と設定しています。
pieceCount
(ピースの総数)、gridSize
(縦横のピース数)、pieceSize
(1ピースのサイズ) など、パズルの基本設定をここで決めています。
initializePuzzle
関数)
function initializePuzzle() { ... }
日本語訳: 「パズルを準備する」という一連の作業をまとめたものです。リセットボタンが押された時や、最初にページが開かれた時に呼び出されます。
puzzleBoard.innerHTML = '';
日本語訳: puzzleBoard
(パズル盤)の中身を空っぽにしなさい。(前回作ったピースなどが残っていたら掃除するためです)
for (let i = 0; i < pieceCount; i++) { ... }
日本語訳: ピースの数(100個)だけ、{}
の中の処理を繰り返しなさい。(0番から99番まで、1つずつピースを作っていきます)
const piece = document.createElement('div');
日本語訳: ピースとして表示するためのHTMLの <div>
タグを1つ新しく作りなさい。
piece.style.background...
日本語訳: 作成した <div>
タグの背景に、cafe.jpg
の画像を設定しなさい。さらに、backgroundPosition
で画像の表示位置をずらすことで、100個のピースそれぞれに正しい絵柄の部分だけが表示されるように切り抜いています。
piece.addEventListener('click', handlePieceClick);
日本語訳: このピースがマウスでクリックされたら、handlePieceClick
という命令を実行するように予約しなさい。
shuffleArray(pieces).forEach(...)
日本語訳: 作成した100個のピースのリストを shuffleArray
という命令でシャッフル(順番をバラバラに)しなさい。そして、シャッフル後のピースを1つずつ pieceContainer
(右側のピース置き場) に追加していきなさい。
handlePieceClick
関数)
async function handlePieceClick(event) { ... }
日本語訳: ピースがクリックされた時に実行される一連の作業をまとめたものです。
if (isSolving) return;
日本語訳: もし既にパズルが自動組立中なら、何もしないで処理を中断しなさい。(組立中に他のピースをクリックされても無視するためです)
const clickedPiece = event.target;
日本語訳: クリックされたピースそのものを clickedPiece
という変数に入れなさい。
await movePieceToPlaceholder(clickedPiece, targetPlaceholder);
日本語訳: クリックされたピースを、アニメーション付きで正しい場所に移動させなさい。そして、その移動アニメーションが終わるまで、次の処理を待ちない。
const remainingPieces = pieces.filter(...)
日本語訳: まだピース置き場に残っている、クリックされたピース以外のすべてのピースをリストアップしなさい。
for (const piece of remainingPieces) { ... }
日本語訳: リストアップした残りのピースを1つずつ、順番に、アニメーション付きで正しい場所に移動させなさい。
setTimeout(() => { ... }, 500);
日本語訳: すべてのピースの移動が終わってから0.5秒後に、「パズルが完成しました!」というアラートを表示しなさい。
movePieceToPlaceholder
関数)
function movePieceToPlaceholder(...) { ... }
日本語訳: 1つのピースを受け取り、それを指定された場所までスムーズに移動させるアニメーション処理をまとめたものです。
内部では、ピースの現在位置と目標位置を計算し、CSSの transition
プロパティを使って、0.5秒かけてスライドするように見せています。
shuffleArray
関数)
function shuffleArray(array) { ... }
日本語訳: ピースのリストなど、複数の要素が入った配列を受け取り、その順番をランダムに並べ替える専門の命令です。「フィッシャー–イェーツのシャッフル」という古典的なアルゴリズムが使われています。
resetButton.addEventListener('click', initializePuzzle);
日本語訳: リセットボタンがクリックされたら、initializePuzzle
(パズルを準備する命令) を実行しなさい。
initializePuzzle();
日本語訳: このスクリプトが読み込まれたら、まず最初に initializePuzzle
を1回実行しなさい。(ページを開いた時に最初のパズルを表示するためです)