読み込みエラー

感想

今回【プログラミング】オセロを1時間で作ってみた【実況解説】(https://www.nicovideo.jp/watch/sm8391299)
を使ったリバーシゲームをを動画を見ながら作成しました

1日目

今回、「 【プログラミング】オセロを1時間で作ってみた【実況解説】」という動画を参考に、リバーシゲームを作成しました。
参考動画を見ながら、リバーシゲームのマスや石の描画をHTMLとCSSのみで行う実装に挑戦しました。
簡素なコードで構造を作り、見た目を再現する過程で、HTML要素の入れ子構造やCSSのスタイル指定について理解を深められました。 参考にした動画では、HTML・CSS・JavaScriptだけを使って実装されており、メモ帳などの簡単なツールで作成できる点に魅力を感じました。

					
						<!-- 緑マス -->
						<div id="cell"style="position:relative;width:33px;height:33px;background-color:#000">
						<div id="cell"style="position:relative;top:1px;left:1px;width:31px;height:31px;background-color:#0e0">
						</div>
						</div>
					
				

緑マスをベースに、ペイントツールで作成した「white.png」「black.png」を使って、白石・黒石の表示を実装しました。

					
						<!-- 緑セル -->
						<div id="cell" style="position:relative; width:33px; height:33px; background-color:#000;">
						<div style="position:relative; top:1px; left:1px; width:31px; height:31px; background-color:#0e0;"></div>
						</div>

						<!-- 白い石 -->
						<div id="white" style="position:relative; width:33px; height:33px; background-color:#000;">
						<img src="white.png" style="display:block; position:relative; top:1px; left:1px; width:31px; height:31px;">
						</div>

						<!-- 黒い石 -->
						<div id="black" style="position:relative; width:33px; height:33px; background-color:#000;">
						<img src="black.png" style="display:block; position:relative; top:1px; left:1px; width:31px; height:31px;">
						</div>piece
					
				

CSSの style="position:relative;"style="position:absolute;" に変更し、JavaScriptのループ文を活用して8×8のボードを自動生成しました。
各セルは cloneNode により複製され、ループ変数に応じて lefttop を計算し、正しい位置に配置しています。
これにより、HTMLとCSSだけでは難しい柔軟な盤面の生成や今後のゲームロジックの拡張も容易になります。

					
						<script>
						(function(){
						var piece;
						var showBoard = function(){
							var b =document.getElementById("board");
							while(b.firstChild){
								b.removeChild(b.firstChild);

							}
							for(var y = 1; y <= 8; y++){
							for(var x = 1; x <= 8; x++){
								var c = piece[board[x][y]].cloneNode(true);
								c.style.left = ((x - 1) * 32) + "px";
								c.style.top = ((y - 1) * 32) + "px";
								b.appendChild(c);
							}
							}
						};

						var board = [];
						onload = function(){
							piece = [document.getElementById("cell")];
							for(var i = 0;i < 10; i++){
								board[i]=[];
								for(var j = 0;j < 10; j++){
								board[i][j] = 0;
								}
							}
							showBoard();
						};
						})()
						</script>
					
				

2日目

この日は、リバーシ盤面に「黒石」「白石」を初期配置する処理に加え、ユーザーが空いているマスをクリックして黒石を置けるようにしました。

・盤面の初期表示を実装

以下のコードにより、盤面の中央に黒(1)と白(2)の駒をあらかじめ表示できるようになりました。配列 board に値をセットし、該当位置に駒が描画されます。

					
						piece = [
						document.getElementById("cell"),
						document.getElementById("black"),
						document.getElementById("white")
						];
						board[4][5] = 1;
						board[5][4] = 1;
						board[4][4] = 2;
						board[5][5] = 2;
					
				

さらに、盤面の表示位置を制御するため、以下のような <div> 要素を追加しています。

					
						<div style="position:relative" id="board"></div>
					
				

このように、初期化された盤面において駒が正しい位置に描画され、重ならずに整然と表示されるようになりました。

・クリックで駒を置ける処理を追加

さらに、空いているマス(値が 0 のマス)をクリックすると、そこに黒石(1)を置ける処理を追加しました。

					
						if (board[x][y] == 0) {
						(function () {
							var _x = x, _y = y;
							c.onclick = function () {
							board[_x][_y] = 1;
							showBoard();
							};
						})();
						}
					
				

即時関数を使うことで、ループ内の変数 xy のスコープを固定し、それぞれのマスに正しくクリックイベントが割り当てられます。

3日目