commit
c36b91b8f4
5 changed files with 395 additions and 0 deletions
-
1.gitignore
-
24LICENSE
-
8Makefile
-
5README.md
-
357shogi.js
@ -0,0 +1 @@ |
|||
*.compiled.js |
@ -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. |
@ -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 |
@ -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. |
@ -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 |
|||
]; |
|||
} |
|||
}; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue