js+canvas實(shí)現(xiàn)五子棋小游戲
本文實(shí)例為大家分享了js+canvas實(shí)現(xiàn)五子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
效果展示:

源碼展示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>五子棋</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
margin-top: 20px;
margin-left: 20px;
}
canvas {
background-image: url("img/bak.jpg");
border: 1px solid #000;
}
</style>
</head>
<body>
<canvas width="600" height="600" onclick="play(event)"></canvas>
<script>
/*準(zhǔn)備工作: 1獲取畫布,獲取畫筆對象 */
var mcanvas = document.querySelector("canvas");
var ctx = mcanvas.getContext("2d");
/*準(zhǔn)備工作:2創(chuàng)建一個二維數(shù)組 用來定義繪制棋盤線*/
var count = 15;//用來定義棋盤的行數(shù)和列數(shù)
var map = new Array(count);
for (var i = 0; i < map.length; i++) {
map[i] = new Array(count);
for (var j = 0; j < map[i].length; j++) {
map[i][j] = 0;
}
}
/*準(zhǔn)備工作:3初始化棋子*/
var black = new Image();
var white = new Image();
black.src = "img/black.png";
white.src = "img/white.png";
//開始繪制 1繪制棋盤線
ctx.strokeStyle = "#fff";
var rectWH = 40; //設(shè)置繪制矩形的大小
for (var i = 0; i < map.length; i++) {
for (var j = 0; j < map[i].length; j++) {
ctx.strokeRect(j * rectWH, i * rectWH, rectWH, rectWH);
}
}
// 用來進(jìn)行黑白子的切換
var isBlack = true;
//開始繪制 2下子
function play(e) {
//獲取點(diǎn)擊canvas的位置值默認(rèn),canvas的左上角為(0,0) 點(diǎn)
var leftOffset = 20;//body 的margin
var x = e.clientX - leftOffset;
var y = e.clientY - leftOffset;
// console.log(x+" "+y);
// 設(shè)置點(diǎn)擊點(diǎn)后棋子下在哪里,獲取點(diǎn)擊的位置進(jìn)行判斷如果超過格子的一半則繪制到下一個點(diǎn)如果小于 則繪制在上一個點(diǎn)上
var xv = (x - rectWH / 2) / rectWH;
var yv = (y - rectWH / 2) / rectWH;
var col = parseInt(xv) + 1;
var row = parseInt(yv) + 1;
console.log(xv + " " + yv + " , " + col + " " + row);
//嚴(yán)格點(diǎn)需要驗(yàn)證 ,驗(yàn)證所輸入的點(diǎn)是否在數(shù)組中已經(jīng)存在 ,如果存在 則返回
if (map[row][col] != 0) {
alert("咋的,還想往我身上下啊!瞎啊!沒看見已經(jīng)有棋子了?。?!");
return;
}
// 切換繪制黑白子
if (isBlack) {
ctx.drawImage(black, col * 40 - 20, row * 40 - 20);
isBlack = false;
map[row][col] = 1;
Yes(1, row, col);
} else {
ctx.drawImage(white, col * 40 - 20, row * 40 - 20);
isBlack = true;
map[row][col] = 2;
Yes(2, row, col);
}
}
//算法驗(yàn)證,查看誰贏 tag :1 :黑子 2 :白子
function Yes(t, row, col) {
console.log(1);
var orgrow = row;
var orgcol = col;
var total = 1;
// 判斷依據(jù),以當(dāng)前下的棋子為圓心,水平方向左右尋找和自己想通的值 ,最后判斷如果大于5個則表示勝利
// 1水平方向判斷
while (col - 1 > 0 && map[row][col - 1] == t) { //判斷下一個值 注意一定是:col-1
total++;
col--;
}
row = orgrow;
col = orgcol;
while (col + 1 < 15 && map[row][col + 1] == t) {
col++;
total++;
}
if (total >= 5) {
if (t == 1){
alert("黑子贏");
} else{
alert("白子贏");
}
return;//判斷出輸贏結(jié)束后續(xù)判斷
}
// 2垂直方向判斷
row = orgrow;
col = orgcol;
total = 1;
while (row - 1 > 0 && map[row - 1][col] == t) {
row--;
total++;
}
row = orgrow;
col = orgcol;
while (row + 1 < 15 && map[row + 1][col] == t) {
row++;
total++;
}
if (total >= 5) {
if (t == 1){
alert("黑子贏");
} else{
alert("白子贏");
}
return;//判斷出輸贏結(jié)束后續(xù)判斷
}
//左下 右上
row = orgrow;
col = orgcol;
total = 1;
while (row + 1 < 15 && col - 1 > 0 && map[row + 1][col - 1] == t) {
row++;
col--;
total++;
}
row = orgrow;
col = orgcol;
while (row - 1 > 0 && col + 1 < 15 && map[row - 1][col + 1] == t) {
row--;
col++;
total++;
}
if (total >= 5) {
if (t == 1){
alert("黑子贏");
} else{
alert("白子贏");
}
return;//判斷出輸贏結(jié)束后續(xù)判斷
}
//左上右下
row = orgrow;
col = orgcol;
total = 1;
while (row - 1 > 0 && col - 1 > 0 && map[row - 1][col - 1] == t) {
row--;
col--;
total++;
}
row = orgrow;
col = orgcol;
while (row + 1 < 15 && col + 1 < 15 && map[row + 1][col + 1] == t) {
row++;
col++;
total++;
}
if (total >= 5) {
if (t == 1){
alert("黑子贏");
} else{
alert("白子贏");
}
return;//判斷出輸贏結(jié)束后續(xù)判斷
}
}
/*功能擴(kuò)充:
1當(dāng)勝利后 彈框:a是否在來一局 b 精彩回復(fù)
a 如果點(diǎn)擊在來一句 清空數(shù)據(jù)重新開始
b 精彩回放將棋盤黑白子按照下棋的順序進(jìn)行棋子編號2悔棋功能
3對算法的擴(kuò)充
a如果是雙三 則直接彈出勝利
b若是桶四 則直接彈出勝利
*/
</script>
</body>
</html>
圖片資源:

背景圖片:


更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序之高德地圖多點(diǎn)路線規(guī)劃過程示例詳解
這篇文章主要介紹了微信小程序之高德地圖多點(diǎn)路線規(guī)劃過程示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
詳解JavaScript實(shí)現(xiàn)繼承的五種經(jīng)典方式(附圖解)
JavaScript中的繼承是一種機(jī)制,通過它可以創(chuàng)建一個對象,該對象可以享有另一個對象的屬性和方法,本文將詳細(xì)的為大家介紹實(shí)現(xiàn)繼承的五種經(jīng)典方式,感興趣的小伙伴跟著小編一起來看看吧2023-08-08
JavaScript 中的運(yùn)算符和表達(dá)式介紹
這篇文章主要介紹了JavaScript 中的運(yùn)算符和表達(dá)式介紹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
element-table表格中插入顏色塊顯示數(shù)據(jù)狀態(tài)的示例代碼
這篇文章主要介紹了element-table表格中插入顏色塊顯示數(shù)據(jù)狀態(tài),代碼部分分為dom部分和data部分及css部分,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12
JavaScript對Cookie進(jìn)行讀寫操作實(shí)例
這篇文章主要介紹了JavaScript對Cookie進(jìn)行讀寫操作的方法,實(shí)例分析了javascript針對cookie的讀寫操作技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-07-07
Bootstrap treeview實(shí)現(xiàn)動態(tài)加載數(shù)據(jù)并添加快捷搜索功能
本文實(shí)現(xiàn)了運(yùn)用bootstrap treeview實(shí)現(xiàn)動態(tài)加載數(shù)據(jù),并且添加快捷搜索功能,需要的朋友參考下2018-01-01
關(guān)于javascript中json 對象數(shù)組之間相互轉(zhuǎn)化問題
這篇文章主要介紹了關(guān)于javascript中json 對象數(shù)組之間相互轉(zhuǎn)化問題,在實(shí)際應(yīng)用中,JSON對象和數(shù)組的結(jié)構(gòu)可能更加復(fù)雜,需要根據(jù)具體情況進(jìn)行相應(yīng)的處理和轉(zhuǎn)換,需要的朋友可以參考下2023-07-07
JavaScript中使用replace結(jié)合正則實(shí)現(xiàn)replaceAll的效果
JavaScript?中使用?replace?達(dá)到?replaceAll的效果,其實(shí)就用利用的正則的全局替換。2010-06-06

