game for fun
客户端主要逻辑基于socket-io开发,实时与服务器交互数据:
- 1
connect到服务器ip:port; - 2 connect成功后,触发
findPeer事件; - 3 服务器返回触发
peerInfo事件,表示成功匹配玩家; - 4.1 玩家完成选择后,客户端触发
choose事件,通知服务器玩家的选择; - 4.2 如果客户端判断玩家失败,则向服务端触发
selfFail事件; - 5 如果客户端收到
peerLose事件,表示对方玩家输,本方胜利;如果客户端收到peerWin事件,表示对方玩家胜利,本方失败; - 6 游戏状态结束后,
close断开连接;
##findPeer::emit () 客户端向服务器触发该事件,表示开始寻找对战玩家
var newPlayer = IOClient.connect(
util.format('http://127.0.0.1:%d/', config.ws_port),
{
reconnection : false,
multiplex : false
}
);
newPlayer.emit("findPeer");##peerInfo::listen (peerid:str) 服务器触发的事件,通知客户端对方玩家已经就绪
peerid对战玩家的id
##choose::emit (selfChoose:num, peerChoose:num)
向服务器发送玩家选择的一对数字,如果选择的自己数字被对方选中,则输;如果选择的对方数字正好是对方的自己数字,则赢;
输赢的判断在服务端进行,服务端会通过peerLose和peerWin事件通知客户端,客户端不需要判断数字的逻辑处理;
selfChoose表示玩家选择的自己的数字peerChose表示玩家选择的对方的数字
player.on("peerInfo", function(peerid)
{
console.log("peer is %s", peerid);
player.emit("choose", 3, 9);
});##selfFail::emit (code:str) 当客户端判断本方玩家输时(例如玩家选择数字超时),向服务器触发这个事件,通知具体的失败信息;
code表示失败的原因,可取如下值:timeout表示超时
if (timeout)
player.emit("selfFail", "timeout");##peerLose/peerWin::listen (code:str) 服务端通知客户端对方玩家输/赢,如果客户端收到这个消息,则表示本方玩家赢/输;
code表示失败的原因,可取如下值:bingo本方玩家猜中对方数字timeout对方玩家选择超时leave对方玩家退出
player.on("peerLose", function(code)
{
console.log("I win! reason is %s", code);
});
player.on("peerWin", function(code)
{
console.log("I lose! reason is %s", code);
});#PlayerClient接口
在客户端封装了一个PlayerClient接口,用于处理内部的client与server交互的逻辑,提供更加抽象的接口。
文件位置:public/js/player.js
demo位置:views/test.html
打开conf.js的http_debug选项,访问http://127.0.0.1:8080/test可看到效果
##connect(cb(err))
cb连接成功或者失败的回调函数err是否有错误,如果为false表示连接成功,如果为true表示连接失败
与服务器建立连接
##findPeer(cb(peerid))
cb找到对战玩家的回调
寻找对战玩家,当服务器匹配到玩家后,通过cb回调返回对方玩家的peerid
##choose(selfChoose, peerChoose)
selfChoose玩家选择的本方数字peerChoose玩家猜测的对方数字
玩家选择数字后,将数字发送给服务端
var winner = new PlayerClient();
winner.connect(function(err)
{
console.log("winner connect ", err);
winner.findPeer(function(err, peerid)
{
console.log("winner find peer ", peerid);
winner.choose(3,4);
});
});##leave() 与服务端断开连接,当一次对战结束后,都要断开连接
##sendFail(code)
code输赢的错误码,表示原因:timeout玩家选择超时
当客户端判断本方玩家失败(例如选择超时后),通知服务器,然后需要客户端自己调用leave接口与服务端断开连接。
##registerWin/registerLose(cb(code))
cb胜负的回调函数code输赢的错误码,表示输赢的原因:bingo本方玩家猜中对方数字timeout对方玩家选择超时leave对方玩家退出
注册胜利和失败的回调函数
var player = new PlayerClient();
player.registerWin(function(code)
{
alert(type + " win! reason is " + code);
player.leave();
});
player.registerLose(function(code)
{
alert(type + "lose! reason is " + code);
player.leave();
});##registerPeerChoose(cb(peerSelf, peerPeer, isPeerWin, isPeerLose))
cb收到对方数字的回调函数peerSelf对方玩家选择的数字peerPeer对方玩家猜的本方玩家的数字isPeerWin服务器判断对方玩家是否胜利,如果为true,则表示对方胜利,本方失败,如果为false,则表示对方没有胜利,并不表示失败isPeerLose服务器判断对方玩家是否失败,如果为true,则表示对方失败,本方胜利,如果为false,则表示对方没有失败,并不表示胜利
注册回调,处理对方选择的数字情况
player.registerPeerChoose(function(peerSelf, peerPeer)
{
console.log("get peer data ", peerSelf, peerPeer);
});##registerLeave(cb()) 注册连接断开的回调事件