

osr_start.mp3 osr_win.mp3 osr_lose.mp3 |
| リソース | 説明 |
|---|---|
| ban.gif | スマホに合わせて 320*320 ピクセルの盤です |
| koma_b.gif | スマホに合わせて 32*32 ピクセルの黒の駒 |
| koma_w.gif | スマホに合わせて 32*32 ピクセルの白の駒 |
| osr_start.mp3 | ゲームを開始するときの音声 |
| osr_win.mp3 | コンピュータが勝ったときの音声 |
| osr_lose.mp3 | コンピュータが負けたときの音声 |
<body> <img src="ban.gif"> </body> |
document.onmousedown =
function(e)
{ if (!e) e= window.event;
xp= Math.floor((e.clientX-20)/38);
yp= Math.floor((e.clientY-10)/38);
window.alert("XP:" + xp + " YP:" + yp);
}
|
var m_t = new Array(8);
for(y=0; y<8; y++)
m_t[y] = new Array(8);
for(y=0; y<8; y++)
for(x=0; x<8; x++)
m_t[y][x] = 0;
m_t[0][0] = 1;
m_t[1][1] = 2;
m_t[2][2] = 1;
m_t[3][3] = 2;
|
function View(xp,vp)
{ document.write('<img src="ban.gif">');
Koma(xp,vp);
}
|
function Koma(xp,vp)
{ for(y=0; y<8; y++)
{ for(x=0; x<8; x++)
{ if (m_t[y][x]!=0)
{ s = "position:absolute;left:" + (x*38+xp) + "px;top:" + (y*38+vp) + "px;";
if (m_t[y][x]==1)
document.write('<img src="koma_b.gif" style=' + s + '>');
else
document.write('<img src="koma_w.gif" style=' + s + '>');
}
}
}
}
|
<body> <script type="text/javascript"> View(21,12); </script> |
<a href="osr_para.html?tt=1200000000110220">テーブルを渡す</a> |
function Init()
{ var param = new Array();
if (window.location.search.length>4)
{ var query = window.location.search.substring(1);
var parameters = query.split('&');
for(i=0; i<parameters.length; i++)
{ var element = parameters[i].split('=');
var paramName = decodeURIComponent(element[0]);
var paramValue = decodeURIComponent(element[1]);
param[paramName] = paramValue.toString();
}
str = param["tt"];
len = str.length;
for(y=0; y<8; y++)
{ for(x=0; x<8; x++)
{ var idx = y*8+x;
if (idx<len) m_t[y][x] = str.charAt(idx);
}
}
}
|
else
{ m_t[3][3] = 1;
m_t[3][4] = 2;
m_t[4][3] = 2;
m_t[4][4] = 1;
}
View(21,12);
}
|
<body> <script type="text/javascript"> Init(); </script> |
document.onmousedown =
function(e)
{ if (!e) e= window.event;
xp= Math.floor((e.clientX-20)/38);
yp= Math.floor((e.clientY-10)/38);
window.alert("XP:" + xp + " YP:" + yp + " Check:" + Check(1,xp,yp,m_t));
}
|
function Check(c, xp, yp, t)
{ var k, l, i, j;
var w = 3-c;
if (yp>7 || xp>7 || yp<0 || xp<0 || c==0 || t[yp][xp]!=0) return false;
for(k=-1; k<2; k++)
{ for(l=-1; l<2; l++)
{ i= yp+k;
j= xp+l;
if (i<8 && j<8 && i>=0 && j>=0 && t[i][j]==w)
{ for(; i<8 && j<8 && i>=0 && j>=0 && t[i][j]==w; i+=k,j+=l);
if (i<8 && j<8 && i>=0 && j>=0 && t[i][j]==c) return true;
}
}
}
return false; //置くことができない
}
|
function Init()
{ m_t[3][3] = 1;
m_t[3][4] = 2;
m_t[4][3] = 2;
m_t[4][4] = 1;
View(21,12);
}
|
<body>
<script type="text/javascript">
Init();
document.onmousedown =
function(e)
{ var e, x, y;
if (!e) e= window.event;
x= Math.floor((e.clientX-20)/38);
y= Math.floor((e.clientY-10)/38);
if (Reverse(m_teban,y*10+x,m_t))
{ m_teban = 3 - m_teban;
Call(m_teban);
}
else window.alert("☆Error XP:" + x + " YP:" + y);
}
</script>
|
function Reverse(c, pos, t)
{ var xp, yp, k, l, i, j;
var w = 3 - c;
xp= pos%10;
yp= Math.floor(pos/10);
var sw = false;
if (yp>7 || xp>7 || yp<0 || xp<0 || c==0 || t[yp][xp]!=0) return false;
for(k=-1; k<2; k++)
{ for(l=-1; l<2; l++)
{ i= yp+k;
j= xp+l;
if (i<8 && j<8 && i>=0 && j>=0 && t[i][j]==w)
{ for(; i<8 && j<8 && i>=0 && j>=0 && t[i][j]==w; i+=k,j+=l);
if (i<8 && j<8 && i>=0 && j>=0 && t[i][j]==c)
{ for(i-=k,j-=l; i!=yp || j!=xp; i-=k,j-=l) t[i][j]= c;
sw= true;
}
}
}
}
if (sw==false) return false;
t[yp][xp]= c;
return true;
}
|
function Call(c)
{ var para,x,y,str;
para = "?teban=" + c + "&tt=";
{ for(y=0; y<8; y++)
for(x=0; x<8; x++) para = para + m_t[y][x];
}
str = "osr_reverse.html" + para;
location.href = str;
}
|
m_teban = 1;
m_t = new Array(8);
for(y=0; y<8; y++) m_t[y] = new Array(8);
for(y=0; y<8; y++)
{ for(x=0; x<8; x++) m_t[y][x] = 0; }
function Init()
{ var param = new Array();
if (window.location.search.length>4)
{ var query = window.location.search.substring(1);
var parameters = query.split('&');
for(i=0; i<parameters.length; i++)
{ var element = parameters[i].split('=');
var paramName = decodeURIComponent(element[0]);
var paramValue = decodeURIComponent(element[1]);
param[paramName] = paramValue.toString();
}
m_teban = param["teban"];
str = param["tt"];
len = str.length;
for(y=0; y<8; y++)
{ for(x=0; x<8; x++)
{ var idx = y*8+x;
if (idx<len) m_t[y][x] = str.charAt(idx);
}
}
}
else
{ m_teban = 1;
m_t[3][3] = 1;
m_t[3][4] = 2;
m_t[4][3] = 2;
m_t[4][4] = 1;
}
View(21,12);
}
|
function t_Log(t,sz)
{ var str,i,j;
str = "";
for(i=0; i<sz; i++)
{ for(j=0; j<sz; j++)
{ if (t[i][j]==0) str= str + ".";
if (t[i][j]==1) str= str + "X";
if (t[i][j]==2) str= str + "O";
}
str= str + "\n";
}
console.log(str);
}
|
function Search(c, t)
{ var x,y;
var s = new Array();
for(y=0; y<8; y++)
{ for(x=0; x<8; x++)
if (Check(c, x, y, t)) s.push(y*10+x);
}
return s;
}
|
function Count(c, t)
{ var x,y,cnt;
cnt = 0;
for(y=0; y<8; y++)
{ for(x=0; x<8; x++)
if (t[y][x]==c) cnt++;
}
return cnt;
}
|
// コンピュータがプレイ
function Think(c)
{ var st = Search(c, m_t);
if (st.length>0)
{ var n = Math.floor(Math.random() * st.length);
return st[n];
}
return 99;
}
|
<body>
<script type="text/javascript">
Init();
document.onmousedown =
function(e)
{ var e, x, y, pos;
if (!e) e= window.event;
if (m_teban==1) // 黒番:コンピュータ
{ pos = Think(m_teban); }
else // 白番:プレイヤー
{ x = Math.floor((e.clientX-20)/38);
y = Math.floor((e.clientY-10)/38);
pos = y*10+x;
}
if (Reverse(m_teban,pos,m_t))
{ m_teban = 3 - m_teban;
Call(m_teban);
}
else
{ var st = Search(m_teban, m_t);
if (st.length>0)
window.alert("Miss Pos:" + pos + " Teban:" + m_teban);
else
{ st = Search(3-m_teban, m_t);
if (st.length>0)
{ window.alert("Pass");
m_teban = 3 - m_teban;
}
else
{ window.alert("★Game Over"); }
}
}
}
</script>
|
<meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="stylesheet" href="javascript.css" type="text/css"> <script src="osero_js.js" type="text/javascript"></script> |
<body> <script type="text/javascript"> document.onmousedown = mousedown; Init(); </script> |
function mousedown(e)
{ var e, x, y, pos;
if (!e) e= window.event;
if (m_teban==2)
{ pos = Think(2); }
else // 黒番:プレイヤー
{ x = Math.floor((e.clientX-20)/38);
y = Math.floor((e.clientY-10)/38);
pos = y*10+x;
}
if (Reverse(m_teban,pos,m_t))
{ m_teban = 3 - m_teban;
Call(m_teban);
}
else
{ Play_Check(m_teban,pos,m_t); }
}
</script>
</head>
|
function Play_Check(c, pos, t)
{ var st = Search(c, t);
if (st.length>0)
{ t_Log(t,8);
window.alert("Miss Play Pos:" + pos + " Teban:" + c);
}
else
{ st = Search(3-c, t);
if (st.length>0)
{ window.alert("☆Pass Teban:" + c);
m_teban = 3 - m_teban;
}
else
{ var bc = Count(1, t);
var wc = Count(2, t);
window.alert("★Game Over" + " Black:" + bc + " White:" + wc);
}
}
}
|
var vt =
[[ 150, -20, 10, 8, 8, 10, -20, 150],
[ -20, -64, -2, -1, -1, -2, -64, -20],
[ 10, -2, 0, 0, 0, 0, -2, 10],
[ 8, -1, 0, 0, 0, 0, -1, 8],
[ 8, -1, 0, 0, 0, 0, -1, 8],
[ 10, -2, 0, 0, 0, 0, -2, 10],
[ -20, -64, -2, -1, -1, -2, -64, -20],
[ 150, -20, 10, 8, 8, 10, -20, 150]];
function vt_Val(pos)
{ var x,y;
x= pos%10;
y= Math.floor(pos/10);
return vt[y][x];
}
function Think(c)
{ var mx, val, i;
var st = Search(c, m_t);
if (st.length==0) return 99;
mx = st[0];
val = vt_Val(mx);
for(i=0; i<st.length; i++)
{ if (vt_Val(st[i])>val)
{ mx = st[i];
val = vt_Val(mx);
}
}
return mx;
}
|
<head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="stylesheet" href="javascript.css" type="text/css"> <script src="osero.js" type="text/javascript"></script> |
function Call(c)
{ var para,x,y,str;
para = "?teban=" + c + "&tt=";
{ for(y=0; y<8; y++)
for(x=0; x<8; x++) para = para + m_t[y][x];
}
str = "osr_play.html" + para;
location.href = str;
}
|
function Think(c)
{ var mxp, val, wv, i;
var st = Search(c, m_t);
if (st.length==0) return 99;
mxp = st[0];
val = -30000;
for(i=0; i<st.length; i++)
{ wv= Value(c, st[i]);
if (wv>val)
{ mxp= st[i];
val= wv;
}
}
return mxp;
}
|
var wt = new Array(8);
function Value(c,pos)
{ var v,i;
for(i=0; i<8; i++)
wt[i] = m_t[i].slice();
if (Reverse(c, pos, wt)==false)
{ window.alert("Error teban:" + c + " pos:" + pos);
return -30000;
}
v= Eval(wt,c);
return v;
}
|
var vt =
[[ 20, -6, 4, 2, 2, 4, -6, 20],
[ -6, -10, -2, -1, -1, -2, -10, -6],
[ 4, -2, 0, 0, 0, 0, -2, 4],
[ 2, -1, 0, 0, 0, 0, -1, 2],
[ 2, -1, 0, 0, 0, 0, -1, 2],
[ 4, -2, 0, 0, 0, 0, -2, 4],
[ -6, -10, -2, -1, -1, -2, -10, -6],
[ 20, -6, 4, 2, 2, 4, -6, 20]];
var wt = new Array(8);
var t00 = //0-0 座標テーブル(Y,X)
[[ 0,0], [ 0,7], [ 7,7], [ 7,0]];
var dt5 = //左上,右上,右下,左下
[[ 1,1], [ 1,-1], [ -1,-1], [ -1,1]];
function Eval(wt,my)
{ var val,you,i,j,xp,yp,wk;
you = 3-my;
val = 0;
for(i=0; i<4; i++)
{ yp= t00[i][0];
xp= t00[i][1];
// コーナーから展開する駒を評価
if (wt[yp][xp]!=0)
{ wk= Corner(0, wt);
if (my==2) val+= wk*30;
else val-= wk*30;
}
// コーナーに打てる
else
{ if (Check(you, xp, yp, wt)) val-= 40; }
}
// 盤上の駒を vt[][] で評価
for(i=0; i<8; i++)
for(j=0; j<8; j++)
{ if (wt[i][j]==my) val+= vt[i][j];
if (wt[i][j]==you) val+= vt[i][j];
}
return val;
}
|
function Corner(no, t)
{ var xp,yp,x,y,moma,cnt,val;
yp= t00[no][0];
xp= t00[no][1];
if (t[yp][xp]==0) return 0;
koma= t[yp][xp];
//コーナ(no)のt[][]をt55にコピー
var t55= new Array(5);
for(y=0; y<5; y++) t55[y]= new Array(5);
for(y=0, yp= t00[no][0]; y<5; y++, yp+= dt5[no][0])
{ for(x=0, xp= t00[no][1]; x<5; x++, xp+= dt5[no][1])
{ t55[y][x]= t[yp][xp]; }
}
//t_Log(t55, 5);
//コーナの確定した石数を求める
cnt= 0;
xp= 4;
for(y=0; y<4 && t55[y][0]==koma; y++)
{ for(x=0; x<xp; x++)
{ if ((t55[y][x]!=koma) ||
(y>0 && x>0 && t55[y-1][x+1]!=koma && t55[y+1][x-1]!=koma))
{ xp= x; break; }
cnt++;
}
}
return cnt;
}
|
var t00 = //0-0 座標テーブル(Y,X)
[[ 0,0], [ 0,7], [ 7,7], [ 7,0]];
var dt = //上辺→,右辺↓,下辺←,左辺↑
[[ 0,1], [ 1,0], [ 0,-1], [ -1,0]];
var dt5 = //左上,右上,右下,左下
[[ 1,1], [ 1,-1], [ -1,-1], [ -1,1]];
// t[8][8] から辺を一列取り出す
function Getstr(no,t)
{ var xp,yp,k;
var s= "";
yp= t00[no][0];
xp= t00[no][1];
for(k=0; k<8; k++)
{ s+= t[yp][xp];
yp+= dt[no][0];
xp+= dt[no][1];
}
console.log(s);
return s;
}
|
function EvLine(s)
{ var i,bc,wc,sc;
if (s.charAt(0)!="0" || s.charAt(7)!="0" ) return 0;
// 黒石, 白石, 列の数をカウント
bc=wc=sc= 0;
for(i=0; i<8; i++)
{ if (s.charAt(i)=="1") bc++;
if (s.charAt(i)=="2") wc++;
if (i==0) sc++;
else
if (s.charAt(i-1)!=s.charAt(i)) sc++;
}
//console.log(s + " B:" + bc + " W:" + wc + " S:" + sc);
// 両端は[△・・・△]
switch(sc)
{ case 3: return (wc-bc)*10; //[△○△][△●△]
case 4: return (wc+bc)*-10; //[△○●△]
}
return 0;
}
|
function Eval(my,wt)
{ var val,you,i,j,xp,yp,wk,str;
you = 3-my;
val = 0;
for(i=0; i<4; i++)
{ yp= t00[i][0];
xp= t00[i][1];
if (wt[yp][xp]!=0)
{ wk= Corner(0, wt);
if (my==2) val+= wk*30;
else val-= wk*30;
}
else
{ if (Check(you, xp, yp, wt)) val-= 40;
str= Getstr(i, wt);
val+= EvLine(str);
}
}
for(i=0; i<8; i++)
for(j=0; j<8; j++)
{ if (wt[i][j]==my) val+= vt[i][j];
if (wt[i][j]==you) val+= vt[i][j];
}
return val;
}
|
function EvLine(s)
{ var bc,wc,sc,ws,rt,ans,val,i;
// 黒石, 白石, 列の数をカウント
bc=wc=sc= 0;
for(i=0; i<8; i++)
{ if (s.charAt(i)=="1") bc++;
if (s.charAt(i)=="2") wc++;
if (i==0) sc++;
else
if (s.charAt(i-1)!=s.charAt(i)) sc++;
}
if (bc+wc==8) return (wc-bc)*20;
if (sc<3) return 0;
// ○,● を詰める
ws= s.replace(/1+/gi, "1");
ws= ws.replace(/2+/gi, "2");
rt= ws.length-1;
// 端に黒(白)が置かれている
if (ws.charAt(0)!="0") return EvEdge(ws,bc,wc,sc);
if (ws.charAt(rt)!="0")
{ ans= ws.split("").reverse().join("");
return EvEdge(ans,bc,wc,sc);
}
// 両隅は空白[△・・・△]
if (sc==3) return (wc-bc)*10;
val= 0;
// 1-2 に駒 [△*・・・△]
if (ws.charAt(1)!="0" || ws.charAt(rt-1)!="0")
{ if (ws.charAt(1)!="0") val+= EvPattern(ws,sc);
if (ws.charAt(rt-1)!="0")
{ ans= ws.split("").reverse().join("");
val+= EvPattern(ans,sc);
}
return val;
}
// 両端は[△△・・・△△]
switch(sc)
{ case 3: return (wc-bc)*10; //[△○△][△●△]
case 4: return (wc+bc)*-10; //[△○●△]
}
return 0;
}
|
function EvEdge(s,bc,wc,sc)
{ if (sc==3)
{ if (s.charAt(0)=="1") return wc*-20; //[●○△△]
if (s.charAt(0)=="2") return bc*20; //[○●△△]
}
return 0;
}
|
function EvPattern(s,sc)
{ // [△○●・・・・] 黒に隅を取られる
if (s.charAt(1)=="2" && s.charAt(2)=="1") return -60;
// [△●○・・・・] 辺が黒になる
if (sc==4) return -20;
// [△○●○・・・] 黒に加点 10
if (s.charAt(1)=="2" && s.charAt(2)=="1" && s.charAt(3)=="2") return -10;
// [△●○●・・・] [△●○ ○・・・]
if (s.charAt(1)=="1" && s.charAt(2)=="2")
{ if (s.charAt(3)=="1" || (s.charAt(3)=="0" && s.charAt(4)=="2")) return 40;
}
// [△○◎○・・・][△○◎・●・・・][△○◎●○・・・]
if (s.charAt(1)!="2" || s.charAt(2)!="0") return 0;
if (s.charAt(3)=="2") return -30;
if (s.charAt(3)=="0" || s.charAt(4)=="1") return -30;
if (s.charAt(3)=="1" || s.charAt(4)=="2") return -30;
return 0;
}
|
| パラメータ | 説明 |
|---|---|
| lev | 再帰のレベル(20 で中断) |
| c | 手番(黒=1, 白=2) |
| t | t[8][8] 現在の局面 |
| return | (64-(黒+空白))*100 + (Y*10+X) |
function Final(lev, c, t)
{ var best,st,wk,i;
if (lev>20)
{ window.alert("Final Call Over Level");
return (64-(Count(0,t)+Count(1,t)))*100;
}
st= Search(c, t);
if (st.length>0)
{ best= 6400;
if (c==2) best= 0;
for(i=0; i<st.length; i++)
{ wk= CallFinal(lev,c,st[i],t);
if (best<wk && c==2) best= Math.floor(wk/100) * 100 + st[i];
if (best>wk && c==1) best= Math.floor(wk/100) * 100 + st[i];
}
return best;
}
st= Search(3-c, t); // パスのとき
if (st.length==0) // ゲームオーバー
{ var vv= (64-(Count(0,t)+Count(1,t)))*100;
return vv;
}
return Final(lev+1,3-c,t);
}
|
| パラメータ | 説明 |
|---|---|
| lev | 再帰のレベル(Final と同じ) |
| c | 手番(黒=1, 白=2) |
| pos | 打つ手 |
| return | (64-(黒+空白))*100 + (Y*10+X) |
function CallFinal(lev, c, pos, t)
{ var t_w= new Array(8);
for(i=0; i<8; i++)
t_w[i] = t[i].slice();
if (Reverse(c,pos,t_w)==false)
{ t_Log(t,8);
window.alert("CallFinal Reverse Error c:" + c + " Pos:" + pos);
}
return Final(lev+1, 3-c, t_w);
}
|
function Think(c)
{ var mxp, val, wv, i;
i= Count(0, m_t);
if (i<12)
{ var best= Final(0,c,m_t);
return best%100;
}
var st = Search(c, m_t);
if (st.length==0) return 99;
mxp = st[0];
val = -30000;
for(i=0; i<st.length; i++)
{ wv= Value(c, st[i]);
if (wv>val)
{ mxp= st[i];
val= wv;
}
}
return mxp;
}
|
![]()
document.write('<audio src="osrstart.mp3" autoplay></audio>');
document.write('<audio src="osrlose.mp3" autoplay></audio>');
document.write('<audio src="osrwin.mp3" autoplay></audio>');
|
var audio = new Audio("osrstart.mp3");
function Init()
{ P = new Array();
if (window.location.search.length<3)
{ // 最初の呼び出し
audio.play();
・・・
|
![]()