동영상

소스코드

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);

app.set('view engine', 'ejs'); // 렌더링 엔진 모드를 ejs로 설정
app.set('views',  __dirname + '/views');    // ejs이 있는 폴더를 지정

const { initGame, gameLoop, UpdateMovement } = require('./game');

app.get('/', (req, res) => {
    res.render('index');    // index.ejs을 사용자에게 전달
})

const state = {};
const clientRooms = {};

io.on('connection', client => {

    client.on('keydown', handleKeydown);    //핸들러 선언문
    client.on('newGame', handleNewGame);
    client.on('joinGame', handleJoinGame);

    function handleJoinGame(roomName)
    {
        const room = io.sockets.adapter.rooms.get(roomName); //adapter를 통하여 room 정보를 가져옴

        let numClients = 0;

        if(room === undefined)
        {
            client.emit('unknownCode');
            return;
        }

        numClients = room.size; // room 안에 몇명이 있는지 알아오는 변수 

        if(numClients === 0)
        {
            client.emit('unknownCode');
            return;
        }
        else if(numClients > 1)
        {
            client.emit('tooManyPlayers');
            return;
        }

        clientRooms[client.id] = roomName;

        client.join(roomName);
        client.number = 2;
        client.emit('init' , 2);

        startGameInterval(roomName);
    }

    function handleNewGame(){   //게임 방을 만드는 함수 핸들러

        let roomName = makeid(5);
        clientRooms[client.id] = roomName;
        client.emit('gameCode' , roomName);

        state[roomName] = initGame();

        client.join(roomName);
        client.number = 1;
        client.emit('init' , 1);
    }

    function handleKeydown(keyCode) {
        const roomName = clientRooms[client.id];
    
        if (!roomName) {
          return;
        }
        try {
          keyCode = parseInt(keyCode);
        } catch(e) {
          console.error(e);
          return;
        }
    
        UpdateMovement(state[roomName], client.number , keyCode);   
        
      }

});

function startGameInterval(roomName)    //게임에 Join 이 되었을 룸을 시작 할 수 있게 제작
{
    const intervalId = setInterval(() =>{
        
       const winner = gameLoop(state[roomName]);

       if(!winner)
       {
            emitGameState(roomName , state[roomName]);
       }
       else
       {
            emitGameOver(roomName , winner);
            state[roomName] = null;
            clearInterval(intervalId);      //intervalId 인터벌을 종료 
       }

    }, 1000 / 30);

}

function emitGameState(room , gameState){
    io.sockets.in(room).emit('gameState' , JSON.stringify(gameState));
}

function emitGameOver(room , gameState){
    io.sockets.in(room).emit('gameOver' , JSON.stringify({winner}));
}

function makeid(length) {   
    let result = '';
    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    for (let i = 0; i < length; i++) {
        result += characters.charAt(
        Math.floor(Math.random() * characters.length));
    }
    return result;
  }

server.listen(3000 , function() {
    console.log("3000 포트 대기중 ");

});