ajax方法写一个在线斗地主的游戏,第一章-开发前的准备工作

摘要 很久以前就在思考用ajax实现一个游戏功能的程序,朋友说你做一个斗地主的游戏吧,于是在他们的怂恿之下我开始着手用js来实现。 这里实现的是三人斗地主

很久以前就在思考用ajax实现一个游戏功能的程序,朋友说你做一个斗地主的游戏吧,于是在他们的怂恿之下我开始着手用js来实现。

这里实现的是三人斗地主.

首先我们是用ajax方法与服务器交换数据的,所以学要一个创建ajax对象的方法:

//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函数是这样定义的:

function 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]。

接下来又几个很重要的地方:

do_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来实现它,上代码:

//规则 
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

这是开始之前的准备工作。以后的代码中我们会反复用到刚刚介绍的片段。