有一个小小的bug

来源:2-5 计算机AI实现(2)

李占山

2016-10-18 16:01

http://img.mukewang.com/5805d64d000142a113750860.jpg为什么不管我在哪点,白棋统统都只在棋盘顶上显示,而且有时候走两步白棋才走一步,是代码有问题吗?

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++;
	}
}

for (var i=0;i<count;i++) {
	myWin[i] = 0;
	computerWin[i] = 0;
}

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

context.strokeStyle="#BFBFBF";

var logo = new Image();
logo.src="img/logo.png";
logo.onload = function(){
	context.drawImage(logo, 0, 0, 450, 450);
	drawChessBard();
}

var drawChessBard = 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();
}

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

而且有时候一点还会点出白子来,有没有大神帮忙解决一下

写回答 关注

4回答

  • qq_沒妳了半城繁華半城傷_04083463
    2016-10-24 20:11:01
    已采纳




    var me = true;

    var chessBoard = [];

    var over = false;




    var wins = [];



    var myWin = [];

    var computerWin = [];


    for(var i=0; i<17; i++){

    chessBoard[i] = [];

    for(var j=0; j<17; j++){

    chessBoard[i][j] = 0;

    }

    }


    for(var i=0; i<17; i++){

    wins[i] = [];

    for(var j=0; j<17; j++){

    wins[i][j] = [];

    }

    }


    var count = 0;

    for(var i=0; i<17; 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<17; 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++;

    }

    }


    for(var i=0; i<count; i++){

    myWin[i] = 0;

    computerWin[i] = 0;

    }


    var chess = document.getElementById('chess')

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


    context.strokeStyle = '#bfbfbf';


    var logo = new Image();

    logo.src = 'img/logo.png';

    logo.onload = function (){

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

    drawChessBoard();

    }


    var drawChessBoard = function (){

    for(var i =0; i< 17; i++){

    context.moveTo(17 + i*20, 17);

    context.lineTo(17 + i*20, 337);

    context.stroke();

    context.moveTo(17, 17 + i*20);

    context.lineTo(337, 17 + i*20);

    context.stroke();

    }

    }


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

    context.beginPath();

    context.arc(17 + i*20, 17 + j*20, 9, 0, 2 * Math.PI);

    context.closePath();

    var gradient = context.createRadialGradient(17 + i*20 +2, 17 + j*20 - 2, 9, 17 + i*20 + 2, 17 + j*20 - 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();


    }


    chess.onclick = function(e){

    if(over){

    return;

    }

    if(!me){

    return;

    }

    var x = e.offsetX;

    var y = e.offsetY;

    var i = Math.floor(x / 20);

    var j = Math.floor(y / 20);

    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<17; i++){

    myScore[i] = [];

    computerScore[i] = [];

    for(var j=0; j<17; j++){

    myScore[i][j] = 0;

    computerScore[i][j] = 0;

    }

    }

    for(var i=0; i<17; i++){

    for(var j=0; j<17; 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] += 2200;

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

    }

    }



    这是我的,里面的布局我改了一下,整体没变,你看一下

    李占山

    还就是布局上的问题

    2016-10-25 10:43:47

    共 2 条回复 >

  • 白小明
    2016-10-31 09:32:04

    183行  v - j;

  • qq_沒妳了半城繁華半城傷_04083463
    2016-10-25 10:55:47

    呵呵,不用谢


  • qq_沒妳了半城繁華半城傷_04083463
    2016-10-22 10:59:18

    js 部分没问题啊,可能你css有问题吧

    李占山

    不会吧! #chess{ display: block; margin: 50px auto; box-shadow:-2px -2px 2px #EFEFEF,5px 5px 5px #B9B9B9 ; } 就这么点能有啥问题?

    2016-10-23 09:45:34

    共 1 条回复 >

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

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

43235 学习 · 109 问题

查看课程

相似问题