CSDN 网友 zswang 组织了一个编程游戏比赛。划拳机器人比赛。类似“Robocode” 的游戏。
比赛相关帖子如下:
【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。
http://topic.csdn.net/u/20080421/17/6a4d1c20-e1d1-4e9d-99ae-d648cb422ca6.html
【编程游戏】划拳机器人,前面一贴的机器人都集中来了,继续PK。谨慎路过。
http://topic.csdn.net/u/20080423/21/cda52758-a06d-49e1-9db0-eda2b009da8c.html
很有意思的,为了让更多人能参与到这个很有趣的 .NET 编程比赛中来,我转了下面的内容:
划拳介绍
划拳又叫豁拳、猜枚、猜拳、拇战,即饮酒时两人同时伸出手指并各说一个数,谁说的数目跟双方所伸手指的总数相符,谁就算赢,输的人喝酒。此乃我国
古传至今仍时尚流行的饮酒游戏,它增添酒兴,烘托喜庆,是一种民间的酒令。 其技巧性颇强,给玩者留有神机斗智的余地,且因玩时须喊叫,易让人兴奋,极富竞争性。
两人同时伸出一只手,用攥起的拳头和伸出一到五个手指,表示从零到五这几个数字,与此同时,嘴里喊出从零到10的数字,如果两人伸出的手指表示的数字相加与其中一个人嘴里喊出的数字相同,那么这个人就算赢了这一拳。举例说明:比如一个人伸出了三个手指,另一个人伸出了四个手指,一个人喊了七,另一个喊了六,那么这个人喊七的人就赢了;如一个人伸出攥紧的拳头(表示零),嘴里喊出了三,而另一个恰好伸出了三个手指可嘴里喊的七,那么喊三的就赢了。就这么简单。当然,如果自己喊的是“八仙过海”, 而自己仅伸出了一个手指,那么对方即使伸出五指也不可能凑成八,这种拳就叫臭拳,如果不是事先约定,是要罚酒的。
划拳规则看完了,那我们就开始写一个会划拳的机器人吧!
那么一个会划拳的机器会做什么事情呢?其实就是两件:
第一件、出拳,即:自己出几个手指?自己猜合计是多少。
第二件、知道划拳的结果,即:对方出几个手指,对方猜合计是多少,是否获胜还是平局还是其他。
只要继承Drunkard这个类,重载Come()和Outcome()方法那么你就拥有了一个会划拳的机器人,参与这个游戏了!
【游戏规则】
1、比赛共1000局,即:出现胜负算一局,如出拳100次没有结果也算一局并双方均不得分;
2、赢一局得1分、输不扣分;
3、机器人执行中每出现一次异常,扣100分、对方加1分、记一局;
4、机器人执行中反应超时1000毫秒直接判负,每超时100毫秒,扣1分,超时10次以上直接判负;
5、自己得分高于对手并大于600分判胜;
6、自己得分为正数对手得分为负数判胜;
7、其他情况则判平。
具体执行的过程,算法的过程请参考Drunkery <T1, T2>类的实现
【入门提示】
1、机器人的命名建议是: <自己的id> + <第几个> + "号",如:Zswang一号、Zswang二号,当然你也可以用“长江七号”
2、不允许修改Drunkard和Drunkery <T1, T2>;
3、机器人必须从Drunkard继承;
4、分析擂主代码是战胜擂主的关键;
5、打擂容易守擂难,大家自由发挥吧!
【擂台赛规则】
1、第一个打败擂主的机器人奖励20分,并成为新的擂主;
2、自己不能挑战自己编写的机器人;
3、最后一个擂主获得200专家分,发帖另付;
4、其余分数酌情散掉。
标准代码和比赛规则有什么不妥或者建议欢迎讨论,谢谢关注
(调试代码参考后面两帖,-_-!!!代码有点多,先别抢沙发。。。。)
由于空间有限, 这里就不贴调试代码了, 调试代码,以及基类代码看上面给的两个帖子的链接。
我的笔记本是 Dell 600M , 一直以来有个问题, 声卡能放出声音,但是无法使用麦克风.
前几天看到一篇文掌, 参照这篇文章就解决了我的问题, 特收藏这篇文章如下:
我们经常在使用过程中,会发现声卡驱动已经装好,插入外置麦克风,无法使用.对此我总结了一些设置方法,看对大家平常使用是否有帮助,但是因为要通过修改注册表来解决,建议修改之前备份自己的注册表,防止改注册表导致系统出现问题:
主要原因:声卡厂商提供驱动程序的时候,可能默认屏蔽掉此功能,因为笔记本内部扬声器和麦克风同时使用的时候容易产生干扰。在右下角小喇叭那边双击,然后点“选项”-“属性”,点“播放”,然后把下面框里面的都勾上,如果这里没有出现“麦克风”,那就是默认没有开启全双工(不是在“录音”里面选“麦克风”,而是看“播放”里面有没有“麦克风”),可以修改注册表试试着能不能改为双工,方法如下:
1.单击“开始”菜单,选“运行”,在运行框里输入regedit,然后敲回车即可运行注册表编辑器。如图1

图1
2.在注册表编辑器菜单中选择“编辑”-》“查找”,并且输入查找词“DisableMicFromPlayback”,如下图2
图2
3.查找到该项后,双击修改。如图3,图4。
图3

图4
4.通过注册表编辑器菜单中“编辑”-》“查找下一个”,把能查找到的所有DisableMicFromPlayback项值都按上述方法修改。
5.退出注册表编辑器,重启电脑即可。
6.重新启动后,再双击小喇叭,把“播放”里面的“麦克风”勾上,记得不要把它静音
对于有些机型,象c系列机器,在注册表中查找:
ShowPlaybackMic,将'0000 00' 改成 '0000 01'
对于有时搜索到了以上两项值,最好能继续搜索一下,把能搜索到相同的都修改了.
太极拳的每个动作都是由手法,步法,身法和眼神等动作变化协调配合而形成的。这个系列的文章,通过收集整理太极拳的手法,步法,身法和眼神的基本法则。让我们从总体上对太极拳有个认识。
太极拳的身法主要有九个法则:
松肩,沉肘,涵胸,拔背,裹裆,溜臀,松腰,抽胯,顶头悬
这篇文章我们重点介绍拔背
下面摘自王培生师爷的《太极拳的健身和技击作用》
为什么要拔背呢?
因为拔背是为了避免脊柱松弛过度和产生低头弯腰等现象,所以用拔背来控制。此外,拔背在技击时,还起着发力的作用。
拔背的练法
以意想象在两肩正中间脊椎骨(即大椎)处,有鼓起来的意思就行了。但不可有意识地向上抽拔。两肩保持灵活,不可低头为要。
掌握拔背的方法
只有用意想着脊背的高骨(即大椎)处,约有10公分的面积和贴身的衣服相接触就成了。
大椎的位置

太极拳的每个动作都是由手法,步法,身法和眼神等动作变化协调配合而形成的。这个系列的文章,通过收集整理太极拳的手法,步法,身法和眼神的基本法则。让我们从总体上对太极拳有个认识。
太极拳的身法主要有九个法则:
松肩,沉肘,涵胸,拔背,裹裆,溜臀,松腰,抽胯,顶头悬
这篇文章我们重点介绍涵胸
下面摘自王培生师爷的《太极拳的健身和技击作用》
为什么要涵胸?
因为涵胸有两个显著的作用:
第一、涵胸可以使气不上浮,所以为了能使气向下沉,必须涵胸。
第二、涵胸动作对于两腿的起落和进退,有着很大的辅助作用。拳之谚语:“腿之变化、运筹在胸。”
这就是涵胸的作用
涵胸的练法
应注意胸部不要挺凸,也不可向内太凹陷。而是往下松,两肩微向前一合就成了。
掌握涵胸之法
以意想两乳、从乳头往下沉气到肚脐以下即可。
太极拳的每个动作都是由手法,步法,身法和眼神等动作变化协调配合而形成的。这个系列的文章,通过收集整理太极拳的手法,步法,身法和眼神的基本法则。让我们从总体上对太极拳有个认识。
太极拳的身法主要有九个法则:
松肩,沉肘,涵胸,拔背,裹裆,溜臀,松腰,抽胯,顶头悬
这篇文章我们重点介绍沉肘
下面摘自王培生师爷的《太极拳的健身和技击作用》
为什么要沉肘呢?
上篇博客
太极拳身法之松肩
http://blog.joycode.com/ghj/archive/2008/04/13/115070.aspx
提到肩、肘、腕的密切关系,因为要把全身的力量运到手上去,不但要松肩,还必须沉肘。
所谓“肩松气到肘,肘沉气到手,手心一空气到指稍”就是这个意思,这也是沉肘所起的作用
沉肘的练法
以意想着肘尖好似接触到地面上,使手腕产生有活动的感觉就成了
掌握沉肘的方法
只要肘尖常有下坠之意,或者意一想“曲池穴”就成了

曲池:
【标准定位】在肘横纹外侧端,屈肘,当尺泽与肱骨外上髁连线中点。
【取法】屈肘成直角,当肘弯横纹尽头处。
比如我们有下面的需求:
三台电脑:A,B,C。
我们在 B 和 C 上部署了同样的一个服务,电脑 A 需要根据客户端的选择,自动的切换到底是调用B的服务,还是C的服务。
要实现这个需求,核心就在客户端的调用上。下面我们用一个简单的演示这个功能的代码来说明如何实现。
首先:服务器段
服务器段逻辑,这是非常简单的,我们按照之前的.net编写规范,编写代码即可。熟悉.net Remoting 的完全可以跳过这部分。
下面是一段简单的服务器段逻辑代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
namespace MyServiceComponent
{
public class MyComponent : MarshalByRefObject
{
public string GetString(short s)
{
// 返回信息中包含服务器IP,这样我们就知道客户端调用的是哪个服务器
if (s <= 10)
return string.Format("<=10 {0}", GetIP());
else
return string.Format("大于10 {0}", GetIP());
}
protected string GetIP() //获取本地IP
{
IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[0];
return ipAddr.ToString();
}
}
}
服务器段的配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton" type="MyServiceComponent.MyComponent, MyServiceComponent"
objectUri="HongjunguoRemotingService" />
</service>
<channels>
<!-- 这里的配置方法,请参看MSDN中 远程处理安全通道技术示例 -->
<channel ref="tcp" port="8088" secure="true" impersonate="true"
protectionLevel="EncryptAndSign" />
<serverProviders>
<formatter href="binary" typeFilterLevel="Full"/>
</serverProviders>
</channels>
</application>
<!--
只有把 customErrors 配置成 Off ,服务器端的详细错误异常,才能传递到客户端
默认是不传递完整的错误异常的。
-->
<customErrors mode ="Off" />
</system.runtime.remoting>
</configuration>
服务器段调用代码
RemotingConfiguration.Configure(
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, false);
客户端
客户端如果我们用以前常用的,把所有客户端的调用信息都写在一个配置文件中,期望简单的用下面代码就不可以了。
RemotingConfiguration.Configure(configFile, true);
如果我们用上面的方法时,则会收到下面的异常:
远程处理配置失败,异常为“System.Runtime.Remoting.RemotingException:
试图重定向类型“MyServiceComponent.MyComponent, MyServiceComponent”的激活,而该类型已被重定向。
在 System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.AddWellKnownClientType(WellKnownClientTypeEntry entry)
在 System.Runtime.Remoting.RemotingConfigHandler.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)
在 System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)
在 System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.StoreRemoteAppEntries(RemotingXmlConfigFileData configData)
在 System.Runtime.Remoting.RemotingConfigHandler.ConfigureRemoting(RemotingXmlConfigFileData configData, Boolean ensureSecurity)”。
参考我在论坛咨询的帖子
远程处理配置失败,异常为“RemotingException: 试图重定向类型“MySC.MyComponent, MyServiceComponent”的激活,而该类型已被重定向
http://topic.csdn.net/u/20080418/10/a9b02fa0-a230-4fb6-abeb-b7407a6729c1.html
使用.net Remoting 客户端调用服务器段时,需要考虑两个东西:
1、信道的问题(Channel)
2、如何创建远程对象,也就是注册类型
先说信道的问题:
上面例子中, B 和 C 服务器,他们完全可能一个开放的是 TCP 信道,一个开放的是 HTTP 信道。 同时,访问他们服务时,身份验证完全可能是不同的。各自服务器自身的验证。
这就有一个需要解决的问题,如何实现客户端多信道。下面这篇博客对此有比较详细的介绍:
Remoting多个信道(Chennel)的注册问题
http://www.cnblogs.com/kriss/archive/2005/11/30/288177.html
创建远程对象的问题:
如果我们把需要创建的信息写在配置文件中,用 RemotingConfiguration.Configure(configFile, true); 来创建远程对象,就会出现下面的错误。
远程处理配置失败,异常为“System.Runtime.Remoting.RemotingException:
试图重定向类型“MyServiceComponent.MyComponent, MyServiceComponent”的激活,而该类型已被重定向。
在 System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.AddWellKnownClientType(WellKnownClientTypeEntry entry)
在 System.Runtime.Remoting.RemotingConfigHandler.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)
在 System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)
在 System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.StoreRemoteAppEntries(RemotingXmlConfigFileData configData)
在 System.Runtime.Remoting.RemotingConfigHandler.ConfigureRemoting (RemotingXmlConfigFileData configData, Boolean ensureSecurity)”。
解决方法,就是下面的演示代码,不写在配置文件中,改自己手工创建,如下面客户端演示代码。
编码创建对象可以使用 Activator.GetObject 或者 Activator.CreateInstance 。
下面就是我的演示代码
针对B服务器的配置文件(主要是通道的配置,注意这两个配置文件验证信息不一样)
注意,这个配置文件中我们可没有下面这样的信息:
<client displayName="client01" >
<wellknown
displayName ="Wellknown1"
type="MyServiceComponent.MyComponent,MyServiceComponent"
url="tcp://192.168.5.2:8088/HongjunguoRemotingService" />
</client>
s1.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<!--
这里的配置方法,请参看MSDN中 远程处理安全通道技术示例
这个技术请参看:
http://www.cnblogs.com/zhengyun_ustc/archive/2006/06/09/remoting_InvalidCredentialException.html
http://forums.asp.net/thread/1626741.aspx
-->
<channel name="Channel1" ref="tcp" port="8081" secure="true"
tokenImpersonationLevel="impersonation" protectionLevel="EncryptAndSign"
username="ghj1976" password="*****" domain="*****" />
<clientProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</clientProviders>
</channels>
</application>
<customErrors mode ="Off" />
</system.runtime.remoting>
</configuration>
针对C服务器的配置文件(主要是通道的配置,注意这两个配置文件验证信息不一样)
s2.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel name="Channel2" ref="tcp" port="8082" secure="true"
tokenImpersonationLevel="impersonation" protectionLevel="EncryptAndSign"
username="communityserver" password="****" domain="***"/>
<clientProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</clientProviders>
</channels>
</application>
<customErrors mode ="Off" />
</system.runtime.remoting>
</configuration>
客户端程序的调用代码
public partial class ClientForm : Form
{
public ClientForm()
{
InitializeComponent();
}
private Dictionary<string, MyServiceComponent.MyComponent> dict =
new Dictionary<string, MyServiceComponent.MyComponent>(2);
private void button1_Click(object sender, EventArgs e)
{
short ss = 0;
if (!short.TryParse(this.textBox1.Text, out ss))
return;
string key = string.Empty;
string url = string.Empty;
if (radioButton1.Checked)
{
key = "s1.config";
url = "tcp://192.168.5.2:8088/HongjunguoRemotingService";
}
else if (radioButton2.Checked)
{
key = "s2.config";
url = "tcp://192.168.5.7:8088/HongjunguoRemotingService";
}
else
return;
MyServiceComponent.MyComponent com = null;
if (!dict.TryGetValue(key, out com))
{
string configFile = Path.Combine(
Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile), key);
RemotingConfiguration.Configure(configFile, true);
//com = new MyServiceComponent.MyComponent();
com = (MyServiceComponent.MyComponent)Activator.GetObject(
typeof(MyServiceComponent.MyComponent), url);
dict.Add(key, com);
}
else
{
if (com == null) return;
}
string www = com.GetString(ss);
MessageBox.Show(www);
}
}
参考资料
客户端提示 信道 http 已注册
http://topic.csdn.net/t/20051219/15/4468126.html
如何取消RemotingConfiguration.RegisterActivatedClientType的注册类型
http://topic.csdn.net/t/20050116/16/3729762.html
RemotingConfiguration.Configure (String, Boolean) 中隐藏的秘密
http://blog.csdn.net/blue_sky_blue_heart/archive/2006/08/28/1130914.aspx
Remoting给远程对象属性赋值
http://topic.csdn.net/u/20070614/15/1d5a7738-e676-489e-978a-b194579d560b.html
太极拳的每个动作都是由手法,步法,身法和眼神等动作变化协调配合而形成的。这个系列的文章,通过收集整理太极拳的手法,步法,身法和眼神的基本法则。让我们从总体上对太极拳有个认识。
太极拳的身法主要有九个法则:
松肩,沉肘,涵胸,拔背,裹裆,溜臀,松腰,抽胯,顶头悬
这篇文章我们重点介绍松肩
下面摘自王培生师爷的《太极拳的健身和技击作用》
为什么要松肩?
因为肩,肘,腕这三个部位有密切的连带关系,所以肩关节若能松开的话,就可以把全身的力量集中到手上去。
反之,肩不能松,则必僵硬,便影响了手法的灵敏性。
这就是所谓的松肩的作用。
这里顺便先谈谈手法的要求,
手法须要气势腾挪,有欲动之势,无散漫之意。
主要在于两肩必须松开不使丝毫之力,手势本无一定,不管抬起、垂下、伸出、屈回总要有相应之意,何时意动何时手到,换句话说,就是得心应手。
松肩的练法?
用意想像把肩部的肱(gong)骨头向里和肩胛骨相贴紧,之后马上离开再向下引长。
如何掌握松肩的方法?
只要意念想一下“肩井穴”就可以了
说明:
肩关节是由半球形的肱骨头和肩胛骨的关节盂构成的球窝关节,所以肩关节是关节中最灵活、活动幅度最大的关节。
肱骨头、肩胛骨的位置图如下:


