diff --git a/src/App.jsx b/src/App.jsx
index 0a35ae1..01beac8 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -1,5 +1,5 @@
import { useState } from "react";
-import { clickHandlerTurn, clickHandlerRestart } from "./functions";
+import { clickHandlerTurn, clickHandlerRestart, clickHandlerGamemode } from "./functions";
let params = {};
@@ -22,18 +22,27 @@ export default function App() {
params.message = message;
params.setMessage = setMessage;
- const [turns, setTurns] = useState(1);
+ const [turns, setTurns] = useState(0);
params.turns = turns;
params.setTurns = setTurns;
+ const [menu, setMenu] = useState(true);
+ params.menu = menu;
+ params.setMenu = setMenu;
+
+ const [gamemode, setGamemode] = useState(0);
+ params.gamemode = gamemode;
+ params.setGamemode = setGamemode;
+
return (
<>
CONNECT4
-
-
- {params.message}
+
+ {!params.menu && }
+ {!params.menu && }
+ {!params.menu && {params.message}
}
>
);
}
@@ -76,7 +85,19 @@ function Board() {
}
function Restart() {
- return (< button className="restart" disabled={!params.gameOver} hidden={!params.gameOver} onClick={() => clickHandlerRestart(params)}>
+ return (< button className="restart" hidden={!params.gameOver} onClick={() => clickHandlerRestart(params)}>
↺
);
}
+
+function Gamemode() {
+ return
+
+
+
+
+}
\ No newline at end of file
diff --git a/src/functions.js b/src/functions.js
index 902e4d2..4ea86e6 100644
--- a/src/functions.js
+++ b/src/functions.js
@@ -1,4 +1,4 @@
-export function putChip(
+async function putChip(
col,
colorBoard,
currentPlayer,
@@ -10,14 +10,14 @@ export function putChip(
if (currentPlayer === "red") {
let mem = colorBoard;
mem[row][col] = "red";
- setColorBoard(mem);
- setCurrentPlayer("yellow");
+ await setColorBoard(mem);
+ await setCurrentPlayer("yellow");
return [true, row];
} else {
let mem = colorBoard;
mem[row][col] = "yellow";
- setColorBoard(mem);
- setCurrentPlayer("red");
+ await setColorBoard(mem);
+ await setCurrentPlayer("red");
return [true, row];
}
}
@@ -25,7 +25,7 @@ export function putChip(
return [false, null];
}
-export function checkWin(row, col, colorBoard, currentPlayer) {
+function checkWin(row, col, colorBoard, currentPlayer) {
if (
(row <= 2 &&
colorBoard[row][col] === currentPlayer &&
@@ -78,36 +78,79 @@ export function checkWin(row, col, colorBoard, currentPlayer) {
}
}
-export function clickHandlerTurn(col, params) {
- const [worked, currentChip] = putChip(
- col,
- params.colorBoard,
- params.currentPlayer,
- params.setColorBoard,
- params.setCurrentPlayer
- );
- if (worked) {
- params.setMessage("");
- params.setTurns(params.turns + 1);
-
- const win = checkWin(currentChip, col, params.colorBoard, params.currentPlayer);
-
- if (win) {
- params.setMessage(params.currentPlayer + " wins!");
- params.setGameOver(true);
-
- } else if (params.turns === 42) {
- params.setMessage("draw!");
- params.setGameOver(true);
+function botChoice(colorBoard) {
+ while (true) {
+ const rand = Math.floor(Math.random() * 7)
+ if (colorBoard[0][rand] === "white") {
+ return rand;
}
- } else {
- params.setMessage("column is full!");
}
}
+export async function clickHandlerTurn(col, params) {
+
+ const iMax = params.gamemode === 1 ? 2 : 1;
+
+ for (let i = 0; i < iMax; i++) {
+
+ const memCurrentPlayer = params.currentPlayer;
+
+ const botMove = i !== 0 && botChoice(params.colorBoard);
+
+ const [worked, currentChip] = i === 0 ?
+ await putChip(
+ col,
+ params.colorBoard,
+ params.currentPlayer,
+ params.setColorBoard,
+ params.setCurrentPlayer
+ ) : await putChip(
+ botMove,
+ params.colorBoard,
+ params.currentPlayer,
+ params.setColorBoard,
+ params.setCurrentPlayer
+ );
+
+ if (worked) {
+ await params.setMessage("");
+
+ const actualMove = i === 0 ? col : botMove;
+
+ const win = checkWin(currentChip, actualMove, params.colorBoard, memCurrentPlayer);
+
+ await params.setTurns(params.turns + 1);
+
+ if (win) {
+ const mem = i === 1 ? "bot " : "player ";
+ await params.setMessage(mem + memCurrentPlayer + " wins!");
+ await params.setGameOver(true);
+ await params.setCurrentPlayer("red");
+ break;
+
+ } else if (params.turns === 42) {
+ await params.setMessage("draw!");
+ await params.setGameOver(true);
+ await params.setCurrentPlayer("red")
+ break;
+ }
+ } else {
+ params.setMessage("column is full!");
+ break;
+ }
+ }
+
+
+}
+
export function clickHandlerRestart(params) {
- params.setTurns(1);
+ params.setTurns(0);
params.setGameOver(false);
params.setColorBoard(Array.from(Array(6), () => new Array(7).fill("white")));
params.setMessage("");
}
+
+export function clickHandlerGamemode(params, gamemode) {
+ params.setMenu(false);
+ params.setGamemode(gamemode);
+}
diff --git a/src/index.css b/src/index.css
index 4fa2857..feb60fa 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,6 +1,7 @@
body {
text-align: center;
font-family: Arial, Helvetica, sans-serif;
+ color: black;
}
.board {
@@ -23,9 +24,29 @@ body {
width: 100px;
height: 60px;
font-size: xx-large;
- border: 5px solid black;
- color: white;
- background-color: blue;
+ border: 3px solid black;
+ background-color: white;
margin-top: 20px;
+}
+
+.gamemode-div {
+
+ margin-left: auto;
+ margin-right: auto;
+ width: 300px;
+ height: 202px;
+ border: 5px solid black;
+
+ background-color: blue;
+
+}
+
+.gamemode-div .gamemode-button {
+ margin-top: 34px;
+ border: 3px solid black;
+ width: 50%;
+ height: 50px;
+ font-size: larger;
+
}
\ No newline at end of file