【JavaScript】ワンピースのタイピングゲームをプログラミングで作成
今回は、JavaScriptでタイピングゲームを作成しました。
よくある例ですが、作ってみるといい勉強になりますよ。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>タイピングゲーム</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="stylesheet" media="screen" href="style.css">
</head>
<body>
<p class="result">[Enter] ゲームスタート</p>
<p class="word"></p>
<p class="img_center">
<img class="img" src="">
</p>
<script src="index.js"></script>
</body>
body {
font-size: 42px;
background-color: cornsilk;
}
.result{
text-align: center;
}
span{
font-size: 24px;
}
p.img_center {
text-align: center;
}
const questions = [
"akainu",
"aokiji",
"arlong",
"buggy",
"chopper",
"crocodile",
"doflamingo",
"moria",
"franky",
"jinbe",
"kizaru",
"lucci",
"luffy",
"nami",
"robin",
"sanji",
"usopp",
"zoro",
];
let images = []; //ワンピースの画像一覧
for (let i = 0; i < questions.length; i++) {
images.push(`img/${questions[i]}.png`)
}
const result = document.querySelector(".result");
const word = document.querySelector(".word");
const img = document.querySelector(".img");
const questionsNum = questions.length; // 問題の総数
let num = 0; //出題された文字のindex番号
let question; //出題される文字
// 問題をランダムで出題させる関数
function setQuestion() {
let random = Math.floor(Math.random() * questions.length);
question = questions.splice(random, 1)[0];
let image = images.splice(random, 1)[0];
word.textContent = question;
img.src = image; //a k a i n u
num = 0; //問題の文字のindex番号 0 1 2 3 4 5
}
// キーが押された時の処理
document.addEventListener("keydown", keyDown);
function keyDown(e) {
if (e.key === "Enter") { //e.keyで押されたkeyの種類
if (result.textContent == "[Enter] ゲームスタート") {
result.textContent = `${questionsNum}/${questionsNum}`;
setQuestion();
move.play();
return;
}
}
// タイプ文字が違う時
if (e.key !== question[num]) {
return;
}
// タイプ文字が合っていた時の処理
num++; //その問題の次の文字
word.textContent = question.substring(num);
// 問題の単語をクリアした時
if (num === question.length) {
result.textContent = `${questions.length}/${questionsNum}`;
move.currentTime = move.currentTime - 2000;
if (questions.length === 0) {
result.innerHTML = "ゲームクリア!! <span>[Enter]もう一回やりますか?</span>";
move.pause();
img.src = "";
gameEnd();
return
}
setQuestion();
}
}
// ゲーム終了時の処理
function gameEnd() {
document.removeEventListener("keydown", keyDown);
document.addEventListener("keydown", (e) => {
if (e.key === "Enter") {
location.reload();
}
});
}
// 文字を動かすアニメーション
const move = word.animate( //右端(0%)から左端(100%)へ
[{ transform: "translateX(100%)" }, { transform: "translateX(0%)" }],//keyframes
{ duration: 7000, fill: "forwards" }
//7秒 最後のキーフレーム(100%)のスタイルが適用
);
move.pause();
/* animate(keyframes, options)
第一引数に2つのキーフレームを指定すると、
自動的にそれぞれの値がアニメーションの進捗が 0% と 100% に割り当てられる
pause()メゾッド・・・一時停止させる
play()メゾッド・・・一時停止しているアニメーションを再生する
currentTimeプロパティ・・・アニメーションの現在の時間値をミリ秒単位で返す
onfinishイベントハンドラプロパティ・・アニメーションの再生が終了したときに実行される
*/
// ゲームオーバー処理
move.onfinish = () => {
result.innerHTML = `${questions.length + 1
}/${questionsNum} <span>[Enter]再挑戦!!</span>`;
gameEnd();
};
この記事が気に入ったらサポートをしてみませんか?