Added sep-dec and dec-sep serialization multiplayer
parent
fa36199c30
commit
997475e153
67
src/App.jsx
67
src/App.jsx
|
@ -4,7 +4,10 @@ import {
|
||||||
clickHandlerRestart,
|
clickHandlerRestart,
|
||||||
clickHandlerGamemode,
|
clickHandlerGamemode,
|
||||||
clickHandlerReturn,
|
clickHandlerReturn,
|
||||||
|
clickHandlerLoadBoard,
|
||||||
|
clickHandlerCopyClipboard,
|
||||||
} from "./functions";
|
} from "./functions";
|
||||||
|
import { use } from "react";
|
||||||
|
|
||||||
const params = {};
|
const params = {};
|
||||||
|
|
||||||
|
@ -45,6 +48,10 @@ export default function App() {
|
||||||
params.gamemode = gamemode;
|
params.gamemode = gamemode;
|
||||||
params.setGamemode = setGamemode;
|
params.setGamemode = setGamemode;
|
||||||
|
|
||||||
|
const [turnsMem, setTurnsMem] = useState("");
|
||||||
|
params.turnsMem = turnsMem;
|
||||||
|
params.setTurnsMem = setTurnsMem;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Heading />
|
<Heading />
|
||||||
|
@ -125,15 +132,19 @@ function Board() {
|
||||||
);
|
);
|
||||||
|
|
||||||
const displayMem = params.menu ? "none" : "";
|
const displayMem = params.menu ? "none" : "";
|
||||||
|
const displayState = params.gamemode === 1 ? "none" : "";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="board-outer" style={{ display: displayMem }}>
|
<div className="board-outer" style={{ display: displayMem }}>
|
||||||
<div className="board-inner">
|
<div className="board-inner">
|
||||||
{fields.map((subarr) => subarr.map((field) => field))}
|
{fields.map((subarr) => subarr.map((field) => field))}
|
||||||
</div>
|
</div>
|
||||||
<Return />
|
<BoardState display={displayState} />
|
||||||
<br />
|
<br />
|
||||||
<Restart />
|
<div className="action-bar">
|
||||||
|
<Return />
|
||||||
|
<Restart />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -196,3 +207,55 @@ function Heading() {
|
||||||
</h1>
|
</h1>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function BoardState({ display }) {
|
||||||
|
const [boardDecimal, setBoardDecimal] = useState("");
|
||||||
|
params.boardDecimal = boardDecimal;
|
||||||
|
params.setBoardDecimal = setBoardDecimal;
|
||||||
|
|
||||||
|
const [inputDecimal, setInputDecimal] = useState("");
|
||||||
|
params.setInputDecimal = setInputDecimal;
|
||||||
|
|
||||||
|
const [showCopy, setShowCopy] = useState(false);
|
||||||
|
params.setShowCopy = setShowCopy;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div style={{ display: display }}>
|
||||||
|
<div className="board-state">
|
||||||
|
<div className="field-div">
|
||||||
|
<button
|
||||||
|
className="inner-button"
|
||||||
|
onClick={() => {
|
||||||
|
clickHandlerCopyClipboard(params);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
state
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
className="board-rw"
|
||||||
|
id="1"
|
||||||
|
type="text"
|
||||||
|
readOnly={true}
|
||||||
|
value={showCopy ? "copied to clipboard!" : boardDecimal}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="board-state">
|
||||||
|
<div className="field-div">
|
||||||
|
<button
|
||||||
|
className="inner-button"
|
||||||
|
onClick={() => clickHandlerLoadBoard(params, inputDecimal)}
|
||||||
|
>
|
||||||
|
load
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
className="board-rw"
|
||||||
|
type="text"
|
||||||
|
value={inputDecimal}
|
||||||
|
onChange={(i) => setInputDecimal(i.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -144,18 +144,17 @@ export async function clickHandlerTurn(params, col) {
|
||||||
params.setOutlineBoard
|
params.setOutlineBoard
|
||||||
);
|
);
|
||||||
|
|
||||||
|
await params.setTurnsMem(col + params.turnsMem);
|
||||||
await params.setTurns(params.turns + 1);
|
await params.setTurns(params.turns + 1);
|
||||||
|
|
||||||
if (win) {
|
if (win) {
|
||||||
const mem = i === 1 ? "bot " : "player ";
|
const mem = i === 1 ? "bot " : "player ";
|
||||||
await params.setMessage(mem + memCurrentPlayer + " wins!");
|
await params.setMessage(mem + memCurrentPlayer + " wins!");
|
||||||
await params.setGameOver(true);
|
await params.setGameOver(true);
|
||||||
await params.setCurrentPlayer("red");
|
|
||||||
break;
|
break;
|
||||||
} else if (params.turns === 42) {
|
} else if (params.turns === 42) {
|
||||||
await params.setMessage("draw!");
|
await params.setMessage("draw!");
|
||||||
await params.setGameOver(true);
|
await params.setGameOver(true);
|
||||||
await params.setCurrentPlayer("red");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -163,30 +162,90 @@ export async function clickHandlerTurn(params, col) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params.gamemode === 2) {
|
||||||
|
await params.setBoardDecimal(sepToDec(params.turnsMem).toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function clickHandlerRestart(params) {
|
export async function clickHandlerRestart(params) {
|
||||||
params.setTurns(0);
|
await params.setTurns(0);
|
||||||
params.setGameOver(false);
|
await params.setGameOver(false);
|
||||||
params.setColorBoard(Array.from(Array(6), () => new Array(7).fill("white")));
|
await params.setCurrentPlayer("red");
|
||||||
params.setOutlineBoard(
|
await params.setColorBoard(
|
||||||
|
Array.from(Array(6), () => new Array(7).fill("white"))
|
||||||
|
);
|
||||||
|
await params.setOutlineBoard(
|
||||||
Array.from(Array(6), () => new Array(7).fill("0px solid black"))
|
Array.from(Array(6), () => new Array(7).fill("0px solid black"))
|
||||||
);
|
);
|
||||||
params.setMessage("");
|
await params.setMessage("");
|
||||||
|
await params.setTurnsMem("");
|
||||||
|
await params.setBoardDecimal("");
|
||||||
|
await params.setInputDecimal("");
|
||||||
}
|
}
|
||||||
|
|
||||||
export function clickHandlerGamemode(params, gamemode) {
|
export async function clickHandlerGamemode(params, gamemode) {
|
||||||
params.setMenu(false);
|
await params.setMenu(false);
|
||||||
params.setGamemode(gamemode);
|
await params.setGamemode(gamemode);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function clickHandlerReturn(params) {
|
export async function clickHandlerReturn(params) {
|
||||||
params.setMenu(true);
|
await params.setMenu(true);
|
||||||
params.setTurns(0);
|
await params.setTurns(0);
|
||||||
params.setGameOver(false);
|
await params.setGameOver(false);
|
||||||
params.setColorBoard(Array.from(Array(6), () => new Array(7).fill("white")));
|
await params.setCurrentPlayer("red");
|
||||||
params.setOutlineBoard(
|
await params.setColorBoard(
|
||||||
|
Array.from(Array(6), () => new Array(7).fill("white"))
|
||||||
|
);
|
||||||
|
await params.setOutlineBoard(
|
||||||
Array.from(Array(6), () => new Array(7).fill("0px solid black"))
|
Array.from(Array(6), () => new Array(7).fill("0px solid black"))
|
||||||
);
|
);
|
||||||
params.setMessage("");
|
await params.setMessage("");
|
||||||
|
await params.setTurnsMem("");
|
||||||
|
await params.setBoardDecimal("");
|
||||||
|
await params.setInputDecimal("");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function clickHandlerLoadBoard(params, dec) {
|
||||||
|
let sep = decToSep(dec);
|
||||||
|
await clickHandlerRestart(params);
|
||||||
|
|
||||||
|
while (sep.length) {
|
||||||
|
await clickHandlerTurn(params, sep[sep.length - 1]);
|
||||||
|
sep = sep.slice(0, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function clickHandlerCopyClipboard(params) {
|
||||||
|
navigator.clipboard.writeText(params.boardDecimal);
|
||||||
|
params.setShowCopy(true);
|
||||||
|
setTimeout(() => {
|
||||||
|
params.setShowCopy(false);
|
||||||
|
}, 1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sepToDec(sep) {
|
||||||
|
let res = 0n;
|
||||||
|
let ind = 0n;
|
||||||
|
let mem = sep.split("").reverse().join("");
|
||||||
|
while (ind < mem.length) {
|
||||||
|
res = BigInt(7n ** ind * BigInt(mem[ind])) + res;
|
||||||
|
ind++;
|
||||||
|
}
|
||||||
|
res = BigInt(7n ** ind) + res;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function decToSep(dec) {
|
||||||
|
let mem = BigInt(dec);
|
||||||
|
let res = "";
|
||||||
|
|
||||||
|
while (mem > 0n) {
|
||||||
|
res = (mem % 7n).toString() + res;
|
||||||
|
mem = mem / 7n;
|
||||||
|
}
|
||||||
|
res = res.slice(1, res.length);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,13 +32,13 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.inner-button {
|
.inner-button {
|
||||||
width: 100px;
|
width: 17%;
|
||||||
height: 60px;
|
height: 60px;
|
||||||
font-size: larger;
|
font-size: larger;
|
||||||
border: 3px solid black;
|
border: 3px solid black;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
margin-bottom: 30px;
|
margin-left: 3%;
|
||||||
|
margin-right: 3%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#restart{
|
#restart{
|
||||||
|
@ -50,6 +50,23 @@ body {
|
||||||
background-color: lightgray;
|
background-color: lightgray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#board-load-button{
|
||||||
|
margin-left: 16.1%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-box .inner-button{
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.board-state .inner-button:disabled{
|
||||||
|
margin-left: 16.1%;
|
||||||
|
color: black;
|
||||||
|
background-color: lightgray;
|
||||||
|
border-color: black;
|
||||||
|
cursor: not-allowed ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.gamemode-div {
|
.gamemode-div {
|
||||||
|
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
|
@ -57,7 +74,6 @@ body {
|
||||||
width: 300px;
|
width: 300px;
|
||||||
height: 202px;
|
height: 202px;
|
||||||
border: 5px solid black;
|
border: 5px solid black;
|
||||||
|
|
||||||
background-color: blue;
|
background-color: blue;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -86,4 +102,42 @@ body {
|
||||||
|
|
||||||
.heading:hover{
|
.heading:hover{
|
||||||
font-size:3em;
|
font-size:3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.board-rw{
|
||||||
|
height: 40px;
|
||||||
|
width: 60%;
|
||||||
|
border: 3px solid black;
|
||||||
|
font-size: large;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.board-state{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 90%;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-bar{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.board-state .inner-button{
|
||||||
|
width: 100px;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field-div{
|
||||||
|
width: 20%;
|
||||||
|
margin-left: auto;
|
||||||
}
|
}
|
Loading…
Reference in New Issue