Ivan Asmer 6 years ago
parent
commit
a72fca84cd
3 changed files with 160 additions and 0 deletions
  1. 76 0
      index.js
  2. 33 0
      public/index.html
  3. 51 0
      public/js/index.js

+ 76 - 0
index.js

@@ -0,0 +1,76 @@
+const express = require('express');
+var app  = express()
+var http = require('http').Server(app);
+var io = require('socket.io')(http);
+
+app.use(express.static('public'))
+
+let gamers = []
+
+let cleanSocket =  gamer => {
+    let copy = {...gamer}
+    delete copy.socket
+    return copy
+}
+
+let emitGamers = () => io.emit('gamers', gamers.map(cleanSocket))
+
+let thisGamer = s  => gamers.filter(g => g.socket === s) [0]
+let gamerById = id => gamers.filter(g => g.id     === id)[0]
+
+io.on('connection', socket => {
+    socket.emit('hi', {id: socket.id})
+    socket.on('disconnect', () => {
+        gamers = gamers.filter(n => n.socket !== socket)
+        emitGamers()
+    });
+
+    socket.on('conn', msg => {
+        gamers.push({nick: msg.nick, socket: socket, id: socket.id})
+        emitGamers()
+    })
+
+    socket.on('newGame', msg => {
+        let gamer = thisGamer(socket)
+        gamer.newGame = msg.newGame
+        emitGamers()
+    })
+
+    socket.on('startGame', ({id}) => {
+        let gamer = thisGamer(socket)
+        let enemy = gamerById(id)
+        //console.log(id, gamers)
+        if (enemy && enemy.newGame){
+            gamer.inGameWith = enemy.id
+            enemy.inGameWith = gamer.id
+
+            gamer.turn  = Math.random() > 0.5
+            enemy.turn  = !gamer.turn
+        }
+        gamer.socket.emit('startGame', cleanSocket(gamer))
+        enemy.socket.emit('startGame', cleanSocket(enemy))
+
+        if (gamer.turn) gamer.socket.emit('turn')
+        else enemy.socket.emit('turn')
+
+        emitGamers()
+    })
+
+    socket.on('turn', data => {
+        let gamer = thisGamer(socket)
+        let enemy = gamerById(gamer.inGameWith)
+        if (gamer && enemy && 
+            gamer.inGameWith === enemy.id && 
+            enemy.inGameWith === gamer.id &&
+            gamer.turn){
+
+            gamer.turn = !gamer.turn
+            enemy.turn = !enemy.turn
+            enemy.socket.emit('turn', data)
+        }
+    })
+});
+
+http.listen(4000, function(){
+      console.log(`listening`);
+});

+ 33 - 0
public/index.html

@@ -0,0 +1,33 @@
+<!doctype html>
+<html>
+    <head>
+        <title>
+            game demo
+        </title>
+        <script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js'></script>
+    </head>
+    <body>
+        <h1>
+            game
+        </h1>
+        <div>
+            <input placeholder='Nick' id='nick' value='Anon'/>
+            <label id='connectLabel'>
+                <input type='checkbox' id='connect'>Connect
+            </label>
+            <div id='nicksDiv'>
+            </div>
+            <label>
+                <input type='checkbox' id='newGame'>New Game
+            </label>
+
+        </div>
+        <div id='gameDiv'>
+            <div id='enemyData'>
+            </div>
+            <input placeholder='Город' id='data' />
+            <button id='send'>Send...</button>
+        </div>
+        <script src='/js/index.js'></script>
+    </body>
+</html>

+ 51 - 0
public/js/index.js

@@ -0,0 +1,51 @@
+let socket;
+let ourId;
+let enemyId;
+
+let startGame = id => socket.emit('startGame', {id})
+
+connect.onchange = () => ({
+    true(){
+        socket = io() //connect
+        socket.on('hi',({id}) => ourId = id)
+        socket.emit('conn', {nick: nick.value})
+
+        socket.on('gamers', gamers => nicksDiv.innerHTML = 
+            gamers.reduce((str, {nick, newGame, id, inGameWith}) => str + 
+               `<div style="${inGameWith ? "color:#BBB" : ''}">${nick}
+                    ${newGame && ourId !== id && !inGameWith ? 
+                        `<button onclick="startGame('${id}')">
+                                    Start Game
+                                 </button>
+                    `: ''}
+                </div>`,"")
+        )
+
+        socket.on('startGame', ({inGameWith, turn}) => {
+            enemyId = inGameWith
+            gameDiv.style.display = 'block';
+            //time to init board
+            send.disabled = true;
+        })
+
+        socket.on('turn', data => {
+            send.disabled = false;
+            enemyData.innerHTML = data ? data.data : 'your turn';
+        })
+    },
+    false(){
+        socket.disconnect()
+        nicksDiv.innerHTML = ''
+    }
+})[nick.disabled = connect.checked]()
+
+nick.oninput = () => connect.disabled = !nick.value
+
+newGame.onchange = () => socket.emit('newGame', {newGame: newGame.checked})
+gameDiv.style.display = 'none';
+
+send.onclick = () => {
+    socket.emit('turn', {data: data.value})
+    enemyData.innerHTML = 'enemy turn';
+    send.disabled = true;
+}