ajax方法写一个在线斗地主的游戏,第一章-开发前的准备工作
很久以前就在思考用ajax实现一个游戏功能的程序,朋友说你做一个斗地主的游戏吧,于是在他们的怂恿之下我开始着手用js来实现。
这里实现的是三人斗地主.
首先我们是用ajax方法与服务器交换数据的,所以学要一个创建ajax对象的方法:
1234567891011121314151617181920212223242526272829303132//AJAX
var
http_request =
false
;
function
send_request(url) {
http_request =
false
;
if
(window.XMLHttpRequest) {
http_request =
new
XMLHttpRequest();
if
(http_request.overrideMimeType) {
http_request.overrideMimeType(
'text/xml'
);
}
}
else
if
(window.ActiveXObject) {
try
{
http_request =
new
ActiveXObject(
"Msxml2.XMLHTTP"
);
}
catch
(e) {
try
{
http_request =
new
ActiveXObject(
"Microsoft.XMLHTTP"
);
}
catch
(e) {}
}
}
if
(!http_request) {
alert(
'不能创建 XMLHttpRequest 对象!'
);
return
false
;
}
http_request.onreadystatechange = processRequest;
http_request.open(
'GET'
, url,
true
);
http_request.send(
null
);
}
//处理返回信息
var
type = 0;
function
send_r(url,t){
type = t;
send_request(url);
}
这里有两个函数 send_request完成创建http_request对象,send_r调用这个函数,参数type暂时不用管。在send_request中,http_request.onreadystatechange = processRequest;的作用是将服务器返回的数据交给processRequest函数处理。
processRequest函数是这样定义的:
12345678910111213141516171819202122232425262728293031323334353637function
processRequest() {
if
(http_request.readyState == 1) {
//alert('正在连接');
//document.getELementById('network_status').innerHTML = '正在连接..';
}
if
(http_request.readyState == 4) {
if
(http_request.status == 200) {
if
(type == 0){
var
text = http_request.responseText.split(
"|"
);
player1_name = text[0];
player2_name = text[1];
player3_name = text[2];
flag1=text[25];
lord = text[6];
lord_p = text[7];
flag = text[8];
beishu=text[26];
self_var= text[3];
//本人手中牌的序列
player1_show = text[9];
player2_show = text[10];
player3_show = text[11];
wininfo=text[28];
expectlord=text[24];
if
(status !=
'wait'
){
do_ani1_p(text[4]);
do_ani2_p(text[5]);
do_self_p(text[3]);
do_lord_p(text[7]);
}
self_ok=text[27];
do_user_info(text[12], text[13], text[14], text[15], text[16], text[17],text[18],text[19],text[20],text[21],text[22],text[23]);
}
}
}
}
var text = http_request.responseText.split(
"|"
); 这句是接收服务器返回的字符串,这个字符串包含很多不同的数据,每个数据之间是用|隔开的,因此我们用split将其分割成数组,当然,要使用这些数据还得记住在后台的约定:每个数据代表什么意思。如
player1_name = text[0];
player2_name = text[1];
player3_name = text[2];
表示玩家1(player1_name)的在本次斗地主中的名字是 text[0]。
接下来又几个很重要的地方:
1234do_ani1_p(text[4]);
do_ani2_p(text[5]);
do_self_p(text[3]);
do_lord_p(text[7]);
do_ani1_p,do_ani2_p处理当前玩家的另外两个玩家的牌在自己页面上的显示。do_self_p显示自己的牌,do_lord_p显示地主牌。
最后,既然是斗地主,当然还需要制定斗地主的规则,我们需要用js来实现它,上代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164//规则
function
pai_v(pai){
var
v;
if
(pai ==
'3'
|| pai ==
'F3'
|| pai ==
'T3'
|| pai ==
'H3'
)
v = 3;
if
(pai ==
'4'
|| pai ==
'F4'
|| pai ==
'T4'
|| pai ==
'H4'
)
v = 4;
if
(pai ==
'5'
|| pai ==
'F5'
|| pai ==
'T5'
|| pai ==
'H5'
)
v = 5;
if
(pai ==
'6'
|| pai ==
'F6'
|| pai ==
'T6'
|| pai ==
'H6'
)
v = 6;
if
(pai ==
'7'
|| pai ==
'F7'
|| pai ==
'T7'
|| pai ==
'H7'
)
v = 7;
if
(pai ==
'8'
|| pai ==
'F8'
|| pai ==
'T8'
|| pai ==
'H8'
)
v = 8;
if
(pai ==
'9'
|| pai ==
'F9'
|| pai ==
'T9'
|| pai ==
'H9'
)
v = 9;
if
(pai ==
'10'
|| pai ==
'F10'
|| pai ==
'T10'
|| pai ==
'H10'
)
v = 10;
if
(pai ==
'11'
|| pai ==
'F11'
|| pai ==
'T11'
|| pai ==
'H11'
)
v = 11;
if
(pai ==
'12'
|| pai ==
'F12'
|| pai ==
'T12'
|| pai ==
'H12'
)
v = 12;
if
(pai ==
'13'
|| pai ==
'F13'
|| pai ==
'T13'
|| pai ==
'H13'
)
v = 13;
if
(pai ==
'1'
|| pai ==
'F1'
|| pai ==
'T1'
|| pai ==
'H1'
)
v = 14;
if
(pai ==
'2'
|| pai ==
'F2'
|| pai ==
'T2'
|| pai ==
'H2'
)
v = 15;
if
(pai ==
'JOKE1'
)
v = 16;
if
(pai ==
'JOKE2'
)
v = 17;
if
(pai ==
'NO'
)
v = 0;
return
v;
}
function
pai_a(pai){
//return 1;
var
split_pai = pai.split(
","
);
var
pai_num = split_pai.length - 1;
var
count =
new
Array(1,1,1,1,1,1,1,1,1,1,1,1);
var
k = 0;
for
(
var
i = 1;i < pai_num;i ++)
//
{
if
(pai_v(split_pai[i]) == pai_v(split_pai[i - 1]))
//如果是相同的,因为牌是按照从小到大的顺序排列的,所以如果是对子都是挨着的。
count[k] ++;
else
k ++;
}
var
r =
''
;
for
(
var
i = 0;i < count.length;i ++)
{
r += count[i]+
","
;
}
//对
if
(pai_num == 2 && r ==
'2,1,1,1,1,1,1,1,1,1,1,1,'
)
return
pai_c(pai_v(split_pai[0]), pai_num,
'dui'
+pai_v(split_pai[0]));
//三只
if
(pai_num == 3 && r ==
'3,1,1,1,1,1,1,1,1,1,1,1,'
)
return
pai_c(pai_v(split_pai[0]), pai_num,
'san'
);
//四只
if
(pai_num == 4 && r ==
'4,1,1,1,1,1,1,1,1,1,1,1,'
)
return
pai_c(pai_v(split_pai[0]), pai_num,
'zha'
);
//四带二只
if
(pai_num == 6 && (r ==
'4,1,1,1,1,1,1,1,1,1,1,1,'
|| r ==
'1,4,1,1,1,1,1,1,1,1,1,1,'
|| r ==
'1,1,4,1,1,1,1,1,1,1,1,1,'
))
{
if
(count[0] == 4)
return
pai_c(pai_v(split_pai[3]), pai_num,
'sidaier'
);
else
if
(count[1] == 4)
return
pai_c(pai_v(split_pai[4]), pai_num,
'sidaier'
);
else
if
(count[2] == 4)
return
pai_c(pai_v(split_pai[5]), pai_num,
'sidaier'
);
}
//四带二对
if
(pai_num == 8 && (r ==
'4,2,2,1,1,1,1,1,1,1,1,1,'
|| r ==
'2,4,2,1,1,1,1,1,1,1,1,1,'
|| r ==
'2,2,4,1,1,1,1,1,1,1,1,1,'
))
{
if
(count[0] == 4)
return
pai_c(pai_v(split_pai[3]), pai_num,
'sidailiangdui'
);
else
if
(count[1] == 4)
return
pai_c(pai_v(split_pai[5]), pai_num,
'sidailiangdui'
);
else
if
(count[2] == 4)
return
pai_c(pai_v(split_pai[7]), pai_num,
'sidailiangdui'
);
}
//三带一
if
(pai_num == 4 && (r ==
'3,1,1,1,1,1,1,1,1,1,1,1,'
|| r ==
'1,3,1,1,1,1,1,1,1,1,1,1,'
))
{
if
(count[0] > count[1])
return
pai_c(pai_v(split_pai[2]), pai_num,
'sandaiyi'
);
else
return
pai_c(pai_v(split_pai[3]), pai_num,
'sandaiyi'
);
}
//三带二
if
(pai_num == 5 && (r ==
'3,2,1,1,1,1,1,1,1,1,1,1,'
|| r ==
'2,3,1,1,1,1,1,1,1,1,1,1,'
))
{
if
(count[0] > count[1])
return
pai_c(pai_v(split_pai[2]), pai_num,
'sandaiyidui'
);
else
return
pai_c(pai_v(split_pai[4]), pai_num,
'sandaiyidui'
);
}
//连对
if
((pai_num == 6 && r ==
'2,2,2,1,1,1,1,1,1,1,1,1,'
) || (pai_num == 8 && r ==
'2,2,2,2,1,1,1,1,1,1,1,1,'
) || (pai_num == 10 && r ==
'2,2,2,2,2,1,1,1,1,1,1,1,'
) || (pai_num == 12 && r ==
'2,2,2,2,2,2,1,1,1,1,1,1,'
) || (pai_num == 14 && r ==
'2,2,2,2,2,2,2,1,1,1,1,1,'
) || (pai_num == 16 && r ==
'2,2,2,2,2,2,2,3,1,1,1,1,'
) || (pai_num == 18 && r ==
'2,2,2,2,2,2,2,2,2,1,1,1,'
) || (pai_num == 20 && r ==
'2,2,2,2,2,2,2,2,2,2,1,1,'
))
{
var
flag = 0;
for
(
var
i = 2;i < pai_num;i += 2)
{
if
(pai_v(split_pai[i]) - pai_v(split_pai[i - 1]) != 1)
{
flag = 1;
break
;
}
}
if
(flag == 0){
return
pai_c(pai_v(split_pai[pai_num - 1]), pai_num,
'liandui'
);
}
}
//飞机
if
((pai_num == 3+3+2 && (r ==
'3,3,2,1,1,1,1,1,1,1,1,1,'
|| r ==
'2,3,3,1,1,1,1,1,1,1,1,1,'
)) || (pai_num == 3+3+2+2 && (r ==
'3,3,2,2,1,1,1,1,1,1,1,1,'
|| r ==
'2,3,3,2,1,1,1,1,1,1,1,1,'
|| r ==
'2,2,3,3,1,1,1,1,1,1,1,1,'
)) || (pai_num == 3+3+1+1 && (r ==
'3,3,1,1,1,1,1,1,1,1,1,1,'
|| r ==
'1,3,3,1,1,1,1,1,1,1,1,1,'
|| r ==
'1,1,3,3,1,1,1,1,1,1,1,1,'
)))
{
if
(count[0] == 3 && count[1] == 3 && pai_v(split_pai[3]) - pai_v(split_pai[2]) == 1)
return
pai_c(pai_v(split_pai[3]), pai_num,
'feiji'
);
//3322,3311,332
if
(count[0] == 2 && count[1] == 3 && pai_v(split_pai[5]) - pai_v(split_pai[4]) == 1)
return
pai_c(pai_v(split_pai[5]), pai_num,
'feiji'
);
//2332,233
if
(count[0] == 1 && count[1] == 3 && pai_v(split_pai[4]) - pai_v(split_pai[3]) == 1)
return
pai_c(pai_v(split_pai[4]), pai_num,
'feiji'
);
//1331
if
(count[0] == 2 && count[1] == 2 && pai_v(split_pai[7]) - pai_v(split_pai[6]) == 1)
return
pai_c(pai_v(split_pai[7]), pai_num,
'feiji'
);
//2233
if
(count[0] == 1 && count[1] == 1 && pai_v(split_pai[5]) - pai_v(split_pai[4]) == 1)
return
pai_c(pai_v(split_pai[5]), pai_num,
'feiji'
);
//1133
}
//对王
if
(pai_num == 2 && ((pai_v(split_pai[0]) == 16 && pai_v(split_pai[1]) == 17) || (pai_v(split_pai[0]) == 17 && pai_v(split_pai[1]) == 16)))
return
pai_c(100, pai_num,
'wangzha'
);
//单
if
(pai_num == 1)
return
pai_c(pai_v(split_pai[0]), pai_num, pai_v(split_pai[0]));
//顺子
if
(pai_v(split_pai[pai_num - 1]) <= pai_v(1) && pai_num >= 5 && r ==
'1,1,1,1,1,1,1,1,1,1,1,1,'
)
{
var
flag2 = 0;
for
(
var
i = 1;i < pai_num;i ++)
{
if
(pai_v(split_pai[i]) - pai_v(split_pai[i - 1]) != 1)
{
flag2 = 1;
break
;
}
}
if
(flag2 == 0)
return
pai_c(pai_v(split_pai[pai_num - 1]), pai_num,
'shunzi'
);
}
return
Array(0,0,0);
}
function
pai_c(v,num, t){
var
arr =
new
Array();
arr[0] = v;
arr[1] = num;
arr[2] = t;
return
arr;
}
//-----------END
这是开始之前的准备工作。以后的代码中我们会反复用到刚刚介绍的片段。
这篇文章还发表在http://jcodecraeer.com/a/jquery_js_ajaxjishu/2012/0602/224.html,同步更新请关注