marp |
---|
true |
➡ Demo
<body>
<h2>Kanji Puzzle Maker</h2>
<input name="答え" type="text" id="answerText" placeholder="漢字2文字で入力" onkeypress="enter(event.keyCode);">
<button onclick="createPuzzleProcess();"> 生成</button>
<br>
<input type="radio" id = "blue" name="tempColor" value="blue" checked onclick="colorChange();">
<label for = "blue">Blue</label>
<input type="radio" id = "green" name="tempColor" value="green" onclick="colorChange();">
<label for = "green">Green</label>
<input type="radio" id = "orange" name="tempColor" value="orange" onclick="colorChange();">
<label for = "orange">Orange</label>
<input type="radio" id = "pink" name="tempColor" value="pink" onclick="colorChange();">
<label for = "pink">Pink</label>
<h3 id="createResult"></h3>
<p id="note"></p>
<canvas id="puzzleCanvas"></canvas>
<canvas id="answerCanvas"></canvas>
</body>
<h2>Kanji Puzzle Maker</h2>
- 見出しの部分
<input name="答え" type="text" id="answerText" placeholder="漢字2文字で入力" onkeypress="enter(event.keyCode);">
<input>
は入力フォームを作成するタグname
はinput
タグの名前type
は入力するデータの種類id
はタグを一意に識別できる名前placeholder
は何も入力していないときにうっすら表示されるテキストonkeypress
で、この入力フォームの中で何かキーが押されたときの処理を指定- ここでは
enter
という関数を呼び出している- 引数は「押したキー(のコード)」
- ここでは
<button onclick="createPuzzleProcess();">生成</button>
<button></button>
はボタンを作成するタグ- タグの間にボタンに表示するテキストを書く
onclick
で、このボタンが押されたときに行う処理を指定- ここでは、
createPuzzleProcess()
を実行
- ここでは、
<br>
- 改行
<input type="radio" id = "blue" name="tempColor" value="blue" checked onclick="colorChange();">
<label for = "blue">Blue</label>
<input type="radio" id = "green" name="tempColor" value="green" onclick="colorChange();">
<label for = "green">Green</label>
---略---
<input>
でtype="radio"
にすることで、ラジオボタンを作成できるvalue
でこのボタンが選択されているときに何という値として扱うかを指定checked
をつけると最初から選択状態になるname
が同じラジオボタンは1つのグループ扱いとなる- ユーザーはこの中から1つしか選択できない
<label>
でinputタグにラベルを付けるfor = "blue"
だったらid="blue"
のinputタグと紐づく- ○の横にblueなどと表示されるようになる
<h3 id="createResult"></h3>
<p id="note"></p>
<h3></h3>
で見出し3(3番目に大きい見出し)を作成- 最初の状態では何も表示するものがない
- あとでパズルの生成結果に応じてテキストが入ることになる
id
を手掛かりに
- 最初の状態では何も表示するものがない
<p></p>
で段落を作成- 最初の状態では何も表示するものがない
- あとでパズルの生成結果に応じてテキストが入ることになる
id
を手掛かりに
- 最初の状態では何も表示するものがない
<canvas id="puzzleCanvas"></canvas>
<canvas id="answerCanvas"></canvas>
<canvas></canvas>
で図を表示する場所を作成できる- 最初の状態では何も表示するものがない
- あとでパズルの生成結果に応じてパズルの画像が入ることになる
id
を手掛かりに
- 最初の状態では何も表示するものがない
const stringPuzzles = `哀楽 哀願 安楽 音楽 快楽 楽園 楽屋 ---略---';
- 文字列を
stringPuzzles
に格納 - 文字列は、1行ごとに↓
- 先頭に「答えとなる熟語」
- その後ろに「答えの1文字目or2文字目を使った熟語」が並んでいる
- 上の例では「哀楽」が答えで、哀や楽を使った熟語が後ろに並んでいる
- 熟語は常用漢字を使ったもののみ
- 難易度が高くなりすぎないように
- 熟語は常用漢字を使ったもののみ
const puzzleStringDividedPerLine = stringPuzzles.split('\n');
stringPuzzles
に格納されている文字列を1行ごとに分割し、puzzleStringDividedPerLine
に格納.split()
で文字列を分割できる()
にはどこで分割するかを指定- ここでは改行を表す
\n
で分割 - ほかにも、例えば
split(',')
にすればカンマで分割される
- ここでは改行を表す
puzzleStringDividedPerLine
はリストになっている["哀楽 哀願 安楽 音楽 快楽 楽園 ...","悪意 悪化 悪寒 悪気 悪口 ...", ...]
- というイメージ
const hintList = [];
const puzzleIndexMap = new Map();
hintList
とpuzzleIndexMap
を用意しておくhintList
は配列puzzleIndexMap
はマップ- マップはキー(key)とそれに対応する値(value)を対応させて保持するオブジェクト
- 参考
puzzleStringDividedPerLine.forEach(function(puzzleString, ind){
------------略----------
});
配列名.forEach( コールバック関数(要素の値, 要素のインデックス) )
- 配列の先頭から要素を1つずつ呼び出して
コールバック関数
を実行- 要素の値は
要素の値
に、 - 要素のインデックスは
要素のインデックス
に渡される
- 要素の値は
- 今回の場合
puzzleStringDividedPerLine
の要素を1つずつ取り出しながら、要素をpuzzleString
に、要素のインデックスをind
に渡してfunction
を実行
- 配列の先頭から要素を1つずつ呼び出して
puzzleStringDividedPerLine.forEach(function(puzzleString, ind){
let aPuzzle = puzzleString.split(' ');
hintList.push(aPuzzle.slice(1,-1));
puzzleIndexMap.set(aPuzzle[0], ind);
});
let aPuzzle = puzzleString.split(' ');
の部分- puzzleStringの中身は、
["哀楽 哀願 安楽 音楽 快楽 楽園 ...","悪意 悪化 悪寒 悪気 悪口 ...", ...]
のようなリストの要素"哀楽 哀願 安楽 音楽 快楽 楽園 ..."
というような感じ
- これを空白で分割し、
["哀楽", "哀願", "安楽", "音楽", "快楽", "楽園" ...]
というようなリストを作成
- puzzleStringの中身は、
puzzleStringDividedPerLine.forEach(function(puzzleString, ind){
let aPuzzle = puzzleString.split(' ');
hintList.push(aPuzzle.slice(1,-1));
puzzleIndexMap.set(aPuzzle[0], ind);
});
hintList.push(aPuzzle.slice(1,-1));
の部分aPuzzle
は、["哀楽", "哀願", "安楽", "音楽", "快楽", ...]
という感じ- これ(の一部)を
hintList
に追加(配列名.push()
:()
内を配列に追加)hintList
は[["哀願", "安楽", "音楽", "快楽", "楽園" ...],["悪化", "悪寒", "悪気", "悪口", ...]]
というような二次元の配列にaPuzzle.slice()
によって配列の一部を取り出す(次ページ)
aPuzzle.slice(1,-1)
の部分配列名.slice(x,y)
で配列のxからy-1番目の要素までを取得- 例えば
[0,1,2,3,4,5]
の配列exam
に対してexam.slice(1,3)
を適用すれば[1,2]
が取得できる([1,2,3]
ではない)
- 例えば
- つまりここでは
aPuzzle
の先頭と末尾の要素を除いた配列を取得している- 先頭は答えとなる熟語→
hintList
には不要 - 末尾は、実は
aPuzzle
の末尾の要素が""
になっている- パズルのデータを作るときにミスりました。謝罪。
- よって、いらない。
- 先頭は答えとなる熟語→
puzzleStringDividedPerLine.forEach(function(puzzleString, ind){
let aPuzzle = puzzleString.split(' ');
hintList.push(aPuzzle.slice(1,-1));
puzzleIndexMap.set(aPuzzle[0], ind);
});
puzzleIndexMap.set(aPuzzle[0], ind);
の部分マップ名.set(キー,値)
で、マップにキーと値を登録- ここでは
puzzleIndexMap
に以下を登録- キー:
aPuzzle
の先頭の要素aPuzzle
は、["哀楽", "哀願", "安楽", "音楽", "快楽", ...]
という感じなので、先頭の要素=答えとなる熟語
- 値:
ind
- こうすることで、キーの熟語が答えになるパズルを作るときに、
hintList
の何番目を見たらいいかがわかるようになる
- こうすることで、キーの熟語が答えになるパズルを作るときに、
- キー:
(後日解説する予定がないこともない)