Skip to content

Instantly share code, notes, and snippets.

@arch-jslin
Created October 19, 2010 12:51
Show Gist options
  • Save arch-jslin/634137 to your computer and use it in GitHub Desktop.
Save arch-jslin/634137 to your computer and use it in GitHub Desktop.
guess_server_script.js
// env, kit 為 server 暴露給開發者用的功能物件
var sys = kit.sys; // 服務管理工具
var game = kit.game; // 遊戲邏輯工具
var db = kit.db; // 資料永續儲存介面
var mem = kit.sharedmem; // shared variable, 跨多個 logic files
var data_ = {}; // user defined local variable
/*
* 1. 覆寫遊戲服務的管理事件, 如 start, stop 等, 沒寫的話 server 會用內建版本
*/
sys.on('loop', function(){
// server 定期、反覆執行此函式
kit.say('現在是 tick' + mem.t++);
});
sys.on('start', function(){
// ...服務啟動時...
});
sys.on('stop', function(){
// ...停止服務時...
});
/*
* 2. 自定義的遊戲邏輯事件
* 參數1: message header
* 參數2: handler
*/
game.on('INIT', function(data){ // 遊戲啟動時, 資料初始化一次
mem.plist = {}; // 玩家列表
mem.upperbound = data.upperbound; //初始化遊戲資料1
mem.lowerbound = data.lowerbound; //初始化遊戲資料2
mem.userlimit = data.userlimit;
mem.gameStarted = false; // 遊戲開始與否
mem.t = 0; // 遊戲時間
data_.player_answer_count = 0;
});
game.on('PLAYER_JOIN', function(data){ // 玩家加入, 參考資料存在 data
kit.say('player '+data.email+' wants to join.');
// 遊戲已經開始, 或人已經滿了,不給加
if (mem.gameStarted || count(mem.plist) >= data.userlimit)
return;
var eml = data.email;
var info = data.info;
if (count(mem.plist) < data.userlimit)
mem.plist[eml] = info;
if( count(mem.plist) === data.userlimit ) {
kit.say('game room is full, notifying all players.');
mem.gameStarted = true;
// 發訊息給 plist 上所有人。GAME_START 是應該定義在 client side 的 handler
for ( player in mem.plist ) {
kit.say_to(player, 'GAME_START', /* send data respectively to each players */);
}
}
});
game.on('PLAYER_ANSWER', function(data){ //玩家設定自己的答案
if( mem.plist[data.email].answer === undefined ) {
mem.plist[data.email].answer = data.answer;
++data_.player_answer_count;
}
if( data_.player_answer_count === count(mem.plist) ) {
var p = random(mem.plist);
kit.say_to(p, 'TURN_START');
data_.whos_turn = p;
}
});
game.on('PLAYER_GUESS', function(data){ //玩家猜對方的答案
if( data_.whos_turn.info !== data.info ) //不確定是否該這樣寫,總之作驗證
return;
if( data.guess > mem.upperbound ) return; //驗證猜測是否在原本上下限裡
if( data.guess < mem.lowerbound ) return;
var winner;
if( data.guess > mem.plist[data.opponent.email].answer ) {
kit.say_to(data_.whos_turn, 'TOO_BIG');
}
else if( data.guess < mem.plist[data.opponent.email].answer ) {
kit.say_to(data_.whos_turn, 'TOO_SMALL');
}
else {
winner = data_.whos_turn;
for( player in mem.plist ) {
kit.say_to(player, 'WIN', winner);
}
// Some cleanup here maybe?
}
if( winner === undefined ) { // No winner yet
kit.say_to(data.opponent, 'TURN_START');
data_.whos_turn = data.opponent;
}
});
/* ... */
game.on('PLAYER_QUIT', function(data){ // 玩家離開, 參考資料存在 data
// 其他必須要做的清理 ...
delete mem.plist[data.email];
mem.gameStarted = false;
// 重新讓 game logic 回到待命狀態,等待玩家加入
});
/* ... */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment