老师为什么计算机不会赢

来源:-

谁在奈何桥下_

2016-04-02 18:46

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回答

  • 程序员面试辅导
    2016-04-02 19:37:19
    已采纳

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

    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行删掉,这里不需要再判断我方是否赢,这里我方没有落子,不可能赢。

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

    谁在奈何桥下...

    老师,计算机还是不会赢

    2016-04-13 20:00:44

    共 2 条回复 >

  • 谁在奈何桥下_
    2016-04-13 20:01:25

    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;          

      }

    }


JS实现人机大战之五子棋(AI篇)

"AlphaGO"我要和你下五子棋,教程带你实现五子棋AI

43235 学习 · 109 问题

查看课程

相似问题