Эх сурвалжийг харах

Number of rounds can now be chosen

Kirk Trombley 5 жил өмнө
parent
commit
461bdb03fb

+ 1 - 2
README.md

@@ -18,6 +18,7 @@ GET /
 PUT /game
     Accepts {
         "timer": number
+        "rounds": number
     }
     Returns 200 and {
         "gameId": string
@@ -85,8 +86,6 @@ POST /game/{ID}/guesses/{round}
 - Improve MapCrunch logic to distribute countries
 - Asynchronously generate locations, allowing game creation to appear faster
 - Update UI to create game without providing a name
-- Genericize number of rounds in API
-- Change UI to allow round number setting
 - Error handling in UI
 - Re-join a game you did not finish
 - Optimize docker file or set up compose structure

+ 11 - 1
client/src/components/screens/PreGame/NewGameInput.jsx

@@ -50,7 +50,7 @@ const DropdownItem = styled.div`
   }
 `
 
-export default ({ onCreateGame, cannotCreateGame, timer, setTimer }) => (
+export default ({ onCreateGame, cannotCreateGame, timer, setTimer, rounds, setRounds }) => (
   <Container>
     <Dropdown>
       <DropdownButton>
@@ -62,6 +62,16 @@ export default ({ onCreateGame, cannotCreateGame, timer, setTimer }) => (
         <DropdownItem onClick={() => setTimer(3600)}>1 Hour</DropdownItem>
       </DropdownList>
     </Dropdown>
+    <Dropdown>
+      <DropdownButton>
+        Rounds: {rounds}
+      </DropdownButton>
+      <DropdownList>
+        <DropdownItem onClick={() => setRounds(1)}>1 Round</DropdownItem>
+        <DropdownItem onClick={() => setRounds(5)}>5 Rounds</DropdownItem>
+        <DropdownItem onClick={() => setRounds(10)}>10 Rounds</DropdownItem>
+      </DropdownList>
+    </Dropdown>
     <Button onClick={onCreateGame} disabled={cannotCreateGame}>
       Create New Game
     </Button>

+ 3 - 2
client/src/components/screens/PreGame/PreGame.jsx

@@ -34,6 +34,7 @@ export default () => {
   const [loading, setLoading] = useState(false);
   const playerName = usePlayerName();
   const [timer, setTimer] = useState(300);
+  const [rounds, setRounds] = useState(5);
 
   if (loading) {
     return <Loading/>
@@ -41,7 +42,7 @@ export default () => {
 
   const onCreateGame = async () => {
     setLoading(true);
-    await dispatch.createGame(timer);
+    await dispatch.createGame(timer, rounds);
   };
   const cannotCreateGame = !playerName || playerName.length === 0;
 
@@ -50,7 +51,7 @@ export default () => {
       <Container>
         <PlayerNameInput/>
         <Divider/>
-        <NewGameInput {...{ onCreateGame, cannotCreateGame, timer, setTimer }} />
+        <NewGameInput {...{ onCreateGame, cannotCreateGame, timer, setTimer, rounds, setRounds }} />
       </Container>
     </HeaderAndFooter>
   );

+ 2 - 2
client/src/domain/apiMethods.js

@@ -12,13 +12,13 @@ export const getStatus = async () => {
     }
 }
 
-export const createGame = async (timer) => {
+export const createGame = async (timer, rounds) => {
     const res = await fetch(`${API_BASE}/game`, {
         method: "PUT",
         headers: {
             "Content-Type": "application/json",
         },
-        body: JSON.stringify({ timer }),
+        body: JSON.stringify({ timer, rounds }),
     });
     if (!res.ok) {
         throw Error(res.statusText);

+ 2 - 2
client/src/domain/gameStore.js

@@ -30,8 +30,8 @@ export const [
 }, {
   setPlayerName: ([set], playerName) => set({ playerName }),
   goToLobby: ([set], gameId) => set({ gameId, gameState: PRE_ROUND }),
-  createGame: async ([set, get], timer) => {
-    const gameId = await createGame(timer);
+  createGame: async ([set, get], timer, rounds) => {
+    const gameId = await createGame(timer, rounds);
     const name = get.playerName();
     const { playerId } = await joinGame(gameId, name);
     set({ gameId, gameJoined: true, playerId, gameState: PRE_ROUND });

+ 1 - 1
server/db.py

@@ -16,7 +16,7 @@ class Game(db.Model):
     players = db.relationship("Player", lazy=True)
 
     @staticmethod
-    def create(timer, rounds=5):
+    def create(timer, rounds):
         game_id = str(uuid.uuid4())
         while Game.query.get(game_id) is not None:
             # basically impossible collision, but let's be safe

+ 5 - 1
server/game_api.py

@@ -33,7 +33,11 @@ def create_game():
     if not isinstance(timer, int) or timer <= 0:
         abort(400)
 
-    new_game = db.Game.create(timer)
+    rounds = request.json.get("rounds", None)
+    if not isinstance(rounds, int) or rounds <= 0:
+        abort(400)
+
+    new_game = db.Game.create(timer, rounds)
 
     return jsonify({"gameId": new_game.game_id})