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

老师为什么计算机不会赢

var chessBoard = [];
var me = true;
var over = false;

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

//赢法的统计数组
var myWin = [];
var coumpterWin = [];
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]=[];
  }
}

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 = 0;
}

var chess=document.getElementById('chess');
var context = chess.getContext('2d');
 
context.strokeStyle = "#bfbfbf"

//绘制水印
var logo = new Image();
logo.src= "img/wuziqi/2.png";
logo.onload = function(){
  context.drawImage(logo,0,0,450,450);
  drawChessBoard();
//oneStep(0,1,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);
    context.stroke();
  }
}

//绘制棋子
var oneStep = function(i,j,me){
  //绘制圆
  context.beginPath();
  context.arc(15+i*30,15+j*30,13,0,2*Math.PI);
  context.closePath();
  var gradient=context.createRadialGradient(15+i*30+2,15+j*30-2,13,15+i*30,15,0)//渐变填充
  if(me){
    gradient.addColorStop(0,"#0a0a0a");
    gradient.addColorStop(1,"#636766")
  }else{
    gradient.addColorStop(0,"#D1D1D1");
    gradient.addColorStop(1,"#F9F9F9")
  }
  context.fillStyle = gradient;
  context.fill();
  //context.stroke()描边,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]+=1000;
            }
            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]+=2000;
            }
          }
        }
    	  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;
        }
      }
    }
  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;          
  }
}


正在回答

2 回答

同学,仔细看了下你的代码,发现几点问题哈。

1、第10行,computerWin拼错了

2、第65行,应该是computerWin[i]=0,这也是为什么计算机不赢的原因之一

3、102行,渐变填充的时候,第二个圆的圆心坐标有点问题,应该是

var gradient=context.createRadialGradient(15+i*30+2,15+j*30-2,13,15+i*30+2,15+j*30-2,0)//渐变填充

4、171行和180行,现在连上4颗子的时候,得分还没3课子高,也是计算机不赢的原因之一。要给连上四颗子的时候,加上一个绝对高的分,所以可以给分数加一个0。

5、219行到288行删掉,这里不需要再判断我方是否赢,这里我方没有落子,不可能赢。

你把这几点改一改吧,看看行不行了?

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

谁在奈何桥下_ 提问者

非常感谢!
2016-04-13 回复 有任何疑惑可以回复我~
#2

谁在奈何桥下_ 提问者

老师,计算机还是不会赢
2016-04-13 回复 有任何疑惑可以回复我~

var chessBoard = [];

var me = true;

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]=[];

  }

}


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 = 0;

}


var chess=document.getElementById('chess');

var context = chess.getContext('2d');

 

context.strokeStyle = "#bfbfbf"


//绘制水印

var logo = new Image();

logo.src= "img/wuziqi/2.png";

logo.onload = function(){

  context.drawImage(logo,0,0,450,450);

  drawChessBoard();

//oneStep(0,1,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);

    context.stroke();

  }

}


//绘制棋子

var oneStep = function(i,j,me){

  //绘制圆

  context.beginPath();

  context.arc(15+i*30,15+j*30,13,0,2*Math.PI);

  context.closePath();

  var gradient=context.createRadialGradient(15+i*30+2,15+j*30-2,13,15+i*30+2,15+j*30-2,0)//渐变填充

  if(me){

    gradient.addColorStop(0,"#0a0a0a");

    gradient.addColorStop(1,"#636766")

  }else{

    gradient.addColorStop(0,"#D1D1D1");

    gradient.addColorStop(1,"#F9F9F9")

  }

  context.fillStyle = gradient;

  context.fill();

  //context.stroke()描边,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;          

  }

}


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

举报

0/150
提交
取消

老师为什么计算机不会赢

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