肩井穴的位置

肩井穴:〖取穴方法〗该穴位于肩上,前直乳中穴,当大椎穴与肩峰端连线的中点上。〖名解〗肩井。肩,指穴在肩部也。井,地部孔隙也。肩井名意指胆经的地部水液由此流入地之地部。本穴物质为胆经上部经脉下行而至的地部经水,至本穴后,经水由本穴的地部孔隙流入地之地部,故名肩井。
我坐公交车的历史,已经有10多年了。今天早上坐852上班的路上,碰到了一个我非常佩服的售票员。佩服她的原因是因为这趟车上,我正好看到2件事情。而她对这两件事情的处理,让我非常有感触,非常有心得。
第一件事情是在望京时,有个乘客下车时,这个售票员走到一个乘客跟前,小声地跟他说了一些话。当时我还觉得很怪异。虽然我就离那个乘客不到2米的地方。但是我只能断断续续的听到几个词。并不明白在说啥。那个乘客下车后,另外一个售票员也觉得很怪异,问她时,她才说那个乘客拿的是学生卡。
那个乘客看起来,老大不小了。估计三、四十了。看起来一点也不可能是学生。按照北京市的规定,发现非学生使用学生卡,卡当时没收,同时罚款不知道多少。违法使用学生卡的事情,我在其他公交车上也看到,但是这个售票员能用这种方式来解决,我是第一次看到。以前最多看到的是:大声地指责,没收卡,或者根本就当这件事情没有发生。
从跟人沟通的角度来看这个问题:争吵,或者视若不见。都不能帮人解决问题。跟他心平气和的沟通。同时一定不要在公众场合批评他,不能让他觉得自己在被公审。这才是督促他解决问题得最好沟通方式。
反面的教材就多了,比如之前的最牛秘书的事情;公司最忌讳的一些事情,就是说某个事情时候,抄送邮件给很多人;公交车上很多时候乘客跟售票员的吵架,就是沟通方式不当导致,我们管理团队时,跟手下沟通方式不当,也会带来很多麻烦等等。
这是我佩服这个售票员的第一个理由。
第二件事情发生在西八间房(广顺南大街南口)这一站。有个乘客在下车刷卡时发现扣了自己8毛。按照正常,应该是扣6毛。这个乘客就为了这2毛钱。大发雷霆,说了很多难听的话。这个乘客是在后门下车的,当时后门的那个售票员已经有点发懵了。显然后门这个售票员经验不足。不知道如何处理这件事情。我佩服的这个售票员,飞快地从中门售票员位置上跑到后门,追上那个乘客,然后又很快的跑回自己位置。
当时我们都觉得很奇怪,这个售票员就这么飞快的过去一趟,就再没听见那个乘客之前的大声门骂骂咧咧了。超级神奇。
大家能猜到这个售票员追上那个乘客干了啥事情么?
当然这事情后门的售票员也很奇怪,也替我们问了。
这个我最佩服的售票员,追上这个乘客,给了他2毛硬币。
坐公交多扣2毛,我自己都碰到过十多次。原因很简单,司机如果在每站的时候,按站号不及时,乘客刷卡时,刷的就是上一站的站号。系统当然按照上一站来计算费用,这样在一些多一站就要多交钱的情况时,就可能会多扣2毛。
由于时刷卡系统扣掉了,想从刷卡系统讨回这两毛,非常困难,而售票员买票的所得又是以5毛为最小单位的。显然这个售票员自己备了一些零钱。而且这些钱很可能是需要从自己工资中扣除,但是上面的行动,让有意见的乘客顿时觉得自己为了这2毛而进行的行为非常不对。对缓和矛盾非常有帮助。
这种事情其他公交车上也看到过,由于上面的原因,大多售票员采用的是道歉的方式,并且说这是刷卡系统扣的,他们也无能为力。
这个售票员用这种超级神奇的方式缓和了矛盾,这是我佩服这个售票员的第二个理由。
从这两件事情,我看到了在跟有矛盾,或者需要批评的人沟通时,选择的方式非常非常重要。方式不对,只能矛盾越来越对立。对解决问题一点都没有帮助。要想做好一个管理者,如果不具备这个售票员所具有的素质,是很难带领手下同甘共苦的。
最后,这趟公交车的车号是 京AC5933。 非常感谢这个售票员给我上了这么一节生动的跟人沟通的课程。
由于我之前装的英文版本的IE8,现在想换成中文版本的, 所以就需要写在原先的IE8 Beta1 英文版,但是按照正常的思路去找卸载的地方,竟然没有找到。考虑到很多人可能会有我类似的问题。特意写了这篇博客帮助大家。
卸载的位置:
控制面板 --> 程序和功能 --> 查看已安装的更新(注意,是在这里)
MIcrosoft Windows 分类下面有一个 Windows Internet Explorer 8 ,卸载它即可。
IE8 是以更新的方式安装的,而不是一个普通的程序。这点是要需要注意的。
另外,英文版本的IE8 ,版本号是:8.0.6001.17184。
中文版版本是:8.0.6001.17193 。比英文版稍稍新一点。