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

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

Player类的属性


this.socket = socket // socket对象,玩家通过它来监听数据
this.name = name // 玩家的名称
this.color = null // 玩家棋子的颜色
this.state = 0 // 0代表空闲, 1在游戏中
this.pipei = false // 是否在匹配
this.gamePlay = null // 棋局对象
this.flag = true // 是否轮到这个玩家出棋
this.fz = false // 是否是房主

Player类对象监听的事件


// 监听玩家是否退出游戏
this.socket.on('disconnect', function () {
// 删除数组中的玩家
// players.splice(players.indexOf(self), 1) // 删不掉
// delete players[players.indexOf(self)] // 新的删除方式
players = players.filter(function (value) {
return value.name !== self.name
})
playerCount--
// 如果退出游戏的玩家正在进行游戏,那么这局游戏也该退出
if (self.state === 0) {
gameCount--
}
console.log(self.name + '已退出游戏')
})
// 玩家开始匹配
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')
}
})
// 玩家取消匹配按钮
this.socket.on('clearPlay', function () {
clearInterval(self.timer)
})
// 监听数据,玩家下棋的时候触发
this.socket.on('data', function (data) {
if (self.flag) {
add_pieces(self.gamePlay, data, self.color)
}
})
// 最后将当前玩家实例放到players全局玩家数组中去
players.push(this)

Game(棋局类)


// 棋盘的格子数
this.column = 21
this.arr = init_arr() // 存储棋盘坐标的二位数组
// 一局棋局上的两个玩家
this.play1 = play1
this.play2 = play2
// 修改游戏状态
this.play1.state = 1
this.play2.state = 1
// 在游戏中,是否匹配为false
this.play1.pipei = false