From d49dc48d1e238035606ed7a374159ea0f4d3aca0 Mon Sep 17 00:00:00 2001 From: skyrunner360 Date: Sat, 13 Apr 2024 21:13:23 +0530 Subject: [PATCH] feat: :sparkles: Basic Game Logic Working --- bun.lockb | Bin 77943 -> 108860 bytes package.json | 7 +++- postcss.config.js | 6 +++ src/App.css | 42 -------------------- src/App.tsx | 43 ++++++++------------ src/Components/Board.tsx | 7 ++++ src/Components/Dice.tsx | 67 ++++++++++++++++++++++++++++++++ src/Components/PlayerInfo.tsx | 23 +++++++++++ src/Utils/index.tsx | 21 ++++++++++ src/index.css | 71 ++-------------------------------- src/main.tsx | 19 +++++---- src/states/BoardStates.ts | 32 +++++++++++++++ src/states/DiceStates.ts | 6 +++ tailwind.config.js | 8 ++++ 14 files changed, 206 insertions(+), 146 deletions(-) create mode 100644 postcss.config.js create mode 100644 src/Components/Board.tsx create mode 100644 src/Components/Dice.tsx create mode 100644 src/Components/PlayerInfo.tsx create mode 100644 src/Utils/index.tsx create mode 100644 src/states/BoardStates.ts create mode 100644 src/states/DiceStates.ts create mode 100644 tailwind.config.js diff --git a/bun.lockb b/bun.lockb index ba3c7a3cf79ae1c0eb07ee5e6d2e8beaf156f8f5..ca330bdb002bbd31c1db9217f2f3b16fc7a513d6 100755 GIT binary patch delta 32654 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
Be#Ugh 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 delta 13895 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 diff --git a/package.json b/package.json index 058ce8c..c2c82cb 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ }, "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-icons": "^5.0.1", + "recoil": "^0.7.7" }, "devDependencies": { "@types/react": "^18.2.66", @@ -19,9 +21,12 @@ "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", "typescript": "^5.2.2", "vite": "^5.2.0" } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.css b/src/App.css index b9d355d..e69de29 100644 --- a/src/App.css +++ b/src/App.css @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/App.tsx b/src/App.tsx index afe48ac..e2b60e6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,35 +1,24 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +import { useState } from "react"; +import PlayerInfo from "./Components/PlayerInfo"; +import Board from "./Components/Board"; +import Dice from "./Components/Dice"; function App() { - const [count, setCount] = useState(0) - return ( <> - -

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

+
+
+ +
+
+ +
+
+ +
-

- Click on the Vite and React logos to learn more -

