Initial commit of shogi javascript library
This commit is contained in:
commit
c36b91b8f4
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.compiled.js
|
24
LICENSE
Normal file
24
LICENSE
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
Copyright (c) 2012, Christopher Ramey
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
8
Makefile
Normal file
8
Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
CLOSURE_PATH=~/closure/compiler.jar
|
||||||
|
VERSION=1.0
|
||||||
|
|
||||||
|
shogi-${VERSION}.compiled.js: shogi.js
|
||||||
|
java -jar ${CLOSURE_PATH} --js $^ --js_output_file $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm shogi-*.compiled.js
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
shogi.js
|
||||||
|
========
|
||||||
|
|
||||||
|
shogi.js is a javascript library for managing shogi games. It's intended
|
||||||
|
as the display end of a web-based pickup shogi game system.
|
357
shogi.js
Normal file
357
shogi.js
Normal file
@ -0,0 +1,357 @@
|
|||||||
|
/**
|
||||||
|
@license Copyright (c) 2012, Christopher Ramey | http://github.com/cramey/shogi/LICENSE"
|
||||||
|
*/
|
||||||
|
var Shogi = {
|
||||||
|
KING : 0,
|
||||||
|
ROOK : 1,
|
||||||
|
BISHOP : 2,
|
||||||
|
GOLD_GENERAL : 3,
|
||||||
|
SILVER_GENERAL : 4,
|
||||||
|
KNIGHT : 5,
|
||||||
|
LANCE : 6,
|
||||||
|
PAWN : 7,
|
||||||
|
PROMOTED_ROOK : 9,
|
||||||
|
PROMOTED_BISHOP : 10,
|
||||||
|
PROMOTED_SILVER : 12,
|
||||||
|
PROMOTED_KNIGHT : 13,
|
||||||
|
PROMOTED_LANCE : 14,
|
||||||
|
PROMOTED_PAWN : 15,
|
||||||
|
|
||||||
|
desc_king : [
|
||||||
|
'reigning', 'challenging'
|
||||||
|
],
|
||||||
|
|
||||||
|
desc_peice : [
|
||||||
|
'King', 'Rook', 'Bishop', 'Gold General',
|
||||||
|
'Silver General', 'Knight', 'Lance', 'Pawn'
|
||||||
|
],
|
||||||
|
|
||||||
|
peicePromoted : function(n)
|
||||||
|
{
|
||||||
|
return (n & 8) != 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
peiceCanPromote : function(b, l){
|
||||||
|
var peice = b[l];
|
||||||
|
if(peice == -1){ return false; }
|
||||||
|
|
||||||
|
var pe = peice & 15;
|
||||||
|
if(pe < 1 || pe > 7){ return false; }
|
||||||
|
|
||||||
|
var player = this.peicePlayer(peice);
|
||||||
|
if(player == 0 && l > 26){ return false; }
|
||||||
|
|
||||||
|
if(player == 1 && l < 54){ return false; }
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
peicePlayer : function(n)
|
||||||
|
{
|
||||||
|
return (n & 16) >> 4;
|
||||||
|
},
|
||||||
|
|
||||||
|
peiceName : function(n)
|
||||||
|
{
|
||||||
|
return this.desc_peice[n & 7];
|
||||||
|
},
|
||||||
|
|
||||||
|
peiceMoves : function(b, l)
|
||||||
|
{
|
||||||
|
var peice = b[l];
|
||||||
|
var player = this.peicePlayer(peice);
|
||||||
|
|
||||||
|
var moves = [];
|
||||||
|
|
||||||
|
switch(peice & 15){
|
||||||
|
case this.KING:
|
||||||
|
var i = l + 9;
|
||||||
|
if(i <= 80 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 9;
|
||||||
|
if(i >= 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 1;
|
||||||
|
if(i <= 80 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 1;
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 8;
|
||||||
|
if(i <= 80 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 10;
|
||||||
|
if(i <= 80 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 10;
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 8;
|
||||||
|
if(i >= 0 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case this.GOLD_GENERAL:
|
||||||
|
case this.PROMOTED_SILVER:
|
||||||
|
case this.PROMOTED_PAWN:
|
||||||
|
case this.PROMOTED_LANCE:
|
||||||
|
case this.PROMOTED_KNIGHT:
|
||||||
|
var i = l + 9;
|
||||||
|
if(i <= 80 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 9;
|
||||||
|
if(i >= 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 1;
|
||||||
|
if(i <= 80 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 1;
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(player){
|
||||||
|
i = l + 8;
|
||||||
|
if(i <= 80 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 10;
|
||||||
|
if(i <= 80 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
i = l - 10;
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 8;
|
||||||
|
if(i >= 0 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case this.KNIGHT:
|
||||||
|
var i = l + (player ? 19 : -19);
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + (player ? 17 : -17);
|
||||||
|
if(i >= 0 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case this.LANCE:
|
||||||
|
if(player){
|
||||||
|
for(var i = l + 9; i <= 80; i += 9){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(var i = l - 9; i >= 0; i -= 9){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case this.PROMOTED_ROOK:
|
||||||
|
var i = l - 10;
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 8;
|
||||||
|
if(i >= 0 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 8;
|
||||||
|
if(i <= 80 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 10;
|
||||||
|
if(i <= 80 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
case this.ROOK:
|
||||||
|
for(var i = l - 9; i >= 0; i -= 9){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i = l - 1; i % 9 != 8; i--){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i = l + 1; i % 9 != 0; i++){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i = l + 9; i <= 80; i += 9){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case this.PROMOTED_BISHOP:
|
||||||
|
var i = l + 9;
|
||||||
|
if(i <= 80 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 9;
|
||||||
|
if(i >= 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 1;
|
||||||
|
if(i <= 80 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 1;
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
case this.BISHOP:
|
||||||
|
for(var i = l - 8; i >= 0 && i % 9 != 0; i -= 8){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i = l - 10; i >= 0 && i % 9 != 8; i -= 10){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i = l + 8; i <= 80 && i % 9 != 8; i += 8){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i = l + 10; i <= 80 && i % 9 != 0; i += 10){
|
||||||
|
if(b[i] == -1){ moves.push(i); }
|
||||||
|
else if(this.peicePlayer(b[i]) != player){
|
||||||
|
moves.push(i); break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case this.PAWN:
|
||||||
|
var i = l + (player ? 9 : -9);
|
||||||
|
if(i >= 0 && i <= 80 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case this.SILVER_GENERAL:
|
||||||
|
i = l + (player ? 9 : -9);
|
||||||
|
if(i >= 0 && i <= 80 && (b[i] == -1 || this.peicePlayer(b[i]))){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
var i = l - 10;
|
||||||
|
if(i >= 0 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l - 8;
|
||||||
|
if(i >= 0 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 8;
|
||||||
|
if(i <= 80 && i % 9 != 8 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = l + 10;
|
||||||
|
if(i <= 80 && i % 9 != 0 && (b[i] == -1 || this.peicePlayer(b[i]) != player)){
|
||||||
|
moves.push(i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return moves;
|
||||||
|
},
|
||||||
|
|
||||||
|
peiceDescription : function(n)
|
||||||
|
{
|
||||||
|
var pl = (n & 16) >> 4;
|
||||||
|
var pe = n & 7;
|
||||||
|
|
||||||
|
return (this.peicePromoted(n) ? 'Promoted ' : '') +
|
||||||
|
this.peiceName(n) +
|
||||||
|
(pe == this.KING ? ' (' + this.desc_king[pl] + ')' : '');
|
||||||
|
},
|
||||||
|
|
||||||
|
boardStandard: function()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
22,21,20,19,16,19,20,21,22,
|
||||||
|
-1,18,-1,-1,-1,-1,-1,17,-1,
|
||||||
|
23,23,23,23,23,23,23,23,23,
|
||||||
|
-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
||||||
|
-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
||||||
|
-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
||||||
|
7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||||
|
-1, 1,-1,-1,-1,-1,-1, 2,-1,
|
||||||
|
6, 5, 4, 3, 0, 3, 4, 5, 6
|
||||||
|
];
|
||||||
|
}
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user