Skip to content
This repository was archived by the owner on Aug 20, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
526c3b5
add readme
GabCostaSilva Mar 5, 2020
a63ae0d
feat: cria rascunho do board do game
GabCostaSilva Mar 13, 2020
1b0af37
update reamde
GabCostaSilva Mar 13, 2020
c9690a8
update readme
GabCostaSilva Mar 15, 2020
b1788f4
feat: add event listener em square
gabcostab4 Mar 13, 2020
66ea8ee
inicia algoritmo para preencher posicoes
gabcostab4 Mar 13, 2020
8899ef5
initial commit
gabcostab4 Mar 26, 2020
7f37ad0
remove readme duplicado
gabcostab4 Mar 27, 2020
8447383
update readme
gabcostab4 Mar 27, 2020
27fa661
update readme
gabcostab4 Mar 27, 2020
badddef
Update readme
petrikic Mar 29, 2020
887dcb6
Update readme
MoshGirl Mar 29, 2020
6c75d60
add license
gabcostab4 Mar 29, 2020
1f4aa59
Update README.MD
GabCostaSilva Mar 29, 2020
233bc2f
Add files via upload
Kemer-Souza Apr 4, 2020
2c1e124
feat: navios sao criados aleatoriamente no board
GabCostaSilva Apr 9, 2020
260a3d4
feat: add NodeJS to project
GabCostaSilva Apr 11, 2020
9b50d6e
update readme
GabCostaSilva Apr 11, 2020
e80f35b
Inserindo navios de forma aleatoria
petrikic Apr 20, 2020
ac8557b
feat: add game logic to server side
GabCostaSilva Apr 21, 2020
e6aaf4e
Merge pull request #1 from GabCostaSilva/validate
GabCostaSilva Apr 21, 2020
d3d29bc
feat: add sidebar with score
GabCostaSilva Apr 22, 2020
6949dcb
Verificando se todos os navios foram destruidos
petrikic Apr 27, 2020
b559c88
Servidor funcionando de forma concorrente
petrikic May 3, 2020
7c482ae
Adicionado score dinâmico
petrikic May 3, 2020
5c7dc4b
Feat: multiplayer system created
petrikic Jun 19, 2020
ad2bece
fix: database path
GabCostaSilva Jun 19, 2020
3c4c558
refactor: refatora controller e rotas
GabCostaSilva Jun 19, 2020
e993fe4
fix: usuario atual nao eh mostrado na lista de online
GabCostaSilva Jun 27, 2020
f05eff3
feat: add convite para jogar
GabCostaSilva Jun 28, 2020
abbf66d
update readme
GabCostaSilva Jun 28, 2020
c025b5c
Update README.MD
GabCostaSilva Jun 28, 2020
15167d8
Update README.MD
GabCostaSilva Jun 28, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
NODE_ENV=development
PORT=8080
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/node_modules
/.vscode
.env
src/database/database.db3
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2020 Gabriel Costa Silva Altair Aquino Alves Junior Cleriston Nantes Petrikic Anna Carollyne Pereira da Silva

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the Software), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
58 changes: 58 additions & 0 deletions README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Batalha Naval Multiplayer

<!--- Exemplos de badges. Acesse https://shields.io para outras opções. Você pode querer incluir informações de dependencias, build, testes, licença, etc. --->

