为了账号安全,请及时绑定邮箱和手机立即绑定

老师,为何【赢法统计数组初始化】写到【赢法种类索引】前面(24--27行)会出现白棋只在(0,0)处下一步,后续不再下棋的状况?鞠躬感谢!!

       

        按照教程中老师的写法:将【赢法统计数组初始化】写在【赢法种类索引】后面(67-71行),本代码可以正常运行。但我发现将【赢法统计数组初始化】写在【赢法种类索引】前面时(24-27行),白棋只会在(0,0)处下第一步,后续无动作,且不会弹框。如下图一所示:

       赢法统计数组myWin[i],computerWin[i]明明只会在【赢法种类索引】后续(139行以后)才会用到,为何在【赢法种类索引】前初始化会对程序造成影响??

http://img1.sycdn.imooc.com//570d017c00016b3b04670475.jpg

                     图一:【赢法统计数组初始化】写在24-27行,错误结果


对应错误代码如下:

var me=true;//下棋方为我方黑棋
var chessboard=[];//棋盘状态
var over=false;//棋局未结束

var wins=[];//赢法数组

var myWin=[];//我方赢法统计数组
var computerWin=[];//电脑方赢法统计数组

for (var i=0;i<15;i++) {
	chessboard[i]=[];
	for (var j=0; j<15;j++) {
		chessboard[i][j]=0;
	}
}//棋盘未落子初始化

for(var i = 0; i < 15; i++) {
	wins[i]=[];
	for(var j = 0; j < 15; j++) {
		wins[i][j]=[];
	}
}//赢法数组初始化

for(var i=0;i<count;i++){
	myWin[i]=0;
	computerWin[i]=0;
}//赢法统计数组初始化【错误位置】

var count=0;//赢法种类索引
for(var i=0;i<15;i++){
	for(var j=0;j<11;j++){
		for(var k=0;k<5;k++){
			wins[i][j+k][count]=true;
		}
		count++;
	}
}//所有横向赢法

for(var i = 0; i < 15; i++) {
	for(var j = 0; j < 11; j++) {
		for(var k = 0; k < 5; k++) {
			wins[j+k][i][count] = true;
		}
		count++;
	}
}//所有纵向赢法

for(var i = 0; i < 11; i++) {
	for(var j = 0; j < 11; j++) {
		for(var k = 0; k < 5; k++) {
			wins[i+k][j+k][count] = true;
		}
		count++;
	}
}//所有斜线赢法

for(var i = 0; i < 11; i++) {
	for(var j = 14; j > 3; j--) {
		for(var k = 0; k < 5; k++) {
			wins[i+k][j-k][count] = true;
		}
		count++;
	}
}//所有反斜线赢法

console.log(count);//
/*
for(var i=0;i<count;i++){
	myWin[i]=0;
	computerWin[i]=0;
}//赢法统计数组初始化【正确位置】
*/
var chess=document.getElementById('chess');
var context=chess.getContext('2d');//返回2D画布绘图的环境

context.strokeStyle="#BFBFBF";//设置绘制颜色#BFBFBF

var logo=new Image();
logo.src="images/GoBang.png";
logo.onload=function () {
	context.drawImage(logo,0,0,450,450);// 图片加载http://www.w3school.com.cn/tags/canvas_drawimage.asp
	drawChessBoard();//先logo后棋盘网格,避免网格覆盖

	//test:oneStep(0,0,true);oneStep(1,1,false);
}

var drawChessBoard=function(){//画棋盘网格
	for (var i = 0;i<15; i++) {
		context.moveTo(15+i*30,15);
		context.lineTo(15+i*30,435);//画横线
		context.stroke();//貌似可删除
		context.moveTo(15,15+i*30);
		context.lineTo(435,15+i*30);//交换XY坐标,画纵线
		context.stroke();
	}
}


var oneStep = function(i,j,me){//棋盘索引 下棋方

	//以下画棋子轮廓---------
	context.beginPath();
	context.arc(15+i*30,15+j*30,13,0,2*Math.PI);//画弧/圆(圆心X/Y,半径,起始/终止弧度)
	context.closePath();//用弦封闭弧,可删除
	context.stroke();//画轮廓线,原文删除

	//以下渐变填充棋子--------
	var gradient=context.createRadialGradient(15+i*30+2,15+j*30-2,13,15+i*30+1,15+j*30-1,0);
	//返回渐变对象,a圆x/y/R b圆x/y/R
	if(me){
	gradient.addColorStop(0,"#0A0A0A");//a圆边缘颜色#0A0A0A
	gradient.addColorStop(1,"#636766");//b圆边缘颜色#636766
	}else{
	gradient.addColorStop(0,"#D1D1D1");//a圆边缘颜色#D1D1D1
	gradient.addColorStop(1,"#F9F9F9");//b圆边缘颜色#F9F9F9	
	}
	//判断下棋是否为我方(黑)
	context.fillStyle=gradient;

	//改变纯色填充样式 context.fillStyle="#636766";
	context.fill();//填充,默认黑色??
}

chess.onclick=function(e){
	if(over){
		return;
	}//棋局已结束
	if(!me){
		return;
	}
	var x=e.offsetX;
	var y=e.offsetY;//
	var i=Math.floor(x/30);//算出索引
	var j=Math.floor(y/30);
	if(chessboard[i][j]==0){//避免在已落子位置 再次落子
		oneStep(i,j,me);
		chessboard[i][j]=1;
		
			for(var k=0;k<count;k++){
				if(wins[i][j][k]){
					myWin[k]++;
					computerWin[k]=6;
					if(myWin[k]==5){
						window.alert("黑棋胜");
						over=true;
					}
				}
			}
		if(!over){
			me=!me;
			computerAI();
		}
	}
}

var computerAI=function(){
	var myScore=[];
	var computerScore=[];//得分数组
	var max=0;//最高分数
	var u=0,v=0;//最高分数坐标
	
	for(var i=0;i<15;i++){
		myScore[i]=[];
		computerScore[i]=[];
		for(var j=0;j<15;j++){
			myScore[i][j]=0;
			computerScore[i][j]=0;
		}
	}//得分数组初始化

	for(var i=0;i<15;i++){
		for(var j=0;j<15;j++){
			if(chessboard[i][j]==0){//遍历棋盘上所有未落子的点
				for(var k=0;k<count;k++){//遍历所有赢法
					if(wins[i][j][k]){
						if(myWin[k]==1){
							myScore[i][j]+=200;
						}else if(myWin[k]==2){
							myScore[i][j]+=400;
						}else if(myWin[k]==3){
							myScore[i][j]+=2000;
						}else if(myWin[k]==4){
							myScore[i][j]+=10000;
						}

						if(computerWin[k]==1){
							computerScore[i][j]+=220;
						}else if(computerWin[k]==2){
							computerScore[i][j]+=420;
						}else if(computerWin[k]==3){
							computerScore[i][j]+=2100;
						}else if(computerWin[k]==4){
							computerScore[i][j]+=20000;
						}
					}
				}

				if(myScore[i][j]>max){
					max=myScore[i][j];
					u=i;
					v=j;
				}else if(myScore[i][j]==max){
					if(computerScore[i][j]>computerScore[u][v]){
						u=i;
						v=j;
					}
				}

				if(computerScore[i][j]>max){
					max=computerScore[i][j];
					u=i;
					v=j;
				}else if(computerScore[i][j]==max){
					if(myScore[i][j]>myScore[u][v]){
						u=i;
						v=j;
					}
				}
			}
		}

	}	
	oneStep(u,v,false);
	chessboard[u][v]=2;
	for(var k=0;k<count;k++){
		if(wins[u][v][k]){
			computerWin[k]++;
			myWin[k]=6;
			if(computerWin[k]==5){
			 	window.alert("白棋胜");
				over=true;
			}
		}
	}
		if(!over){
			me=!me;//轮流下棋
		}
}
/*无法判断胜负????????????
chess.onclick=function(e){
	if(over){
		return;
		}//棋局已结束
	var x=e.offsetX;
	var y=e.offsetY;//?
	var i=Math.floor(x/30);//算出索引
	var j=Math.floor(y/30);
	if(chessboard[i][j]==0){//避免在已落子位置 再次落子
		oneStep(i,j,me);
		if(me){
			chessboard[i][j]=1;
			for(var k=0;k<count;k++){
				if(wins[i][j][k]){
					myWin[k]++;
					computerWin[k]=6;//黑子可能占用该种赢法,白子不可能用该种方法赢,顾设为异常值
					if(myWin[k]==5){
						window.alert("黑棋胜");
						over=true;
					}
				}
			}

		}else{
			chessboard[i][j]=2;
			for(var k=0;k<count;k++){
				if(wins[i][j][k]){
					computerWin[k]++;
					myWin[k]=6;
					if(computerWin[k]==5){
						window.alert("白棋胜");
						over=true;
					}
				}
			}
		}

	me=!me;//轮流下棋

	}
}
*/


正在回答

2 回答

javascript的执行顺序是从上到下,for(var i=0; i<count; i++)里的count是在后面定义且经过循环自增的,你可以在这里alert(count)看下结果应该是undefiend.

0 回复 有任何疑惑可以回复我~
#1

ICHAYA 提问者

确实这样 非常感谢!!
2016-05-06 回复 有任何疑惑可以回复我~

你把第24-27行删掉就好了


0 回复 有任何疑惑可以回复我~
#1

ICHAYA 提问者

我知道不能写在24-27行(这是个结果),但我的问题是为什么初始化不能写在这里?
2016-04-14 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

老师,为何【赢法统计数组初始化】写到【赢法种类索引】前面(24--27行)会出现白棋只在(0,0)处下一步,后续不再下棋的状况?鞠躬感谢!!

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信