js實(shí)現(xiàn)簡(jiǎn)單五子棋游戲
更新時(shí)間:2020年05月28日 10:41:48 作者:swrd2014
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了js實(shí)現(xiàn)五子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>五子棋</title> <link rel="stylesheet" href="css/style.css" /> </head> <body> <canvas id="chess" width="450px" height="450px"></canvas> <script type="text/javascript" src="js/script.js" ></script> </body> </html>
css
canvas{ display: block; margin: 50px auto; box-shadow: -2px -2px 2px #EFEFEF,5px 5px 5px #B9B9B9; }
js
var me = true; var over = false; var chessBox = []; var wins = []; //定義三維數(shù)組 //贏法統(tǒng)計(jì)數(shù)組 var myWin = []; var computerWin = []; for(i=0;i<15;i++){ chessBox[i]=[]; for(j=0;j<15;j++){ chessBox[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++){ //執(zhí)行1次 // wins[0][0][0]=true; // wins[0][1][0]=true; // wins[0][2][0]=true; // wins[0][3][0]=true; // wins[0][4][0]=true; //執(zhí)行2次 // wins[0][1][1]=true; // wins[0][2][1]=true; // wins[0][3][1]=true; // wins[0][4][1]=true; // wins[0][5][1]=true; 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[i] = 0; } var chess = document.getElementById('chess'); var context = chess.getContext('2d'); context.strokeStyle = "#BFBFBF"; var logo= new Image(); logo.src = "img/木頭.jpg"; logo.onload = function(){ context.drawImage(logo,0,0,450,450); drawChessBoard(); // oneStep(0,0,true); // oneStep(1,1,false); } function drawChessBoard(){ for(var i=0;i<15;i++){ context.moveTo(15+i*30,15); context.lineTo(15+i*30,435); 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,15+j*30,13,15+i*30,15+j*30,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); //i,j為索引序列號(hào) var j = Math.floor(y/30); if(chessBox[i][j]==0){ oneStep(i,j,me); chessBox[i][j]=1; for(var k=0;k < count; k++){ if(wins[i][j][k]) { myWin[k]++; computerWin[k] = 6; //設(shè)置異常值 if(myWin[k] == 5) { window.alert("你贏了"); over = true; } } } if(!over){ me=!me; computerAI(); } } } var computerAI = function(){ var myScore = []; var computerScore = []; var max = 0; //保存最高分?jǐn)?shù); var u = 0, v =0; //保存坐標(biāo) 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(chessBox[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]+= 2020; }else if(computerWin[k]==4){ computerScore[i][j]+= 10020; } } } 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); chessBox[u][v] = 2; for(var k=0;k < count; k++){ if(wins[u][v][k]) { computerWin[k]++; myWin[k] = 6; //設(shè)置異常值 if(computerWin[k] == 5) { window.alert("計(jì)算機(jī)贏了"); over = true; } } } if(!over){ me=!me; } }
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- 純JS實(shí)現(xiàn)五子棋游戲兼容各瀏覽器(附源碼)
- 基于JavaScript實(shí)現(xiàn)五子棋游戲
- Javascript和HTML5利用canvas構(gòu)建Web五子棋游戲?qū)崿F(xiàn)算法
- JS canvas繪制五子棋的棋盤
- H5+C3+JS實(shí)現(xiàn)五子棋游戲(AI篇)
- H5+C3+JS實(shí)現(xiàn)雙人對(duì)戰(zhàn)五子棋游戲(UI篇)
- 原生JS+Canvas實(shí)現(xiàn)五子棋游戲?qū)嵗?/a>
- JS+canvas實(shí)現(xiàn)的五子棋游戲【人機(jī)大戰(zhàn)版】
- javascript 初學(xué)教程及五子棋小程序的簡(jiǎn)單實(shí)現(xiàn)
- 教你用Js寫一個(gè)簡(jiǎn)單的五子棋小游戲
相關(guān)文章
javascript getElementsByClassName函數(shù)
今天在腳本中應(yīng)用到了根據(jù)類名取元素的方法,卻對(duì)其效率不甚滿意。于是,小幅修改了其探測(cè)元素類名的方法,提升了約3成的效率.2010-04-04Javascript中點(diǎn)擊(click)事件的三種寫法舉例
在JavaScript中Click事件是一種常見的用戶交互事件,表示用戶在網(wǎng)頁(yè)上點(diǎn)擊某個(gè)元素的動(dòng)作,這篇文章主要給大家介紹了關(guān)于Javascript中點(diǎn)擊(click)事件的三種寫法,需要的朋友可以參考下2024-06-06javascript面向?qū)ο髣?chuàng)建對(duì)象的方式小結(jié)
這篇文章主要介紹了javascript面向?qū)ο髣?chuàng)建對(duì)象的方式,結(jié)合實(shí)例形式總結(jié)分析了javascript常見的7種創(chuàng)建對(duì)象的方式,需要的朋友可以參考下2019-07-07