![GitHub repo size](https://img.shields.io/github/repo-size/hsborges/progweb-template)
![GitHub contributors](https://img.shields.io/github/contributors/hsborges/progweb-template)

Batalha Naval é um jogo de estratégia popular no mundo todo, conhecido pela possibilidade de jogá-lo somente com papel e caneta (e um oponente). Agora em sua versão século XXI. [Saiba mais sobre a história deste jogo](https://en.wikipedia.org/wiki/Battleship_(game)).

## Planning

- Você pode ver nosso projeto no [Trello](https://trello.com/b/H6AJ4LP3/batalha-naval-multiplayer)

## Pré-requisitos

Antes de iniciar, certifique-se de cumprir os seguintes requisitos:

- Um web browser atualizado, como Google Chrome ou Mozilla Firefox.

- yarn ou npm

- Possuir Redis instalado e rodando na port padrão(6379)

## Como executar

Execute os comandos<br>

`yarn`<br>
`yarn start`<br>

ou<br>

`npm install`<br>
`npm run start`<br>

Após instalar as dependências e rodar o server, game estará rodando em <br><br>
[http://localhost:3000](http://localhost:3000)
## Usando Batalha Naval

Para usar Batalha Naval, siga os seguintes passos:

- Clique em qualquer célula disponível na tela.
- Procure acertar posições ocupadas por navios

## Contribuidores

As seguintes pessoas contribuiram para este projeto:

- [Gabriel Costa](https://github.com/gabcostasilva)
- [Altair Aquino Alves Junior](https://github.com/Zaltair-alves)
- [Cleriston Nantes Petrikic](http://github.com/petrikic)
- [Anna Carollyne Pereira da Silva](http://github.com/MoshGirl)
- [Kemer Wander Souza Tomas](https://github.com/Kemer-Souza)


## Licença de uso

[MIT](https://github.com/GabCostaSilva/batalha-naval/blob/master/LICENSE)
60 changes: 0 additions & 60 deletions README.md

This file was deleted.

28 changes: 28 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "batalha-naval",
"version": "1.0.0",
"description": "A simple Sea Battleships multiplayer and AI game",
"main": "index.js",
"scripts": {
"start": "node src/index.js"
},
"repository": "https://github.com/GabCostaSilva/batalha-naval.git",
"author": "gabcostasilva <gabcostadeveloper@gmail.com>",
"license": "MIT",
"private": false,
"dependencies": {
"bcryptjs": "^2.4.3",
"bluebird": "^3.7.2",
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"ejs": "^3.1.3",
"express": "^4.17.1",
"express-session": "^1.17.1",
"redis": "^3.0.2",
"socket.io": "^2.3.0",
"sqlite-sync": "^0.3.9"
},
"devDependencies": {
"nodemon": "^2.0.4"
}
}
6 changes: 6 additions & 0 deletions src/config/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const KEY = 'user-id';
const SECRET = 'socketchat';
module.exports = {
KEY,
SECRET
}
14 changes: 14 additions & 0 deletions src/config/redis.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const redis = require("redis");
const bluebird = require('bluebird')

bluebird.promisifyAll(redis)

const client = redis.createClient();

client.on("error", function(error) {
console.error('here', error);
});
// client.set("key", "value", redis.print);
// client.get("key", redis.print);

module.exports = client
22 changes: 22 additions & 0 deletions src/controller/online.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
var stackOnline = [];

const addUser = (user) => {
stackOnline.push(user);
}

const removeUser = (user) => {
stackOnline.pop(user);
}

const checkUser = (user) => {
return stackOnline.includes(user);
}

const listUsers = () => {
return stackOnline.filter((i, j) => stackOnline.indexOf(i) === j);
}

exports.set = addUser;
exports.remove = removeUser;
exports.check = checkUser;
exports.list = listUsers;
57 changes: 57 additions & 0 deletions src/controller/room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
var listRooms = [];
var userRooms = {};

const generateSerial = () => {
var result, i, j;
result = '';
for (j = 0; j < 32; j++) {
if (j != 0 && j % 8 == 0)
result = result + '-';
i = Math.floor(Math.random() * 16).toString(16).toUpperCase();
result = result + i;
}
return result;
}

const existsRoom = (room) => {
return listRooms.includes(room);
}

const createRoom = () => {
let room = generateSerial();
listRooms.push(room);
userRooms[room] = [];
return room;
}

const removeRoom = (room) => {
if (existsRoom(room)) {
listRooms.pop(room);
}
}

const checkRoom = (room, user) => {
if (!existsRoom(room)) {
throw "RoomDoesNotExistException";
} else if (userRooms[room].includes(user)) {
//throw "AlreadyInRoomException";
} else if (userRooms[room].length > 1) {
throw "FullRoomException";
}
}

const setToRoom = (room, user) => {
userRooms[room].push(user);
}

const unsetToRoom = (room, user) => {
userRooms[room].pop(user);
}

exports.exists = existsRoom;
exports.create = createRoom;
exports.remove = removeRoom;
exports.check = checkRoom;
exports.setTo = setToRoom;
exports.unsetTo = unsetToRoom;
exports.list = listRooms;
40 changes: 40 additions & 0 deletions src/controller/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
const user = require('../models/userModel')

module.exports = {
login(req, res) {
let usr = req.body;
if(req.session.user){
res.redirect('/');
} else if(!user.findOne(usr.username)){
res.status(401).send({error: 'User not found'});
} else if(user.find(usr)){
req.session.user = usr.username
res.status(200).send("OK");
} else {
res.status(403).send({error: 'Not authorized'});
}
},
create (req, res){
let usr = {
username: req.body.username,
password: req.body.password
}
if(usr.username.length < 4){
res.status(400).send({error: "Username is too small"});
} else if(usr.password.length < 4) {
res.status(400).send({error: "Password is too small"})
} else if(user.findOne(usr.username)){
res.status(400).send({error: "Username already exists"});
} else {
user.insert(usr);
req.session.user = usr.username
res.status(200).send("OK");
}
},
verifyUsername(req, res){
usr = req.body;
if(user.findOne(usr.username)){
res.status(400).send({error: "Username already exists"});
}
}
}
13 changes: 13 additions & 0 deletions src/database/dao.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

const sqlite = require('sqlite-sync');
sqlite.connect(__dirname + '/database.db3');


const SQL_CREATE = `CREATE TABLE IF NOT EXISTS Users(
username TEXT PRIMARY KEY,
password TEXT
);`;

sqlite.run(SQL_CREATE);

module.exports = sqlite;
56 changes: 56 additions & 0 deletions src/events/game.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
let redis = require('../config/redis')

exports.use = (io) => {
const rooms = require('../controller/room');
const game = require('../game/controller/game');

io.on("connection", client => {
let player = client.handshake.session.user;
let room;

client.on('newGame', (players) => {
let room = rooms.create()

let p1 = io.sockets.sockets[players.player1]
let p2 = io.sockets.sockets[players.player2]

game.newGame(room, { p1, p2 })

return true;
})
client.on('invite', async invited => {
try {
let invitedId = await redis.getAsync(invited)
io.to(invitedId).emit('invited', client.id, `${player} está te chamando para uma partida!`);
}catch(err) {
console.error(err.message)
}
})
client.on('joinGame', (roomName) => {
if (rooms.exists(roomName)) {
rooms.setTo(roomName, player);
game.join(roomName, player, client);
client.join(roomName);
room = roomName;
}
});
client.on('click', (id) => {
if (game.existMatch(room) && game.isStarted(room))
game.shot(room, player, id);
});
client.on('playHere', () => {
game.playHere(room, player, client);
});
client.on('disconnect', () => {
if (room) {
rooms.unsetTo(room, player);
setTimeout(() => {
if (!io.sockets.adapter.rooms[room]) {
rooms.remove(room);
client.broadcast.emit('closeRoom', room);
}
}, 800);
}
});
});
}
Loading