Finished i guess?
This commit is contained in:
parent
b6c04bdc54
commit
c63786d516
|
@ -3,6 +3,7 @@
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
}
|
}
|
||||||
|
@ -11,3 +12,15 @@ h1 {
|
||||||
color: white;
|
color: white;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.refresh-button {
|
||||||
|
--color: #ffee33;
|
||||||
|
background-color: transparent;
|
||||||
|
font-size: 40px;
|
||||||
|
color: var(--color);
|
||||||
|
border: none;
|
||||||
|
margin: 5px;
|
||||||
|
aspect-ratio: 1;
|
||||||
|
height: 70px;
|
||||||
|
transition: 0.15s;
|
||||||
|
}
|
|
@ -3,17 +3,83 @@ import { VALUE } from "../Button/Button";
|
||||||
import { Board } from "../Board/Board";
|
import { Board } from "../Board/Board";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
|
export const MESSAGE = {
|
||||||
|
IN_GAME: 0,
|
||||||
|
WIN: 1,
|
||||||
|
DRAW: 2,
|
||||||
|
};
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
const [nextValue, setNextValue] = useState(VALUE.X);
|
const [nextValue, setNextValue] = useState(VALUE.X);
|
||||||
|
const [winner, setWinner] = useState(null);
|
||||||
|
const [values, setValues] = useState(Array(9).fill(VALUE.EMPTY));
|
||||||
|
const inGameMessage = ["Turn of ", nextValue];
|
||||||
|
const drawMessage = "It's a draw";
|
||||||
|
const winMessage = ["The winner is ", winner];
|
||||||
|
const message = winner
|
||||||
|
? winner === "Draw"
|
||||||
|
? drawMessage
|
||||||
|
: winMessage
|
||||||
|
: inGameMessage;
|
||||||
|
|
||||||
|
function handleClick(i) {
|
||||||
|
if (!winner) {
|
||||||
|
if (values[i] === VALUE.EMPTY) {
|
||||||
|
let newValues = values.slice();
|
||||||
|
newValues[i] = nextValue;
|
||||||
|
setValues(newValues);
|
||||||
|
let winner = calculateWinner(newValues);
|
||||||
|
if (winner) {
|
||||||
|
setWinner(winner);
|
||||||
|
} else if (newValues.filter((v) => v === VALUE.EMPTY).length === 0) {
|
||||||
|
setWinner("Draw");
|
||||||
|
}
|
||||||
|
alternateNextValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function newGame() {
|
||||||
|
setNextValue(VALUE.X);
|
||||||
|
setWinner(null);
|
||||||
|
setValues(Array(9).fill(VALUE.EMPTY));
|
||||||
|
}
|
||||||
|
|
||||||
function alternateNextValue() {
|
function alternateNextValue() {
|
||||||
setNextValue(nextValue === VALUE.X ? VALUE.O : VALUE.X);
|
setNextValue(nextValue === VALUE.X ? VALUE.O : VALUE.X);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="center">
|
<div className="center">
|
||||||
<h1>Turn of {nextValue}</h1>
|
<h1>{message}</h1>
|
||||||
<Board nextValue={nextValue} onBoardClick={alternateNextValue} />
|
<Board nextValue={nextValue} handleClick={handleClick} values={values} />
|
||||||
|
<button className="refresh-button" onClick={newGame}>
|
||||||
|
<i className="icon-refresh"></i>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function calculateWinner(values) {
|
||||||
|
const lines = [
|
||||||
|
[0, 1, 2],
|
||||||
|
[3, 4, 5],
|
||||||
|
[6, 7, 8],
|
||||||
|
[0, 3, 6],
|
||||||
|
[1, 4, 7],
|
||||||
|
[2, 5, 8],
|
||||||
|
[0, 4, 8],
|
||||||
|
[2, 4, 6],
|
||||||
|
];
|
||||||
|
|
||||||
|
let line = lines.find(
|
||||||
|
([a, b, c]) =>
|
||||||
|
values[a] === values[b] &&
|
||||||
|
values[b] === values[c] &&
|
||||||
|
values[a] !== VALUE.EMPTY
|
||||||
|
);
|
||||||
|
let winner = line ? values[line[0]] : null;
|
||||||
|
return winner;
|
||||||
|
}
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|
|
@ -1,27 +1,7 @@
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { Button, VALUE } from "../Button/Button";
|
import { Button, VALUE } from "../Button/Button";
|
||||||
|
|
||||||
export function Board({ onBoardClick, nextValue }) {
|
export function Board({ handleClick, values }) {
|
||||||
const [values, setValues] = useState([
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
VALUE.EMPTY,
|
|
||||||
]);
|
|
||||||
|
|
||||||
function handleClick(i) {
|
|
||||||
if (values[i] === VALUE.EMPTY) {
|
|
||||||
let newValues = values.slice();
|
|
||||||
newValues[i] = nextValue;
|
|
||||||
setValues(newValues);
|
|
||||||
onBoardClick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
.board-button {
|
.board-button {
|
||||||
|
--color: #edfffd;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border: 7px solid #00ffdd;
|
border: 7px solid var(--color);
|
||||||
font-size: 40px;
|
font-size: 40px;
|
||||||
color: #00ffdd;
|
color: var(--color);
|
||||||
border-radius: 25px;
|
border-radius: 25px;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
|
@ -11,5 +12,14 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.board-button:hover {
|
.board-button:hover {
|
||||||
box-shadow: #00ffdd 0px 4px 20px;
|
box-shadow: var(--color) 0px 4px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.board-button.button-x {
|
||||||
|
--color: #ff66ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.board-button.button-o {
|
||||||
|
--color: #00ffdd;
|
||||||
|
}
|
||||||
|
/* #00ffdd */
|
|
@ -7,8 +7,17 @@ export const VALUE = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export function Button({ value, onButtonClick }) {
|
export function Button({ value, onButtonClick }) {
|
||||||
|
let colorClass = "";
|
||||||
|
switch (value) {
|
||||||
|
case VALUE.X:
|
||||||
|
colorClass = "button-x";
|
||||||
|
break;
|
||||||
|
case VALUE.O:
|
||||||
|
colorClass = "button-o";
|
||||||
|
break;
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<button className="board-button" onClick={onButtonClick}>
|
<button className={"board-button " + colorClass} onClick={onButtonClick}>
|
||||||
{value}
|
{value}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue