node.js利用socket.io实现多人在线匹配联机五子棋

2020-06-17 06:40:11易采站长站整理

function login() {
if (username.value === undefined || username.value === '') {
return
}
// 调用父窗口的login方法
parent.login(username.value)
}

game.html中的login方法,这个方法通过socket向server触发了login事件


function login(username) {
socket.emit('login', username)
}

server.js


// 监听连接
io.on('connection', function (socket) {
// 玩家登陆, socket.emit('login', username)就是触发了这个事件
// 监听了login事件
socket.on('login', function (name) {
// players是一个全局数组,里面存放了所有的玩家对象,如果players中
var flag = players.some(function (value) {
return value.name === name
})
if (flag) {
socket.emit('home', {'flag': true})
} else {
console.log(name + '已登陆')
// 创建玩家
new Player(socket, name)
// 将玩家放进数组中
// players.push(player)
// 如果用户名没有重名,那么触发client端的home事件
socket.emit('home', {'playerCount': playerCount, 'name': name})
}
})
})

玩家client对home事件的监听


// 玩家登陆成功
socket.on('home', function (data) {
if (data.flag) {
game.contentWindow.flag.hidden = false
} else {
game.contentWindow.flag.hidden = true
// 保存用户名和玩家在线人数到localStorage中
localStorage.setItem('name', data.name)
localStorage.setItem('playerCount', data.playerCount)
// location.href = './home.html'
game.src = 'home.html'
}
})

home.html玩家等待大厅, home.html和index.html长得基本一致,所以它也有一个按钮,匹配按钮,通过它来触发play事件


// 玩家开始匹配
this.socket.on('play', function () {
// 如果空闲玩家总数大于或等于2,那么开始游戏
if (playerCount >= 2) {
self.pipei = true
// 如果已经有人在开始匹配了,那么这个玩家就不需要走下面函数了,因为继续执行的话相当于再开一个棋局
if (isExistFZ(self) > 0) {
// 保持不动就好,房主会自动找到你的
return
}
// 如果没有房主,那么这个玩家将成为房主
self.fz = true
// 可用的玩家数
var player2 = null
self.timer = setInterval(function () {
console.log('正在匹配...')
if (player2 = findPlayer(self)) {
console.log('匹配成功')
self.gamePlay = new Game(self, player2)
player2.gamePlay = self.gamePlay
clearInterval(self.timer)
}
}, 1000)
} else {
socket.emit('player less')
}
})

server.js中有两个类,一个是Player玩家类,另一个是Game棋局类,一个棋局对应两个玩家。