added changing color in navbar if ready
This commit is contained in:
parent
0844f23c4e
commit
e32b46556c
29
README.md
29
README.md
@ -0,0 +1,29 @@
|
|||||||
|
# Online multiplayer Ludo
|
||||||
|
WORK IN PROGRESS ...
|
||||||
|
## About
|
||||||
|
|
||||||
|
**Ludo** is a strategy board game for two to four players, in which the players race their four tokens from start to finish according to the rolls of a single die. Like other cross and circle games, Ludo is derived from the Indian game Pachisi, but simpler. The game and its variations are popular in many countries and under various names. [Read more](https://en.wikipedia.org/wiki/Ludo_(board_game))
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
Play this game [here]()
|
||||||
|
```
|
||||||
|
npm i
|
||||||
|
npm start
|
||||||
|
cd backend
|
||||||
|
npm i
|
||||||
|
node server.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Technologies
|
||||||
|
### Backend
|
||||||
|
- Node.js
|
||||||
|
- Express
|
||||||
|
- express-session
|
||||||
|
- MongoDB
|
||||||
|
- MongoDB sessions store
|
||||||
|
- Maybe Redis in future
|
||||||
|
### Frontend
|
||||||
|
- React
|
||||||
|
- Axios
|
||||||
|
- Material UI
|
||||||
|
- Canvas
|
||||||
17
backend/routes/game.js
Normal file
17
backend/routes/game.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
|
||||||
|
//starts game
|
||||||
|
router.post('/start', function (req, res){
|
||||||
|
/* set interval:
|
||||||
|
draw a number <1,6>
|
||||||
|
update positions
|
||||||
|
*/
|
||||||
|
|
||||||
|
});
|
||||||
|
//returns positions
|
||||||
|
router.get('/', function (req, res){
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
@ -2,8 +2,7 @@ var express = require('express');
|
|||||||
var router = express.Router();
|
var router = express.Router();
|
||||||
var RoomModel = require('../schemas/room');
|
var RoomModel = require('../schemas/room');
|
||||||
|
|
||||||
|
var changeReadyState = (req, res, exit) =>{
|
||||||
router.post('/ready', function (req, res){
|
|
||||||
RoomModel.findOne({_id: req.session.roomId}, function (err, doc){
|
RoomModel.findOne({_id: req.session.roomId}, function (err, doc){
|
||||||
if (err) {
|
if (err) {
|
||||||
res.status(500).send(err)
|
res.status(500).send(err)
|
||||||
@ -13,7 +12,9 @@ router.post('/ready', function (req, res){
|
|||||||
let index = updatedPlayers.findIndex(
|
let index = updatedPlayers.findIndex(
|
||||||
player => (player._id).toString() == (req.session.playerId).toString()
|
player => (player._id).toString() == (req.session.playerId).toString()
|
||||||
);
|
);
|
||||||
updatedPlayers[index].ready = !updatedPlayers[index].ready;
|
if(!exit)
|
||||||
|
{updatedPlayers[index].ready = !updatedPlayers[index].ready;}
|
||||||
|
else {updatedPlayers[index].ready = false;}
|
||||||
RoomModel.findOneAndUpdate({
|
RoomModel.findOneAndUpdate({
|
||||||
_id: req.session.roomId
|
_id: req.session.roomId
|
||||||
}, {players: updatedPlayers}, function(err, doc){
|
}, {players: updatedPlayers}, function(err, doc){
|
||||||
@ -27,11 +28,29 @@ router.post('/ready', function (req, res){
|
|||||||
res.status(200).send("Ready!");
|
res.status(200).send("Ready!");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//changing status of player to ready for game
|
||||||
|
router.post('/ready', function (req, res){
|
||||||
|
changeReadyState(req, res, false)
|
||||||
});
|
});
|
||||||
|
|
||||||
//deleting user in case he left before game started
|
//deleting user in case he left before game started
|
||||||
router.post('/exit', function(req,res){
|
router.post('/exit', function(req,res){
|
||||||
console.log("wyszedł XD")
|
changeReadyState(req,res, true)
|
||||||
|
});
|
||||||
|
|
||||||
|
//return session data
|
||||||
|
router.get('/', (req,res)=>{
|
||||||
|
if(req.session.name){
|
||||||
|
res.send({
|
||||||
|
name: req.session.name,
|
||||||
|
playerId: req.session.playerId,
|
||||||
|
roomId: req.session.roomId,
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
@ -34,32 +34,22 @@ router.post('/add', function (req, res) {
|
|||||||
|
|
||||||
}else {
|
}else {
|
||||||
let players = results.players;
|
let players = results.players;
|
||||||
|
|
||||||
players.push({
|
players.push({
|
||||||
name: req.body.name,
|
name: req.body.name,
|
||||||
ready: false,
|
ready: false,
|
||||||
color: colors[players.length]
|
color: colors[players.length]
|
||||||
});
|
});
|
||||||
|
|
||||||
let updateObj = {
|
let updateObj = { players: players }
|
||||||
players: players,
|
|
||||||
}
|
|
||||||
|
|
||||||
players.length === 4 ? updateObj.full = true : updateObj.full = false;
|
players.length === 4 ? updateObj.full = true : updateObj.full = false;
|
||||||
|
|
||||||
RoomModel.findOneAndUpdate(
|
RoomModel.findOneAndUpdate(
|
||||||
{ _id: results._id }, //find room by id
|
{ _id: results._id }, //find room by id
|
||||||
updateObj,
|
updateObj)
|
||||||
function (err, docs) {
|
.then(()=>{
|
||||||
if (err){
|
|
||||||
console.log(err)
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
console.log("Updated Docs : ", docs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
).then(()=>{
|
|
||||||
req.session.roomId = results._id;
|
req.session.roomId = results._id;
|
||||||
req.session.playerId = results.players[results.players.lenght - 1]._id;
|
req.session.playerId = updateObj.players[(updateObj.players).lenght - 1]._id;
|
||||||
req.session.name = req.body.name;
|
req.session.name = req.body.name;
|
||||||
res.status(200).send('Joined!');
|
res.status(200).send('Joined!');
|
||||||
});
|
});
|
||||||
@ -68,16 +58,6 @@ router.post('/add', function (req, res) {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
//deleting room after game ends
|
|
||||||
router.delete('/delete/{id}', function(req,res){
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
//editing room every move
|
|
||||||
router.put('/edit', function(req,res){
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
//get room values
|
//get room values
|
||||||
router.get('/', function(req,res){
|
router.get('/', function(req,res){
|
||||||
RoomModel.findOne(
|
RoomModel.findOne(
|
||||||
@ -87,7 +67,6 @@ router.get('/', function(req,res){
|
|||||||
console.log(err)
|
console.log(err)
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
console.log(docs)
|
|
||||||
res.send({ players: docs.players});
|
res.send({ players: docs.players});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,6 +33,7 @@ mongoose.connect(CONNECTION_URI, {
|
|||||||
console.log('MongoDB Connected…');
|
console.log('MongoDB Connected…');
|
||||||
})
|
})
|
||||||
.catch(err => console.error(err));
|
.catch(err => console.error(err));
|
||||||
|
|
||||||
//SESSION CONFIG]
|
//SESSION CONFIG]
|
||||||
var MongoDBStore = require('connect-mongodb-session')(session);
|
var MongoDBStore = require('connect-mongodb-session')(session);
|
||||||
var store = new MongoDBStore({
|
var store = new MongoDBStore({
|
||||||
@ -52,21 +53,11 @@ app.use(session({
|
|||||||
//ROUTES CONFIG
|
//ROUTES CONFIG
|
||||||
const roomRoutes = require("./routes/room");
|
const roomRoutes = require("./routes/room");
|
||||||
const playerRoutes = require("./routes/player");
|
const playerRoutes = require("./routes/player");
|
||||||
|
const gameRoutes = require("./routes/game");
|
||||||
app.get('/', (req,res)=>{
|
|
||||||
if(req.session.name){
|
|
||||||
res.send({
|
|
||||||
name: req.session.name,
|
|
||||||
playerId: req.session.playerId,
|
|
||||||
roomId: req.session.roomId,
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
res.end();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.use('/player', playerRoutes);
|
app.use('/player', playerRoutes);
|
||||||
app.use('/room', roomRoutes);
|
app.use('/room', roomRoutes);
|
||||||
|
app.use('/game', gameRoutes)
|
||||||
|
|
||||||
app.listen(PORT, ()=>{
|
app.listen(PORT, ()=>{
|
||||||
console.log("Server runs on port "+PORT);
|
console.log("Server runs on port "+PORT);
|
||||||
|
|||||||
@ -14,7 +14,7 @@ function App() {
|
|||||||
const [redirect, setRedirect] = useState()
|
const [redirect, setRedirect] = useState()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
axios.get('http://localhost:3000', {
|
axios.get('http://localhost:3000/player', {
|
||||||
withCredentials:true,
|
withCredentials:true,
|
||||||
mode: 'cors'
|
mode: 'cors'
|
||||||
})
|
})
|
||||||
@ -33,7 +33,7 @@ function App() {
|
|||||||
const idCallback = (id)=>{
|
const idCallback = (id)=>{
|
||||||
setId(id);
|
setId(id);
|
||||||
|
|
||||||
axios.get('http://localhost:3000', {
|
axios.get('http://localhost:3000/player/', {
|
||||||
withCredentials:true,
|
withCredentials:true,
|
||||||
mode: 'cors',
|
mode: 'cors',
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
|
|||||||
@ -6,9 +6,8 @@ import axios from 'axios';
|
|||||||
const Navbar = () => {
|
const Navbar = () => {
|
||||||
|
|
||||||
const [players, setPlayers] = useState([]);
|
const [players, setPlayers] = useState([]);
|
||||||
|
//fetching players data to display them in navbar
|
||||||
useEffect(()=>{
|
const fetchData = () => {
|
||||||
//fetching players data
|
|
||||||
axios.get('http://localhost:3000/room/',{
|
axios.get('http://localhost:3000/room/',{
|
||||||
withCredentials:true,
|
withCredentials:true,
|
||||||
mode: 'cors',
|
mode: 'cors',
|
||||||
@ -16,11 +15,14 @@ const Navbar = () => {
|
|||||||
while(response.data.players.length !== 4){
|
while(response.data.players.length !== 4){
|
||||||
response.data.players.push({
|
response.data.players.push({
|
||||||
name: "...",
|
name: "...",
|
||||||
color: "grey"
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
setPlayers(response.data.players);
|
setPlayers(response.data.players);
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
useEffect(()=>{
|
||||||
|
//sending ajax every 3 sec
|
||||||
|
setInterval(fetchData, 3000);
|
||||||
},[]);
|
},[]);
|
||||||
|
|
||||||
return(
|
return(
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import './NameContainer.css'
|
import './NameContainer.css'
|
||||||
const NameContainer = ( {player} ) => {
|
const NameContainer = ( {player} ) => {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="name-container" style={{backgroundColor: player.color}}>
|
<div className="name-container"
|
||||||
|
style={ player.ready ? { backgroundColor: player.color} : { backgroundColor: 'grey'} }>
|
||||||
{player.name}
|
{player.name}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -12,9 +12,9 @@ const ReadyButton = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return(
|
return(
|
||||||
<div>
|
<div className="ready-container">
|
||||||
<label>Ready: </label>
|
|
||||||
<Switch onClick={handleCheckboxChange} checked={checked}/>
|
<Switch onClick={handleCheckboxChange} checked={checked}/>
|
||||||
|
<label>{checked ? 'I want to play' : 'Im waiting' }</label>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user