<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>会说话的狗</title>
	<atom:link href="http://www.quou.cn/feed" rel="self" type="application/rss+xml" />
	<link>http://www.quou.cn</link>
	<description>写的任何一句代码都不是为了混饭吃！</description>
	<lastBuildDate>Fri, 10 Feb 2012 10:02:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>[转载]负载均衡和过载保护</title>
		<link>http://www.quou.cn/archives/914</link>
		<comments>http://www.quou.cn/archives/914#comments</comments>
		<pubDate>Wed, 08 Feb 2012 01:04:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[系统架构]]></category>
		<category><![CDATA[负载均衡]]></category>
		<category><![CDATA[过载保护]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=914</guid>
		<description><![CDATA[一.负载均衡 &#160;&#160;&#160;&#160;&#160;&#160;简单来说，就是按照目标server的参数进行合理分配，这个参数可以是失败率，也可以是响应时间，也可以是请求量，甚至是随机数。 &#160;&#160;&#160;&#160;&#160;&#160;我们来按照从简单到复杂逐个看一下几种实现。 1.轮询式 逻辑比较简单，直接看代码： vector vecServer; while(1) { Server* server = vecServer[curIndex % vecServer.size()]; curIndex ++; } &#160;&#160;&#160;&#160;&#160;&#160;如上代码就是一个简单的轮询式分配方法，这种方法优点实现简单，cpu计算少，缺点就是无法动态判断server的状态，当后端有一台server挂掉的时候，会至少1/vecServer.size()的请求。（最为严重的情况是由于单台后端server的超时导致前段全部挂死）。而且这种分配方法有一个bug，就是当每次请求结束后就释放内存，那么curIndex永远都只会为0，即每次都请求第一个server。 2.定死权重式 &#160;&#160;&#160;&#160;&#160;&#160;这种方式适用于那种需要实现就规定后端server的权重，比如A比Bserver的响应速度快，我们希望A接受的请求比B多。 //假设A，B, C server的权重分别为 10 5 2 typedef struct _serverinfo { //server 指针 Server* server; //权重 int weight; }ServerInfo;   vector vecServer; vecServer.push_back(A); vecServer.push_back(B); vecServer.push_back(C);   vector vecWeight; for (unsigned i = 0; i < [...]]]></description>
			<content:encoded><![CDATA[<p>一.负载均衡<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单来说，就是按照目标server的参数进行合理分配，这个参数可以是失败率，也可以是响应时间，也可以是请求量，甚至是随机数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们来按照从简单到复杂逐个看一下几种实现。<br />
1.轮询式<br />
逻辑比较简单，直接看代码：</p>
<pre lang='c++' colla='+'>
vector<Server*> vecServer;
while(1)
{
    Server* server = vecServer[curIndex % vecServer.size()];
    curIndex ++;
}
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如上代码就是一个简单的轮询式分配方法，这种方法优点实现简单，cpu计算少，缺点就是无法动态判断server的状态，当后端有一台server挂掉的时候，会至少1/vecServer.size()的请求。（最为严重的情况是由于单台后端server的超时导致前段全部挂死）。而且这种分配方法有一个bug，就是当每次请求结束后就释放内存，那么curIndex永远都只会为0，即每次都请求第一个server。</p>
<p>2.定死权重式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种方式适用于那种需要实现就规定后端server的权重，比如A比Bserver的响应速度快，我们希望A接受的请求比B多。</p>
<pre lang='c++' colla='+'>
//假设A，B, C server的权重分别为 10 5 2
typedef struct _serverinfo
{
    //server 指针
    Server* server;
    //权重
    int weight;
}ServerInfo;
 
vector<ServerInfo*> vecServer;
vecServer.push_back(A);
vecServer.push_back(B);
vecServer.push_back(C);
 
vector<int> vecWeight;
for (unsigned i = 0; i < vecServer.size(); i++)
{
    vecWeight.insert(vecWeight.end(),vecServer[i]->weight,i);
}
while(1)
{
    index = vecWeight;
    Server* server = vecServer[index].server;
}
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面的代码也比较好理解，一共有两个数组，一个是server信息数组vecServer，一个是权重数组vecWeight。在分配server时，先通过权重数组vecWeight获取到server信息数组的下标，然后分配server。<br />
这样的做法在我1年半写的一个项目是有使用的，经过统计效果是很不错的，基本是访问量是严格按照权重比分配的。这样做的cpu消耗也不高，但是缺点也是显而易见的，就是还是没有办法动态调整权重，需要人为去修改。所以我们接下来看第三种。</p>
<p>3.动态调整权重<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要讨论这种方法前，我们先要明确几个希望使用他的原因：</p>
<p>1.我们希望server能够自动按照运行状态进行按照权重的选择<br />
2.我们不希望手工去配置权重变化</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后是我们实现方法，很明显，我们需要一个基准来告诉我们这台server是否是正常的。这个基准是什么，是历史累计的平均值。比如如果是按照响应时间分配权重，那么就是所有后端server历史累计的平均响应时间，如果是错误率也是如此。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么一旦调整了权重，我们什么时候来调整权重呢，调整比例是怎样呢？按照我的经验，一般是隔一段固定时间才进行调整，如果正常但是权重过低，那么就按照20%的比例恢复；如果server不正常，那么直接按照当前server响应时间/历史平均响应时间进行降权。这里的逻辑之所以不一样是有原因的，因为服务出现问题的时候，我们是能够知道这坏的程度有多少的，就是当前server响应时间/历史平均响应时间进行降权；但是要恢复的时候，你并不能保证server能够支撑到多大的访问量，所以只能按照20%放量来试。也避免滚雪球效应的发生。<br />
我们来看一下代码。</p>
<pre lang='c++' colla='+'>
typedef struct _serverinfo
{
    unsigned        _svr_ip;            //目标主机
    float           _cfg_wt;            //配置的权重
    float           _cur_wt;            //当前实际权重
    int             _req_count;         //请求数
    float           _rsp_time;    //请求总响应时间
    float           _rsp_avg_time;      //请求平均响应时间
    int             _rsp_error;         //请求错误数
}ServerInfo;
 
vector<ServerInfo*> vecServer;
int total_rsp_time = 0;
int total_req_count = 0;
 
unsigned int comWeight = 100;
unsigned int MaxWeight = 1000;
while(1)
{
    //按照文中第二种方式进行server分配
    serverInfo._req_count++;
    serverInfo._rsp_time+=rsp_time;//响应时间
 
    total_req_count++;
    total_rsp_time += rsp_time;
 
    if(! 需要重建权重)
    {
        continue;
    }
 
    float total_rsp_avg_time = (float)total_rsp_time / (float)total_req_count;
    for(vector<ServerInfo*>::iterator it = vecServer.begin();it!=vecServer.end();++it)
    {
        it->_rsp_avg_time = (float)it->_rsp_time / (float)it->_req_count;
        if(it->_rsp_avg_time > total_rsp_avg_time)
        {
            it->_cur_wt = int(comWeight*total_rsp_avg_time/it->_rsp_avg_time);
        }
        else
        {
            it->_cur_wt *= 1.2;
        }
        it->_cur_wt = it->_cur_wt < MaxWeight ? it->_cur_wt : MaxWeight;
    }
 
    //按照文中第二种方式重建权重数组
}
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上基本展示了动态调整的过程，代码可能只是起演示作用，很多比如越界的检测都没有做，大家参照就好~</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK，到这里我们基本就结束了负载均衡的讨论了，但是还有一个话题：过载保护。<br />
二.过载保护<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于过载保护其实经常适合负载均衡结合在一起使用的，但有两个问题：</p>
<p>1.过载参照的基准是谁。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是上面代码中的total_rsp_avg_time吗？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不是，因为除非所有机器的正常性能完全一样，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否则不可以拿total_rsp_avg_time来作为某台机器的负载基准。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而能拿来做参照的，只有这台server自身的历史累计值。<br />
2.怎么实现过载保护。其实很简单，我们定义两个值_cur_max_queue_cnt和_queue_req_cnt，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;意义分别是这个server上在一段时间内允许分配的最多次数和当前已经排队的个数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_cur_max_queue_cnt值是通过当前时间段响应时间和历史累计时间算出来的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每次使用分配的server前，都要判断一下_queue_req_cnt是否达到了_cur_max_queue_cnt，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果达到了，分配失败。否则分配成功并且_queue_req_cnt++。<br />
代码如下：</p>
<pre lang='c++' colla='+'>
typedef struct _serverinfo
{
    unsigned        _svr_ip;            //目标主机
    float           _cfg_wt;            //配置的权重
    float           _cur_wt;            //当前实际权重
    int             _req_count;         //请求数
    float           _rsp_time;    //请求总响应时间
    float           _rsp_avg_time;      //请求平均响应时间
    int             _rsp_error;         //请求错误数
 
    int             _total_req_count;           //总的请求数
    float           _total_rsp_avg_time;        //总的请求平均响应时间
    int             _total_rsp_error;           //总的请求错误数
    float           _total_rsp_time;        //总的请求时间
 
    float           _cur_max_queue_cnt; //当前实际允许的最大排队请求数
    int             _queue_req_cnt;         //当前排队请求数
 
}ServerInfo;
 
float comxQueueSize = 1000;
float maxQueueSize = 10000;
while(1)
{
    //按照文中第二种方式进行server分配
 
    if(serverInfo._queue_req_cnt > serverInfo._cur_max_queue_cnt)
    {
        //分配失败
        continue;
    }
    serverInfo._queue_req_cnt ++;
 
    serverInfo._req_count++;
    serverInfo._rsp_time+=rsp_time;//响应时间
 
    serverInfo._total_req_count++;
    serverInfo._total_rsp_time+=rsp_time;//响应时间
 
    total_req_count++;
    total_rsp_time += rsp_time;
 
    if(! 需要重建权重)
    {
        continue;
    }
 
    //按照第三种方法重新分配权重
    //按照文中第二种方式重建权重数组
 
    //其实和上面的循环合并成一个
    for(vector<ServerInfo*>::iterator it = vecServer.begin();it!=vecServer.end();++it)
    {
        it->_total_rsp_avg_time = (float)it->_total_rsp_time / (float)it->_total_req_count;
        if(it->_rsp_avg_time > it->_total_rsp_avg_time)
        {
            it->_cur_max_queue_cnt = int(comxQueueSize*it->_total_rsp_avg_time/it->_rsp_avg_time);
        }
        else
        {
            it->_cur_max_queue_cnt *= 1.2;
        }
        it->_cur_max_queue_cnt = it->_cur_max_queue_cnt < maxQueueSize ? it->_cur_max_queue_cnt : maxQueueSize;
        it->_queue_req_cnt = 0;
    }
}
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面的代码为了演示方便，所以把两个for循环拆开了，实际上是应该合到一个里面写的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/914/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;无蓝牙图标&#8221;的解决办法</title>
		<link>http://www.quou.cn/archives/911</link>
		<comments>http://www.quou.cn/archives/911#comments</comments>
		<pubDate>Thu, 02 Feb 2012 04:16:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[会说话的狗]]></category>
		<category><![CDATA[蓝牙]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=911</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;今天买了一个蓝牙适配器，结果插在电脑上，右下角一点提示都没有，搜索半天无果，最终看到一篇文章，写下来吧。我电脑win7. &#160;&#160;&#160;&#160;&#160;&#160;第一方法：【开始】->【设备和打印机】->Intel(R) Centrino(R) Wireless Bluetooth(R) 3.0 + High Speed Adapter（类似文件名）->【右键】->【Bluetooth设置】->【在通知区域显示Bluetooth图标】。 &#160;&#160;&#160;&#160;&#160;&#160;第二方法：【控制面板】->【设备和打印机】&#8230;]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天买了一个蓝牙适配器，结果插在电脑上，右下角一点提示都没有，搜索半天无果，最终看到一篇文章，写下来吧。我电脑win7.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一方法：【开始】->【设备和打印机】->Intel(R) Centrino(R) Wireless Bluetooth(R) 3.0 + High Speed Adapter（类似文件名）->【右键】->【Bluetooth设置】->【在通知区域显示Bluetooth图标】。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二方法：【控制面板】->【设备和打印机】&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/911/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一些linux基本命令</title>
		<link>http://www.quou.cn/archives/906</link>
		<comments>http://www.quou.cn/archives/906#comments</comments>
		<pubDate>Thu, 26 Jan 2012 15:01:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[系统架构]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=906</guid>
		<description><![CDATA[闲来无事，买了个vps，学习一下装系统，先备份一些linux常用命令： 系统 View Code HTML1 2 3 4 5 6 7 8 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量 资源 View Code HTML1 [...]]]></description>
			<content:encoded><![CDATA[<p>  闲来无事，买了个vps，学习一下装系统，先备份一些linux常用命令：<br />
<strong>系统</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code9'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p9069"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p906code9"><pre class="html" style="font-family:Dialog;"># uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量</pre></td></tr></table></div>

<p><strong>资源</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code10'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p90610"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p906code10"><pre class="html" style="font-family:Dialog;"># free -m                # 查看内存使用量和交换区使用量
# df -h                  # 查看各分区使用情况
# du -sh &lt;目录名&gt;        # 查看指定目录的大小
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载
# cat /proc/loadavg      # 查看系统负载</pre></td></tr></table></div>

<p><strong>磁盘和分区</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code11'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p90611"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p906code11"><pre class="html" style="font-family:Dialog;"># mount | column -t      # 查看挂接的分区状态
# fdisk -l               # 查看所有分区
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE       # 查看启动时IDE设备</pre></td></tr></table></div>

<p><strong>检测状况网络</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code12'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p90612"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p906code12"><pre class="html" style="font-family:Dialog;"># ifconfig               # 查看所有网络接口的属性
# iptables -L            # 查看防火墙设置
# route -n               # 查看路由表
# netstat -lntp          # 查看所有监听端口
# netstat -antp          # 查看所有已经建立的连接
# netstat -s             # 查看网络统计信息</pre></td></tr></table></div>

<p><strong>进程</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code13'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p90613"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p906code13"><pre class="html" style="font-family:Dialog;"># ps -ef                 # 查看所有进程
# top                    # 实时显示进程状态</pre></td></tr></table></div>

<p><strong>用户</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code14'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p90614"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p906code14"><pre class="html" style="font-family:Dialog;"># w                      # 查看活动用户
# id &lt;用户名&gt;            # 查看指定用户信息
# last                   # 查看用户登录日志
# cut -d: -f1 /etc/passwd   # 查看系统所有用户
# cut -d: -f1 /etc/group    # 查看系统所有组
# crontab -l             # 查看当前用户的计划任务</pre></td></tr></table></div>

<p><strong>服务</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code15'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p90615"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p906code15"><pre class="html" style="font-family:Dialog;"># chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on    # 列出所有启动的系统服务程序</pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p906code16'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p90616"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p906code16"><pre class="html" style="font-family:Dialog;"># rpm -qa                # 查看所有安装的软件包</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/906/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于websocket的python实现</title>
		<link>http://www.quou.cn/archives/896</link>
		<comments>http://www.quou.cn/archives/896#comments</comments>
		<pubDate>Mon, 16 Jan 2012 08:10:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax应用]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[websocket]]></category>
		<category><![CDATA[协议]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=896</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;又是闲来无事，熟悉一下websocket相关东东，写了一个小demo，才发现不能用，最后搜索发现websocket连接有一个握手过程，这个过程和flash的鉴权是类似操作。来看看一个websocket协议的数据包结构吧，如果不喜欢看英文，可以看这篇博客的简介：http://blog.csdn.net/fenglibing/article/details/6852497： &#160;&#160;&#160;&#160;&#160;&#160;欲了解详情，可以访问：http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10了解情况，在这个版本之前还有一个老版协议：http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-02，貌似safari浏览器还用的该协议，需要了解可以直接去查看，下面贴一个websocket通信协议帮助类： View Code PYTHON1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;又是闲来无事，熟悉一下websocket相关东东，写了一个小demo，才发现不能用，最后搜索发现websocket连接有一个握手过程，这个过程和flash的鉴权是类似操作。来看看一个websocket协议的数据包结构吧，如果不喜欢看英文，可以看这篇博客的简介：http://blog.csdn.net/fenglibing/article/details/6852497：<br />
<img src="http://www.quou.cn/wp-content/uploads/2012/01/websocket.png" alt="" title="websocket" width="529" height="285" class="aligncenter size-full wp-image-904" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;欲了解详情，可以访问：http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10了解情况，在这个版本之前还有一个老版协议：http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-02，貌似safari浏览器还用的该协议，需要了解可以直接去查看，下面贴一个websocket通信协议帮助类：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p896code20'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p89620"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
</pre></td><td class="code" id="p896code20"><pre class="python" style="font-family:Dialog;"><span style="color: #ff7700;font-weight:bold;">import</span> hashlib
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">base64</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> WebSocket:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, protocols = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">header</span> = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">protocols</span> = protocols
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> trim<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'去除空白字符'</span><span style="color: #483d8b;">''</span>
        rep = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>, <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\r</span>'</span>, <span style="color: #483d8b;">' '</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> rep:
            <span style="color: #008000;">str</span> = <span style="color: #008000;">str</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span>i, <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">str</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> unpack_data<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'解析数据包'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Version'</span><span style="color: black;">&#93;</span> == <span style="color: #ff4500;">1</span>: <span style="color: #808080; font-style: italic;">#老版本</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> data<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
        code_length = <span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&amp;</span> <span style="color: #ff4500;">127</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> code_length == <span style="color: #ff4500;">126</span>:
            masks = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span>:<span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
            data = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>:<span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> code_length == <span style="color: #ff4500;">127</span>:
            masks = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">10</span>:<span style="color: #ff4500;">14</span><span style="color: black;">&#93;</span>
            data = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">14</span>:<span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            masks = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: #ff4500;">6</span><span style="color: black;">&#93;</span>
            data = data<span style="color: black;">&#91;</span><span style="color: #ff4500;">6</span>:<span style="color: black;">&#93;</span>
&nbsp;
        i = <span style="color: #ff4500;">0</span>
        raw_str = <span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> d <span style="color: #ff7700;font-weight:bold;">in</span> data:
            raw_str += <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span><span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>d<span style="color: black;">&#41;</span> ^ <span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>masks<span style="color: black;">&#91;</span>i<span style="color: #66cc66;">%</span>4<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            i += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> raw_str
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> pack_data<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'打包数据'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Version'</span><span style="color: black;">&#93;</span> == <span style="color: #ff4500;">1</span>: <span style="color: #808080; font-style: italic;">#老版本</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>00'</span>+<span style="color: #008000;">str</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>FF'</span>
&nbsp;
        data = <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>81'</span>
&nbsp;
        dlen = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlen <span style="color: #66cc66;">&lt;</span>= <span style="color: #ff4500;">125</span>:
            data += <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>dlen<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            data + <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">126</span><span style="color: black;">&#41;</span>
            data + <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>dlen<span style="color: #66cc66;">&gt;&gt;</span><span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>
            data + <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>dlen<span style="color: #66cc66;">&amp;</span>0xFF<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> data + <span style="color: #008000;">str</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_token1<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, key1, key2, key3<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'老版本token算法'</span><span style="color: #483d8b;">''</span>
        num1 = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>i <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> key1 <span style="color: #ff7700;font-weight:bold;">if</span> i.<span style="color: black;">isdigit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        spa1 = key1.<span style="color: black;">count</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">' '</span><span style="color: black;">&#41;</span>
        num2 = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>i <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> key2 <span style="color: #ff7700;font-weight:bold;">if</span> i.<span style="color: black;">isdigit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        spa2 = key2.<span style="color: black;">count</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">' '</span><span style="color: black;">&#41;</span>
        combined = <span style="color: #dc143c;">struct</span>.<span style="color: black;">pack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&gt;II'</span>, num1/spa1, num2/spa2<span style="color: black;">&#41;</span> + key3
        <span style="color: #ff7700;font-weight:bold;">return</span> hashlib.<span style="color: #dc143c;">md5</span><span style="color: black;">&#40;</span>combined<span style="color: black;">&#41;</span>.<span style="color: black;">digest</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_hand_shake1<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'老版本头握手消息'</span><span style="color: #483d8b;">''</span>
        data  = <span style="color: #483d8b;">'HTTP/1.1 101 WebSocket Protocol Handshake<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Upgrade: WebSocket<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Connection: Upgrade<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Sec-WebSocket-Origin: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Sec-WebSocket-Location: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Sec-WebSocket-Protocol: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
&nbsp;
        data = data <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Sec-WebSocket-Origin'</span><span style="color: black;">&#93;</span>, 
                       <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Sec-WebSocket-Location'</span><span style="color: black;">&#93;</span>, 
                       <span style="color: #483d8b;">','</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">protocols</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> data
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_token2<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, key<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'新版本token算法'</span><span style="color: #483d8b;">''</span>
        key += <span style="color: #483d8b;">'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'</span>
        skey = hashlib.<span style="color: black;">sha1</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>.<span style="color: black;">digest</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">base64</span>.<span style="color: black;">b64encode</span><span style="color: black;">&#40;</span>skey<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_hand_shake2<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'新版本头握手消息'</span><span style="color: #483d8b;">''</span>
        data  = <span style="color: #483d8b;">'HTTP/1.1 101 Switching Protocols<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Upgrade: websocket<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Connection: Upgrade<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Sec-WebSocket-Accept: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
        data += <span style="color: #483d8b;">'Sec-WebSocket-Protocol: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span>
&nbsp;
        data = data <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Token'</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">','</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">protocols</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> data
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> decode_header<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'解析websocket握手消息'</span><span style="color: #483d8b;">''</span>
        ret = msg.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> ret:
            h = i.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">':'</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">trim</span><span style="color: black;">&#40;</span>h<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">trim</span><span style="color: black;">&#40;</span>h<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Sec-WebSocket-Location'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'ws://'</span>+<span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Host'</span><span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">header</span>.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Sec-WebSocket-Key1'</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Version'</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">1</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Token'</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">get_token1</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Sec-WebSocket-Key1'</span><span style="color: black;">&#93;</span>, 
                                                   <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Sec-WebSocket-Key2'</span><span style="color: black;">&#93;</span>, 
                                                   msg<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">9</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_hand_shake1</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Version'</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">2</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Token'</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">get_token2</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">header</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'Sec-WebSocket-Key'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_hand_shake2</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>这里用python的socketServer模块搭建一个socket服务来说明这个类的用法：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p896code21'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p89621"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="code" id="p896code21"><pre class="python" style="font-family:Dialog;"><span style="color: #ff7700;font-weight:bold;">class</span> ThreadedTCPRequestHandler<span style="color: black;">&#40;</span><span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">BaseRequestHandler</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'线程请求管理'</span><span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> setup<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">settimeout</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3600</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#保证连接超时释放</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">web_socket</span> = WebSocket<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'chat'</span>, <span style="color: #483d8b;">'texas'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> handle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
                ctime = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                buf = <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1024</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> buf:
                    <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> buf<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:<span style="color: #ff4500;">20</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'GET /socket HTTP/1.1'</span>:
                    data = <span style="color: #008000;">self</span>.<span style="color: black;">web_socket</span>.<span style="color: black;">decode_header</span><span style="color: black;">&#40;</span>buf<span style="color: black;">&#91;</span><span style="color: #ff4500;">21</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
                    <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">send</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
                    <span style="color: #ff7700;font-weight:bold;">print</span> data
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    data = <span style="color: #008000;">self</span>.<span style="color: black;">web_socket</span>.<span style="color: black;">unpack_data</span><span style="color: black;">&#40;</span>buf<span style="color: black;">&#41;</span>
                    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'%s&gt;&gt;%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>data, <span style="color: #dc143c;">binascii</span>.<span style="color: black;">hexlify</span><span style="color: black;">&#40;</span>buf<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                    <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">web_socket</span>.<span style="color: black;">pack_data</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'server return:%s'</span> <span style="color: #66cc66;">%</span> data<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">timeout</span>:<span style="color: #808080; font-style: italic;">#连接超时</span>
            cur_thread = <span style="color: #dc143c;">threading</span>.<span style="color: black;">currentThread</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            emsg = cur_thread.<span style="color: black;">getName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">' timeout connect!'</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> emsg
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'error in ThreadedTCPRequestHandler :%s'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">traceback</span>.<span style="color: black;">format_exc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'request closed!'</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ThreadedTCPServer<span style="color: black;">&#40;</span><span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">ThreadingMixIn</span>, <span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">TCPServer</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Server:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, host, port<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">host</span> = host
        <span style="color: #008000;">self</span>.<span style="color: black;">port</span> = port
        <span style="color: #008000;">self</span>.<span style="color: black;">server</span> = <span style="color: #008000;">None</span>
        ThreadedTCPServer.<span style="color: black;">allow_reuse_address</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">server</span> = ThreadedTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">host</span>, <span style="color: #008000;">self</span>.<span style="color: black;">port</span><span style="color: black;">&#41;</span>, ThreadedTCPRequestHandler<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server</span>.<span style="color: black;">serve_forever</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    Server<span style="color: black;">&#40;</span><span style="color: #483d8b;">'0.0.0.0'</span>, <span style="color: #ff4500;">25525</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前端html写作方法，没有什么特别注意的，websocket提供的api非常简单（ie9不支持，ie10支持，但需要win8才能安装，firefox支持很好，chrome支持，opera最新版不支持）：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p896code22'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p89622"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
</pre></td><td class="code" id="p896code22"><pre class="html" style="font-family:Dialog;">&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;测试websocket&lt;/title&gt;
&lt;style&gt;
.debug{ border:1px #333333 solid; width:80%; padding:5px; box-shadow:1px 2px 1px 1px #999;}
.debug span{ color:#900; font-weight:bold;}
&lt;/style&gt;
&nbsp;
&lt;/head&gt;
&nbsp;
&lt;body&gt;
&nbsp;
&lt;div&gt;
	&lt;input type=&quot;text&quot; id=&quot;msg&quot; /&gt;&lt;input type=&quot;button&quot; id=&quot;submit&quot; value=&quot;发送&quot; /&gt;
&lt;/div&gt;
&nbsp;
&lt;script src=&quot;http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.min.js&quot; language=&quot;javascript&quot;&gt;&lt;/script&gt;
&lt;script&gt;
	var xprint = function(msg){
		var debug = $('#debug');
		if(debug.length&lt;1){
			$('body').before($('&lt;div id=&quot;debug&quot; class=&quot;debug&quot;&gt;&lt;/div&gt;'));
			debug = $('#debug');
		}
		debug.html(debug.html()+msg+'&lt;br /&gt;');
	};
&nbsp;
	var socket = null;
	var socket_connected = false;
&nbsp;
	var testSocket = function(host, protocols){
		try{
			if($.browser.msie){
				alert('Internet Explorer dont support WebSocket!');
				return false;
			}else if($.browser.mozilla){
				socket = new MozWebSocket(host, ['chat','texas']);
			}else if($.browser.safari || $.browser.opera){
				socket = new WebSocket(host, protocols);
			}
&nbsp;
			socket.onopen = function(e){
				socket_connected = true;
				xprint('&lt;span&gt;【socket connected】&lt;/span&gt;:'+e);
			};
&nbsp;
			socket.onmessage = function(e){
				xprint('&lt;span&gt;【receive msg】&lt;/span&gt;:'+e.data);
			};
&nbsp;
			socket.onerror = function(evt){
				xprint('&lt;span&gt;【socket error】&lt;/span&gt;:'+evt.target);
			}
&nbsp;
			socket.onclose = function(e){
				socket_connected = false;
				xprint('&lt;span&gt;【server closed】&lt;/span&gt;:'+e);
				socket.close();
			};
&nbsp;
		}catch(e){
			alert(e);
		}
	};
&nbsp;
	var testChat = function(){
		var msg = '';
		$('#submit').click(function(){
			msg = $('#msg').val();
			if(msg == '') return false;
			socket.send(msg);
			xprint('&lt;span&gt;【send msg】&lt;/span&gt;:'+msg);
			$('#msg').val('');
		});
	};
&nbsp;
&nbsp;
	~function(){
		var host = 'ws://192.168.0.237:25525/socket';
		var protocols = 'my_protocols';
		testSocket(host, protocols);
		testChat();
	}();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/896/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于html5和css3的一些尝试</title>
		<link>http://www.quou.cn/archives/872</link>
		<comments>http://www.quou.cn/archives/872#comments</comments>
		<pubDate>Sun, 15 Jan 2012 13:03:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax应用]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=872</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;最近无事，看了很多html5和css3网站相继火红。我也忍不住了，买了一本《HTML5与CSS3 权威指南》，书还是很不错，但感觉讲的有点不够升入。之前看过一本《ActionScript 3.0权威指南》，觉得写的很不错，主要是把我学了这么几年的矩阵派上用场了，神啊，买。想学习动画，但html5和css3动画教程比较少，所以打算先多学点as3，从中取点经，其实很多api都是很相通的。 &#160;&#160;&#160;&#160;&#160;&#160;想学一下css3，一开始我以为bing的国外版本是用了css3绘制的，原来用了html5的一句video标签，大失所望，还是学习一下 http://tjrus.com/iphone 这哥们写的，来，效果： .test{ width:80px; height:80px; background:#09F; border-radius:80px; background-image:-moz-linear-gradient(center top , rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.2) 50%, transparent 50%, transparent 100%); background-image:-webkit-linear-gradient(center top , rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.2) 50%, transparent 50%, transparent 100%); background-size:4px 4px; box-shadow:0 -1px 0 #CBCBCB inset, 0 0.9px 0 [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近无事，看了很多html5和css3网站相继火红。我也忍不住了，买了一本《HTML5与CSS3 权威指南》，书还是很不错，但感觉讲的有点不够升入。之前看过一本《ActionScript 3.0权威指南》，觉得写的很不错，主要是把我学了这么几年的矩阵派上用场了，神啊，买。想学习动画，但html5和css3动画教程比较少，所以打算先多学点as3，从中取点经，其实很多api都是很相通的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;想学一下css3，一开始我以为bing的国外版本是用了css3绘制的，原来用了html5的一句video标签，大失所望，还是学习一下 <a href="http://tjrus.com/iphone" >http://tjrus.com/iphone</a> 这哥们写的，来，效果：</p>
<style>
.test{ width:80px; height:80px; background:#09F; border-radius:80px;
     background-image:-moz-linear-gradient(center top , rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.2) 50%, transparent 50%, transparent 100%);
     background-image:-webkit-linear-gradient(center top , rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.2) 50%, transparent 50%, transparent 100%);
     background-size:4px 4px; box-shadow:0 -1px 0 #CBCBCB inset, 0 0.9px 0 #FFFFFF;}
#water_l{ width:200px; height:200px; -moz-transform:translate(100px, 100px);}
.water{ width:200px; height:200px; border-radius:200px;
        box-shadow: inset 5px 3px 20px 5px #09F; 
        -ms-transform:scale(1, 0.9);
        -moz-transform:scale(1, 0.9);
        -o-transform:scale(1, 0.9);
        -webkit-transform:scale(1, 0.9);
        transform:scale(1,0.8) rotate(45deg);}
.code{ width:30px; height:30px; background:#333; color:#EEE;
       float:left; margin:5px; border:1px solid #222; cursor:pointer;
       font-family:Georgia, "Times New Roman", Times, serif; border-radius:30px;
       line-height:28px; text-align:center; box-shadow:1px 1px 2px 1px #666;
       text-shadow:1px 2px 1px rgba(153,0,0,0.5);
       background:-moz-radial-gradient(0% 100% , #333, #999);
       background:-webkit-gradient(linear left top, left bottom, from(#333), to(#999)); 
       filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#550000FF, endColorstr=#55FFFF00);
     }
.scode{
    background:#F00; color:#FFF; font-weight:bold;
    border:1px solid #900; box-shadow:1px 1px 2px 1px #600;
    background:-webkit-gradient(linear left top, left bottom, from(#A00), to(#F00)); 
    background:-moz-radial-gradient(0% 100% , #800, rgba(255, 0, 0, 0.8));
}
</style>
<div id="water_l">
<div class="water" id="water"></div>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后，想起淘宝网站首页都改版用html5，一下子抄的如火如荼，我想我们公司也不差这点技术呀，搞一搞也火一下呗，写了个选号的，firefox下效果最佳：</p>
<div id="number">
<div class="code">01</div>
<div class="code scode">02</div>
<div class="code">03</div>
<div class="code">04</div>
<div class="code scode">05</div>
<div class="code">06</div>
<div class="code">07</div>
</div>
<p><script>
var active_water = function(){
	var water_l = $('#water_l');
	var deg = 10, adeg = 0, ro;
	var get_transform = function(info){
		return {'-moz-transform':info,
		 '-ms-transform' :info,
		 '-o-transform'  :info, 
		 '-webkit-transform':info};
	}	
	setInterval(function(){
		adeg = (adeg + deg) % 360;
		ro = 'rotate('+adeg+'deg)';
		water_l.css(get_transform(ro));
	}, 50);
};
var code_click = function(){
	$('.code').each(function(index, element) {
		var code;
        $(element).click(function(e){
			code = $(e.target);
			if(code.hasClass('scode')){
				code.removeClass('scode');
			}else{
				code.addClass('scode');
			}
		});
    });
};
~function(){
	active_water();
	code_click();
}();
</script></p>
<div style="clear:both;"></div>
<p>以前刚接触html5的时候，就想画个五角星，感觉好难。还有html5没有提供画椭圆的api，但这里有个很好的方法，画四条贝塞尔曲线，看效果：</p>
<style>
	#my_canvas{ border:1px solid #09F; background:#111;}
</style>
<p><canvas id="test_canvas" width="200" height="120" style="float:left;"><br />
    Your browser does not support the canvas element.<br />
</canvas><br />
<canvas id="my_canvas" width="200" height="120" style="float:left;"><br />
	Your browser does not support the canvas element.<br />
</canvas><br />
<script>
	var create_five_star = function(ctx){
		ctx.strokeStyle = '#FFFF00';
		ctx.fillStyle = '#FF0000';
		ctx.translate(50, 50);
		ctx.beginPath();
		var dig = Math.PI/5*4;
		var s = 50;
		for(var i=0; i<5; i++){
			var x = Math.sin(i*dig);
			var y = Math.cos(i*dig);
			ctx.lineTo(100+x*s, y*s);
		}
		ctx.closePath();
		ctx.stroke();
		ctx.fill();
	};
        ~function(){
		var canvas = $('#test_canvas')[0];
		var ctx = canvas.getContext('2d');
		create_five_star(ctx);
        }();
	var canvas, ctx, nx, ny;
	var init = function(px, py, x, y){
		canvas = $('#my_canvas');
		ctx = canvas[0].getContext('2d');
		ctx.strokeStyle = '#FFFF00';
		ctx.translate( px, py);
		nx = x;
		ny = y;
	};
	var draw_ellipse = function(x, y, w, h){
		ctx.clearRect(-canvas.width, -canvas.height, 2 * canvas.width, 2 * canvas.height);
		var k = 0.5522848;
		var ox = (w / 2) * k;
		var oy = (h / 2) * k;
		var xe = x + w;
		var ye = y + h;
		var xm = x + w / 2;
		var ym = y + h / 2;
		ctx.beginPath();
		ctx.moveTo(x, ym);
		ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);
		ctx.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);
		ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
		ctx.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);
		ctx.stroke();
		ctx.translate(x+(w/2), y+(h/2));
		ctx.rotate(10*Math.PI/180);
		nx = -w/2;
		ny = -h/2;
	};
	~function(){
		var w = 40;
		var h = 42;
		init(50, 50, 0, 0);
		var n = 72;
		var test = function(){
			draw_ellipse(nx, ny, w, h);
			setTimeout(function(){
				test();
			}, 500);
		};
		test();
	}();
</script></p>
<div style="clear:both;"></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之前用flash写德州，ui没写完，实在有点小累，写个html5版(用canvas绘制而成的)的界面，但....本应该用css3写才是专业的，就当学习了吧，上效果(在firefox最新版本，或ie9以上查看)：</p>
<style>
.button{
    background: -moz-linear-gradient(270deg, #d2ebf8, #0c8ab5);
	background: -webkit-linear-gradient(top, #d2ebf8, #0c8ab5);
	background: -o-linear-gradient(top, #d2ebf8, #0c8ab5);
	filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#000099CC', EndColorStr='#FF0087B4');
}
#table_canvas{ 
    border:1px solid #09F; background:#051D0B;
    box-shadow: inset 0 1px 10px 1px #5c8bee, 0px 1px 0 #1d2c4d, 0 2px 0px #1f3053, 0 4px 4px 1px #111111;
    border-radius: 4px;
}
#timer_canvas{ z-index: 10; display:none;}
#table_div{ position:relative; width:760px; height:500px;}
#table_div canvas{ position:absolute;}
.seat_canvas{ cursor:pointer;}
</style>
<div id="table_div">
        <canvas id="table_canvas" width="760" height="500"><br />
            Your browser does not support the canvas element.<br />
        </canvas><br />
        <canvas id="timer_canvas" width="65" height="65"><br />
            Your browser does not support the canvas element.<br />
        </canvas>
    </div>
<p><script>
var Table = function(x, y, w, h){
	this.x = x;
	this.y = y;
	this.w = w;
	this.h = h;
};
Table.prototype.init = function(cw, ch){
	this.canvas = $('#table_canvas')[0];
	this.canvas_w = cw;
	this.canvas_h = ch;
	this.ctx = this.canvas.getContext('2d');
	this.ctx.strokeStyle = '#FFFF00';
	return this;
};
Table.prototype._draw_round_rect = function(x, y, w, h){ 
	var d1 = 1/20*w;　//设置 d1 d2的默认长度  为贝塞尔曲线取中间控制点做准备 
	var d2 = 1/20*w;
	this.ctx.beginPath();　 
	// 第一个节点 
	this.ctx.moveTo(x,y+d1+d2)　;　//起始点 
	this.ctx.bezierCurveTo(x,y+d1,x+d1,y,x+d2+d1,y); //第一个圆角 
	this.ctx.lineTo(x+w-d1-d2,y); //连接线 
	this.ctx.bezierCurveTo(x+w-d1,y,x+w,y+d1,x+w,y+d1+d2); //第二个圆角   
	this.ctx.lineTo(x+w,y+h-d1-d2); //连接线 
	this.ctx.bezierCurveTo(x+w,y+h-d1,x+w-d1,y+h,x+w-d1-d2,y+h); //第三个圆角   
	this.ctx.lineTo(x+d1+d2,y+h);　//连接线 
	this.ctx.bezierCurveTo(x+d1,y+h,x,y+h-d1,x,y+h-d1-d2); //第四个圆角 
	this.ctx.lineTo(x,y+d1+d2);//连接线 
	//this.ctx.stroke();//画线 
};
Table.prototype.draw_round_rect = function(x, y, w, h){ 
	this.ctx.lineWidth = 1;
	this._draw_round_rect(x, y, w, h);
	this.ctx.fillStyle = '#431E12';
	this.ctx.fill();
	this.ctx.strokeStyle = "#000000";
	this.ctx.stroke(); 
	this.ctx.closePath();
	this.ctx.lineWidth = 2;
	this._draw_round_rect(x+7, y+7, w-14, h-14);
	this.ctx.translate(w/2+x, h/2+y);
	var gradient = this.ctx.createRadialGradient(0, 0, 20, 0, 0, 200);
    gradient.addColorStop(0, '#1D8174');
    gradient.addColorStop(1, '#06584F');
	this.ctx.fillStyle = gradient;
	this.ctx.fill();
	this.ctx.strokeStyle = "#300F03";
	this.ctx.stroke();
	this.ctx.closePath();
};
Table.prototype.draw = function(){
	var x = this.x + (this.canvas_w - this.w)/2;
	var y = this.y + (this.canvas_h - this.h)/2;
	this.draw_round_rect(x, y, this.w, this.h);
};
var Seat = function(){
	this.radius = 30;
	this.seat_dict = {};
	this.interval = null;
	this.timer_cvs = $('#timer_canvas');
	this.tctx = this.timer_cvs[0].getContext('2d');
	this.tctx.translate(32, 33);
	this.seat_cvs = $('<canvas width="70" height="70">Seat canvas.</canvas>');
	this.sctx = this.seat_cvs[0].getContext('2d');
};
Seat.prototype.init = function(){
	this.conf = {1 : [100,  50],  2 : [270,  30],  3:[370, 190], 
				 4 : [370,  380], 5 : [370,  570], 6:[210, 665],
				 7 : [65,   570], 8 : [65,   400], 9:[65,  220]}
	this._create_free(this.radius);
	for(var i=1; i<10; i++){
		var seat = this.create_free(i, this.conf[i][0], this.conf[i][1]);
		$('#table_div').append(seat);
		this.seat_dict[i] = seat;
	}
	return this;
};
Seat.prototype.initEvent = function(){
	var that = this;
	for(var id in this.seat_dict){
		this.seat_dict[id].click(function(ele){
			that.wait_for(ele.target.id.substr(-1, 1), 5000);
		});
	}
	return this;
};
Seat.prototype._create_free = function(r){
	this.sctx.translate(r+5, r+5);
	var gradient = this.sctx.createLinearGradient(-10, -10, 70, 70);
	gradient.addColorStop(0, '#006600');
	gradient.addColorStop(1, '#FFFFFF');
	this.draw_circle(32, '#66CCFF', '#431E12');
	this.draw_circle(25, gradient, '#431E12');
	this.sctx.font = '12px Helvetica';
	this.sctx.strokeStyle = '#FFFFFF';
	this.sctx.strokeText('坐下', -12, 5);
};
Seat.prototype.draw_circle = function(r, fc, sc){
	this.sctx.beginPath();
	this.sctx.arc(0, 0, r, 0, Math.PI*2, true); 
	this.sctx.fillStyle = fc;
	this.sctx.fill();
	this.sctx.strokeStyle = sc;
	this.sctx.stroke();
	this.sctx.closePath();
};
Seat.prototype.create_free = function(seat_no, top, left){
	var cans = this.seat_cvs.clone();
	var canv = cans[0].getContext('2d'); 
	canv.drawImage(this.seat_cvs[0], 0, 0); 
	cans.attr('id', 'seat_'+seat_no);
	cans.attr('class', 'seat_canvas');
	cans.css({'top':top, 'left':left});
	return cans;
};
Seat.prototype.wait_for = function(seat_no, time){
	var y = this.conf[seat_no][0]+2;
	var x = this.conf[seat_no][1]+3;
	this.timer_cvs.css({'top':y, 'left':x});	
	if(this.interval) clearInterval(this.interval);
	this.tctx.clearRect(-32, -35, 72, 72);
	this.timer_cvs.show();
	this.create_lcircle(this.tctx, 31, 26, time);
};
Seat.prototype.create_lcircle = function(ctx, r1, r2, t){
	ctx.strokeStyle = 'rgba(255, 0, 0, 1)';
	var pt = 20;   //每多长时间画一次
	var ti = t/pt; //执行次数
	var a = 2*Math.PI / ti;
	var r = 255*n / ti //红色值
	var al, rl, i = 0, n = ti/15, k, e, f, g, h;
	var col = new Array('#FFFF00', '#FFEE00', '#FFDD00', '#FFCC00', '#FFBB00', 
			   '#FFAA00', '#FF9900', '#FF8800', '#FF7700', '#FF6600', 
			   '#FF5500', '#FF4400', '#FF3300', '#FF2200', '#FF1100', '#FF0000', '#FF0000');
	var that = this;
	var create_circle_line = function(){
		ctx.strokeStyle = col[Math.round(i/n)];
		ctx.beginPath();
		al = i*a;
		e = r1*Math.cos(al); f = r1*Math.sin(al);
		ctx.moveTo(e, f);
		g = r2*Math.cos(al); h = r2*Math.sin(al);
		ctx.lineTo(g, h);
		ctx.closePath();
		ctx.stroke();
		i += 1;
		if(al>2*Math.PI){ 
			clearInterval(that.interval);
			that.timer_cvs.hide();
		}
	};
	this.interval = setInterval(create_circle_line, pt);
};
~function(){
	var table = new Table(0, 0, 560, 230).init(760, 500);
	table.draw();
	var seat = new Seat().init().initEvent();
	//seat.wait_for(8, 5000);
}();
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/872/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>python版消息前置服务</title>
		<link>http://www.quou.cn/archives/868</link>
		<comments>http://www.quou.cn/archives/868#comments</comments>
		<pubDate>Wed, 11 Jan 2012 15:41:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python&Ruby]]></category>
		<category><![CDATA[德州扑克]]></category>
		<category><![CDATA[服务]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=868</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;虽然在这次的德州demo中我只是把消息服务作为了一个线程处理，但并不影响实际的消息管理，其实也没有什么要说的，消息格式：消息长度+版本号+事件名+事件对应参数详情。之前写短信网关时候对SocketServer没有理解太深，没有设置socket的超时时间，结果导致大量请求挂起，导致最后服务挂起。 &#160;&#160;&#160;&#160;&#160;&#160;今天一连写了三篇博客，大部分是对最近这段时间的所作描述，因为表述不怎么好，所以就贴了比较多的代码。以后再回过头来看曾经写的代码会是什么样的心情呢。在flash上我也写了一些模块，本本快没电了，现在也有点晚了，所以就放在下一篇文章中在描述吧。 View Code PYTHON1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然在这次的德州demo中我只是把消息服务作为了一个线程处理，但并不影响实际的消息管理，其实也没有什么要说的，消息格式：消息长度+版本号+事件名+事件对应参数详情。之前写短信网关时候对SocketServer没有理解太深，没有设置socket的超时时间，结果导致大量请求挂起，导致最后服务挂起。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天一连写了三篇博客，大部分是对最近这段时间的所作描述，因为表述不怎么好，所以就贴了比较多的代码。以后再回过头来看曾经写的代码会是什么样的心情呢。在flash上我也写了一些模块，本本快没电了，现在也有点晚了，所以就放在下一篇文章中在描述吧。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p868code25'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86825"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
</pre></td><td class="code" id="p868code25"><pre class="python" style="font-family:Dialog;"><span style="color: #808080; font-style: italic;">#coding=gbk</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">struct</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">traceback</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">binascii</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> Object
<span style="color: #ff7700;font-weight:bold;">import</span> Config
<span style="color: #ff7700;font-weight:bold;">import</span> ClientEvent
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">SocketServer</span>
<span style="color: #ff7700;font-weight:bold;">import</span> MsgPackage
<span style="color: #ff7700;font-weight:bold;">import</span> Connection
<span style="color: #ff7700;font-weight:bold;">import</span> Game.<span style="color: black;">M</span> <span style="color: #ff7700;font-weight:bold;">as</span> M
<span style="color: #ff7700;font-weight:bold;">import</span> Game.<span style="color: black;">I</span> <span style="color: #ff7700;font-weight:bold;">as</span> I
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ThreadedTCPRequestHandler<span style="color: black;">&#40;</span><span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">BaseRequestHandler</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'线程请求管理'</span><span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> setup<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">settimeout</span><span style="color: black;">&#40;</span>Config.<span style="color: black;">CLIENT_OUTTIME</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, command, info<span style="color: black;">&#41;</span>:
        _data = MsgPackage.<span style="color: black;">pack</span><span style="color: black;">&#40;</span>command, info<span style="color: black;">&#41;</span>
        _len = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>_data<span style="color: black;">&#41;</span>
        _data = <span style="color: #dc143c;">struct</span>.<span style="color: black;">pack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&gt;L'</span>, _len<span style="color: black;">&#41;</span> + _data
        <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">send</span><span style="color: black;">&#40;</span>_data<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'send[%s] data[%s]:%s'</span>, M.<span style="color: black;">get</span><span style="color: black;">&#40;</span>command<span style="color: black;">&#41;</span>, _len, info<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> handle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
                ctime = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                buf = <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> buf:
                    <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
                cmd_len = <span style="color: #dc143c;">struct</span>.<span style="color: black;">unpack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&gt;L'</span>, buf<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
                data = <span style="color: #483d8b;">''</span>
                <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> cmd_len:
                    obuf = <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">recv</span><span style="color: black;">&#40;</span>cmd_len - <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> obuf:
                        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">Exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'not receive anything!'</span><span style="color: black;">&#41;</span>
                    data += obuf
&nbsp;
                _data = MsgPackage.<span style="color: black;">unpack</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
                <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'get[%s] data[%s]:%s'</span>, M.<span style="color: black;">get</span><span style="color: black;">&#40;</span>_data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'c'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, cmd_len, data<span style="color: black;">&#41;</span>
&nbsp;
                ret = ClientEvent.<span style="color: black;">deal</span><span style="color: black;">&#40;</span>_data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'c'</span><span style="color: black;">&#93;</span>, _data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'i'</span><span style="color: black;">&#93;</span>, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> ret: <span style="color: #808080; font-style: italic;">#有返回消息</span>
                    <span style="color: #008000;">self</span>.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>ret<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">timeout</span>:<span style="color: #808080; font-style: italic;">#连接超时</span>
            cur_thread = <span style="color: #dc143c;">threading</span>.<span style="color: black;">currentThread</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            emsg = cur_thread.<span style="color: black;">getName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">' timeout connect!'</span>
            <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span>emsg<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            <span style="color: #dc143c;">logging</span>.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'error in ThreadedTCPRequestHandler :%s, res:'</span>, <span style="color: #dc143c;">traceback</span>.<span style="color: black;">format_exc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        Connection.<span style="color: black;">unbind</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">request</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ThreadedTCPServer<span style="color: black;">&#40;</span><span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">ThreadingMixIn</span>, <span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">TCPServer</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Server:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, host, port<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">host</span> = host
        <span style="color: #008000;">self</span>.<span style="color: black;">port</span> = port
        <span style="color: #008000;">self</span>.<span style="color: black;">server</span> = <span style="color: #008000;">None</span>
        ThreadedTCPServer.<span style="color: black;">allow_reuse_address</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        server_check = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=<span style="color: #008000;">self</span>.<span style="color: black;">check</span><span style="color: black;">&#41;</span>
        server_check.<span style="color: black;">setDaemon</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        server_check.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">server</span> = ThreadedTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">host</span>, <span style="color: #008000;">self</span>.<span style="color: black;">port</span><span style="color: black;">&#41;</span>, ThreadedTCPRequestHandler<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server</span>.<span style="color: black;">serve_forever</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> check<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff7700;font-weight:bold;">not</span> Object.<span style="color: black;">END_EVENT</span>.<span style="color: black;">isSet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            Object.<span style="color: black;">END_EVENT</span>.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">shutdown</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> stop<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">shutdown</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    Server<span style="color: black;">&#40;</span><span style="color: #483d8b;">'0.0.0.0'</span>, <span style="color: #ff4500;">25525</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面这个是上文提到的GameServer代码，主要是轮询赛桌当前应该处理的事件和自处理事件。没有什么技术含量，主要是补充上篇博客的阅读：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p868code26'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86826"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="code" id="p868code26"><pre class="python" style="font-family:Dialog;"><span style="color: #808080; font-style: italic;">#coding=gbk</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">traceback</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> Config
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">Queue</span>
<span style="color: #ff7700;font-weight:bold;">import</span> Object
&nbsp;
_INSTANCE_ = <span style="color: #008000;">None</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> GameServer:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._table_conf = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>._table_msgq = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> join_table<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, table<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>._table_conf.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span>table.<span style="color: black;">table_id</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> -<span style="color: #ff4500;">1</span>
&nbsp;
        <span style="color: #008000;">self</span>._table_conf<span style="color: black;">&#91;</span>table.<span style="color: black;">table_id</span><span style="color: black;">&#93;</span> = table
        <span style="color: #008000;">self</span>._table_msgq<span style="color: black;">&#91;</span>table.<span style="color: black;">table_id</span><span style="color: black;">&#93;</span> = <span style="color: #dc143c;">Queue</span>.<span style="color: #dc143c;">Queue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'table[%s] created!'</span>, table.<span style="color: black;">table_id</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> do_event<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, table_id, uid, command, info<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'处理一个事件'</span><span style="color: #483d8b;">''</span>
        t_queue = <span style="color: #008000;">self</span>._table_msgq.<span style="color: black;">get</span><span style="color: black;">&#40;</span>table_id, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> t_queue:
            <span style="color: #ff7700;font-weight:bold;">return</span> -<span style="color: #ff4500;">1</span>
        t_queue.<span style="color: black;">put</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'uid'</span>:uid, <span style="color: #483d8b;">'event'</span>:command, <span style="color: #483d8b;">'info'</span>:info<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_event<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, table_id<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取一个事件'</span><span style="color: #483d8b;">''</span>
        t_queue = <span style="color: #008000;">self</span>._table_msgq.<span style="color: black;">get</span><span style="color: black;">&#40;</span>table_id, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> t_queue:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> t_queue.<span style="color: black;">get_nowait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        t = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target = <span style="color: #008000;">self</span>.<span style="color: black;">run</span><span style="color: black;">&#41;</span>
        t.<span style="color: black;">setDaemon</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        t.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff7700;font-weight:bold;">not</span> Object.<span style="color: black;">END_EVENT</span>.<span style="color: black;">isSet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                <span style="color: #ff7700;font-weight:bold;">for</span> tid, table <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>._table_conf.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                    <span style="color: #808080; font-style: italic;">#logging.info('%s, %s, %s', table.status, table.wait_next_uid, table.wait_end_uid)</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> table.<span style="color: black;">status</span> <span style="color: #66cc66;">!</span>= Config.<span style="color: black;">GAMEOVER_STATUS</span>:
                        table.<span style="color: black;">check</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">get_event</span><span style="color: black;">&#40;</span>tid<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">except</span>:
                <span style="color: #dc143c;">logging</span>.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'error in GameServer.run:%s'</span>, <span style="color: #dc143c;">traceback</span>.<span style="color: black;">format_exc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> getInstance<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取游戏服务进程'</span><span style="color: #483d8b;">''</span>
    <span style="color: #ff7700;font-weight:bold;">global</span> _INSTANCE_
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> _INSTANCE_:
        _INSTANCE_ = GameServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> _INSTANCE_</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/868/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>python版德州牌桌模块</title>
		<link>http://www.quou.cn/archives/864</link>
		<comments>http://www.quou.cn/archives/864#comments</comments>
		<pubDate>Wed, 11 Jan 2012 15:26:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python&Ruby]]></category>
		<category><![CDATA[德州扑克]]></category>
		<category><![CDATA[服务]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=864</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;上周末写了一个德州牌桌demo，桌子有点大，所以我把一个桌子分成了两半，一半是处理用户请求的，包括：加注、看牌、弃牌、跟注、all in等。一半是牌桌自己事件，包括：抽取庄家位，发底牌，发翻牌，发转牌，发河牌，算奖等。其实大部分方法来说都是一两句代码，分出方法是为了维护方便，也是为了能好意思贴出来。 &#160;&#160;&#160;&#160;&#160;&#160;先看这个牌桌这半个类吧，写了这么几年代码，总结来说：1、代码应该简洁；2、代码要有思想；3、代码逻辑性强；4、代码模块要独立。虽然我不敢说自己的代码真能做到，但我一直是往这些方面靠拢。感觉这个牌桌有这么几点自我感觉还行：1、游戏每个事件都有不同方法；2、游戏中几乎没有跟游戏无关的代码（除了事件监听和发送）。其实做事件的目的是为了通知用户赛桌的变化和对赛事包括牌谱持久化，牌谱分析统计等等。 &#160;&#160;&#160;&#160;&#160;&#160;代码中存在一些如M、I的模块，还有Config等涉及公司机密，就不方便贴出来了，M是定义的事件类型；I是定义的消息中的参数名。Config中包括一些状态定义等等，缺少也不会影响代码阅读，自己补充一点点就能跑起来。 &#160;&#160;&#160;&#160;&#160;&#160;先看一下，牌桌测试程序吧，这个就是常说的测试案例，有这么一个代码就好了，你可以随意修改服务，修改完成运行一次就可以知道服务有么有什么问题： View Code PYTHON1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 gserv = Game.GameServer.getInstance&#40;&#41; &#160; t = Game.Table.Table&#40;'id123', 6, 5&#41; t.match_type = Game.Config.IMMEDIATE t.init_event&#40;&#41; &#160; t.user_join&#40;&#123;'u1' : &#91;1000, 1&#93;, 'u2' : &#91;1000, 2&#93;, 'u3' [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上周末写了一个德州牌桌demo，桌子有点大，所以我把一个桌子分成了两半，一半是处理用户请求的，包括：加注、看牌、弃牌、跟注、all in等。一半是牌桌自己事件，包括：抽取庄家位，发底牌，发翻牌，发转牌，发河牌，算奖等。其实大部分方法来说都是一两句代码，分出方法是为了维护方便，也是为了能好意思贴出来。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先看这个牌桌这半个类吧，写了这么几年代码，总结来说：1、代码应该简洁；2、代码要有思想；3、代码逻辑性强；4、代码模块要独立。虽然我不敢说自己的代码真能做到，但我一直是往这些方面靠拢。感觉这个牌桌有这么几点自我感觉还行：1、游戏每个事件都有不同方法；2、游戏中几乎没有跟游戏无关的代码（除了事件监听和发送）。其实做事件的目的是为了通知用户赛桌的变化和对赛事包括牌谱持久化，牌谱分析统计等等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码中存在一些如M、I的模块，还有Config等涉及公司机密，就不方便贴出来了，M是定义的事件类型；I是定义的消息中的参数名。Config中包括一些状态定义等等，缺少也不会影响代码阅读，自己补充一点点就能跑起来。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先看一下，牌桌测试程序吧，这个就是常说的测试案例，有这么一个代码就好了，你可以随意修改服务，修改完成运行一次就可以知道服务有么有什么问题：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p864code30'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86430"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p864code30"><pre class="python" style="font-family:Dialog;">    gserv = Game.<span style="color: black;">GameServer</span>.<span style="color: black;">getInstance</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    t = Game.<span style="color: black;">Table</span>.<span style="color: black;">Table</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'id123'</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
    t.<span style="color: black;">match_type</span> = Game.<span style="color: black;">Config</span>.<span style="color: black;">IMMEDIATE</span>
    t.<span style="color: black;">init_event</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    t.<span style="color: black;">user_join</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'u1'</span> : <span style="color: black;">&#91;</span><span style="color: #ff4500;">1000</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, 
                 <span style="color: #483d8b;">'u2'</span> : <span style="color: black;">&#91;</span><span style="color: #ff4500;">1000</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>,
                 <span style="color: #483d8b;">'u3'</span> : <span style="color: black;">&#91;</span><span style="color: #ff4500;">1000</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span>,
                 <span style="color: #483d8b;">'u4'</span> : <span style="color: black;">&#91;</span><span style="color: #ff4500;">1000</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span>,
                 <span style="color: #483d8b;">'u5'</span> : <span style="color: black;">&#91;</span><span style="color: #ff4500;">1000</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
&nbsp;
    gserv.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">join_table</span><span style="color: black;">&#40;</span>t<span style="color: black;">&#41;</span>
&nbsp;
    n, j = <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">1</span>
    <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff7700;font-weight:bold;">not</span> Object.<span style="color: black;">END_EVENT</span>.<span style="color: black;">isSet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> t.<span style="color: black;">wait_next_uid</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> n<span style="color: #66cc66;">&gt;</span><span style="color: #ff4500;">0</span>:
            gserv.<span style="color: black;">do_event</span><span style="color: black;">&#40;</span>t.<span style="color: black;">table_id</span>, t.<span style="color: black;">wait_next_uid</span>, M.<span style="color: black;">CALL</span>, <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
            n -= <span style="color: #ff4500;">1</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> t.<span style="color: black;">status</span> == <span style="color: #483d8b;">'turn'</span> <span style="color: #ff7700;font-weight:bold;">and</span> j == <span style="color: #ff4500;">1</span>:
            gserv.<span style="color: black;">do_event</span><span style="color: black;">&#40;</span>t.<span style="color: black;">table_id</span>, t.<span style="color: black;">wait_next_uid</span>, M.<span style="color: black;">RAISE</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">'chips'</span>:<span style="color: #ff4500;">100</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
            j = <span style="color: #ff4500;">0</span>
&nbsp;
        <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码贴的实在是有点多了，关于GameServer我就再写一篇来描述消息接收和游戏轮询做介绍吧</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p864code31'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86431"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
</pre></td><td class="code" id="p864code31"><pre class="python" style="font-family:Dialog;"><span style="color: #808080; font-style: italic;">#coding=gbk</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">import</span> M, I
<span style="color: #ff7700;font-weight:bold;">import</span> Code
<span style="color: #ff7700;font-weight:bold;">import</span> Event
<span style="color: #ff7700;font-weight:bold;">import</span> Config
<span style="color: #ff7700;font-weight:bold;">import</span> Poker
<span style="color: #ff7700;font-weight:bold;">import</span> TableUser
<span style="color: #ff7700;font-weight:bold;">import</span> EventHelper
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Table<span style="color: black;">&#40;</span>TableUser.<span style="color: black;">TableUser</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, table_id, seat_num = <span style="color: #ff4500;">6</span>, action_time = <span style="color: #ff4500;">20</span><span style="color: black;">&#41;</span>:
        TableUser.<span style="color: black;">TableUser</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span> = table_id     <span style="color: #808080; font-style: italic;">#桌子id</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_name</span> = <span style="color: #483d8b;">''</span>         <span style="color: #808080; font-style: italic;">#桌子名称</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_desc</span> = <span style="color: #483d8b;">''</span>         <span style="color: #808080; font-style: italic;">#桌子简介</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>        <span style="color: #808080; font-style: italic;">#桌上当前牌</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">match_id</span> = <span style="color: #008000;">None</span>         <span style="color: #808080; font-style: italic;">#牌桌所属赛事id</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">match_type</span> = <span style="color: #008000;">None</span>       <span style="color: #808080; font-style: italic;">#牌桌所属赛事类型</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">seat_num</span> = seat_num     <span style="color: #808080; font-style: italic;">#当前桌子座位数</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">action_time</span> = action_time <span style="color: #808080; font-style: italic;">#玩家行动超时时间</span>
        <span style="color: #008000;">self</span>._poker = <span style="color: #008000;">None</span>           <span style="color: #808080; font-style: italic;">#扑克牌队列</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span> = <span style="color: black;">&#123;</span>          <span style="color: #808080; font-style: italic;">#牌桌相关信息</span>
                           <span style="color: #483d8b;">'bblind'</span>:<span style="color: #ff4500;">100</span>,   <span style="color: #483d8b;">'sblind'</span>:<span style="color: #ff4500;">50</span>, <span style="color: #483d8b;">'ante'</span>:<span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'dealer_uid'</span>:<span style="color: #ff4500;">0</span>, 
                           <span style="color: #483d8b;">'bblind_uid'</span>:<span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'sblind_uid'</span>:<span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'dealer_uid'</span>:<span style="color: #ff4500;">0</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">status_list</span> = <span style="color: black;">&#91;</span>Config.<span style="color: black;">START_STATUS</span>, Config.<span style="color: black;">BLIND_STATUS</span>, Config.<span style="color: black;">PREFLOP_STATUS</span>, 
                            Config.<span style="color: black;">FLOP_STATUS</span>, Config.<span style="color: black;">TURN_STATUS</span>, Config.<span style="color: black;">DRIVE_STATUS</span>, 
                            Config.<span style="color: black;">PRIZE_STATUS</span>, Config.<span style="color: black;">GAMEOVER_STATUS</span><span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">free_seat</span> = <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, seat_num+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#空座位列表[座位号]</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pot_info</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>           <span style="color: #808080; font-style: italic;">#奖池信息</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pot_uinfo</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>          <span style="color: #808080; font-style: italic;">#奖池对应的用户信息</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">status</span> = Config.<span style="color: black;">INIT_STATUS</span> <span style="color: #808080; font-style: italic;">#初始化状态</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> init_event<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'初始化事件'</span><span style="color: #483d8b;">''</span>
        TableUser.<span style="color: black;">TableUser</span>.<span style="color: black;">init_event</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">PREFLOP_COMPLETE</span>, EventHelper.<span style="color: black;">on_preflop_msg</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">FLOP_COMPLETE</span>, EventHelper.<span style="color: black;">on_flop_msg</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">TURN_COMPLETE</span>, EventHelper.<span style="color: black;">on_turn_msg</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">DRIVE_COMPLETE</span>, EventHelper.<span style="color: black;">on_drive_msg</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">BLIND_COMPLETE</span>, EventHelper.<span style="color: black;">on_blind_msg</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">READY_COMPLETE</span>, EventHelper.<span style="color: black;">on_table_ready</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> reset<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'重置桌子信息'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span> = <span style="color: #ff4500;">0</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span> = <span style="color: #ff4500;">0</span>
        <span style="color: #008000;">self</span>._poker = Poker.<span style="color: black;">get_poker_queue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_dealer_uid<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取庄家位子'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> first_blind_uid<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'第一次设置大小盲'</span><span style="color: #483d8b;">''</span>
        dealer_uid = <span style="color: #008000;">self</span>.<span style="color: black;">get_dealer_uid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        plen = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#41;</span>
        dindex = <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>.<span style="color: black;">index</span><span style="color: black;">&#40;</span>dealer_uid<span style="color: black;">&#41;</span>
        bindex = <span style="color: black;">&#40;</span>dindex+<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> plen
        <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'sblind_uid'</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>dindex+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> plen<span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'bblind_uid'</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>dindex+<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> plen<span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'dealer_uid'</span><span style="color: black;">&#93;</span> = dealer_uid
        <span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span> = <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span>bindex+<span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span> + <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:bindex+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_blind_uid<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'设置盲注相关信息'</span><span style="color: #483d8b;">''</span>
        lbb = <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'bblind_uid'</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lbb: <span style="color: #808080; font-style: italic;">#如果是第一手</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">first_blind_uid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
&nbsp;
        bblind_uid = sblind_uid = <span style="color: #ff4500;">0</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> lbb <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>:
            sblind_uid = lbb
        <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #808080; font-style: italic;">#如果上一手的大盲离开</span>
            sblind_uid = <span style="color: #ff4500;">0</span>
&nbsp;
        bindex = <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>.<span style="color: black;">index</span><span style="color: black;">&#40;</span>lbb<span style="color: black;">&#41;</span> + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#41;</span>
        bblind_uid = <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span>bindex<span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'sblind_uid'</span><span style="color: black;">&#93;</span> = sblind_uid
        <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'bblind_uid'</span><span style="color: black;">&#93;</span> = bblind_uid
        dindex = <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>.<span style="color: black;">index</span><span style="color: black;">&#40;</span>sblind_uid<span style="color: black;">&#41;</span> - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'dealer_uid'</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span>dindex<span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span> = <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span>bindex+<span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span> + <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:bindex+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'开始游戏'</span><span style="color: #483d8b;">''</span>
        <span style="color: #808080; font-style: italic;">#检查是否可以开始比赛</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span> = <span style="color: #008000;">self</span>.<span style="color: black;">get_player_list</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">self</span>.<span style="color: black;">min_player_num</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">status</span> = Config.<span style="color: black;">INIT_STATUS</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s] start game!'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">reset</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">status</span> = Config.<span style="color: black;">BLIND_STATUS</span>
        event_content = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'cplayer_list'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>, 
                          <span style="color: #483d8b;">'player_dict'</span> :<span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span>, 
                          <span style="color: #483d8b;">'table_id'</span>    :<span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">READY_COMPLETE</span>, content = event_content<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> blind<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'设置大小盲注'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">set_blind_uid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s] set blind over!:%s'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> cut_card<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'切牌'</span><span style="color: #483d8b;">''</span>
        ret = <span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[cut_card]:%s'</span>, ret<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> ret
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> pre_flop<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'底牌圈'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cut_card</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> pos <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>pos<span style="color: black;">&#93;</span>.<span style="color: black;">poker_list</span> = <span style="color: black;">&#91;</span><span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
        event_content = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'cplayer_list'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>, 
                         <span style="color: #483d8b;">'player_dict'</span> :<span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span>, 
                         <span style="color: #483d8b;">'table_id'</span>    :<span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">PREFLOP_COMPLETE</span>, content = event_content<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">do_blind_chips</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#扣除大小盲</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> flop<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'翻牌圈'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cut_card</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span>.<span style="color: black;">extend</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        event_content = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'cplayer_list'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>, 
                         <span style="color: #483d8b;">'table_poker'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span>, 
                         <span style="color: #483d8b;">'table_id'</span>   :<span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">FLOP_COMPLETE</span>, content = event_content<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> turn<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'转牌圈'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cut_card</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        event_content = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'cplayer_list'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>, 
                         <span style="color: #483d8b;">'table_poker'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span>, 
                         <span style="color: #483d8b;">'table_id'</span>   :<span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">TURN_COMPLETE</span>, content = event_content<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> drive<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'河牌圈'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cut_card</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._poker.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        event_content = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'cplayer_list'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>, 
                         <span style="color: #483d8b;">'table_poker'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span>, 
                         <span style="color: #483d8b;">'table_id'</span>   :<span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">DRIVE_COMPLETE</span>, content = event_content<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> prize<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'派奖'</span><span style="color: #483d8b;">''</span>
        _uinfo = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> uid <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>:
            _player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> _player.<span style="color: black;">status</span> <span style="color: #66cc66;">!</span>= Config.<span style="color: black;">FOLD</span>:
                _uinfo<span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span> = _player.<span style="color: black;">poker_list</span> + <span style="color: #008000;">self</span>.<span style="color: black;">table_poker</span>
&nbsp;
        ret = <span style="color: #008000;">None</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>_uinfo<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">1</span>:
            ret = Poker.<span style="color: black;">compare</span><span style="color: black;">&#40;</span>_uinfo<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> _uinfo
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s] prize :%s'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span>, ret<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> game_over<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'游戏结束'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>:
            player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
            player.<span style="color: black;">poker_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'game_over!'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _do_blind_chips<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">type</span>, uchips = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'扣除盲注'</span><span style="color: #483d8b;">''</span>
        player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #008000;">type</span>+<span style="color: #483d8b;">'_uid'</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span>
        bchips = uchips <span style="color: #ff7700;font-weight:bold;">and</span> uchips <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #008000;">type</span><span style="color: black;">&#93;</span>
&nbsp;
        info = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'chips'</span>:bchips<span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">user_raise</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #008000;">type</span>+<span style="color: #483d8b;">'_uid'</span><span style="color: black;">&#93;</span>, info<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> bchips
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> do_blind_chips<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'扣除大小盲注'</span><span style="color: #483d8b;">''</span>
        schips = <span style="color: #008000;">self</span>._do_blind_chips<span style="color: black;">&#40;</span><span style="color: #483d8b;">'sblind'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#扣除小盲注</span>
        splayer = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'sblind_uid'</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">#当前只有大小盲，且小盲all in</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span> <span style="color: #ff7700;font-weight:bold;">and</span> splayer.<span style="color: black;">status</span> == Config.<span style="color: black;">ALL_IN</span>:
            bchips = <span style="color: #008000;">self</span>._do_blind_chips<span style="color: black;">&#40;</span><span style="color: #483d8b;">'bblind'</span>, schips<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#扣除大盲注</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            bchips = <span style="color: #008000;">self</span>._do_blind_chips<span style="color: black;">&#40;</span><span style="color: #483d8b;">'bblind'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#扣除大盲注</span>
&nbsp;
        event_content = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'cplayer_list'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>, 
                         <span style="color: #483d8b;">'table_info'</span>  :<span style="color: #008000;">self</span>.<span style="color: black;">table_info</span>, 
                         <span style="color: #483d8b;">'blind_info'</span>  :<span style="color: black;">&#123;</span><span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'bblind_uid'</span><span style="color: black;">&#93;</span>:bchips, 
                                         <span style="color: #008000;">self</span>.<span style="color: black;">table_info</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'sblind_uid'</span><span style="color: black;">&#93;</span>:schips<span style="color: black;">&#125;</span>,
                         <span style="color: #483d8b;">'table_id'</span>    :<span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">BLIND_COMPLETE</span>, content = event_content<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> check<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'服务检查'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">status</span> == Config.<span style="color: black;">INIT_STATUS</span>: <span style="color: #808080; font-style: italic;">#初始态</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> data.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'uid'</span>, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;">#用户有请求</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">player_bet</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'uid'</span><span style="color: black;">&#93;</span>, data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'event'</span><span style="color: black;">&#93;</span>, data<span style="color: black;">&#91;</span><span style="color: #483d8b;">'info'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span> == <span style="color: #ff4500;">0</span> : <span style="color: #808080; font-style: italic;">#做游戏事情</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>._check_game_over<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">status</span> = Config.<span style="color: black;">PRIZE_STATUS</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">hasattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">self</span>.<span style="color: black;">status</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'error status attr:%s'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">status</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">self</span>.<span style="color: black;">status</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>._turn_player<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._get_wait_next<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #008000;">self</span>.<span style="color: black;">status</span> = <span style="color: #008000;">self</span>._get_next_status<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#跳转到下一状态</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #808080; font-style: italic;">#判断用户状态</span>
            player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> player.<span style="color: black;">out_time</span>: <span style="color: #808080; font-style: italic;">#超时</span>
                player.<span style="color: black;">status</span> = Config.<span style="color: black;">NURSE</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">status</span> == Config.<span style="color: black;">NURSE</span>: <span style="color: #808080; font-style: italic;">#托管中</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">user_nurse</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> error<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg = <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'error:%s'</span>, msg<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">####################################################################################</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _check_game_over<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'判断游戏是否完成'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span><span style="color: black;">&#41;</span> - <span style="color: #008000;">self</span>.<span style="color: black;">fold_unum</span> == <span style="color: #ff4500;">1</span>: <span style="color: #808080; font-style: italic;">#只剩下一个用户</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_next_status<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取下一个游戏状态'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">status</span> == <span style="color: #008000;">self</span>.<span style="color: black;">status_list</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">status</span>
&nbsp;
        sindex = <span style="color: #008000;">self</span>.<span style="color: black;">status_list</span>.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">status</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">status_list</span><span style="color: black;">&#91;</span>sindex + <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面在来看一下，上面类中继承的TableUser.py模块，该模块主要为了响应用户事件，包括用户超时自动设为托管状态等。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p864code32'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86432"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
</pre></td><td class="code" id="p864code32"><pre class="python" style="font-family:Dialog;"><span style="color: #808080; font-style: italic;">#coding=gbk</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> M, I
<span style="color: #ff7700;font-weight:bold;">import</span> Code
<span style="color: #ff7700;font-weight:bold;">import</span> Event
<span style="color: #ff7700;font-weight:bold;">import</span> Player
<span style="color: #ff7700;font-weight:bold;">import</span> Config
<span style="color: #ff7700;font-weight:bold;">import</span> EventHelper
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TableUser:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'桌上玩家动作'</span><span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span> = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>        <span style="color: #808080; font-style: italic;">#当前牌桌用户列表 {玩家uid:player}</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>       <span style="color: #808080; font-style: italic;">#当前玩家列表[玩家uid]</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">nplayer_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>       <span style="color: #808080; font-style: italic;">#新加入玩家list[玩家uid]</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>       <span style="color: #808080; font-style: italic;">#当前说话玩家顺序</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">fold_unum</span> = <span style="color: #ff4500;">0</span>           <span style="color: #808080; font-style: italic;">#弃牌用户数</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span> = <span style="color: #ff4500;">0</span>       <span style="color: #808080; font-style: italic;">#等待的出价玩家uid</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span> = <span style="color: #ff4500;">0</span>      <span style="color: #808080; font-style: italic;">#用户最大出价 </span>
        <span style="color: #008000;">self</span>.<span style="color: black;">min_player_num</span> = <span style="color: #ff4500;">2</span>      <span style="color: #808080; font-style: italic;">#最小玩家数</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">free_seat</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>          <span style="color: #808080; font-style: italic;">#空座位列表[座位号]</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span> = Event.<span style="color: black;">Event</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;">#相关事件句柄</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">user_method_conf</span> = <span style="color: black;">&#123;</span>M.<span style="color: black;">CALL</span>:<span style="color: #008000;">self</span>.<span style="color: black;">user_call</span>, M.<span style="color: black;">RAISE</span>:<span style="color: #008000;">self</span>.<span style="color: black;">user_raise</span>, 
                                 M.<span style="color: black;">FOLD</span>:<span style="color: #008000;">self</span>.<span style="color: black;">user_fold</span>, M.<span style="color: black;">CHECK</span>:<span style="color: #008000;">self</span>.<span style="color: black;">user_check</span>,
                                 M.<span style="color: black;">ALL_IN</span>:<span style="color: #008000;">self</span>.<span style="color: black;">user_all_in</span><span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> init_event<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'初始化事件'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">USER_JOIN</span>, EventHelper.<span style="color: black;">on_user_join</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_player_list<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'初始化当前玩家列表'</span><span style="color: #483d8b;">''</span>
        _cplayer_list = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> uid, player <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span>.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">chips</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span> : <span style="color: #808080; font-style: italic;">#取出有筹码的用户</span>
                player.<span style="color: black;">unplay_times</span> = <span style="color: #ff4500;">0</span>
                _cplayer_list.<span style="color: black;">append</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                player.<span style="color: black;">unplay_times</span> += <span style="color: #ff4500;">1</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>: <span style="color: #808080; font-style: italic;">#不是第一手，就有新手列表</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">nplayer_list</span> = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span>_cplayer_list<span style="color: black;">&#41;</span> - <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span><span style="color: black;">&#41;</span>
        _cplayer_list.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: #008000;">cmp</span>=<span style="color: #ff7700;font-weight:bold;">lambda</span> x,y:<span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>x<span style="color: black;">&#93;</span>.<span style="color: black;">seat_pos</span>-<span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>y<span style="color: black;">&#93;</span>.<span style="color: black;">seat_pos</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> _cplayer_list
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _user_join<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid, chips=<span style="color: #ff4500;">0</span>, seat_pos=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家加入牌桌'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">free_seat</span>: <span style="color: #808080; font-style: italic;">#没有空座</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">NOFREE_SEAT</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> seat_pos: <span style="color: #808080; font-style: italic;">#分配座位号</span>
            seat_pos = <span style="color: #008000;">self</span>.<span style="color: black;">free_seat</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">elif</span> seat_pos <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">free_seat</span>: <span style="color: #808080; font-style: italic;">#座位已经被占用</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">EXIST_PLAYER</span>
&nbsp;
        player = Player.<span style="color: black;">Player</span><span style="color: black;">&#40;</span>uid, chips, Config.<span style="color: black;">OK</span><span style="color: black;">&#41;</span>
        player.<span style="color: black;">seat_pos</span> = seat_pos
        <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span> = player
        <span style="color: #008000;">self</span>.<span style="color: black;">free_seat</span>.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>seat_pos<span style="color: black;">&#41;</span>
&nbsp;
        event_content = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'info'</span>        :player, 
                         <span style="color: #483d8b;">'player_dict'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span>, 
                         <span style="color: #483d8b;">'player_dict'</span> :<span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span>, 
                         <span style="color: #483d8b;">'table_id'</span>    :<span style="color: #008000;">self</span>.<span style="color: black;">table_id</span><span style="color: black;">&#125;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">USER_JOIN</span>, content = event_content<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">OK</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> user_join<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, userdict = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'uid'</span>:<span style="color: black;">&#91;</span><span style="color: #483d8b;">'chips'</span>, <span style="color: #483d8b;">'seat_pos'</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'用户加入牌桌'</span><span style="color: #483d8b;">''</span>
        <span style="color: #dc143c;">code</span> = Code.<span style="color: black;">OK</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> uid, uinfo <span style="color: #ff7700;font-weight:bold;">in</span> userdict.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #dc143c;">code</span> = <span style="color: #008000;">self</span>._user_join<span style="color: black;">&#40;</span>uid, uinfo<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, uinfo<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">status</span> == Config.<span style="color: black;">INIT_STATUS</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">match_type</span> == Config.<span style="color: black;">IMMEDIATE</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#开始比赛</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">code</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> player_bet<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid, event, info<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家下注'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span> <span style="color: #66cc66;">!</span>= uid:
            <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">NOTURN_YOU</span> <span style="color: #808080; font-style: italic;">#还没轮到该用户</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> uid <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">NOPLAYER</span> <span style="color: #808080; font-style: italic;">#用户非法</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>.<span style="color: black;">status</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>Config.<span style="color: black;">FOLD</span>, Config.<span style="color: black;">ALL_IN</span><span style="color: black;">&#93;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">NOPRIM_DO</span> <span style="color: #808080; font-style: italic;">#没有说话权利</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">user_method_conf</span>.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span>event<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">DO_ERROR</span> <span style="color: #808080; font-style: italic;">#没有该玩家事件</span>
&nbsp;
        ret = <span style="color: #008000;">self</span>.<span style="color: black;">user_method_conf</span><span style="color: black;">&#91;</span>event<span style="color: black;">&#93;</span><span style="color: black;">&#40;</span>uid, info<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> ret <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">True</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> ret
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">check_game</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> check_game<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'做系统判断'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>._check_street<span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>._reset_street<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#重置这一街情况</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span> = <span style="color: #ff4500;">0</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
&nbsp;
        next_uid = <span style="color: #008000;">self</span>._get_wait_next<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._turn_player<span style="color: black;">&#40;</span>next_uid<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> user_call<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid, info = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家跟注'</span><span style="color: #483d8b;">''</span>
        player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
        uchip = <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span>player.<span style="color: black;">bid_list</span><span style="color: black;">&#41;</span>
        ichips = <span style="color: #ff4500;">0</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">chips</span>+uchip <span style="color: #66cc66;">&gt;</span> <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span>:
            ichips = <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span> - uchip
            player.<span style="color: black;">chips</span> -= ichips
            player.<span style="color: black;">bid_list</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ichips<span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s][%s] call :%s'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span>, uid, ichips<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #808080; font-style: italic;">#筹码不够,all in</span>
           <span style="color: #008000;">self</span>.<span style="color: black;">user_all_in</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> user_raise<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid, info = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家加注'</span><span style="color: #483d8b;">''</span>
        player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
        chips = info.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'chips'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">chips</span> <span style="color: #66cc66;">&gt;</span> chips:
            player.<span style="color: black;">chips</span> -= chips
            player.<span style="color: black;">bid_list</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>chips<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span> = <span style="color: #008000;">max</span><span style="color: black;">&#40;</span>chips, <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span><span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s][%s] raise :%s'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span>, uid, chips<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #808080; font-style: italic;">#筹码不够,all in</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">user_all_in</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> user_fold<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid, info = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家弃牌'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>.<span style="color: black;">status</span> = Config.<span style="color: black;">FOLD</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">fold_unum</span> += <span style="color: #ff4500;">1</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s][%s] fold!'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span>, uid<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> user_check<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid, info = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家看牌'</span><span style="color: #483d8b;">''</span>
        player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
        uchip = <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span>player.<span style="color: black;">bid_list</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'user_check test[%s, %s, %s]'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>uid, uchip, <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> uchip <span style="color: #66cc66;">&gt;</span>= <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span>:
            <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s][%s] check!'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span>, uid<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> Code.<span style="color: black;">NOPRIM_CHECK</span> <span style="color: #808080; font-style: italic;">#没有权限看牌</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> user_all_in<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid, info = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家ALL IN'</span><span style="color: #483d8b;">''</span>
        player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
&nbsp;
        chips = player.<span style="color: black;">chips</span>
        player.<span style="color: black;">chips</span> = <span style="color: #ff4500;">0</span>
        player.<span style="color: black;">status</span> = Config.<span style="color: black;">ALL_IN</span>
        player.<span style="color: black;">bid_list</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>chips<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span> = <span style="color: #008000;">max</span><span style="color: black;">&#40;</span>chips, <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[%s][%s] all in :%s'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">table_id</span>, uid, chips<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> user_nurse<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'玩家智能托管'</span><span style="color: #483d8b;">''</span>
        player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">user_check</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">True</span>: <span style="color: #808080; font-style: italic;">#看牌失败</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">user_fold</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">check_game</span><span style="color: black;">&#40;</span>uid<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">####################################################################</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _turn_player<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'轮到某玩家说话'</span><span style="color: #483d8b;">''</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'status:%s, wait:%s'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">status</span>, uid<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span> = uid
        <span style="color: #ff7700;font-weight:bold;">if</span> uid == <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> uid
&nbsp;
        player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
        player.<span style="color: black;">out_time</span> = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>+<span style="color: #008000;">self</span>.<span style="color: black;">action_time</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _reset_street<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'一街完成重置'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span> = <span style="color: #ff4500;">0</span>
        uchips = <span style="color: #ff4500;">0</span> <span style="color: #808080; font-style: italic;">#统计底池</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>:
            player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
            uchips += <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span>player.<span style="color: black;">bid_list</span><span style="color: black;">&#41;</span>
            player.<span style="color: black;">bid_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">pot_info</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>uchips<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _check_street<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, uid<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'检查一街是否完成'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> uid <span style="color: #66cc66;">!</span>= <span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">cplayer_list</span>:
            player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">status</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>Config.<span style="color: black;">FOLD</span>, Config.<span style="color: black;">ALL_IN</span><span style="color: black;">&#93;</span>:
                <span style="color: #ff7700;font-weight:bold;">continue</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span>player.<span style="color: black;">bid_list</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">self</span>.<span style="color: black;">user_max_chips</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_wait_next<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'设置当前轮到下一玩家'</span><span style="color: #483d8b;">''</span>
        index = <span style="color: #ff4500;">0</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span>:
            index = <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span>.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span><span style="color: black;">&#41;</span>+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span><span style="color: black;">&#41;</span>
&nbsp;
        next_uid = <span style="color: #ff4500;">0</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'iplayer_list:%s, index:%s, nuid:%s '</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span>, index, <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> uid <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span><span style="color: black;">&#91;</span>index:<span style="color: black;">&#93;</span>+<span style="color: #008000;">self</span>.<span style="color: black;">iplayer_list</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:index<span style="color: black;">&#93;</span>:
            player = <span style="color: #008000;">self</span>.<span style="color: black;">player_dict</span><span style="color: black;">&#91;</span>uid<span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">status</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>Config.<span style="color: black;">FOLD</span>, Config.<span style="color: black;">ALL_IN</span><span style="color: black;">&#93;</span>:
                next_uid = uid
                <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">wait_next_uid</span> == next_uid:
            next_uid = <span style="color: #ff4500;">0</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> next_uid</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/864/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>python版Event.addEventListener模块</title>
		<link>http://www.quou.cn/archives/861</link>
		<comments>http://www.quou.cn/archives/861#comments</comments>
		<pubDate>Wed, 11 Jan 2012 14:46:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python&Ruby]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=861</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;上次说到元旦的时候coding了一个德州的服务，这段时间刚好插不上什么手就调试了一下服务的通信问题。到目前这个服务都是一个进程，分三个块：1、消息连接管理线程（负责接收客户端消息，并做调度）；2、赛事管理线程（目前还没有独立成线程，还没有做到锦标赛一步）；3、赛桌管理线程（主要负责管理当前开启的赛桌正常运行）。 &#160;&#160;&#160;&#160;&#160;&#160;为了跟客户端代码靠齐，我diy了一个python版event模块。其实就是以前写的插件方法上做了一点修饰。先看用法吧： View Code PYTHON1 2 3 4 5 6 7 self.event = Event.Event&#40;&#41; #相关事件句柄 # 监听用户加入牌桌事件，EventHelper是事件方法集合模块 self.event.add_event_listener&#40;Event.USER_JOIN, EventHelper.on_user_join&#41; &#160; #在处理完用户加入牌桌后加上如下代码： event_content = &#123;'uid':123, 'seat_pos':2&#125; self.event.dispatch_event&#40;Event.USER_JOIN, content = event_content&#41; &#160;&#160;&#160;&#160;&#160;&#160;下面这个是Event.py的全部代码，写的不怎么的，就凑合着看吧，稍后我把游戏逻辑Table.py代码贴出来，基于状态，虽然这个想法我是听来的，我也没有找到更好的方法。 View Code PYTHON1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上次说到元旦的时候coding了一个德州的服务，这段时间刚好插不上什么手就调试了一下服务的通信问题。到目前这个服务都是一个进程，分三个块：1、消息连接管理线程（负责接收客户端消息，并做调度）；2、赛事管理线程（目前还没有独立成线程，还没有做到锦标赛一步）；3、赛桌管理线程（主要负责管理当前开启的赛桌正常运行）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了跟客户端代码靠齐，我diy了一个python版event模块。其实就是以前写的插件方法上做了一点修饰。先看用法吧：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p861code35'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86135"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p861code35"><pre class="python" style="font-family:Dialog;"><span style="color: #008000;">self</span>.<span style="color: black;">event</span> = Event.<span style="color: black;">Event</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;">#相关事件句柄</span>
<span style="color: #808080; font-style: italic;"># 监听用户加入牌桌事件，EventHelper是事件方法集合模块</span>
<span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">add_event_listener</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">USER_JOIN</span>, EventHelper.<span style="color: black;">on_user_join</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#在处理完用户加入牌桌后加上如下代码：</span>
event_content = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'uid'</span>:<span style="color: #ff4500;">123</span>, <span style="color: #483d8b;">'seat_pos'</span>:<span style="color: #ff4500;">2</span><span style="color: black;">&#125;</span>
<span style="color: #008000;">self</span>.<span style="color: black;">event</span>.<span style="color: black;">dispatch_event</span><span style="color: black;">&#40;</span>Event.<span style="color: black;">USER_JOIN</span>, content = event_content<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面这个是Event.py的全部代码，写的不怎么的，就凑合着看吧，稍后我把游戏逻辑Table.py代码贴出来，基于状态，虽然这个想法我是听来的，我也没有找到更好的方法。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p861code36'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86136"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="code" id="p861code36"><pre class="python" style="font-family:Dialog;"><span style="color: #808080; font-style: italic;">#coding=gbk</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">traceback</span>
&nbsp;
READY_COMPLETE        = <span style="color: #483d8b;">'ready_over'</span>         <span style="color: #808080; font-style: italic;">#准备就绪</span>
BLIND_COMPLETE        = <span style="color: #483d8b;">'blind_over'</span>         <span style="color: #808080; font-style: italic;">#扣除盲注完</span>
PREFLOP_COMPLETE      = <span style="color: #483d8b;">'send_preflop_over'</span>  <span style="color: #808080; font-style: italic;">#发底牌</span>
FLOP_COMPLETE         = <span style="color: #483d8b;">'send_flop_over'</span>     <span style="color: #808080; font-style: italic;">#发翻牌完</span>
TURN_COMPLETE         = <span style="color: #483d8b;">'send_turn_over'</span>     <span style="color: #808080; font-style: italic;">#发转牌完</span>
DRIVE_COMPLETE        = <span style="color: #483d8b;">'send_drive_over'</span>    <span style="color: #808080; font-style: italic;">#发河牌完</span>
PRIZE_COMPLETE        = <span style="color: #483d8b;">'prize_over'</span>         <span style="color: #808080; font-style: italic;">#派奖完成</span>
&nbsp;
USER_JOIN             = <span style="color: #483d8b;">'user_join'</span>          <span style="color: #808080; font-style: italic;">#用户加入</span>
USER_TURN             = <span style="color: #483d8b;">'user_turn'</span>          <span style="color: #808080; font-style: italic;">#轮转用户</span>
USER_CHECK            = <span style="color: #483d8b;">'user_check'</span>         <span style="color: #808080; font-style: italic;">#玩家看牌</span>
USER_CALL             = <span style="color: #483d8b;">'user_call'</span>          <span style="color: #808080; font-style: italic;">#玩家跟注</span>
USER_RAISE            = <span style="color: #483d8b;">'user_raise'</span>         <span style="color: #808080; font-style: italic;">#玩家加注</span>
USER_FOLD             = <span style="color: #483d8b;">'user_fold'</span>          <span style="color: #808080; font-style: italic;">#玩家弃牌</span>
USER_ALLIN            = <span style="color: #483d8b;">'user_allin'</span>         <span style="color: #808080; font-style: italic;">#玩家all in</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Event:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'事件侦听和派发模块'</span><span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._event_config = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_unique_id<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, target, function, priority<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'%s_%s_%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>target, function.<span style="color: #0000cd;">__hash__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, priority<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add_event_listener<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, target, function, priority=<span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'添加事件监听'</span><span style="color: #483d8b;">''</span>
        idx = <span style="color: #008000;">self</span>._get_unique_id<span style="color: black;">&#40;</span>target, function, priority<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>._event_config.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span>target<span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>._event_config<span style="color: black;">&#91;</span>target<span style="color: black;">&#93;</span> = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>._event_config<span style="color: black;">&#91;</span>target<span style="color: black;">&#93;</span>.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span>priority<span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>._event_config<span style="color: black;">&#91;</span>target<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>priority<span style="color: black;">&#93;</span> = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #008000;">self</span>._event_config<span style="color: black;">&#91;</span>target<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>priority<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>idx<span style="color: black;">&#93;</span> = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'function'</span> : function<span style="color: black;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> dispatch_event<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, target, content = <span style="color: #008000;">None</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'分发事件'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>._event_config.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span>target<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
        actions = <span style="color: #008000;">self</span>._event_config<span style="color: black;">&#91;</span>target<span style="color: black;">&#93;</span>
&nbsp;
        prikey = actions.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        prikey.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#按优先级排序</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> k <span style="color: #ff7700;font-weight:bold;">in</span> prikey:
            acs = actions<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> ac <span style="color: #ff7700;font-weight:bold;">in</span> acs:
                a = acs<span style="color: black;">&#91;</span>ac<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'function'</span><span style="color: black;">&#93;</span>
                <span style="color: #ff7700;font-weight:bold;">try</span>:
                    a<span style="color: black;">&#40;</span>content, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">except</span>:
                    <span style="color: #dc143c;">logging</span>.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'some error in %s-do_action:%s'</span>, target, <span style="color: #dc143c;">traceback</span>.<span style="color: black;">format_exc</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/861/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>python模块名造成数据共享问题</title>
		<link>http://www.quou.cn/archives/859</link>
		<comments>http://www.quou.cn/archives/859#comments</comments>
		<pubDate>Wed, 11 Jan 2012 14:22:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python&Ruby]]></category>
		<category><![CDATA[数据]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=859</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;今天在调服务的时候老是发现两个线程读同一模块内存的时候出现问题，情况是一个线程负责写，但另一个线程始终读不到数据，最后做测试的时候发现是这么回事，先看这个小例子吧。 &#160;&#160;&#160;&#160;&#160;&#160;当前目录下有一个haha的包，包中包含:__init__.py、data.py，data.py文件内容如下： View Code PYTHON1 CONF = &#123;&#125; &#160;&#160;&#160;&#160;&#160;&#160;在当前目录下的主程序文件test.py中写下如下代码： View Code PYTHON1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sys.path.append&#40;'./haha'&#41; &#160; import server as hs import haha.server as hs1 from haha import server as hs2 &#160; hs.CONF&#91;'hs'&#93; = 1 hs1.CONF&#91;'hs1'&#93; = 1 hs2.CONF&#91;'hs2'&#93; = [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天在调服务的时候老是发现两个线程读同一模块内存的时候出现问题，情况是一个线程负责写，但另一个线程始终读不到数据，最后做测试的时候发现是这么回事，先看这个小例子吧。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前目录下有一个haha的包，包中包含:__init__.py、data.py，data.py文件内容如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p859code39'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p85939"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p859code39"><pre class="python" style="font-family:Dialog;">CONF = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在当前目录下的主程序文件test.py中写下如下代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p859code40'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p85940"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p859code40"><pre class="python" style="font-family:Dialog;"><span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'./haha'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> server <span style="color: #ff7700;font-weight:bold;">as</span> hs
<span style="color: #ff7700;font-weight:bold;">import</span> haha.<span style="color: black;">server</span> <span style="color: #ff7700;font-weight:bold;">as</span> hs1
<span style="color: #ff7700;font-weight:bold;">from</span> haha <span style="color: #ff7700;font-weight:bold;">import</span> server <span style="color: #ff7700;font-weight:bold;">as</span> hs2
&nbsp;
hs.<span style="color: black;">CONF</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'hs'</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">1</span>
hs1.<span style="color: black;">CONF</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'hs1'</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">1</span>
hs2.<span style="color: black;">CONF</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'hs2'</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">1</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> hs, <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>, hs1, <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>, hs2, <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>
<span style="color: #808080; font-style: italic;">#输出：&lt;module 'server' from '/home/xxx/python/poker/bin/server.pyc'&gt; </span>
<span style="color: #808080; font-style: italic;">#      &lt;module 'haha.server' from '/home/xxx/python/poker/bin/haha/server.pyc'&gt; </span>
<span style="color: #808080; font-style: italic;">#      &lt;module 'haha.server' from '/home/xxx/python/poker/bin/haha/server.pyc'&gt;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> hs.<span style="color: black;">CONF</span>, <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>, hs1.<span style="color: black;">CONF</span>, <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>, hs2.<span style="color: black;">CONF</span>
<span style="color: #808080; font-style: italic;">#输出：{'hs': 1} </span>
<span style="color: #808080; font-style: italic;">#      {'hs2': 1, 'hs1': 1} </span>
<span style="color: #808080; font-style: italic;">#      {'hs2': 1, 'hs1': 1}</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看输出应该能知道个大概了吧，虽然还没有找到具体原因是什么，主要是不知道这种东西应该怎么搜索。xing哥猜测是不同module name用了不同的内存空间，我也同意这个解释。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/859/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>德州比牌算法和生成扑克牌方法</title>
		<link>http://www.quou.cn/archives/853</link>
		<comments>http://www.quou.cn/archives/853#comments</comments>
		<pubDate>Tue, 03 Jan 2012 13:41:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python&Ruby]]></category>
		<category><![CDATA[texas]]></category>
		<category><![CDATA[德州扑克]]></category>
		<category><![CDATA[比牌]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.quou.cn/?p=853</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;先介绍一副写扑克牌的方法吧，一般的方法莫过于随机生成牌，检查牌是否存在，在循环，这种方法是普通青年的方法，极不可靠。下面这个算是文艺青年方法吧，有内涵而且只会循环一次就写完扑克牌。备注：0、1、2、3 = 黑、红、梅、方，如果你不喜欢换换也无所谓；11、12、13、14 = J、Q、K、A。为什么A是14呢，主要是为了算牌的方便。 View Code PYTHON1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import random import math def get_poker&#40;&#41;: '''获取一副打乱的扑克牌''' ret = &#91; &#40;0, 14&#41;,&#40;0, 2&#41;,&#40;0, 3&#41;,&#40;0, 4&#41;,&#40;0, 5&#41;,&#40;0, 6&#41;,&#40;0, 7&#41;,&#40;0, 8&#41;,&#40;0, 9&#41;,&#40;0, 10&#41;,&#40;0, 11&#41;,&#40;0, 12&#41;,&#40;0, 13&#41;, &#40;1, 14&#41;,&#40;1, 2&#41;,&#40;1, 3&#41;,&#40;1, 4&#41;,&#40;1, 5&#41;,&#40;1, 6&#41;,&#40;1, [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先介绍一副写扑克牌的方法吧，一般的方法莫过于随机生成牌，检查牌是否存在，在循环，这种方法是普通青年的方法，极不可靠。下面这个算是文艺青年方法吧，有内涵而且只会循环一次就写完扑克牌。备注：0、1、2、3 = 黑、红、梅、方，如果你不喜欢换换也无所谓；11、12、13、14 = J、Q、K、A。为什么A是14呢，主要是为了算牌的方便。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p853code45'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p85345"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p853code45"><pre class="python" style="font-family:Dialog;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">math</span>
<span style="color: #ff7700;font-weight:bold;">def</span> get_poker<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取一副打乱的扑克牌'</span><span style="color: #483d8b;">''</span>
    ret = <span style="color: black;">&#91;</span>
        <span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">7</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">11</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">12</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">13</span><span style="color: black;">&#41;</span>,
        <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">7</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">11</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">12</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">13</span><span style="color: black;">&#41;</span>,
        <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">7</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">11</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">12</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">13</span><span style="color: black;">&#41;</span>,
        <span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">7</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">11</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">12</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">13</span><span style="color: black;">&#41;</span> <span style="color: black;">&#93;</span>
    <span style="color: #808080; font-style: italic;">#默认0是黑、1是红、2是梅、3是方</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">52</span><span style="color: black;">&#41;</span> :
        k = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">math</span>.<span style="color: black;">floor</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">52</span><span style="color: #66cc66;">*</span><span style="color: #dc143c;">random</span>.<span style="color: #dc143c;">random</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        b = ret<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;">#这几句特没技术含量⊙﹏⊙</span>
        ret<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span> = ret<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
        ret<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> = b
    <span style="color: #ff7700;font-weight:bold;">return</span> ret</pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面说贴一个今天写的算牌类吧，因为不是在公司写的，所以就提供出来，方便大家使用，只写了一遍没有做细检查，如果有bug麻烦贴一下，先说比牌的方法吧。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p853code46'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p85346"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code" id="p853code46"><pre class="python" style="font-family:Dialog;"><span style="color: #ff7700;font-weight:bold;">def</span> compare<span style="color: black;">&#40;</span>cards_dict<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'比较牌大小'</span><span style="color: #483d8b;">''</span>
    rank = <span style="color: #ff4500;">0</span>
    ret = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
    <span style="color: #808080; font-style: italic;">#先取出最大同等级的所有牌谱，比如都是同花顺</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #008000;">id</span>, plist <span style="color: #ff7700;font-weight:bold;">in</span> cards_dict.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        res = CardCounter<span style="color: black;">&#40;</span>plist<span style="color: black;">&#41;</span>.<span style="color: black;">result</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'type'</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span> rank:
            rank = res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'type'</span><span style="color: black;">&#93;</span>
            ret = <span style="color: black;">&#123;</span><span style="color: #008000;">id</span>:res<span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'type'</span><span style="color: black;">&#93;</span> == rank:
            ret<span style="color: black;">&#91;</span><span style="color: #008000;">id</span><span style="color: black;">&#93;</span> = res
&nbsp;
    iret = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
    <span style="color: #008000;">max</span> = <span style="color: #008000;">None</span>
    <span style="color: #808080; font-style: italic;">#同等级的所有牌谱比较，比如都是同花顺，比较最大牌</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #008000;">id</span>, res <span style="color: #ff7700;font-weight:bold;">in</span> ret.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">max</span> <span style="color: #ff7700;font-weight:bold;">or</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'result'</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #008000;">max</span>:
            <span style="color: #008000;">max</span> = res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'result'</span><span style="color: black;">&#93;</span>
            iret = <span style="color: black;">&#123;</span><span style="color: #008000;">id</span>: res<span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> res<span style="color: black;">&#91;</span><span style="color: #483d8b;">'result'</span><span style="color: black;">&#93;</span> == <span style="color: #008000;">max</span>:
            iret<span style="color: black;">&#91;</span><span style="color: #008000;">id</span><span style="color: black;">&#93;</span> = res
    <span style="color: #ff7700;font-weight:bold;">return</span> iret</pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用这个方法比较几副扑克牌，以下面的比较9个人的扑克牌，执行1000次耗时0.5秒左右，下面演示一下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p853code47'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p85347"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p853code47"><pre class="python" style="font-family:Dialog;">    poker = get_poker <span style="color: #808080; font-style: italic;">#得到一副扑克</span>
    u_list = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
    cpoker = poker<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:<span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;">#取出前5张作为公共牌</span>
    num = <span style="color: #ff4500;">6</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;">#生成9个玩家牌</span>
        po = cpoker + poker<span style="color: black;">&#91;</span>num:num+<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
        num += <span style="color: #ff4500;">3</span>
        u_list<span style="color: black;">&#91;</span><span style="color: #483d8b;">'test_%s'</span> <span style="color: #66cc66;">%</span> i<span style="color: black;">&#93;</span> = po
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'test_%s  =&gt;  %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>i, po<span style="color: black;">&#41;</span>
    res = compare<span style="color: black;">&#40;</span>u_list<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#比较扑克，得到最大玩家</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> res</pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面的代码中出现了一个关键的类CardCounter,现贴一下代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p853code48'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p85348"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
</pre></td><td class="code" id="p853code48"><pre class="python" style="font-family:Dialog;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">copy</span>
&nbsp;
SUITED_JUNKO   = <span style="color: #ff4500;">10</span> <span style="color: #808080; font-style: italic;">#同花顺</span>
QUADS          = <span style="color: #ff4500;">9</span>  <span style="color: #808080; font-style: italic;">#四条</span>
FULL_HOUSE     = <span style="color: #ff4500;">8</span>  <span style="color: #808080; font-style: italic;">#葫芦</span>
SUITED         = <span style="color: #ff4500;">7</span>  <span style="color: #808080; font-style: italic;">#同花</span>
JUNKO          = <span style="color: #ff4500;">6</span>  <span style="color: #808080; font-style: italic;">#顺子</span>
TRIPS          = <span style="color: #ff4500;">5</span>  <span style="color: #808080; font-style: italic;">#三条</span>
TWO_PAIRS      = <span style="color: #ff4500;">4</span>  <span style="color: #808080; font-style: italic;">#两对</span>
PAIR           = <span style="color: #ff4500;">3</span>  <span style="color: #808080; font-style: italic;">#一对</span>
HIGH           = <span style="color: #ff4500;">2</span>  <span style="color: #808080; font-style: italic;">#高牌</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># CardCounter的使用方法如下：</span>
<span style="color: #808080; font-style: italic;"># upoker = {'uname1':[(0,14), (0,2), (0,3), (0,4), (0,5), (0,9), (0,8)]</span>
<span style="color: #808080; font-style: italic;">#           'uname2':[(0,14), (0,2), (0,3), (0,4), (0,5), (0,6), (0,8)]}</span>
<span style="color: #808080; font-style: italic;"># ret = CardCounter(upoker).result()</span>
<span style="color: #808080; font-style: italic;"># ret返回的是个字典，解释一下字典中的项：</span>
<span style="color: #808080; font-style: italic;"># {'type':'',   #牌型，上面定义的常量，如同花、顺子</span>
<span style="color: #808080; font-style: italic;">#  'card':'',   #在四条中和一对中表示牌点数</span>
<span style="color: #808080; font-style: italic;">#  'tcard':'',  #在三条和葫芦中表示三条牌点数</span>
<span style="color: #808080; font-style: italic;">#  'pcard':',   #在葫芦中表示一对的点数</span>
<span style="color: #808080; font-style: italic;">#  'cards':'',  #最大5张中的其余牌</span>
<span style="color: #808080; font-style: italic;">#  'color':'',  #在同花顺和同花中表示花色</span>
<span style="color: #808080; font-style: italic;">#  'result':''  #同等级牌的比较项</span>
<span style="color: #808080; font-style: italic;"># 各字段只在描述的牌型中出现</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> CardCounter:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'德州扑克牌计算类'</span><span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, poker_list<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._plist = poker_list
        <span style="color: #008000;">self</span>._clist = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;">#花色列表</span>
        <span style="color: #008000;">self</span>._nlist = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;">#点数列表</span>
        <span style="color: #008000;">self</span>._olist = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;">#不同点数列表</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">init_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> init_info<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'初始化相关信息'</span><span style="color: #483d8b;">''</span>
        <span style="color: #008000;">self</span>._clist = <span style="color: black;">&#91;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>._plist<span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>._nlist = <span style="color: black;">&#91;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>._plist<span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>._nlist.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._olist = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span><span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._nlist<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._olist.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_junko<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, olist<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取顺子'</span><span style="color: #483d8b;">''</span>
        n = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>olist<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> n<span style="color: #66cc66;">&lt;</span><span style="color: #ff4500;">5</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>n-<span style="color: #ff4500;">5</span>, -<span style="color: #ff4500;">1</span>, -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
            xlist = olist<span style="color: black;">&#91;</span>i:<span style="color: #ff4500;">5</span>+i<span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> xlist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> - xlist<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #ff4500;">4</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> xlist
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">set</span><span style="color: black;">&#40;</span>olist<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_suited<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, clist, plist<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'是否是同花'</span><span style="color: #483d8b;">''</span>
        flag = <span style="color: #008000;">False</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> clist.<span style="color: black;">count</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">5</span>:
                flag = i
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> flag <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">False</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> flag
&nbsp;
        plist = <span style="color: black;">&#91;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> plist <span style="color: #ff7700;font-weight:bold;">if</span> i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == flag<span style="color: black;">&#93;</span>
        plist.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>flag, plist<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_pairs<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, olist, nlist<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取对'</span><span style="color: #483d8b;">''</span>
        ret = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> olist:
            <span style="color: #ff7700;font-weight:bold;">if</span> nlist.<span style="color: black;">count</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">2</span> :
                ret.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
        ret.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> ret
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_trips<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, olist, nlist<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取三条'</span><span style="color: #483d8b;">''</span>
        ret = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> olist:
            <span style="color: #ff7700;font-weight:bold;">if</span> nlist.<span style="color: black;">count</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">3</span> :
                ret.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
        ret.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> ret
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_quads<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, olist, nlist<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取四条'</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> olist:
            <span style="color: #ff7700;font-weight:bold;">if</span> nlist.<span style="color: black;">count</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">4</span> :
                <span style="color: #ff7700;font-weight:bold;">return</span> i
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> result<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'获取牌型的最大牌'</span><span style="color: #483d8b;">''</span>
        suited = <span style="color: #008000;">self</span>.<span style="color: black;">get_suited</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._clist, <span style="color: #008000;">self</span>._plist<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> suited:
            color, xsuited = suited
            suited_junko = <span style="color: #008000;">self</span>.<span style="color: black;">get_junko</span><span style="color: black;">&#40;</span>xsuited<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> suited_junko: <span style="color: #808080; font-style: italic;">#同花顺</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:SUITED_JUNKO, <span style="color: #483d8b;">'cards'</span>:suited_junko<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">6</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, 
                        <span style="color: #483d8b;">'color'</span>:color, <span style="color: #483d8b;">'result'</span>:suited_junko<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span>
&nbsp;
        n = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> n<span style="color: #66cc66;">&lt;</span>=<span style="color: #ff4500;">4</span>:
            quads = <span style="color: #008000;">self</span>.<span style="color: black;">get_quads</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist, <span style="color: #008000;">self</span>._nlist<span style="color: black;">&#41;</span> 
            <span style="color: #ff7700;font-weight:bold;">if</span> quads: <span style="color: #808080; font-style: italic;">#4条</span>
                olist = <span style="color: #dc143c;">copy</span>.<span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist<span style="color: black;">&#41;</span>
                olist.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>quads<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:QUADS, <span style="color: #483d8b;">'card'</span>:quads, <span style="color: #483d8b;">'cards'</span>:olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">2</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'result'</span>:olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span>
&nbsp;
        pairs = <span style="color: #008000;">self</span>.<span style="color: black;">get_pairs</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist, <span style="color: #008000;">self</span>._nlist<span style="color: black;">&#41;</span>
        trips = <span style="color: #008000;">self</span>.<span style="color: black;">get_trips</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist, <span style="color: #008000;">self</span>._nlist<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>pairs<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">2</span> <span style="color: #ff7700;font-weight:bold;">and</span> trips: 
            <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> trips<span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> i <span style="color: #ff7700;font-weight:bold;">in</span> pairs: <span style="color: #808080; font-style: italic;">#葫芦</span>
                    pcard = pairs<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> == i <span style="color: #ff7700;font-weight:bold;">and</span> pairs<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">or</span> pairs<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
                    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:FULL_HOUSE, <span style="color: #483d8b;">'tcard'</span>:i, <span style="color: #483d8b;">'pcard'</span>:pcard, 
                            <span style="color: #483d8b;">'result'</span>:<span style="color: black;">&#91;</span>i, pcard<span style="color: black;">&#93;</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> suited: <span style="color: #808080; font-style: italic;">#同花</span>
            color, xsuited = suited
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:SUITED, <span style="color: #483d8b;">'cards'</span>:xsuited<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">6</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'color'</span>:color, 
                    <span style="color: #483d8b;">'result'</span>:xsuited<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">6</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span>
&nbsp;
        junko = <span style="color: #008000;">self</span>.<span style="color: black;">get_junko</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> junko: <span style="color: #808080; font-style: italic;">#顺子</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:JUNKO, <span style="color: #483d8b;">'cards'</span>:junko, 
                    <span style="color: #483d8b;">'result'</span>:junko<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> trips: <span style="color: #808080; font-style: italic;">#三条</span>
            olist = <span style="color: #dc143c;">copy</span>.<span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist<span style="color: black;">&#41;</span>
            olist.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>trips<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:TRIPS, <span style="color: #483d8b;">'tcard'</span>:trips<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'cards'</span>:olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">3</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, 
                    <span style="color: #483d8b;">'result'</span>:<span style="color: black;">&#91;</span>trips<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">3</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>pairs<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">2</span>: <span style="color: #808080; font-style: italic;">#两对</span>
            olist = <span style="color: #dc143c;">copy</span>.<span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist<span style="color: black;">&#41;</span>
            olist.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>pairs<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            olist.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>pairs<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:TWO_PAIRS, <span style="color: #483d8b;">'tcard'</span>:pairs<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">3</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'cards'</span>:olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">2</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, 
                    <span style="color: #483d8b;">'result'</span>:<span style="color: black;">&#91;</span>pairs<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">3</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">2</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span> <span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> pairs: <span style="color: #808080; font-style: italic;">#一对</span>
            olist = <span style="color: #dc143c;">copy</span>.<span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._olist<span style="color: black;">&#41;</span>
            olist.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>pairs<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:PAIR, <span style="color: #483d8b;">'card'</span>:pairs<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'cards'</span>:olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">4</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, 
                    <span style="color: #483d8b;">'result'</span>:<span style="color: black;">&#91;</span>pairs<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">4</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span> <span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'type'</span>:HIGH, <span style="color: #483d8b;">'cards'</span>:<span style="color: #008000;">self</span>._olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">6</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, 
                <span style="color: #483d8b;">'result'</span>:<span style="color: #008000;">self</span>._olist<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">6</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span></pre></td></tr></table></div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;熬了N久终于等到了一个元旦，第一天睡了个很懒的觉，下午看了会下午电视，晚上和hong、rongrong一起去看《金陵十三钗》，我终于知道为什么mtime上的评价那么极端了，一帮人10分，一帮人0分，不知道是不是没什么爱心还是这个社会把我伤着了，没怎么被感动。第二天早上6点就醒来，感觉好久没写代码了，7点起床写代码，这一写就是一天，晚上和他们去吃了巴西烤肉，一群俗人吃撑了，走着回家，还有个铅笔青年一路上说要吐。第三天（今天）在家接着coding了一天。现公布成绩。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨天写了游戏的大框架，实在不是一个一天就能完成的东西，到现在还是个半途而废的东西呢。明天又要上班了，怎么可以把我从服务中解脱出来呢。啊啊啊啊&#8230;..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quou.cn/archives/853/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

