上面这些程序已经包括了走棋的全部子程序,现在我们只需再增加一个下棋的协议,工作就算完成了,这个协议就是RUN了。RUN协议其实很简单,就是把一个对手名及其走在哪一列的信息传送给服务器,然后服务器将这个信息传给“我”的对手,对手自动做出反应把棋放在相应位置。
下面请看服务器端的Java代码:
……
else if(cmd.equals(this.cmd_RUN)) {
if(param != null) {
param = param.trim();
if(param.indexOf(" ") != -1) {
String target = param.substring(0, param.indexOf(" "));
String chess_place = param.substring(param.indexOf(" ")+1);
chess_place = chess_place.trim();
User w = user.manager.findNickname(target);
if(w != null && !chess_place.equals("") && !w.nickname.equals(user.nickname)) {
w.notify(packMsg(this.m_RUN, chess_place, "" ));
}
} else {
if(param.indexOf(",") != -1) {
String rival = param.substring(param.indexOf(",")+1);
User w = user.manager.findNickname(rival);
if(w != null && !rival.equals("") && !w.nickname.equals(user.nickname)) {
//将下棋的两个人的状态表示为下棋
user.play_status = "Play";
w.play_status = "Play";
}
}
}
}
}
下棋的时候,当鼠标移到格子的最上面,就会出现一个按钮,效果如图7-15所示。

图7-15
很明显,如果红方在这里走一步的话,就应该落在从下面数第三格。棋盘上方的黄色按钮是隐藏按钮,当鼠标放上去时就会显现出来,这个按钮的程序如下:
on (release) {
// 自己走一步棋
if (_root.i_run && !_root.result && !_root.draw && _root.replay && _root.i_can_play) {
_root.runchess(place, "my");
var chatXML;
var m_Message;
chatXML = new XML();
m_Message = chatXML.createElement("CMD");
m_Message.attributes.VALUE = "RUN";
m_Message.attributes.PARAM = _root.rival+" "+place;
chatXML.appendChild(m_Message);
trace (chatXML.toString());
// send it!!!
_root.chatSocket.send(chatXML);
}
}
这段程序是在走了棋之后向服务器发送字符串,程序流程如下:
调用_root.runchess,在我的机器上显示下棋位置,轮到对方走棋,我被锁定不能走棋。
发送<CMD PARAM="小东瓜 4" VALUE="RUN" />字符串给服务器,其中“小东瓜”是表示我的对手名称,4是表示我在第4列走了棋。
服务器收到这个字符串后,经过上面的Java代码处理,向用户“小东瓜”发送<RUN VALUE="4" />的字符串。
小东瓜在收到<RUN VALUE="4" />字符串后,处理调用_root.runchess在第4列处投子。
轮到对方走棋。
下面请看对方是如何响应我走的棋的:
function onXML_Receive(x) {
……
} else if (e.nodeName == "RUN") {
trace("----- run ---------");
if (trim(e.attributes.Value) == "NO") {
// 表示对手不跟你下了,退出游戏
_root.no_play();
……
} else {
//表示正常下棋
_root.runchess(Number(trim(e.attributes.Value)), "your");
}
……
其实这段代码就是调用了_root.runchess,把下棋的位置传给runchess函数而已。同时可以看到,有一个选项是退出游戏,下面就是_root.no_play子程序:
function no_play() {
var chatXML;
var m_Message;
_root.player_right[_root.now_play_table]=_root.player_left[_root.now_play_table]="";
//不下棋了就应该让双方棋手起立
_root.myself.PlayStatus = "StandUp";
chatXML = new XML();
m_Message = chatXML.createElement("CMD");
m_Message.attributes.VALUE = "SIT";
m_Message.attributes.PARAM = _root.now_play_table+" stand_up "+_root.nickname;
chatXML.appendChild(m_Message);
_root.chatSocket.send(chatXML);
m_Message.attributes.PARAM = _root.now_play_table+" stand_up "+_root.rival;
chatXML.appendChild(m_Message);
_root.chatSocket.send(chatXML);
//清除棋盘、棋子箭头等内容
_root.clear();
_root.rival = "";
// 表示当前走棋显示点不再出现
_root.obj_flash_point._visible = false;
_root.obj_win_defeat.gotoAndStop(1);
_root.now_sit_table = 0;
_root.now_play_table = 0;
_root.gotoAndStop("enter_room");
}
这段退出下棋程序就是让双方起立离开棋桌,然后清除棋盘,回到显示所有棋盘的状态。
最后要介绍的就是退出本系统。在右下角有一个按钮,其程序如下:
on (release) {
var xmlMsg = new XML();
var ack = xmlMsg.createElement("CMD");
ack.attributes.VALUE = "LGOUT";
xmlMsg.appendChild(ack);
chatSocket.send(xmlMsg);
_root.objUserDisplay._visible = false;
_root.objChatDisplay._visible = false;
_root.gotoAndPlay(1);
}
通过这段程序向服务器发出退出命令,系统便退出与服务器的连接,回到登陆页面。至此,游戏的下棋部分讲解完毕。