摘要:預覽效果源碼核心代碼記錄是否走過所有贏法數量贏法數組我方贏法的統計數組計算機贏法的統計數組初始化填充數組是否走過贏法數組橫豎斜反斜贏法的統計數組繪制水印繪制棋盤落子實現我方落子統計贏法你贏了計算機落子最大分數所在坐標遍歷棋盤遍
預覽效果
github源碼
核心代碼
export default { data () { return { chess: {}, context: {}, chessBoard: [], // 記錄是否走過 me: true, count: 0, // 所有贏法數量 wins: [], // 贏法數組 myWin: [], // 我方贏法的統計數組 computerWin: [], // 計算機贏法的統計數組 over: false, } }, mounted () { setTimeout(_ => { this.init() }) }, methods: { // 初始化 init () { this.chess = this.$refs.canvas this.context = this.chess.getContext("2d") this.drawImage( _ => { this.drawChessBoard() }) this.fillArray() }, // 填充數組 fillArray () { // 是否走過 for (let i = 0; i < 15; i++) { this.chessBoard[i] = [] for (let j = 0; j < 15; j++) { this.chessBoard[i][j] = 0 } } // 贏法數組 for (let i = 0; i < 15; i++) { this.wins[i] = [] for (let j = 0; j < 15; j++) { this.wins[i][j] = [] } } // 橫 for (let i = 0; i < 15; i++) { for (let j = 0; j < 11; j++) { for (let k = 0; k < 5; k++) { this.wins[i][j+k][this.count] = true } this.count++ } } // 豎 for (let i = 0; i < 15; i++) { for (let j = 0; j < 11; j++) { for (let k = 0; k < 5; k++) { this.wins[j+k][i][this.count] = true } this.count++ } } // 斜 for (let i = 0; i < 11; i++) { for (let j = 0; j < 11; j++) { for (let k = 0; k < 5; k++) { this.wins[i+k][j+k][this.count] = true } this.count++ } } // 反斜 for (let i = 0; i < 11; i++) { for (let j = 14; j > 3; j--) { for (let k = 0; k < 5; k++) { this.wins[i+k][j-k][this.count] = true } this.count++ } } // 贏法的統計數組 for (let i = 0; i < this.count; i++) { this.myWin[i] = 0 this.computerWin[i] = 0 } }, // 繪制水印 drawImage (callback) { const { context } = this const img = new Image() img.src = "/images/logo.svg" img.onload = _ => { context.drawImage(img, (450 - img.width)/2, (450 - img.height)/2, img.width, img.height) callback() } }, // 繪制棋盤 drawChessBoard () { const { context } = this context.strokeStyle = "#bfbfbf" for (let 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() } }, // 落子實現 onStep (x, y, me) { const { context } = this context.beginPath() context.arc(15 + x * 30, 15 + y * 30, 13, 0, 2 * Math.PI) context.closePath() const gradient = context.createRadialGradient(15 + x * 30 + 2, 15 + y * 30 - 2, 13, 15 + x * 30 + 2, 15 + y * 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() }, // 我方落子 chessClick (e) { if (this.over) { return } if (!this.me) { return } const ox = e.offsetX const oy = e.offsetY const x = Math.floor(ox/30) const y = Math.floor(oy/30) if (this.chessBoard[x][y] === 0) { this.chessBoard[x][y] = 1 this.onStep(x, y, this.me) // 統計贏法 for (let k = 0; k < this.count; k++) { if (this.wins[x][y][k]) { this.myWin[k]++ this.computerWin[k] = 6 if (this.myWin[k] === 5) { alert("你贏了") this.over = true } } } if (!this.over) { this.me = !this.me this.computerAI() } } }, // 計算機落子 computerAI () { const myScore = [] const computerScore = [] let max = 0 // 最大分數 let u = 0, v = 0 // 所在坐標 for (let i = 0; i < 15; i++) { myScore[i] = [] computerScore[i] = [] for (let j = 0; j < 15; j++) { myScore[i][j] = 0 computerScore[i][j] = 0 } } // 遍歷棋盤 for (let i = 0; i < 15; i++) { for (let j = 0; j < 15; j++) { if (this.chessBoard[i][j] === 0) { // 遍歷所有贏法 for (let k = 0; k < this.count; k++) { if (this.wins[i][j][k]) { // 我方 if (this.myWin[k] === 1) { myScore[i][j] += 200 } else if (this.myWin[k] === 2) { myScore[i][j] += 400 } else if (this.myWin[k] === 3) { myScore[i][j] += 2000 } else if (this.myWin[k] === 4) { myScore[i][j] += 10000 } // 計算機 if (this.computerWin[k] === 1) { computerScore[i][j] += 220 } else if (this.computerWin[k] === 2) { computerScore[i][j] += 420 } else if (this.computerWin[k] === 3) { computerScore[i][j] += 2100 } else if (this.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 } } } } } this.onStep(u, v, false) this.chessBoard[u][v] = 2 // 統計贏法 for (let k = 0; k < this.count; k++) { if (this.wins[u][v][k]) { this.computerWin[k]++ this.myWin[k] = 6 if (this.computerWin[k] === 5) { alert("計算機贏了") this.over = true } } } if (!this.over) { this.me = !this.me } } } }
原文地址:https://unnue.com/article/50
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19865.html
摘要:預覽效果源碼核心代碼記錄是否走過所有贏法數量贏法數組我方贏法的統計數組計算機贏法的統計數組初始化填充數組是否走過贏法數組橫豎斜反斜贏法的統計數組繪制水印繪制棋盤落子實現我方落子統計贏法你贏了計算機落子最大分數所在坐標遍歷棋盤遍 預覽效果 github源碼 showImg(https://segmentfault.com/img/bVbk02l?w=450&h=450); 核心代碼 ...
摘要:五子棋人機大戰創建實例是否結束我電腦所有棋子已經落下的棋子贏法總數所有贏法統計我的贏法統計電腦贏法統計初始化初始化生成棋盤棋盤初始化鼠標移動聚焦功能實現算法初始化落子功能實現生成棋盤初始化生成不是的倍數棋盤列初始化棋盤棋盤初始化畫棋盤畫 JS+canvas五子棋人機大戰 1. 創建實例 function Gobang () { this.over = false; // 是否結...
摘要:由于二維數組中代表黑棋,代表白棋,,的數字集合即可代表棋盤上的棋子情況,可以對整個棋盤數組進行遍歷,得到每一個可以下的位置的八個方向的棋子情況。 java基本入門之后,迎來第一個挑戰——五子棋設計 寒假的時候,靠著看java手冊,實現了雙人對戰并判斷輸贏的功能。但是一直卡在了人機對戰上面。 之后隨著學習的深入,終于實現。 以下詳細的敘述一下整體的設計過程: 首先是五子棋窗口界面的設計,...
閱讀 1702·2021-11-25 09:43
閱讀 2665·2019-08-30 15:53
閱讀 1808·2019-08-30 15:52
閱讀 2898·2019-08-29 13:56
閱讀 3317·2019-08-26 12:12
閱讀 565·2019-08-23 17:58
閱讀 2126·2019-08-23 16:59
閱讀 932·2019-08-23 16:21