Javascriptでオセロをつくる 第1回
オセロ盤と石をつくる
まずオセロ盤と石をHTMLとCSSでつくります。オセロ盤はtableで、石は角を丸めたdivでつくってみます。
othello1.htmlのソース
<!DOCTYPE html>
<html>
<head>
<style type='text/css'><!--
table#board {
background-color: black;
}
table#board td {
width: 30px;
height: 30px;
background-color: green;
padding: 5px;
}
div.black {
background-color: black;
width: 30px;
height: 30px;
border-radius: 50%;
}
div.white {
background-color: white;
width: 30px;
height: 30px;
border-radius: 50%;
}
--></style>
</head>
<body>
<table id='board'>
<tr>
<td><div></div></td>
<td><div></div></td>
</tr>
<tr>
<td><div class='black'></div></td>
<td><div class='white'></div></td>
</tr>
</table>
<div id='status'></div>
</body>
</html>
othello1.htmlの実行結果
下に表示されないときはここをクリック(別ウィンドウが開きます)
8×8に拡張
オセロ盤は8×8で、これを全部書くのは面倒なので、Javascriptでマス目も書くようにします。HTMLの要素を楽に扱うためにjquery.jsを導入します。
othello2.htmlのソース
<!DOCTYPE html>
<html>
<head>
<style type='text/css'><!--
table#board {
background-color: black;
}
table#board td {
width: 30px;
height: 30px;
background-color: green;
padding: 5px;
}
div.black {
background-color: black;
width: 30px;
height: 30px;
border-radius: 50%;
}
div.white {
background-color: white;
width: 30px;
height: 30px;
border-radius: 50%;
}
--></style>
<!-- 追加 ここから -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script type='text/javascript'><!--
jQuery(function (){
for(var r = 0 ; r < 8 ; r ++){
var tr = $("<tr>"); // tr要素をつくる
for(var c = 0 ; c < 8 ; c ++){
tr.append($('<td><div class="none"></div></td>')); // td要素をつくってtr要素に追加する
}
$('table#board').append(tr); // tr要素をtableに追加する
}
});
--></script>
<!-- 追加 ここまで -->
</head>
<body>
<table id='board'>
</table>
<div id='status'></div>
</body>
</html>
othello2.htmlの実行結果
下に表示されないときはここをクリック(別ウィンドウが開きます)
石を置く、ひっくり返す
オセロ盤をクリックすることで、白黒の石をおいたりひっくり返したりできるようにします。
まだ石が置かれていないマスをクリックすると、石が置かれます。置いたあとで、挟んだ石をクリックしてひっくり返します。全てひっくり返したあとで次の手を置きます。
ちゃんと操作方法を理解していれば遊べますが、間違えたときに戻せないので慎重に遊ぶ必要があります。
othello3.htmlのソース
<!DOCTYPE html>
<html>
<head>
<style type='text/css'><!--
table#board {
background-color: black;
}
table#board td {
width: 30px;
height: 30px;
background-color: green;
padding: 5px;
}
div.black {
background-color: black;
width: 30px;
height: 30px;
border-radius: 50%;
}
div.white {
background-color: white;
width: 30px;
height: 30px;
border-radius: 50%;
}
--></style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script type='text/javascript'><!--
var turn = 1; // 石の白黒
jQuery(function (){
for(var r = 0 ; r < 8 ; r ++){
var tr = $("<tr>");
for(var c = 0 ; c < 8 ; c ++){
tr.append($('<td><div class="none"></div></td>')
.click(function (e){ // tdがクリックされたときの動作
var disc = $('div', this); // クラスを変更するdiv要素を取得
if(disc.hasClass('none')){ // 石が置かれていないとき
disc.removeClass('none');
disc.addClass(turn == 1 ? 'black' : 'white');
turn *= -1; // 白黒を逆にする
$('div#status').html((turn == 1 ? '黒' : '白') + 'の番');
// 挟んだ石をひっくり返す
}else{
disc.removeClass(turn == 1 ? 'black' : 'white');
disc.addClass(turn == 1 ? 'white' : 'black');
}
})
);
}
$('table#board').append(tr);
}
// 初期配置
$('table#board').find('tr').eq(3).find('td').eq(3).click(); // trの3番目のtdの3番目をクリック
$('table#board').find('tr').eq(3).find('td').eq(4).click();
$('table#board').find('tr').eq(4).find('td').eq(4).click();
$('table#board').find('tr').eq(4).find('td').eq(3).click();
});
--></script>
</head>
<body>
<table id='board'>
</table>
<div id='status'></div>
</body>
</html>
othello3.htmlの実行結果
下に表示されないときはここをクリック(別ウィンドウが開きます)
自動的に石を返す
次回に続く。