นี่เป็นเว็บแอปแรกของฉันที่เขียนด้วย JS ฉันต้องการทราบว่าโค้ดสามารถปรับปรุงได้อย่างไรในแง่ของรูปแบบและโครงสร้างโดยเฉพาะอย่างยิ่งในแง่ของการปฏิบัติตามอนุสัญญาของ JS และการวิเคราะห์พฤติกรรมทั่วไป ฉันจะขอบคุณสำหรับการปรับปรุงใด ๆ ที่สามารถทำได้กับ HTML หรือ CSS ของฉัน
var size = 3;
var board = [];
var team = "X"
var running = true;
buildEmptyBoard();
addClickListenerToEachCell();
// Initialise empty board dynamically based on size
function buildEmptyBoard() {
for (let i = 0; i < size; i++) {
board.push([]);
for (let j = 0; j < size; j++)
board[i].push(" ");
}
}
function addClickListenerToEachCell() {
var matches = document.querySelectorAll("#board .row .elem .clickable");
for (let i = 0; i < matches.length; i++)
matches[i].addEventListener("click", dealWithUserMove);
}
function dealWithUserMove(clickable) {
var id = clickable.target.id;
if (isValidMove(id))
makeMove(id);
else
alert("Invalid move");
simpleAIMove();
}
// A very simple AI that just picks the first possible move that's valid
function simpleAIMove() {
if (running) {
for (let i = 0; i < size; i++) {
for (let j = 0; j < size; j++) {
if (board[i][j] == " ") {
makeMove(convertCoordinatesToID(i, j));
return;
}
}
}
}
}
// Given 2 co-ordinates, convert to a string ID that the html will understand
function convertCoordinatesToID(i, j) {
return "r" + i + "c" + j;
}
function isValidMove(id) {
return board[getRowFromID(id)][getColumnFromID(id)] == " ";
}
function makeMove(id) {
updateViewWithMove(id);
updateBoardWithMove(id);
detectGameOver(id);
switchTeam();
}
// If game has finished, clean up and alert the appropriate message
function detectGameOver(id) {
if (isWinner(id)) {
alert("Team " + team + " has won!");
running = false;
removeClickListenerFromEachCell();
}
else if (isStalemate()) {
alert("Game ended in statemate");
running = false;
removeClickListenerFromEachCell();
}
}
function removeClickListenerFromEachCell() {
var matches = document.querySelectorAll("#board .row .elem .clickable");
for (let i = 0; i < matches.length; i++)
matches[i].removeEventListener("click", dealWithUserMove);
}
function isStalemate() {
for (let i = 0; i < size; i++) {
for (let j = 0; j < size; j++) {
if (board[i][j] == " ")
return false;
}
}
return true;
}
// Return true if move resulted in a win
function isWinner(id) {
return isSidewaysWinner(id) || isDiagonalWinner(id);
}
// Return true if move resulted in a vertical or horizontal win
function isSidewaysWinner(id) {
var column = 0;
var row = 0;
for (let i = 0; i < size; i++) {
if (board[getRowFromID(id)][i] == team)
column++;
if (board[i][getColumnFromID(id)] == team)
row++;
}
return row == size || column == size;
}
function isDiagonalWinner(id) {
posGradient = true;
negGradient = true;
for (let i = 1; i < size; i++) {
if (board[i][i] != board[i - 1][i - 1] || board[i - 1][i - 1] == " ")
posGradient = false;
if (board[size - 1 - i][i] != board[size - i][i - 1] || board[size - i][i - 1] == " ")
negGradient = false;
}
return posGradient || negGradient;
}
function switchTeam() {
if (team == "X")
team = "O"
else
team = "X"
}
function updateBoardWithMove(id) {
board[getRowFromID(id)][getColumnFromID(id)] = team;
}
function updateViewWithMove(id) {
var cell = document.querySelector("#board .row .elem #" + id);
cell.innerHTML = team;
cell.style.color = "black";
}
function getRowFromID(id) {
return parseInt(id.charAt(1));
}
function getColumnFromID(id) {
return parseInt(id.charAt(3));
}
#page {
width: 50%;
margin: auto;
font-family: Helvetica-Neue, sans-serif;
}
#board {
text-align: center;
border-collapse: collapse;
border-style: hidden;
pointer-events: none;
table-layout: fixed
}
#board .row {
pointer-events: none;
}
#board .row .elem {
border: 5px solid black;
font-size: 1000%;
pointer-events: none;
}
#board .row .elem .clickable {
pointer-events: all;
color: white;
}
<!DOCTYPE html>
<html lang="en">
<head>
<title>Tic Tac Toe</title>
<meta charset="utfc8">
</head>
<body>
<div id="page">
<table id="board" height="600" width="600">
<tr class="row">
<td class="elem"><span class="clickable" id="r0c0">X</span></td>
<td class="elem"><span class="clickable" id="r0c1">X</span></td>
<td class="elem"><span class="clickable" id="r0c2">X</span></td>
</tr>
<tr class="row">
<td class="elem"><span class="clickable" id="r1c0">X</span></td>
<td class="elem"><span class="clickable" id="r1c1">X</span></td>
<td class="elem"><span class="clickable" id="r1c2">X</span></td>
</tr>
<tr class="row">
<td class="elem"><span class="clickable" id="r2c0">X</span></td>
<td class="elem"><span class="clickable" id="r2c1">X</span></td>
<td class="elem"><span class="clickable" id="r2c2">X</span></td>
</tr>
</table>
</div>
</body>
</html>
โปรแกรมดูมีโครงสร้างที่ดีดังนั้นนี่จะเป็นแบบ nitpicky
function isDiagonalWinner(id) {
posGradient = true;
ตั้งแต่ยังไม่ได้รับการประกาศให้ทุกที่นี้จะถือว่าเป็นในระดับโลกposGradient จะเหมาะกับคุณเป็นอย่างดีที่นี่window['posGradient']let
var matches = document.querySelectorAll("#board .row .elem .clickable");
คุณค่าของmatchesไม่เคยเปลี่ยนแปลง การใช้constที่นี่จะบ่งบอกถึงสิ่งนี้
var column = 0;
letเป็นคำหลักที่ทันสมัยกว่าสำหรับการประกาศตัวแปรที่อยู่ในขอบเขตบล็อกแทนที่จะเป็นขอบเขตฟังก์ชัน สำหรับ vaiables ในพื้นที่มักจะเป็นไปตามที่คุณต้องการ โปรดทราบว่ามันไม่ได้สร้างความแตกต่างที่นี่ แต่สามารถทำได้เมื่อเกี่ยวข้องกับการโทรกลับ
Jana Duggar เปิดใจเกี่ยวกับการค้นหาความรักของเธอ นี่คือทุกสิ่งที่เธอพูดเกี่ยวกับหัวข้อและกรอบเวลา 5 ปีสำหรับการแต่งงาน
เมื่อเร็ว ๆ นี้ แซม ฮิวแฮน นักแสดงจากเรื่อง 'Outlander' ได้เปิดเผยสิ่งที่เขาจะทำจากกองถ่ายเพื่อระลึกถึงเจมี เฟรเซอร์ บทบาทที่ทำให้เขากลายเป็นดารา
'She Loves You' เขียนขึ้นในหนึ่งชั่วโมง บันทึกเสียงในหนึ่งวัน และเป็นเพลงของ The Beatles ที่มีการแสดงที่ดีที่สุดเพลงหนึ่งในอาชีพของพวกเขา
Dolly Parton และคุณย่า Bessie มีความสัมพันธ์พิเศษ คุณยายพาร์ตันป่วยหนัก แต่นั่นไม่ได้ทำให้ดอลลี่หยุดแกล้งเธอ
คุณอาจคิดว่าไม้โอ๊คหรือฮิคคอรีเป็นไม้ที่แข็ง แต่เมื่อต้องพูดถึงไม้ที่แข็งที่สุดในโลกแล้ว พวกมันกลับไม่ใกล้เคียงเลย
มหาสมุทรเต็มไปด้วยความงาม แต่ก็ซ่อนสิ่งมีชีวิตใต้ท้องทะเลที่น่ากลัวที่สุดบางชนิดไว้เช่นกัน สัตว์เหล่านี้หลายชนิดซ่อนตัวอยู่ใต้ผิวน้ำอันมืดมิด ในโลกใต้ทะเลลึกอันแสนกดดันและมืดมิด
หากคุณกำลังต่อสู้กับศัตรูหรือกำลังเตรียมตัวสำหรับโหมด PvP การรู้ถึงการเสริมพลังดาบที่ดีที่สุดใน Minecraft จะช่วยให้คุณได้เปรียบอย่างมาก การเสริมพลังดาบจะช่วยให้คุณสร้างความเสียหายได้มากขึ้น เพิ่มจำนวนม็อบที่ดรอป และเพิ่มความทนทานของดาบ
เมื่อผู้คนพูดถึงประเทศสังคมนิยม พวกเขามักจะนึกถึงการควบคุมโดยรัฐบาลอย่างเต็มรูปแบบโดยไม่มีกรรมสิทธิ์ส่วนบุคคล แต่ในทางปฏิบัติ เศรษฐกิจแบบสังคมนิยมมีความหลากหลายอย่างมาก
“เด็ก” โผล่รับเชิญดาราดังพร้อมข่าวร้าย
RAV4 นี้อ้างว่าอยู่ในสภาพที่ดีเยี่ยมและมีไว้สำหรับการเล่นเก้าอี้ดนตรี
ภาพจากโดรนจับภาพนักดับเพลิงที่กำลังพยายามดับไฟ
Eyes of Wakanda เชื่อมโยงโดยตรงกับ MCU พร้อมอัปเดตเกี่ยวกับ X-Men '97, What If..., Daredevil และอีกมากมาย
Ava Gardner แต่งงานกับ Mickey Rooney และ Frank Sintra และเธอยังคบหาดูใจกับดาราฮอลลีวูดอีกหลายคน ต่อไปนี้คือประวัติการออกเดทของ Ava Gardner
จอห์น คลีส แต่งงานกับเจนนิเฟอร์ เวด ภรรยาของเขาในปี 2012 นี่คือทุกสิ่งที่คุณต้องรู้เกี่ยวกับเจนนิเฟอร์ เวด ภรรยาของจอห์น คลีส
Michael C. Hall แต่งงานกับ Morgan Macgregor ภรรยาของเขาตั้งแต่ปี 2016 นี่คือทุกสิ่งที่คุณต้องการทราบเกี่ยวกับภรรยาของ Michael C. Hall
Mena Suvari แต่งงานกับ Michael Hope สามีของเธอมาตั้งแต่ปี 2018 นี่คือทุกสิ่งที่ควรรู้เกี่ยวกับสามีของ Mena Suvari
มันทำให้ฉันประหลาดใจ ทันใดนั้นมันก็เกิดขึ้นบ่อยๆ มันอยู่กลางทางอีกครั้ง <ไม่ ไม่ใช่คนในมหาสมุทรแปซิฟิก คุณเป็นสีน้ำตาลแดง คนที่งานคาร์นิวัล> ทุกพาดหัวข่าวดัง…..
ในปี 2022 ด้วยการเปิดตัว GPT-3 ทักษะการเขียนดูเหมือนจะมีความสำคัญน้อยลง ด้วย AI คนที่เขียนไม่ดีก็สามารถสร้างพนักงานที่มีคุณภาพได้เช่นกัน
ในโลกที่เปลี่ยนแปลงอย่างรวดเร็วและการแข่งขันในปัจจุบัน อาชีพของคนๆ หนึ่งมีบทบาทสำคัญในการเติบโตส่วนบุคคล ความมั่นคงทางการเงิน และความพึงพอใจในชีวิตโดยรวม อย่างไรก็ตาม ผู้คนจำนวนมากพบว่าตัวเองติดอยู่ในวงจรของความเมื่อยล้าและความไม่พอใจอย่างไม่หยุดยั้ง ค่อยๆ สูญเสียชีวิตการทำงานไป
เมื่อสัปดาห์ที่แล้วฉันสังเกตเห็นข่าวประชาสัมพันธ์ที่เผยแพร่ผ่าน PressGazette (เว็บไซต์ข่าวของสื่ออังกฤษ) บทความประกาศว่า Acast ซึ่งเป็นบริษัทโฮสติ้งและโฆษณาพอดคาสต์ของ Scandi จะเป็นผู้นำกลุ่มผู้เผยแพร่ "อาจมีอิทธิพลมากที่สุด" ในพอดคาสต์