メモ帳でできるプログラミング JavaScript

スピードマッチ

デモ

  • 今表示されているマークがひとつ前に表示されていたマークと一致か不一致かを間違えずに選択するゲームです。
  • 制限時間は45秒です。
  • カッコ内の数字のキーでも操作できます。

プログラム

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>スピードマッチ</title>
<style>
#a {font-size:150px;text-align:center;}
#b {text-align:center;}
#c {margin:10px 0;}
#d {text-align:center;}
#e {text-align:center; padding:10px;}
</style>
<script>
window.onload = function() {
	var running = false;
	var tid;
	var prev = '';
	var p1 = 0;
	var p2 = 0;

	function r() {
		return ['●', '▲', '■'][Math.floor(Math.random()*3)];
	}

	function init() {
		document.getElementById('b').style.display = 'none';
		document.getElementById('a').innerHTML = r();
		prev = '';
		tid = 0;
		running = false;
		p1 = 0;
		p2 = 0;
		document.f.b0.disabled = false;
	}

	function n() {
		document.getElementById('a').style.color = '#fff';
		setTimeout(function(){document.getElementById('a').style.color = '#000';}, 150);
		prev = document.getElementById('a').innerHTML;
		document.getElementById('a').innerHTML = r();
	}

	function start() {
		n();
		document.f.b0.disabled = true;
		tid = setTimeout(timeout, 45000);
		running = true;
	}

	function timeout() {
		tid = 0;
		running = false;
		result();
	}

	function answer(a) {
		if (running) {
			++p2;
			if ((a == 1 && prev == document.getElementById('a').innerHTML) || (a == 2 && prev != document.getElementById('a').innerHTML)) {
				++p1;
				document.getElementById('e').innerHTML = '<span style="color:#090;">○</span>';
			} else {
				document.getElementById('e').innerHTML = '<span style="color:#c00;">×</span>';
			}
			n();
		}
	}

	function result() {
		document.getElementById('c').innerHTML = '総回答数: ' + p2 + '、正解数:' + p1 + '、判断の速さ:' + (Math.floor(p2 / 45 * 1000) / 1000) + '回/秒、判断の正確さ:' + Math.floor(p1 / p2 * 100) + '%';
		document.getElementById('b').style.display = 'block';
	}

	function k(e) {
		switch (String.fromCharCode(e.keyCode)) {
			case '0':
				start();
				break;
			case '1':
				answer(1);
				break;
			case '2':
				answer(2);
				break;
			case '3':
				if (!running) {
					init();
				}
				break;
		}
	}

	init();
	document.f.b0.addEventListener('click', start);
	document.f.b1.addEventListener('click', function () {
		answer(1);
	});
	document.f.b2.addEventListener('click', function () {
		answer(2);
	});
	document.f.b3.addEventListener('click', init);
	document.addEventListener('keyup', k);
}
</script>
</head>
<body>
	<form name="f">
		<div id="a">★</div>
		<div id="d">
			<button type="button" name="b1">一致 (1)</button>
			<button type="button" name="b0">スタート (0)</button>
			<button type="button" name="b2">不一致 (2)</button>
		</div>
		<div id="e"></div>
		<div id="b">
			<div id="c"></div>
			<button type="button" name="b3">もう一度 (3)</button>
		</div>
	</form>

	<ul>
		<li>今表示されているマークがひとつ前に表示されていたマークと一致か不一致かを間違えずに選択するゲームです。</li>
		<li>制限時間は45秒です。</li>
		<li>カッコ内の数字のキーでも操作できます。</li>
	</ul>
</body>
</html>

解説

(追記予定)