- ) + ); } -export default App +export default App; diff --git a/src/Components/Board.tsx b/src/Components/Board.tsx new file mode 100644 index 0000000..d0861d5 --- /dev/null +++ b/src/Components/Board.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const Board = () => { + return
Board
; +}; + +export default Board; diff --git a/src/Components/Dice.tsx b/src/Components/Dice.tsx new file mode 100644 index 0000000..58c7b3b --- /dev/null +++ b/src/Components/Dice.tsx @@ -0,0 +1,67 @@ +import React from "react"; +import { useRecoilState } from "recoil"; +import { diceValue } from "../states/DiceStates"; +import { diceRoll, DiceValToIconMap } from "../Utils"; +import { + currentPlayer, + gameLogs, + gameState, + playerPositions, +} from "../states/BoardStates"; + +const Dice = () => { + const [diceVal, setDiceVal] = useRecoilState(diceValue); + const [gameLog, setGameLog] = useRecoilState(gameLogs); + const [currPlayer, setCurrPlayer] = useRecoilState(currentPlayer); + const [playerPos, setPlayerPos] = useRecoilState(playerPositions); + const [gState, setGState] = useRecoilState(gameState); + + const rollDice = () => { + const newVal = diceRoll(); + const newPlayer = currPlayer === 1 ? 2 : 1; + const isPlayerFree = newVal === 6; + setDiceVal(newVal); + setGameLog([ + ...gameLog, + `Player ${currPlayer} Rolled Dice to ${newVal}`, + ...(isPlayerFree ? [`Player ${currPlayer} is Free to Move`] : []), + `Player ${newPlayer}'s Turn`, + ]); + setCurrPlayer(newPlayer); + setPlayerPos({ + player1: + currPlayer === 1 && isPlayerFree && !gState["player1"].move + ? newVal + : gState["player1"].move && currPlayer === 1 + ? playerPos.player1 + newVal + : playerPos.player1, + player2: + currPlayer === 2 && isPlayerFree && !gState["player2"].move + ? newVal + : gState["player2"].move && currPlayer === 2 + ? playerPos.player2 + newVal + : playerPos.player2, + }); + if (isPlayerFree) { + setGState({ ...gState, [`player${currPlayer}`]: { move: true } }); + } else { + setGState({ ...gState, global: "started" }); + } + console.log("Game states", gState); + }; + + return ( +
+
+
+ {DiceValToIconMap[diceVal]} +
+
+
+ Click to Roll Dice +
+
+ ); +}; + +export default Dice; diff --git a/src/Components/PlayerInfo.tsx b/src/Components/PlayerInfo.tsx new file mode 100644 index 0000000..fbf656d --- /dev/null +++ b/src/Components/PlayerInfo.tsx @@ -0,0 +1,23 @@ +import React from "react"; +import { useRecoilState, useRecoilValue } from "recoil"; +import { gameLogs, playerPositions } from "../states/BoardStates"; + +const PlayerInfo = () => { + const [playerPos, setPlayerPos] = useRecoilState(playerPositions); + const gLogs = useRecoilValue(gameLogs); + return ( +
+

Game Logs

+
+ {gLogs?.map((log) => ( +

{log}

+ ))} +
+

Player Positions

+

Player 1 :- {playerPos.player1}

+

Player 2 :- {playerPos.player2}

+
+ ); +}; + +export default PlayerInfo; diff --git a/src/Utils/index.tsx b/src/Utils/index.tsx new file mode 100644 index 0000000..66f2b07 --- /dev/null +++ b/src/Utils/index.tsx @@ -0,0 +1,21 @@ +import { IoDice } from "react-icons/io5"; +import { FaDiceOne } from "react-icons/fa6"; +import { FaDiceTwo } from "react-icons/fa6"; +import { FaDiceThree } from "react-icons/fa6"; +import { FaDiceFour } from "react-icons/fa"; +import { FaDiceFive } from "react-icons/fa"; +import { FaDiceSix } from "react-icons/fa6"; + +export const DiceValToIconMap = { + 0: , + 1: , + 2: , + 3: , + 4: , + 5: , + 6: , +}; + +export const diceRoll = () => { + return Math.trunc(Math.random() * 6 + 1); +}; diff --git a/src/index.css b/src/index.css index 6119ad9..bd6213e 100644 --- a/src/index.css +++ b/src/index.css @@ -1,68 +1,3 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 3d7150d..f9017a8 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,13 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.css' +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.css"; +import { RecoilRoot } from "recoil"; -ReactDOM.createRoot(document.getElementById('root')!).render( +ReactDOM.createRoot(document.getElementById("root")!).render( - - , -) + + + + +); diff --git a/src/states/BoardStates.ts b/src/states/BoardStates.ts new file mode 100644 index 0000000..64406a1 --- /dev/null +++ b/src/states/BoardStates.ts @@ -0,0 +1,32 @@ +import { atom } from "recoil"; + +export const playerPositions = atom({ + key: "playerPositions", + default: { + player1: 0, + player2: 0, + }, +}); + +export const gameLogs = atom({ + key: "gameLogs", + default: ["Player 1 Click Dice to Start Game"], +}); + +export const currentPlayer = atom({ + key: "currentPlayer", + default: 1, +}); + +export const gameState = atom({ + key: "gameState", + default: { + global: "notStarted", // notStarted || started || over + player1: { + move: false, + }, + player2: { + move: false, + }, + }, +}); diff --git a/src/states/DiceStates.ts b/src/states/DiceStates.ts new file mode 100644 index 0000000..9504c12 --- /dev/null +++ b/src/states/DiceStates.ts @@ -0,0 +1,6 @@ +import { atom } from "recoil"; + +export const diceValue = atom({ + key: "diceValue", + default: 0, +}); diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..614c86b --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +};