canvas教程

JS+canvas实现五子棋人机大战(2)

字号+ 作者:H5之家 来源:H5之家 2017-12-05 08:00 我要评论( )

交叉赢法 /*交叉赢法*/for (var x = 0; x 右 开始的所有交叉赢法 总共11 * 11种for (var y = 0; y = 4; x --) { //右 -> 左 开始的所有交叉赢法 总共11 * 11种for (var y = 0; y maxScore) { //当我的分数大于最大

交叉赢法

JS+canvas实现五子棋人机大战

/* 交叉赢法 */ for (var x = 0; x < this.col-4; x++) { // 左 -> 右 开始的所有交叉赢法 总共11 * 11种 for (var y = 0; y < this.col-4; y ++) { this.winsCount ++; /* 如: 1. [0,0] [1,1] [2,2] [3,3] [4,4] 2. [0,1] [1,2] [2,3] [3,4] [4,5] 3. [0,2] [1,3] [2,4] [3,5] [4,6] ... [1,0] [2,1] [3,2] [4,3] [5,5] 相当于从左至右 一列列计算过去 */ for (var k = 0; k < 5; k ++) { this.wins[x+k][y+k][this.winsCount] = true; } } } for (var x = this.col-1; x >= 4; x --) { //右 -> 左 开始的所有交叉赢法 总共11 * 11种 for (var y = 0; y < this.col-4; y ++) { this.winsCount ++; for (var k = 0; k < 5; k ++) { this.wins[x-k][y+k][this.winsCount] = true; } } } } 9. 落子实现 //落子实现 Gobang.prototype.dorpChess = function(){ var that = this; this.canvas.addEventListener('click', function(e) { // 判断是否结束 if (that.over) return; var x = Math.floor((e.offsetX)/30), y = Math.floor((e.offsetY)/30); //判断该棋子是否已存在 if (that.allChesses[x][y]) return; // 检查落子情况 that.checkChess(x, y) if (!that.over) { that.player = false; that.computerDropChess();//计算机落子 } }) } //检查落子情况 Gobang.prototype.checkChess = function(x, y){ //画棋 this.drawChess(x, y, this.player); //记录落下的棋子 this.existChesses.push({ x: x, y: y, player: this.player }); //该位置棋子置为true,证明已经存在 this.allChesses[x][y] = true; this.currWinChesses(x, y, this.player); } //判断当前坐标赢的方法各自拥有几粒棋子 Gobang.prototype.currWinChesses = function(x, y, player){ var currObj = player ? this.myWins : this.computerWins; var enemyObj = player ? this.computerWins : this.myWins; var currText = player ? '我' : '电脑'; for (var i = 1; i 0) { var n = 10; for (var i = 0; i < o; i++) { n *= 3; } return n } return 0 } // 获取没有落子的棋盘区域 function existChess(arr) { var existArr = []; for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr[i].length; j++) { if (!arr[i][j]) { existArr.push({x:i, y:j}) } } } return existArr; } var exceptArr = existChess(this.allChesses); // 循环未落子区域,找出分数最大的位置 for (var i = 0; i < exceptArr.length; i++) { var o = exceptArr[i]; // 循环所有赢的方法 for (var k = 0; k < this.winsCount; k++) { //判断每个坐标对应的赢法是否存在 if (this.wins[o.x][o.y][k]) { // 计算每种赢法,拥有多少棋子,获取对应分数 // 电脑起始分数需要高一些,因为现在是电脑落子, 优先权大 myScore[o.x][o.y] += formatScore(this.myWins[k-1], 10); computerScore[o.x][o.y] += formatScore(this.computerWins[k-1], 11); } } //我的分数判断 if (myScore[o.x][o.y] > maxScore) { //当我的分数大于最大分数时, 证明这个位置的是对我最有利的 maxScore = myScore[o.x][o.y]; x = o.x; y = o.y; }else if (myScore[o.x][o.y] === maxScore) { //当我的分数与最大分数一样时, 证明我在这两个位置下的效果一样, 所以我们应该去判断在这两个位置时,电脑方对应的分数 if (computerScore[o.x][o.y] > computerScore[x][y]) { x = o.x; y = o.y; } } // 电脑分数判断, 因为是电脑落子, 所以优先权大 if (computerScore[o.x][o.y] > maxScore) { maxScore = computerScore[o.x][o.y]; x = o.x; y = o.y; }else if (computerScore[o.x][o.y] === maxScore) { if (myScore[o.x][o.y] > myScore[x][y]) { x = o.x; y = o.y; } } } this.checkChess(x, y) if (!this.over) { this.player = true; } } var gobang = new Gobang(); gobang.init()

github地址
线上地址

原文地址:https://segmentfault.com/a/1190000012218251,作者:咚子

以上就是对JS+canvas实现五子棋人机大战的相关介绍,希望对您学习html5有所帮助,感谢您关注织梦者!

这些内容可能对你也有帮助

更多HTML教程可查看HTML教程列表页。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Phaser实现飞机大战

    Phaser实现飞机大战

    2017-11-21 13:00

  • 五子棋必胜技巧图解

    五子棋必胜技巧图解

    2017-07-16 14:01

  • 一个五子棋的代码

    一个五子棋的代码

    2015-11-05 10:29

网友点评
p