Netbyzz

#A073
4 connect multiplayer Game

HTML :

<!-- CODE = #A073 -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>NETBYZZ A073</title>
    <link rel="preconnect" href="https://fonts.gstatic.com">
	<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@500&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <div id="main-container">

		<div id="player">

			<h1 id="player-type">Player - 1</h1>

		</div>

		<div id="grid">

			<div class="row">

				<div class="col">

					<button class="btn btn-1"></button>

				</div>

				<div class="col">

					<button class="btn btn-2"></button>

				</div>

				<div class="col">

					<button class="btn btn-3"></button>

				</div>

				<div class="col">

					<button class="btn btn-4"></button>

				</div>

				<div class="col">

					<button class="btn btn-5"></button>

				</div>

				<div class="col">

					<button class="btn btn-6"></button>

				</div>

				<div class="col">

					<button class="btn btn-7"></button>

				</div>

			</div>

			<div class="row">

				<div class="col">

					<button class="btn btn-8"></button>

				</div>

				<div class="col">

					<button class="btn btn-9"></button>

				</div>

				<div class="col">

					<button class="btn btn-10"></button>

				</div>

				<div class="col">

					<button class="btn btn-11"></button>

				</div>

				<div class="col">

					<button class="btn btn-12"></button>

				</div>

				<div class="col">

					<button class="btn btn-13"></button>

				</div>

				<div class="col">

					<button class="btn btn-14"></button>

				</div>

			</div>

			<div class="row">

				<div class="col">

					<button class="btn btn-15"></button>

				</div>

				<div class="col">

					<button class="btn btn-16"></button>

				</div>

				<div class="col">

					<button class="btn btn-17"></button>

				</div>

				<div class="col">

					<button class="btn btn-18"></button>

				</div>

				<div class="col">

					<button class="btn btn-19"></button>

				</div>

				<div class="col">

					<button class="btn btn-20"></button>

				</div>

				<div class="col">

					<button class="btn btn-21"></button>

				</div>

			</div>

			<div class="row">

				<div class="col">

					<button class="btn btn-22"></button>

				</div>

				<div class="col">

					<button class="btn btn-23"></button>

				</div>

				<div class="col">

					<button class="btn btn-24"></button>

				</div>

				<div class="col">

					<button class="btn btn-25"></button>

				</div>

				<div class="col">

					<button class="btn btn-26"></button>

				</div>

				<div class="col">

					<button class="btn btn-27"></button>

				</div>

				<div class="col">

					<button class="btn btn-28"></button>

				</div>

			</div>

			<div class="row">

				<div class="col">

					<button class="btn btn-29"></button>

				</div>

				<div class="col">

					<button class="btn btn-30"></button>

				</div>

				<div class="col">

					<button class="btn btn-31"></button>

				</div>

				<div class="col">

					<button class="btn btn-32"></button>

				</div>

				<div class="col">

					<button class="btn btn-33"></button>

				</div>

				<div class="col">

					<button class="btn btn-34"></button>

				</div>

				<div class="col">

					<button class="btn btn-35"></button>

				</div>

			</div>

			<div class="row">

				<div class="col">

					<button class="btn btn-36"></button>

				</div>

				<div class="col">

					<button class="btn btn-37"></button>

				</div>

				<div class="col">

					<button class="btn btn-38"></button>

				</div>

				<div class="col">

					<button class="btn btn-39"></button>

				</div>

				<div class="col">

					<button class="btn btn-40"></button>

				</div>

				<div class="col">

					<button class="btn btn-41"></button>

				</div>

				<div class="col">

					<button class="btn btn-42"></button>

				</div>

			</div>

		</div>

		<button type="button" id="reset-btn">Play Again</button>

	</div>
    <script src="script.js"></script>
  </body>
</html>

CSS :

body {
    background-color: #e9e7fd;
}

/* Main Container */

#main-container {

    align-items: center;
    display: flex;
    flex-direction: column;
    justify-content: center;
    min-height: 100vh;

}

/* Player Details */

