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(); ・・・ |