JavaScript應用:五子棋游戲實戰開發

在這里插入圖片描述

🏆作者簡介,黑夜開發者,全棧領域新星創作者?,CSDN博客專家,阿里云社區專家博主,2023年6月csdn上海賽道top4。
🏆數年電商行業從業經驗,歷任核心研發工程師,項目技術負責人。
🏆本文已收錄于專欄:100個JavaScript的小應用。
🎉歡迎 👍點贊?評論?收藏

文章目錄

  • 🚀一、引言
  • 🚀二、核心功能設計
  • 🚀三、功能實現
    • 🔎3.1 創建HTML結構
    • 🔎3.2 創建HTML樣式
    • 🔎3.3 繪制棋盤
    • 🔎3.4 核心下棋邏輯處理
      • 🍁3.4.1 玩家落子
      • 🍁3.4.2 系統回棋
      • 🍁3.4.3 輸贏判斷
      • 🍁3.4.4 重新開始游戲
  • 🚀四、總結


🚀一、引言

五子棋是一種非常經典的棋類游戲,不論是對于計算機科學還是對于普通玩家來說,都具有一定的挑戰性。本文將使用Javascript來開發一個簡單的五子棋游戲,在游戲中實現雙方角色的對戰,并且記錄勝負結果。

在這里插入圖片描述

🚀二、核心功能設計

在開始編寫代碼之前,我們需要明確一些基本的概念和步驟:

  1. 棋盤:五子棋游戲的主要場景,由19x19個交叉點組成;
  2. 角色:用戶和系統兩個角色,用戶是白色棋子,系統是黑色棋子;
  3. 開始按鈕:點擊開始按鈕后,游戲重新開始;
  4. 落子規則:用戶和系統輪流落子,每次只能落一個棋子,不能重復落子;
  5. 判斷勝負:當任意一方先連成五個棋子時,游戲結束,并宣布勝者。

🚀三、功能實現

🔎3.1 創建HTML結構

首先,我們需要創建一個HTML文件,并添加必要的結構和樣式。在<body>標簽中,我們會添加一個<div>元素用于繪制棋盤,以及一個開始按鈕。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>五子棋游戲</title><link rel="stylesheet" type="text/css" href="style.css">
</head>
<body><div id="board"></div><button id="start">開始</button><script src="script.js"></script>
</body>
</html>

在上面的代碼中,我們為棋盤設置了一個寬度和高度,并將其居中顯示。我們還為每個棋子指定了樣式。

🔎3.2 創建HTML樣式

#board {height: 500px;margin: 0 auto;background-color: beige;
}.dot {width: 10px;height: 10px;border-radius: 50%;background-color: black;position: absolute;
}.white {background-color: white;
}

🔎3.3 繪制棋盤

接下來,我們將使用JavaScript來繪制棋盤。在script.js文件中,我們將獲取棋盤元素并生成網格。我們會定義一個全局變量board來存儲當前游戲狀態。

const boardSize = 15; // 棋盤大小
const boardElement = document.getElementById('board');
let board = []; // 存儲棋盤狀態function createBoard() {for (let i = 0; i < boardSize; i++) {board[i] = [];for (let j = 0; j < boardSize; j++) {const dot = document.createElement('div');dot.className = 'dot';dot.style.top = (i * 30 + 10) + 'px';dot.style.left = (j * 30 + 10) + 'px';boardElement.appendChild(dot);board[i][j] = null;}}
}createBoard();

上述代碼中,我們使用兩個嵌套的for循環來遍歷整個棋盤,并創建一個<div>元素作為每個交叉點。我們設置了這些點的位置,并將其添加到棋盤元素中。同時,我們也初始化了board數組,將每個交叉點的狀態設置為null

🔎3.4 核心下棋邏輯處理

🍁3.4.1 玩家落子

現在,我們將添加處理用戶點擊事件的功能。當用戶點擊空白的交叉點時,我們會為其添加一個白色棋子,并將其狀態設置為'white'。我們還會為開始按鈕添加一個點擊事件來重新開始游戲。