#player {

    background-color: #d5deff;
    border: 8px solid #4f3ff0;
    border-radius: 10px;
    margin-top: 50px;
    padding: 20px;
    width: 550px;

}

#player-type {

    color: #4f3ff0;
    font-family: "Poppins";
    letter-spacing: 5px;
    text-align: center;
    text-transform: uppercase;

}

/* Grid */

#grid {

    background-color: #4f3ff0;
    border: 3.5px solid #d5deff;
    border-radius: 8px;
    box-shadow: 2px 3px 7px grey;
    margin-top: 50px;
    max-width: 600px;
    padding: 3px;

}

/* Grid Row */

.row {

    display: flex;

}

/* Grid Column */

.col {

    align-items: center;
    background-color: #d5deff;
    border: 1px solid #4f3ff0;
    border-radius: 5px;
    display: flex;
    justify-content: center;
    height: 75px;
    margin: 5px;
    width: 75px;

}

/* Buttons */

.btn {

    background-color: transparent;
    border: none;
    color: transparent;
    height: 100%;
    padding: 0;
    width: 100%;

}

#reset-btn {

    background-color: transparent;
    border: 2px solid #4f3ff0;
    border-radius: 5px;
    color: #4f3ff0;
    font-family: "Poppins";
    font-size: 1.5rem;
    margin: 50px 0;
    padding: 10px 40px;
    text-transform: uppercase;
    transition: 0.7s;

}

#reset-btn:hover {

    background-color: #4f3ff0;
    color: #d5deff;
    cursor: pointer;
    transition: 0.7s;

}

/* Player - 1 Buttons */

.btn-player-1 {

    background-color: #34c471;
    border: 2px solid #34c471;
    border-radius: 50%;
    color: red;
    height: 50px;
    width: 50px;

}

/* Player - 2 Buttons */

.btn-player-2 {

    background-color: #df3670;
    border: 2px solid #df3670;
    border-radius: 50%;
    color: red;
    height: 50px;
    width: 50px;

}

/* Media Queries */

@media (max-width: 800px) {
    #grid {
        width: 500px;
    }

    .col {
        height: 62px;
        margin: 4px;
        width: 62px;
    }

    #player {
        width: 450px;
    }

    #reset-btn {
        font-size: 1.2rem;
    }

    .btn-player-1 {
        height: 40px;
        width: 40px;
    }

    .btn-player-2 {
        height: 40px;
        width: 40px;
    }
}

@media (max-width: 550px) {
    #grid {
        width: 400px;
    }

    .col {
        height: 50px;
        margin: 3px;
        width: 50px;
    }

    #player {
        width: 350px;
    }

    #reset-btn {
        font-size: 1rem;
    }

    .btn-player-1 {
        height: 30px;
        width: 30px;
    }

    .btn-player-2 {
        height: 30px;
        width: 30px;
    }
}

@media (max-width: 450px) {
    #grid {
        width: 90%;
    }

    .col {
        height: 40px;
        margin: 2px;
    }

    #player {
        align-items: center;
        display: flex;
        border-width: 5px;
        justify-content: center;
        height: 30px;
        width: 78%;
    }

    #player-type {
        font-size: 1.2rem;
    }

    #reset-btn {
        font-size: 0.8rem;
    }

    .btn-player-1 {
        height: 20px;
        width: 20px;
    }

    .btn-player-2 {
        height: 20px;
        width: 20px;
    }
}

JS :

// DOM Variables

var buttons = document.getElementsByClassName("btn");
var reset = document.getElementById("reset-btn");
var playerType = document.getElementById("player-type");

// Game Flow Variables

var playerNumber = 1; // Initially player - 1 gets to start his/her turn

var filledGrid = []; // Player board

var filledCells = 0; // No. of cells that has been filled

for (var i = 0; i < 6; i++) {
  var arr = [-1, -1, -1, -1, -1, -1, -1]; // Board is initialised with -1
  filledGrid.push(arr);
}

// Event Listener for Buttons

