德州扑克AI WEB版

继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼。哈哈,估计只有自己能玩了

这两天重构了一下界面,基于web服务器和浏览器来交互。

服务器和客户端之间用websocket通信,这种全双工长连接更方便服务器及时的将整个游戏数据向客户端推送。

这篇随笔主要记录一下做前端界面的时候遇到的一些坑,至于德州扑克游戏的具体逻辑以及AI的逻辑可以查看我前两篇随笔

说道web服务器,go语言对这方面封装的非常好,用起来太爽了。而使用websocket,我们需要用到google提供的一个websocket包。

下载地址:http://code.google.com/p/go.net/websocket

如果访问不了的话,可以从这个地址下载:https://github.com/SongLiangChen/websocket(我自己下好,打包在github上)

整个重构非常简单,架设一个web服务器,客户端和服务器之间建立websocket连接,服务器首先将初始化的游戏数据打包成XML推送给客户端,客户端通过JavaScript解析之后将数据展示。之后服务器根据游戏逻辑来等待客户端输入数据,例如下注之类。然后进行下一步计算,并且重新将数据推送给客户端展现。

过程中主要遇到的坑就是JavaScript解析XML的时候,由于各个浏览器之间的不同而导致很多兼容性的问题。

比如chrome不允许跨域访问,同时它又没有实现像IE类似的loadXml()或者load()函数。所以只能通过http请求向服务器索要数据。

            function loadXMLStr(xmlFile){
                try{
                xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
                }catch(e){
                    xmlDoc=document.implementation.createDocument("","",null);
                }
                try{
                    xmlDoc.async=false;
                    xmlDoc.loadXML(xmlFile);
                }catch(e){
                    var xmlhttp = new window.XMLHttpRequest();
                    xmlhttp.overrideMimeType("text/xml; charset=utf-8");
                    xmlhttp.open("GET","xml",false);
                    xmlhttp.send();
                    xmlDoc = xmlhttp.responseXML;
                }

                return xmlDoc;
            };

代码中红色标注的那句话,它的作用是标注请求的数据是一种xml文本资源,并且可以通知服务器浏览器使用的编码方式。如果没有的话,你将会发现responseText能够正确返回数据,但是responseXML将返回NULL。

现在我们chrome中运行这段JS代码, 服务器就会收到一个"xml"(名字可以自己定)的请求。我们只要设置一下路由,收到"xml"请求的时候,将数据发送给客户端就可以啦

func GetXml(w http.ResponseWriter, r *http.Request){
    fmt.Println("getXml ",string(desk.GetXmlData()))
    w.Write(desk.GetXmlData())
}

func main(){
    http.Handle("/con", websocket.Handler(StartGame))
    http.HandleFunc("/", Hello)
    http.HandleFunc("/xml", GetXml)

    if err := http.ListenAndServe(":8080", nil); err != nil{
        fmt.Println("LS Fail")
    }
}

在go语言中,这种事情都不是事情,你可以看到,真的相当简单。

运行服务器,浏览器通过8080端口访问本地就可以玩耍啦

代码开源在github上,欢迎交流:https://github.com/SongLiangChen/AITexasHoldemForWeb

运行时候请将html文件和exe文件放在同一个目录下

时间: 2024-10-22 02:58:35

德州扑克AI WEB版的相关文章

德州扑克AI实现 TexasHoldem Poker

参考了一下这篇文献,http://cowboyprogramming.com/2007/01/04/programming-poker-ai/ 自己用go实现了一个德州扑克AI,效果还可以. 正常和它玩耍的时候,互动性还不错.但是也有一点点问题,比如玩家乱来,把把都ALL IN(反正不是真的要钱),这其实就是在赌运气了,这种情况下测试AI丢牌的概率有点大,如何对付这种赖皮玩家,后期还要改进. 另外现在的实现其实是主要是概率运算,如何增加学习机制是一个努力方向,目前的想法是每一局结束以后,都去分析

德州扑克AI简介——2015华为软件精英赛小结

2015华为软件精英挑战赛的比赛目的是设计德州扑克比赛的牌手程序,采用的是无限注的比赛规则.具体比赛规则见下面链接.在接到这个赛题之初,我们做的第一件事情是熟悉德州扑克的比赛规则,并尽可能去寻找现有的开源项目或者程序.具体来说,着手点主要有四点:维基.论文.比赛和开源项目. 首先阅读的是维基,这里参考的主要是英文的维基百科.通过维基百科,大致了解了德州扑克的发展历史和现状,并且得知在现在每年的都会有人与机器的德州扑克比赛和机器与机器之间的德州扑克比赛.此外,通过维基百科,还了解到当前主流学术界对

德州扑克AI(译)

前言: 最近在研究德州扑克的AI, 也想由浅入深的看下, 在网上找了一圈, 发现很多文章都提到了一篇文章: Programming Poker AI. 仔细拜读了一下, 觉得非常不错. 这里作下简单的翻译工作, 可能加些自己的一些理解, 权当做一回大自然的搬运工, ^_^. 扑克数据模型抽象(Poker Data Type): 本文的作者倾向于使用位/字节级别来描述牌的数据模型(Hand=玩家手牌+公共牌), 也算一种高阶的抽象. 花色(Suit), 其值范围为0..3, 并假定梅花(Clubs

德州扑克AI

德州扑克: 1:outs数,就是所听的牌的数量. 例子: 1:听顺子 4567 outs数就是8,能够成顺子的牌为3和8. 5689 outs数就是4,能够成顺子的牌只有7. 2:听同花     359J outs数就是9,能够成牌的是同一种花色的'A','2','4','6','7','8','10','Q','K'. 3:听同花顺 4567 outs数就是2,能够成牌的是同一种花色的'3','8'. 5689 outs数就是1,能够成牌的是同一种花色的'7'. 4:听同花或顺子 4567 o

在写德州扑克AI的时候想到的一种实现模糊决策的方法

目前的AI决策方式是线性的,给定了一个条件X,代入一条曲线获得一个Y后直接作为决策值.略略灵活一点的,从两条曲线中取得两个值Y1,Y2,然后随机从两者中间的区域中取得一个值. 但是,这样做会使AI表现出非常明显的"边界",与AI交流能够明显的感觉的AI的限度在哪里.感觉会比较"僵硬".原因在于人类的决策过程并没有这种边界.当我们面对某一个条件X的时候,我们的决策"曲线"应该是这个样子的 如图,人类的决策没有明显的边界,所以看起来非常的模糊.模糊处

德州扑克游戏

哇,好久好久没写东西啦... 这两天实现了一个简单的游戏引擎,可以发牌,可以比较两手牌的大小 由于最近都在倒腾Golang,所以用GO实现的.这阶段过后准备用这个引擎来实现一个简单的AI对战,现在先记录一下 接下来我假设你已经懂游戏规则和俗语了 首先是牌的储存,2~~A,一共13张牌,我用的是一个14位的二进制区间来储存的,比如2-A,将表示为:11111111111110,辣么第一位是干啥的呢,请继续看下面 这样的储存方式除了省空间外还有什么优势呢?我们顺子的判断为例:例如顺子10JQKA,在

WEB版一次选择多个文件进行批量上传(Plupload)的解决方案

WEB版一次选择多个文件进行批量上传(Plupload)的解决方案 转载自http://www.cnblogs.com/chillsrc/archive/2013/01/30/2883648.html 说明:Plupload支持多种浏览器,多种上传方式! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 windows程序一样,一次选择多个文件进行批量上传.这样在某些应用上就显得很不人性化,有时候客户希

分享一个德州扑克的算法

德州扑克想必很多人都玩过,当然对于新手需要说明的是,德州指的是德克萨斯州,而不是山东德州. 这几个月一直在做一个德州扑克的服务器,分享下在计算最大牌型,比牌逻辑的算法和洗牌的方法,希望对大家有帮助. 首先我们定义一下Poker类 public class Poker { private String tag; // 图片扑克花色的表示(代表的是红桃.黑桃,梅花.方块 private int num; // 表示扑克牌面的大 public Poker(String tag, int num) {

模拟德州扑克对战游戏

================================================================ 注意:本文参考"巧妙的Python数据结构玩法|实战德州扑克"的相关内容,并在此基础之上完成模拟扑克对战游戏. 原文网址:http://mp.weixin.qq.com/s/JQ0zJGf7Tz49Xn78x7Z40g ================================================================ 我们写了两