const startButton = document.getElementById('start');
let currentPlayer = 'white';boardElement.addEventListener('click', handleClick);function handleClick(event) {const dot = event.target;const row = Math.floor((dot.offsetTop - 10) / 30);const col = Math.floor((dot.offsetLeft - 10) / 30);if (board[row][col] === null) {dot.classList.add(currentPlayer);board[row][col] = currentPlayer;// 檢查是否有玩家連成五個棋子if (checkWin(row, col)) {endGame(currentPlayer + ' 勝利!');} else {currentPlayer = 'black';setTimeout(systemPlay, 1000); // 系統自動下一步棋}}
}

🍁3.4.2 系統回棋

接下來,我們需要實現系統落子的邏輯。當游戲玩家下完棋后,系統要進行相應的回棋,游戲才能進行下去。


function systemPlay() {// 系統隨機選擇一個空的交叉點let emptyDots = [];for (let i = 0; i < boardSize; i++) {for (let j = 0; j < boardSize; j++) {if (board[i][j] === null) {emptyDots.push([i, j]);}}}const randomIndex = Math.floor(Math.random() * emptyDots.length);const [row, col] = emptyDots[randomIndex];const dot = boardElement.children[row * boardSize + col];dot.classList.add(currentPlayer);board[row][col] = currentPlayer;// 檢查是否有玩家連成五個棋子if (checkWin(row, col)) {endGame(currentPlayer + ' 勝利!');} else {currentPlayer = 'white';}
}

🍁3.4.3 輸贏判斷

我們首先獲取被點擊的元素,并計算其所在的行和列。然后,我們檢查該交叉點是否為空,如果是,就為其添加當前玩家的棋子,并更新board數組。接下來,我們使用checkWin函數檢查該玩家是否連成五個棋子,如果是,就結束游戲。


function checkWin(row, col) {// 檢查行let count = 1;for (let i = col - 1; i >= 0; i--) {if (board[row][i] === currentPlayer) {count++;} else {break;}}for (let i = col + 1; i < boardSize; i++) {if (board[row][i] === currentPlayer) {count++;} else {break;}}if (count >= 5) {return true;}// 檢查列count = 1;for (let i = row - 1; i >= 0; i--) {if (board[i][col] === currentPlayer) {count++;} else {break;}}for (let i = row + 1; i < boardSize; i++) {if (board[i][col] === currentPlayer) {count++;} else {break;}}if (count >= 5) {return true;}// 檢查主對角線count = 1;for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (board[i][j] === currentPlayer) {count++;} else {break;}}for (let i = row + 1, j = col + 1; i < boardSize && j < boardSize; i++, j++) {if (board[i][j] === currentPlayer) {count++;} else {break;}}if (count >= 5) {return true;}// 檢查副對角線count = 1;for (let i = row - 1, j = col + 1; i >= 0 && j < boardSize; i--, j++) {if (board[i][j] === currentPlayer) {count++;} else {break;}}for (let i = row + 1, j = col - 1; i < boardSize && j >= 0; i++, j--) {if (board[i][j] === currentPlayer) {count++;} else {break;}}if (count >= 5) {return true;}return false;
}
// 結束游戲
function endGame(message) {alert(message);boardElement.removeEventListener('click', handleClick);
}

🍁3.4.4 重新開始游戲

如果想重新開始游戲,點擊開始按鈕,就能夠將游戲重新開始,主要邏輯如下

startButton.addEventListener('click', resetGame);function resetGame() {boardElement.innerHTML = '';board = [];createBoard();currentPlayer = 'white';
}

我們為開始按鈕添加了一個點擊事件,用于重新開始游戲。點擊該按鈕時,我們會清空棋盤,并重新繪制棋盤,并將當前玩家設置為白色。一起來看一下效果吧。
在這里插入圖片描述

🚀四、總結

本篇文章介紹了如何使用JavaScript開發一個簡單的五子棋游戲。通過繪制棋盤、實現開始按鈕和游戲邏輯、處理用戶交互、判斷勝負和游戲結束等功能,我們完成了一個基本的五子棋游戲。當然,我們還可以對游戲進行優化和擴展,例如增加悔棋功能、提示下一步最佳落子位置等。

JavaScript是一種非常強大和靈活的編程語言,可以用于開發各種類型的應用程序和游戲。希望通過這篇文章,你對使用JavaScript開發游戲有了更深入的了解。如果你對五子棋游戲開發還有任何問題或建議,歡迎在評論區留言討論。謝謝閱讀!
在這里插入圖片描述

今天的內容就到這里,我們下次見。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試熱題(螺旋矩陣)

給你一個 m 行 n 列的矩陣 matrix &#xff0c;請按照 順時針螺旋順序 &#xff0c;返回矩陣中的所有元素 一看到這個大家有沒有想到 就是一個螺旋形狀&#xff0c;那這道題我們應該怎么解決&#xff1f; 我們先來仔細的看&#xff0c;它這種螺旋形狀的遍歷是先【右-下-左-上】…

Docker中Tomcat部署步驟

第一次訪問沒有東西。

為什么我不推薦任何人用C語言作為編程啟蒙第一課?

前言 寫了20多年的代碼&#xff0c;之前做過阿里的高級架構師&#xff0c;在技術這條路上跌跌撞撞了很多&#xff0c;我今天分享一些我個人的自學方法給各位。為什么我會說&#xff1a;不推薦任何人用C語言作為編程啟蒙第一課&#xff1f; 這里有很多同學要站出來說了&#x…

實現CP指令

一、文件的打開創建 #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags); flags: O_RDONLY 只讀 O_WRONLY 只寫 O_RDWR 可讀可寫 int open(const char *pathname, int flags, mode_t mode); 如果 …

VsCode美化 - VsCode自定義 - VsCode自定義背景圖

VsCode美化 - VsCode自定義 - VsCode自定義背景圖&#xff1a;添加二次元老婆圖到VsCode 前言 作為一個二刺螈&#xff0c;VsCode用久了&#xff0c;總覺得少了些什么。是啊&#xff0c;高效的代碼生產工具中怎么能沒有老婆呢&#xff1f; 那就安裝一個VsCode插件把老婆添加…

章節7:Burp Intruder模塊

章節7&#xff1a;Burp Intruder模塊 參考資料 https://portswigger.net/burp/documentation/desktop/tools/intruder 01 Intruder模塊作用與原理 原理 http://xxx.xx.com/bbs/index.php?namewuyanzu&mottogo 對請求參數進行修改&#xff0c;分析響應內容&#xff0…

Linux 內核第一版 (v0.01) 開源代碼解讀

探索Linux v0.01的內部結構&#xff0c;Linux內核經常被認為是一個龐大的開源軟件。在撰寫本文時&#xff0c;最新版本是v6.5-rc5&#xff0c;包含36M行代碼。不用說&#xff0c;Linux是幾十年來許多貢獻者辛勤工作的成果。 Linux 內核首個開源版本 (v0.01) 的體積非常小&…

四、Dubbo擴展點加載機制

四、Dubbo擴展點加載機制 4.1 加載機制概述 Dubbo良好的擴展性與框架中針對不同場景使用合適設計模式、加載機制密不可分 Dubbo幾乎所有功能組件都是基于擴展機制&#xff08;SPI&#xff09;實現的 Dubbo SPI 沒有直接使用 Java SPI&#xff0c;在它思想上進行改進&#xff…

競賽項目 深度學習的視頻多目標跟蹤實現

文章目錄 1 前言2 先上成果3 多目標跟蹤的兩種方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟蹤過程4.1 存在的問題4.2 基于軌跡預測的跟蹤方式 5 訓練代碼6 最后 1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 基于深度學習的視頻多目標跟蹤實現 …

全網最牛,Appium自動化測試框架-關鍵字驅動+數據驅動實戰(二)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 util 包 util 包…

數據可視化工具LightningChart .NET正式發布v10.5.1——擁有全新的3D新功能

LightningChart.NET完全由GPU加速&#xff0c;并且性能經過優化&#xff0c;可用于實時顯示海量數據-超過10億個數據點。 LightningChart包括廣泛的2D&#xff0c;高級3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D餅/甜甜圈&#xff0c;地理地圖和GIS圖表以及適用于科學…

網絡安全專業術語英文縮寫對照表

因在閱讀文獻過程中經常遇到各種專業縮寫&#xff0c;所以把各種縮寫總結了一下。 因能力有限&#xff0c;錯誤在所難免&#xff0c;歡迎進行糾錯與補充&#xff1a;https://github.com/piaolin/CSAbbr 滲透相關 縮寫全稱解釋備注XSSCross Site Script Attack跨站腳本攻擊為…

ResNet創新點總結

ResNet&#xff08;Residual Networks&#xff09;是深度學習中的一個重要架構&#xff0c;其創新點主要體現在解決了深層神經網絡訓練中的梯度消失和梯度爆炸問題&#xff0c;從而使得可以構建更深的神經網絡。以下是 ResNet 的創新點總結&#xff1a; ??1. 殘差連接&#x…

nlohmann json:通過items遍歷object/array

//官方的例子 #include <iostream> #include <nlohmann/json.hpp>using json = nlohmann::json;int main() {// create JSON valuesjson j_object = {{"one", 1}, {"two", 2}};json j_array = {1, 2, 4, 8, 16};// example for an objectfor (…

java畢業設計-智慧食堂管理系統-內容快覽

首頁 智慧食堂管理系統是一種可以提高食堂運營效率的管理系統。它將前端代碼使用Vue實現&#xff0c;后端使用Spring Boot實現。這個系統的目的是簡化食堂管理&#xff0c;提高食堂服務質量。在現代快節奏的生活中&#xff0c;人們對餐飲服務提出了更高的要求&#xff0c;食堂管…

Flink-間隔聯結

間隔聯結只支持事件時間間隔聯結如果遇到遲到數據&#xff0c;則會關聯不上&#xff0c;比如來了一個5秒的數據&#xff0c;它可以關聯前2秒的數據&#xff0c;后3秒的數據&#xff0c;就是可以關聯3秒到8秒的數據&#xff0c;然后又來了一個6秒的數據&#xff0c;可以關聯4秒到…

Docker安裝elasticsearch分布式搜索

文章目錄 ??安裝elasticsearch??1.部署單點es&#x1f338;1.1.創建網絡&#x1f338;1.2.下載鏡像&#x1f338;1.3.運行 ??2.部署kibana&#x1f338;2.1.部署&#x1f338;2.2.DevTools ??3.安裝IK分詞器&#x1f338;3.1.在線安裝ik插件&#xff08;較慢&#xff0…

Rx.NET in Action 中文介紹 前言及序言

Rx 處理器目錄 (Catalog of Rx operators) 目標可選方式Rx 處理器(Operator)創建 Observable Creating Observables直接創建 By explicit logicCreate Defer根據范圍創建 By specificationRangeRepeatGenerateTimerInterval Return使用預設 Predefined primitivesThrow …

答疑:Arduino IDE配置其他開發板下載速度慢

基于案例&#xff1a;Linux環境Arduino IDE中配置ATOM S3 通常&#xff0c;網絡問題較多&#xff0c;可以使用一些技巧。 https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json 沒有配置&#xff0c;不支持M5Stack&#xff08;ESP32&…

HCIA靜態路由與動態路由

目錄 一、靜態路由 定義&#xff1a; 適用環境 二、動態路由 定義&#xff1a; 特點&#xff1a; 動態路由協議: 三、缺點&#xff1a; 1&#xff09;靜態路由缺點: 2&#xff09;動態路由的缺點: 四、靜態路由與動態路由的區別 靜態路由: 動態路由: 一、靜態路…