首页 > 编程语言 >再读《悟透javascript》之五、五子棋

再读《悟透javascript》之五、五子棋

时间:2022-12-08 11:01:49浏览次数:40  
标签:function style javascript 五子棋 flag newDiv 之五 var new


前言

      五子棋是个很有趣的游戏,在用javascript开发之后,我发现其实ai算法才是最难的,这里的ai算法是直接借鉴自其它的ai算法。

 

 

代码如下:

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>五子棋</title>
<script type="text/javascript">
var
//-----------------构造函数-----------------------------------------
create:function(x, y){
var newDiv = document.createElement("div");
document.body.appendChild(newDiv);

newDiv.style.position = "absolute";
newDiv.style.width = "23px";
newDiv.style.height = "23px";
newDiv.style.top = 100 + 23*y + "px";
newDiv.style.left = document.body.clientWidth/2-23*9+23*x+"px";

newDiv.x = x;
newDiv.y = y;

newDiv.fill = this.fill;
newDiv.manPlay = this.manPlay;
newDiv.pcPlay = this.pcPlay;
newDiv.setVal = this.setVal;
newDiv.isWin = this.isWin;
newDiv.wink = this.wink;

var
var
if(x==0&&y==0)
n=0;
else if(x==borderline && y==0)
n=2;
else if(x==0 && y==borderline)
n=6;
else if(x==borderline && y==borderline)
n=8;
else if(x>0 && x<borderline && y==0)
n=1;
else if(x>0 && x<borderline && y==borderline)
n=7;
else if(x==0 && y>0 && y<borderline)
n=3;
else if(x==borderline && y>0 && y<borderline)
n=5;
else
n=4;

(function(){
var
var
var

setTimeout(function(){
_newDiv.style.backgroundImage = "url(images/b"+_n+".gif)";
_newDiv._backImage = _newDiv.style.backgroundImage;
}, _y*69);
})();

return
},


//-----------------处理函数-----------------------------------------
fill:function(flag){
this.style.backgroundImage = flag == undefined ? this._backImage : "url(images/d"+flag+".gif)"; //白:0,黑:1
this.flag = flag;
this.setVal(flag);

return this.isWin();
},

setVal:function(flag){
for(var
if(flag==0){
if(pcTab[this.x][this.y][i] && win[0][i]!=9){
win[0][i]++;
}
if(manTab[this.x][this.y][i]){
manTab[this.x][this.y][i] = false;
win[1][i] = 9;
}
}
if(flag==1){
if(manTab[this.x][this.y][i] && win[1][i]!=9){
win[1][i]++;
}
if(pcTab[this.x][this.y][i]){
pcTab[this.x][this.y][i] = false;
win[0][i] = 9;
}
}
}
},

manPlay:function(){
if(this.flag == undefined){
var isWin = this.fill(1);
if(isWin) return;
this.pcPlay(0);
}
},

pcPlay:function(){
if(this.flag == undefined && arguments.length==0){
this.fill(0);
return;
}

var
//计算玩家、电脑在每个格子上的分数
for(var
for(var
manScore[x][y] = 0;
pcScore[x][y] = 0;
if(board[x][y].flag == undefined){
for(var
//计算玩家在每个格子上的分数
if(manTab[x][y][z]){
switch(win[1][z]){
case 1 : manScore[x][y] += 5; break;
case 2 : manScore[x][y] += 50; break;
case 3 : manScore[x][y] += 100; break;
case 4 : manScore[x][y] += 500; break;
}
}

//计算电脑在每个格子上的分数
if(pcTab[x][y][z]){
switch(win[0][z]){
case 1 : pcScore[x][y] += 5; break;
case 2 : pcScore[x][y] += 50; break;
case 3 : pcScore[x][y] += 100; break;
case 4 : pcScore[x][y] += 500; break;
}
}
}
}
}
}

//比较哪个空格子上的分数最高
var
var pcMax = { x:-1, y:-1, val:-1 }

for(var
for(var
if(board[x][y].flag == undefined){
if(manScore[x][y] >= menMax.val){
menMax.val = manScore[x][y];
menMax.x = x;
menMax.y = y;
}
if(pcScore[x][y] >= pcMax.val){
pcMax.val = pcScore[x][y];
pcMax.x = x;
pcMax.y = y;
}
}
}
}

//进攻or防守
var
var

if(menMax.val>=pcMax.val && menMax.val>=100){ //防守
nextX = menMax.x;
nextY = menMax.y;
}
else if(pcMax.val==0){
nextX = menMax.x;
nextY = menMax.y;
}
else{
nextX = pcMax.x;
nextY = pcMax.y;
}

chess.fill.call(board[nextX][nextY], 0);
},

isWin:function(){
for(var
if(win[0][i] == chess.getWinLength()){
this.wink(i, 0);
alert("电脑赢了");
return true;
}
if(win[1][i] == chess.getWinLength()){
this.wink(i, 1);
alert("恭喜,您赢了");
return true;
}
}

return false;
},

wink:function(winIndex, flag){
var
for(var
for(var
if(flag == 0){
if(pcTab[x][y][winIndex]){
board[x][y].style.zIndex = 100;
board[x][y].style.border = "solid 3px red";
}
}

if(flag == 1){
if(manTab[x][y][winIndex]){
board[x][y].style.zIndex = 100;
board[x][y].style.border = "solid 3px red";
}
}

board[x][y].onclick = function(){
if(confirm("是否重新开始")){
window.location = window.location;
}
}
}
}
},

//-----------------常量-----------------------------------------
getChessWidth:function(){
return
},
getWinLength:function(){
return document.getElementById("rdo5").checked ? 5 : 6;
}
}

