diff --git a/Backend/src/main/java/hsrt/VSundSOA/backendapi/gameInstance/GameController.java b/Backend/src/main/java/hsrt/VSundSOA/backendapi/gameInstance/GameController.java index 45ad2f672bd9796514a0b44aea8b7df02f9c2aa9..6624923c49e6a4c662faba9cb9b883d48d33d8ba 100644 --- a/Backend/src/main/java/hsrt/VSundSOA/backendapi/gameInstance/GameController.java +++ b/Backend/src/main/java/hsrt/VSundSOA/backendapi/gameInstance/GameController.java @@ -1,5 +1,6 @@ package hsrt.VSundSOA.backendapi.gameInstance; +import hsrt.VSundSOA.backendapi.fieldCreation.FieldCreation; import org.jetbrains.annotations.NotNull; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; @@ -15,13 +16,25 @@ public class GameController { private Field field = new Field(); @PostConstruct - private void init(){ - field.field(); + @ResponseStatus(HttpStatus.OK) + @GetMapping("/game/newField") + private int[][] createField(){ + try { + Thread.sleep(2000); + }catch (Exception e){ + e.printStackTrace(); + } + history.clear(); + FieldCreation fieldCreation = new FieldCreation(); + ArrayList<int[][]> list = fieldCreation.getNewField(); + field.setStartField(list.get(0)); + field.setSolutionField(list.get(1)); + return field.getStartField(); } @ResponseStatus(HttpStatus.OK) - @GetMapping("/game/fields") - public int[][] GetFields(){ + @GetMapping("/game/field") + public int[][] getField(){ return field.getStartField(); } @@ -37,9 +50,8 @@ public class GameController { @ResponseStatus(HttpStatus.OK) @GetMapping("/game/win") - public Boolean VerifyWin(){ + public Boolean verifyWin(){ if (field.getCellsToFill() <= history.size()){ - history.clear(); return true; } return false; diff --git a/Backend/src/main/java/hsrt/VSundSOA/backendapi/login/LoginController.java b/Backend/src/main/java/hsrt/VSundSOA/backendapi/login/LoginController.java index 289d198e398398b931309f7edca53457ec6af0a1..d420bb2c7dd394c198517a641670c86c07ea1853 100644 --- a/Backend/src/main/java/hsrt/VSundSOA/backendapi/login/LoginController.java +++ b/Backend/src/main/java/hsrt/VSundSOA/backendapi/login/LoginController.java @@ -17,7 +17,7 @@ public class LoginController { } @ResponseStatus(HttpStatus.OK) - @GetMapping("/login/user/{username}") + @GetMapping("/login/{username}") public User getUser(@PathVariable String username){ for (User user : userList) { if (username.equals(user.getUsername())) { @@ -28,10 +28,10 @@ public class LoginController { } @ResponseStatus(HttpStatus.OK) - @PutMapping("/login/registry") - public User putUser(User user){ + @PostMapping("/login/registry") + public User postUser(@RequestBody User user){ for (User userInList : userList) { - if (user.equals(userInList)) { + if (user.getUsername().equals(userInList.getUsername())) { return userInList; } } @@ -41,7 +41,7 @@ public class LoginController { @ResponseStatus(HttpStatus.OK) @PatchMapping("/login/update/{username}") - public User patchUser(@PathVariable String username, User user){ + public User patchUser(@PathVariable String username, @RequestBody User user){ User userToUpdate = getUser(username); userToUpdate.setColor(user.getColor()); userToUpdate.setGamesPlayed(user.getGamesPlayed()); diff --git a/Sudoku.css b/Sudoku.css index b457d7369faf26990fe1ec86166cd696aaafffa1..5d6bb78e5b2fe2bb67b5ed222f3687933269cc9f 100644 --- a/Sudoku.css +++ b/Sudoku.css @@ -61,12 +61,13 @@ h3{ .Game{ display: grid; - grid-template-columns: 10% 75% 15%; - align-content: center; + grid-template-columns: 15% 70% 15%; + justify-items: center; } .Sudoku{ - width: 700px; + width: 100%; + height: 100%; overflow: hidden; background: #7918f2; background: -webkit-linear-gradient(-68deg, #ac32e4 , #4801ff); @@ -100,6 +101,5 @@ h3{ } .PadButton{ - height: 80px; font-size: 50px; } \ No newline at end of file diff --git a/Sudoku.html b/Sudoku.html index 1106ee432d31c2ddd16465f0c5bc80bb1e851118..265c1ca321165dc9c79ac75a16d171aec566ec85 100644 --- a/Sudoku.html +++ b/Sudoku.html @@ -10,7 +10,7 @@ <h1>Sudoku with Friends</h1> <h2 id="usernameMessage">Welcome, please enter your username</h2> <input type="text" id="username" class="input" placeholder="Username"/> - <button type="button" id="login" class="button" onclick="loginOnClick()">Connect</button> + <button type="button" id="login" class="button" onclick="loginOnClickAsync()">Connect</button> </div> <div class="Game" id="game"> <div class="NumberPad" id="number-pad"> diff --git a/Sudoku.js b/Sudoku.js index 3fd554e8f47ba347dd5ffa395daf4df6eb702767..451f173f8dc7d3744c01313cddbf317f6f640509 100644 --- a/Sudoku.js +++ b/Sudoku.js @@ -5,27 +5,27 @@ let activeNumber = 0; let history = []; let colors = ['gray', 'cyan', 'darkred', 'green', 'yellow', 'indianred', 'lime', 'orangered', 'lightblue', 'salmon', 'indigo', 'white', 'palegreen', 'teal', 'olive', 'deeppink']; let users = {}; +let reloadInterval; -async function initiateGame() { - users[username] = colors[Math.floor(Math.random() * colors.length)]; - +async function initiateGameAsync() { + users[username] = await postUserAsync(username, colors[Math.floor(Math.random() * colors.length)], 0); createEmptySudokuGrid(); createUserList(); - await fillSudokuGrid(); + await fillSudokuGridAsync(); await reloadOnTimerAsync(); - setInterval(reloadOnTimerAsync, 2 * 1000); + reloadInterval = setInterval(reloadOnTimerAsync, 2 * 1000); } -async function loginOnClick() { +async function loginOnClickAsync() { username = document.getElementById('username').value; document.getElementById('login').remove(); document.getElementById('username').remove(); document.getElementById("usernameMessage").textContent = username; createNumberPadButtons(); - await initiateGame(); + await initiateGameAsync(); } function createNumberPadButtons() { @@ -74,15 +74,15 @@ function createUserList() { if (occurrence == 0) { const user = document.createElement(`h2`); user.id = `user-${key}` - user.textContent = key; - user.style.color = users[key]; + user.textContent = `${key} won: ${users[key].gamesPlayed}`; + user.style.color = users[key].color; userBlock.appendChild(user); } } } -async function fillSudokuGrid() { +async function fillSudokuGridAsync() { const sudoku = await getFieldsAsync(); for (let row = 0; row < 9; row++) { for (let cell = 0; cell < 9; cell++) { @@ -98,11 +98,16 @@ async function fillSudokuGrid() { } } -async function getFieldsAsync() { - const fields = await fetch(GameAPI + "/fields", {method: "GET"}); +async function createFieldAsync(){ + const fields = await fetch(GameAPI + "/game/newField", {method: "GET"}); return await fields.json(); } +async function getFieldsAsync() { + const field = await fetch(GameAPI + "/game/field", {method: "GET"}); + return await field.json(); +} + async function getHistoryAsync() { const history = await fetch(GameAPI + "/game/history", {method: "GET"}); return await history.json(); @@ -113,7 +118,45 @@ async function getWinVerificationAsync() { return await win.json(); } -async function reloadCell(placement) { +async function getUserAsync(username){ + const user = await fetch(GameAPI + `/login/${username}`, {method: 'GET'}); + return await user.json(); +} + +async function getUserListAsync(){ + const userList = await fetch(GameAPI + '/login/userList', {method: 'GET'}); + return await userList.json(); +} + +async function postUserAsync(username, color, gamesPlayed){ + const user = { + username: username, + color: color, + gamesPlayed: gamesPlayed + }; + const newUser = await fetch(GameAPI + `/login/registry`, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify(user) + }); + return await newUser.json(); +} + +async function patchUserAsync(username, color, gamesPlayed){ + const user = { + username: username, + color: color, + gamesPlayed: gamesPlayed + }; + const updatedUser = await fetch(GameAPI + `/login/update/${username}`, { + method: 'PATCH', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify(user) + }); + return await updatedUser.json(); +} + +async function reloadCellAsync(placement) { history.push(placement); let occurrence = 0; for (const key of Object.keys(users)) { @@ -122,16 +165,22 @@ async function reloadCell(placement) { } } if (occurrence == 0) { - users[placement.username] = colors[Math.floor(Math.random() * colors.length)]; + users[placement.username] = await getUserAsync(placement.username); } const cellText = document.getElementById(`${placement.x}cell${placement.y}`).children; cellText[0].innerText = placement.value; - cellText[0].style.color = users[`${placement.username}`]; + cellText[0].style.color = users[placement.username].color; if (await getWinVerificationAsync()) { + clearInterval(reloadInterval); window.alert("you won!"); + const user = await getUserAsync(username); + await patchUserAsync(username, user.color, ++user.gamesPlayed); // Reset + if (placement.username === username){ + await createFieldAsync(); + } history = []; users = {}; document.getElementById('Sudoku').remove(); @@ -145,7 +194,7 @@ async function reloadCell(placement) { list.className = 'UserList'; document.getElementById('game').append(list); - await initiateGame(); + await initiateGameAsync(); } } @@ -165,9 +214,8 @@ async function reloadOnTimerAsync() { continue; } - reloadCell(element); + await reloadCellAsync(element); createUserList(); - } } @@ -183,7 +231,7 @@ async function sudokuOnClickAsync(X, Y) { }; const worked = await putPlacementAsync(placement); if (worked) { - reloadCell(placement); + await reloadCellAsync(placement); } }