4日目:スコアとステージクリアの処理を追加する

4日目です。前回は全部数値を消してもクリアした際のメッセージがない空しい状態でした。また、スコアもないのでゲームとしてちょっと空しいというか、目標がないというか何ともな感じになってます。そこで、今回はスコアの追加とステージクリアの処理を追加してみます。

まず、スコアの処理から。スコアを入れる変数を用意します。これは、そのまま「var score = 0;」としました。次に、このスコアを表示する部分を用意しないといけません。これはHTMLで「<div>SCORE : <span id="score">0</span></div>」として用意しました。まあ、span要素にスコアの値を表示する、という具合です。これで準備はOKです。

スコアを増やす場合は2つの値の合計が10だった時です。スコアに1点加算するには「score = score + 1;」とします。変数に加算しただけでは画面に表示されないので「document.getElementById("score").innerHTML = score;」としてスコアを画面に表示します。これでスコアの部分はできあがりです。

次にステージクリアの処理を追加します。このゲームでは4×6個の数字を消せばステージクリアになります。オリジナルのTEN -10-の場合は、ちょっと面倒で最後の方では加算した値が10になるように数字が沸いてでてきます。これは複数の数値を足して10になるというルールのためです。現在、HTML5+JavaScriptに移植しているものは2つの数値しか加算せず、必ず全部消すことができるようになっています。ですので、処理としては非常に簡単です。
まず、「var ele = document.querySelectorAll("input");」として得られたinput要素の数を変数に入れておきます。今回はcountという名前の変数を用意しました。このcountにeleの合計数つまり「count = ele.length;」として合計数を入れます。そして、タッチされた(クリックされた)2つの値の合計が10の場合は「count = count - 2;」として2を引きます。2つタッチ(クリック)しているので2を引かないと永久にクリアできないゲームになってしまいます。
全部の数値が消されたかどうかはcountの値が0かどうかで判別します。ちなみに何らかの不具合でcountの値がマイナスになってしまうとステージクリアの処理ができないことになってしまいます。そんな事ありえないと思うかもしれませんが、予想外の出来事まで考慮しておくなら「if (count === 0)」でなく「if (count < 1)」として判別するのが安全です。ただし、これをやってしまうと何らかの不具合が発生した時に、不具合が発生していることが分からず、不具合そのものが発見できなくなることもあります。
ステージをクリアしたらアラートダイアログを表示してクリアした事を示します。こういう時のアラートダイアログはちょっと便利かもしれません。

ということで改良したゲームをプレイ。面白くないけど、スコアは表示されるし一応ステージクリアはできるようになりました。この段階でイマイチということは多分、改良してもイマイチな可能性が高いかもしれません・・・。面白くないのは、いつも同じ数字が表示されているから、というのもあります。また、スコアはクリアすれば12点と決まってしまっているせいもあります。これは、同じ事を繰り返し、成果がでないか、分かりにくいものは飽きられる、つまり常習性が低い → ゲーム性に乏しいということになります。

見た目もよろしくないし、このままでは最低の移植になってしまいそうなので、次回はどうにか改良したいところです。

[サンプルを実行する]

[サンプルをダウンロード]

HTMLファイルの内容

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TEN</title>
</head>
<body>
<h1>TEN</h1>
<div>SCORE : <span id="score">0</span></div>
<form>
<!-- 1段目 -->
<input type="button" value="6">
<input type="button" value="7">
<input type="button" value="1">
<input type="button" value="6">
<br>
<!-- 2段目 -->
<input type="button" value="9">
<input type="button" value="3">
<input type="button" value="8">
<input type="button" value="2">
<br>
<!-- 3段目 -->
<input type="button" value="5">
<input type="button" value="7">
<input type="button" value="2">
<input type="button" value="6">
<br>
<!-- 4段目 -->
<input type="button" value="4">
<input type="button" value="4">
<input type="button" value="6">
<input type="button" value="8">
<br>
<!-- 5段目 -->
<input type="button" value="3">
<input type="button" value="4">
<input type="button" value="7">
<input type="button" value="2">
<br>
<!-- 6段目 -->
<input type="button" value="4">
<input type="button" value="5">
<input type="button" value="3">
<input type="button" value="8">
</form>
<div id="msg"></div>
<script src="main.js"></script>
</body>
</html>

JavaScriptファイル (main.js) の内容

// TEN HTML5 version
// (c) 2014 Cybermuse
// Arranger 古籏一浩
var score = 0;			// スコア(得点)を入れる変数
var count = 0;		// ボタンの合計を入れる変数
var prevNumber = 0;	// 直前にクリックした数字を入れる変数
var prevEle = null;		// 直前にクリックした要素を入れる変数
// 初期化処理
function init(){
	var ele = document.querySelectorAll("input");	// クリックしたら処理するようにイベントを設定
	for(var i=0; i<ele.length; i++){	// 要素の数だけ繰り返す
		ele[i].onclick = addNumber;	// クリック時に呼び出す関数を指定する
	}
	count = ele.length;	// input要素の総数を入れる
}
// 2つの数字の合計が10かどうか調べる
function addNumber(){
	// 1個目のクリックの場合
	if (prevNumber === 0){
		prevEle = this;	// 要素の情報を変数に入れる
		prevEle.style.backgroundColor = "red";	// 背景を赤色にする
		prevNumber = parseInt(this.value);	// クリックされた要素の番号を変数に入れる
		return;	// 関数から抜ける
	}
	// 2個目のクリックの場合
	var total = prevNumber + parseInt(this.value);	// 直前の数値とクリックされた要素の数値を加算する
	if (total === 10){	// 合計が10の場合の処理
		this.style.visibility = "hidden";	// 現在の要素を非表示にする
		prevEle.style.visibility = "hidden";	// 前の要素を非表示にする
		prevNumber = 0;	// 数値を0にする
		document.getElementById("msg").innerHTML = "OK!";	// メッセージを表示する
		score = score + 1;	// スコア(得点)を追加する
		document.getElementById("score").innerHTML = score;	// スコア(得点)を表示する
		count = count - 2;	// 合計から2を引く
		if (count === 0){	// 全部消したかどうか調べる
			alert("ステージクリア!");
		}
		return;	// 関数から抜ける
	}
	// 合計が10でなかった場合
	prevNumber = 0;	// 数値を0にする
	prevEle.style.backgroundColor = "";	// 透明にする
	document.getElementById("msg").innerHTML = "合計が10じゃないよ!";	// メッセージを表示する
}
init();	// 初期化処理を呼び出す