そのまんま。
実装検討の一環として試作してみました。
クリックするとその駒の利きが黒く表示されます。 ただし、
…とまあ、ガッタガタの実装です。
やってること自体はクリックイベントと連動してCSSを書き換えるだけの処理なので、定義がめんどくさいこと以外はあんまりハードルではないです。DOM操作もjQueryのおかげで楽ちん。
↓が実物。よかったら動かしてみてください。
歩
香
歩
角
桂
歩
銀
歩
金
歩
玉
歩
金
歩
銀
歩
桂
歩
香
元のソースがこちら。
↓html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Shogi</title> <script src="./jquery.js"></script> </head> <body> <div id="Shogi"> <div class="KomadaiGote"> </div> <div class="Ban"> <div class="Masu" style="position:absolute; top:0px; left:0px"></div> <div class="Masu" style="position:absolute; top:30px; left:0px"></div> <div class="Masu" style="position:absolute; top:60px; left:0px"></div> <div class="Masu" style="position:absolute; top:90px; left:0px"></div> <div class="Masu" style="position:absolute; top:120px; left:0px"></div> <div class="Masu" style="position:absolute; top:150px; left:0px"></div> <div class="Masu" style="position:absolute; top:180px; left:0px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:0px"></div> <div class="Masu" style="position:absolute; top:240px; left:0px"><p class="Koma">香</p></div> <div class="Masu" style="position:absolute; top:0px; left:30px"></div> <div class="Masu" style="position:absolute; top:30px; left:30px"></div> <div class="Masu" style="position:absolute; top:60px; left:30px"></div> <div class="Masu" style="position:absolute; top:90px; left:30px"></div> <div class="Masu" style="position:absolute; top:120px; left:30px"></div> <div class="Masu" style="position:absolute; top:150px; left:30px"></div> <div class="Masu" style="position:absolute; top:180px; left:30px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:30px"><p class="Koma">角</p></div> <div class="Masu" style="position:absolute; top:240px; left:30px"><p class="Koma">桂</p></div> <div class="Masu" style="position:absolute; top:0px; left:60px"></div> <div class="Masu" style="position:absolute; top:30px; left:60px"></div> <div class="Masu" style="position:absolute; top:60px; left:60px"></div> <div class="Masu" style="position:absolute; top:90px; left:60px"></div> <div class="Masu" style="position:absolute; top:120px; left:60px"></div> <div class="Masu" style="position:absolute; top:150px; left:60px"></div> <div class="Masu" style="position:absolute; top:180px; left:60px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:60px"></div> <div class="Masu" style="position:absolute; top:240px; left:60px"><p class="Koma">銀</p></div> <div class="Masu" style="position:absolute; top:0px; left:90px"></div> <div class="Masu" style="position:absolute; top:30px; left:90px"></div> <div class="Masu" style="position:absolute; top:60px; left:90px"></div> <div class="Masu" style="position:absolute; top:90px; left:90px"></div> <div class="Masu" style="position:absolute; top:120px; left:90px"></div> <div class="Masu" style="position:absolute; top:150px; left:90px"></div> <div class="Masu" style="position:absolute; top:180px; left:90px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:90px"></div> <div class="Masu" style="position:absolute; top:240px; left:90px"><p class="Koma">金</p></div> <div class="Masu" style="position:absolute; top:0px; left:120px"></div> <div class="Masu" style="position:absolute; top:30px; left:120px"></div> <div class="Masu" style="position:absolute; top:60px; left:120px"></div> <div class="Masu" style="position:absolute; top:90px; left:120px"></div> <div class="Masu" style="position:absolute; top:120px; left:120px"></div> <div class="Masu" style="position:absolute; top:150px; left:120px"></div> <div class="Masu" style="position:absolute; top:180px; left:120px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:120px"></div> <div class="Masu" style="position:absolute; top:240px; left:120px"><p class="Koma">玉</p></div> <div class="Masu" style="position:absolute; top:0px; left:150px"></div> <div class="Masu" style="position:absolute; top:30px; left:150px"></div> <div class="Masu" style="position:absolute; top:60px; left:150px"></div> <div class="Masu" style="position:absolute; top:90px; left:150px"></div> <div class="Masu" style="position:absolute; top:120px; left:150px"></div> <div class="Masu" style="position:absolute; top:150px; left:150px"></div> <div class="Masu" style="position:absolute; top:180px; left:150px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:150px"></div> <div class="Masu" style="position:absolute; top:240px; left:150px"><p class="Koma">金</p></div> <div class="Masu" style="position:absolute; top:0px; left:180px"></div> <div class="Masu" style="position:absolute; top:30px; left:180px"></div> <div class="Masu" style="position:absolute; top:60px; left:180px"></div> <div class="Masu" style="position:absolute; top:90px; left:180px"></div> <div class="Masu" style="position:absolute; top:120px; left:180px"></div> <div class="Masu" style="position:absolute; top:150px; left:180px"></div> <div class="Masu" style="position:absolute; top:180px; left:180px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:180px"></div> <div class="Masu" style="position:absolute; top:240px; left:180px"><p class="Koma">銀</p></div> <div class="Masu" style="position:absolute; top:0px; left:210px"></div> <div class="Masu" style="position:absolute; top:30px; left:210px"></div> <div class="Masu" style="position:absolute; top:60px; left:210px"></div> <div class="Masu" style="position:absolute; top:90px; left:210px"></div> <div class="Masu" style="position:absolute; top:120px; left:210px"></div> <div class="Masu" style="position:absolute; top:150px; left:210px"></div> <div class="Masu" style="position:absolute; top:180px; left:210px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:210px"></div> <div class="Masu" style="position:absolute; top:240px; left:210px"><p class="Koma">桂</p></div> <div class="Masu" style="position:absolute; top:0px; left:240px"></div> <div class="Masu" style="position:absolute; top:30px; left:240px"></div> <div class="Masu" style="position:absolute; top:60px; left:240px"></div> <div class="Masu" style="position:absolute; top:90px; left:240px"></div> <div class="Masu" style="position:absolute; top:120px; left:240px"></div> <div class="Masu" style="position:absolute; top:150px; left:240px"></div> <div class="Masu" style="position:absolute; top:180px; left:240px"><p class="Koma">歩</p></div> <div class="Masu" style="position:absolute; top:210px; left:240px"></div> <div class="Masu" style="position:absolute; top:240px; left:240px"><p class="Koma">香</p></div> </div> <div class="KomadaiSente"> </div> </div> </body> </html>
↓css
html, body{
height: 100%;
width: 100%;
background: rgba(236,236,236,1.0);
}
div#Shogi{
position: absolute;
top: 0;
left: 0;
width: 390px;
height: 270px;1
overflow: hidden;
display: block;
background: rgba(255,255,255,0);
z-index: 10;
}
.Ban{
position:absolute;
top: 0px;
left: 60px;
width: 270px;
height: 270px;
border-width: 1px;
border-style: solid;
margin: -1px;
z-index: 20;
}
.KomadaiGote{
position: absolute;
background: rgba(0,255,0,0.1);
top:0px;
left: 0px;
width: 60px;
height: 270px;
z-index: 20;
}
.KomadaiSente{
position: absolute;
background: rgba(0,0,255,0.1);
top: 0px;
left: 330px;
width: 60px;
height: 270px;
z-index: 20;
}
.Masu{
position: absolute;
width: 30px;
height: 30px;
border-width: 1px;
border-top-style: solid;
border-left-style: solid;
margin: -1px;
overflow: hidden;
z-index: 30;
}
p.Koma{
position: relative;
margin: 0;
padding: 0;
line-height:30px;
text-align: center;
}
↓JavaScript (with jQuery)
$(function(){
$("p.Koma").click(function(e){
var name = $(this).text();
console.log($(this).parent());
var top = Number($(this).parent().css("top").replace(/px/,''));
var left = Number($(this).parent().css("left").replace(/px/,''));
var rel = [];
switch(name){
case "歩":
rel.push([0,-1]);
break;
case "香":
rel.push([0,-1]);
rel.push([0,-2]);
rel.push([0,-3]);
rel.push([0,-4]);
rel.push([0,-5]);
rel.push([0,-6]);
rel.push([0,-7]);
rel.push([0,-8]);
break;
case "桂":
rel.push([+1,-2]);
rel.push([-1,-2]);
break;
case "銀":
rel.push([0,-1]);
rel.push([-1, -1]);
rel.push([+1, -1]);
rel.push([+1, +1]);
rel.push([-1, +1]);
case "金":
rel.push([0,-1]);
rel.push([-1, -1]);
rel.push([+1, -1]);
rel.push([-1, 0]);
rel.push([+1, 0]);
rel.push([0, +1]);
break;
case "玉":
rel.push([-1, -1]);
rel.push([-1, 0]);
rel.push([-1, +1]);
rel.push([0, -1]);
rel.push([0, +1]);
rel.push([+1, -1]);
rel.push([+1, 0]);
rel.push([+1, +1]);
break;
default: break;
}
for(var i=0; i<rel.length; i++){
var x = rel[i][0]*30;
var y = rel[i][1]*30;
$(".Masu").each(function(){
var t = Number($(this).css("top").replace(/px/,''));
var l = Number($(this).css("left").replace(/px/,''));
if(top+y==t && left+x==l){
$(this).css("background","rgba(0,0,0,0.5)");
}
});
}
});
});
ゲームは状態に関する定義の仕方とかが非常に難しいですね。 良し悪し見境なくやろうと思えば、実装方法なんていくらでもありますし。より良いやり方を!なんて考えてたら一向に収束しませんし。
BonanzaやらGPSやらうさぴょんやらソースを見るのが一番の勉強だとは思いますけど、私がやりたいのはどちらかというとUI寄りの話ですし、何より気力が足りない。実装のしかたも知りたいけど、私としては設計・実装した人が「なぜ」そうしたのか、って考え方の道筋が知りたいなぁ。