var board = new
var manTab = new Array(chess.getChessWidth()); //用户获胜组合
var pcTab = new
var manScore = new Array(chess.getChessWidth()); //用户获取的分数
var pcScore = new
var win = new Array(2); //
var

function
close();

var
var

//计算可能赢的组合个数
for(var
for(var
if((x+winLength-1)<chessWidth) winCount++;
if((y+winLength-1)<chessWidth) winCount++;
if((x+winLength-1)<chessWidth && (y+winLength-1)<chessWidth) winCount++;
if((x+winLength-1)<chessWidth && (y-winLength+1)>=0) winCount++;
}
}

//画棋盘,初始化数据结构
for(var
board[x] = new
manTab[x] = new
pcTab[x] = new
manScore[x] = new
pcScore[x] = new

for(var
board[x][y] = chess.create(x,y);
manTab[x][y] = new
pcTab[x][y] = new
}

win[0] = new
win[1] = new
}

//初始化
for(var
for(var
win[i][j] = 0;

//计算可赢的可能的组合
winCount = 0;
var
//横向组合
for(var
for(var
for(var
manTab[x+z][y][winCount] = true;
pcTab[x+z][y][winCount] = true;
}
winCount++;
}
}
//纵向组合
for(var
for(var
for(var
manTab[x][y+z][winCount] = true;
pcTab[x][y+z][winCount] = true;
}
winCount++;
}
}
//斜向下组合
for(var
for(var
for(var
manTab[x+z][y+z][winCount] = true;
pcTab[x+z][y+z][winCount] = true;
}
winCount++;
}
}
//斜向上组合
for(var
for(var
for(var
manTab[x+z][y-z][winCount] = true;
pcTab[x+z][y-z][winCount] = true;
}
winCount++;
}
}

//选项
var level = document.getElementById("radio");
level.style.position = "absolute";
level.style.top = "100px";
level.style.left = document.body.clientWidth/2+23*chessWidth/2+"px";

if(document.getElementById("rdoHard").checked){
setTimeout(function(){
open();
chess.pcPlay.call(board[chessWidth/2][chessWidth/2]);
alert("可以开始啦!!!");
}, 2*1000);
}
else{
open();
}

function
for(var
for(var
board[x][y].onclick = chess.manPlay
}
}
}
function
for(var
for(var
board[x][y].onclick = function(){alert("还不能开始,请稍等...");}
}
}
}
}

window.onload = main;
</script>
</head>
<body>
<form id="form1" runat="server">
<div id="radio">
容易:<inputid="rdoEasy" checked="checked" name="onlyOne" onclick="main()" type="radio" /><br />
较难:<inputid="rdoHard" name="onlyOne" onclick="main()" type="radio" /><br /><br />
五子棋:<inputid="rdo5" checked="checked" onclick="main()" name="only" type="radio" /><br />
六子棋: <input id="rdo6" onclick="main()" name="only" type="radio" />
</div>
</form>
</body>
</html>

 

 

图片:

   

再读《悟透javascript》之五、五子棋_算法

   

   


请对照下面的图片命名上面的图片

再读《悟透javascript》之五、五子棋_算法_02

标签:function,style,javascript,五子棋,flag,newDiv,之五,var,new
From: https://blog.51cto.com/u_15906220/5920746

相关文章

  • 《悟透javascript》学习笔记:四、函数的魔力
    引言 JavaScript的代码就只有function一种形式,function就是函数的类型。也许其他编程语言还有procedure或method等代码概念,但在JavaScript里只有function一种形......
  • 再读《悟透javascript》之四、贪吃蛇
    前言     贪吃蛇是个很简单的小游戏,但是却很有趣,下面是我用JavaScript写的一个贪吃蛇的代码:  代码如下:   <htmlxmlns="http://www.w3.org/1999/xhtml"><headr......
  • 《悟透javascript》学习笔记:一、前言
    《悟透JavaScript》学习笔记  这是一本很形象生动的书,使我们可以更深地了解了JavaScript。 引言   编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就......
  • 《悟透javascript》学习笔记:二、回归简单
    引言 要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。JavaScript就......
  • 《悟透javascript》学习笔记:三、似类却不是类
    引言 JavaScript没有“类”的概念!这让很多学习过高级语言的人感到很不爽,其实比之于C语言又如何呢?显然JavaScript要比C语言好用很多。 不废话,上代码 <scriptlanguage="j......
  • 再读《悟透javascript》之三、甘露模型
    前言     甘露模型是用于开发基于javascript的类库的,通过它,我们可以以类似C#等面向对象的语言式的模式来开发javascript类库,这将使你的javascript代码变得清晰有条理......
  • JavaScript:代码细节和良好编码习惯
    这些细节,与语法无关,仅仅是编写代码时需要注意的最最基本的细节和一些良好编码习惯。注释代码注释代码分为单行注释和多行注释,如下所示:严格区分大小写JS的代码时严格区......
  • JavaScript:严格模式"use strict"
    因为历史遗留问题,JS其实存在很多feature,以及兼容性问题;所以JS在ES5之后,新增了一个严格模式,以区别于普通模式,用来激活新的特性,使得某些代码的执行准确无误;如何开启严格模......
  • JavaScript:是一种什么样的编程语言?
    有关JavaScript的发展历程,百度百科上已经说得很清楚了,这里不赘述,只是想谈一下我刚刚接触JS的一些感触。作为后端java开发者,初次学习JS的时候,真的觉得JS非常的不严谨,很混乱......
  • JavaScript:代码应该编写在哪里?
    我们可以将JS的代码,编写在三个地方。但是无论编写在哪里,最后它都会嵌入进网页代码中,被浏览器执行。编写在script标签中我们可以直接在HTML的script标签中,编写大段JS代码......