reset.addEventListener("click", function () {
  resetBoard();
});

for (var i = 0; i < buttons.length; i++) {
  // Handing the Event when button was clicked

  buttons[i].addEventListener("click", function () {
    // Make move and disable the button to avoid furthur clicking it again

    var buttonNo = this.classList[1];
    makeMove(this, buttonNo.slice(4));
  });
}

// Function to Make Move on the passed button and disable it
function makeMove(button, buttonNo) {
  var row =
    buttonNo % 7 === 0
      ? Math.floor(buttonNo / 7) - 1
      : Math.floor(buttonNo / 7);
  var col = buttonNo % 7 === 0 ? 6 : (buttonNo % 7) - 1;

  if (playerNumber === 1) {
    button.classList.add("btn-player-1");

    filledGrid[row][col] = 1;
    filledCells++;

    if (playerWon(row, col, 1) === true) {
      setTimeout(function () {
        alert("Game Over: Green Wins");
        resetBoard();
      }, 200);
    }

    // Update the player
    playerNumber = 2;
    playerType.textContent = "Player - 2";
  } else {
    button.classList.add("btn-player-2");

    filledGrid[row][col] = 2;
    filledCells++;

    if (playerWon(row, col, 2) === true) {
      setTimeout(function () {
        alert("Game Over : Red Wins");
        resetBoard();
      }, 200);
    }

    // Update the player
    playerNumber = 1;
    playerType.textContent = "Player - 1";
  }

  // If all the cells has been filled

  if (filledCells === 42) {
    setTimeout(function () {
      alert("Game Draw");
      resetBoard();
    }, 200);
    return;
  }

  // Disable the button is the move is made
  setTimeout(function () {
    button.disabled = true;
  }, 10);
}

function playerWon(row, col, player) {
  var count = 0;

  // Check for columns

  for (var i = 0; i < 7; i++) {
    if (filledGrid[row][i] === player) {
      count++;
      if (count === 4) return true;
    } else {
      count = 0;
    }
  }

  count = 0;

  // Check for Rows

  for (var i = 0; i < 6; i++) {
    if (filledGrid[i][col] === player) {
      count++;
      if (count === 4) return true;
    } else {
      count = 0;
    }
  }

  count = 0;

  // Check for primary diagonal

  if (row >= col) {
    var i = row - col;
    var j = 0;

    for (; i <= 5; i++, j++) {
      if (filledGrid[i][j] === player) {
        count++;
        if (count == 4) return true;
      } else {
        count = 0;
      }
    }
  } else {
    var i = 0;
    var j = col - row;

    for (; j <= 6; i++, j++) {
      if (filledGrid[i][j] === player) {
        count++;
        if (count == 4) return true;
      } else {
        count = 0;
      }
    }
  }

  count = 0;

  // Check for secondary diagonal

  if (row + col <= 5) {
    var i = row + col;
    var j = 0;

    for (; i >= 0 && j <= row + col; i--, j++) {
      if (filledGrid[i][j] === player) {
        count++;
        if (count == 4) return true;
      } else {
        count = 0;
      }
    }
  } else {
    var i = 5;
    var j = row + col - 5;

    for (; j <= 6; j++, i--) {
      if (filledGrid[i][j] === player) {
        count++;
        if (count == 4) return true;
      } else {
        count = 0;
      }
    }
  }
  return false;
}

// Function to reset the Board completely
function resetBoard() {
  // Remove all the disabled buttons and the styles

  for (var i = 0; i < buttons.length; i++) {
    buttons[i].disabled = false;
    buttons[i].classList.remove("btn-player-1");
    buttons[i].classList.remove("btn-player-2");
  }

  // Player Number is changed to 1

  playerNumber = 1;
  playerType.textContent = "Player - 1";

  // Filled Cells is changed to 0

  filledCells = 0;

  // Filling the Board with -1

  for (var i = 0; i < 6; i++) {
    for (var j = 0; j < 7; j++) {
      filledGrid[i][j] = -1;
    }
  }
}
 

Source Code