<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_LOVE DOTNET</title><subtitle type="text">花开堪折直须折，莫待无花空折枝</subtitle><id>http://feed.cnblogs.com/blog/u/38632/rss</id><updated>2011-11-24T07:30:43Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/38632/rss"/><entry><id>http://www.cnblogs.com/chengchen/archive/2011/09/10/2173255.html</id><title type="text">VS 不捕获异常？</title><summary type="text">最近神奇的事情非常多，调试程序的时候，VS遇到明显的错误也不报异常，也中断不下了，而是直接忽略了错误。想想可能与最近一次打补丁相关，将VS的异常设置取消了。点击“调试”--&amp;gt;“异常...”果然，只要将这里的勾全部打上，VS又可以识别异常信息了。</summary><published>2011-09-10T09:43:00Z</published><updated>2011-09-10T09:43:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2011/09/10/2173255.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2011/09/10/2173255.html"/><content type="html">&lt;p&gt;最近神奇的事情非常多，调试程序的时候，VS遇到明显的错误也不报异常，也中断不下了，而是直接忽略了错误。想想可能与最近一次打补丁相关，将VS的异常设置取消了。&lt;/p&gt;&#xD;
&lt;p&gt;点击&amp;#8220;调试&amp;#8221;--&amp;gt;&amp;#8220;异常...&amp;#8221;&lt;/p&gt;&#xD;
&lt;p&gt;果然，只要将这里的勾全部打上，VS又可以识别异常信息了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chengchen/Exception.jpg" width="734" height="415" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/2173255.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2011/09/10/2173255.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/11/26/1889310.html</id><title type="text">MSSQL 语法备忘</title><summary type="text">数据库是我最差的一项了，写个备忘录吧，太容易忘了。将UserName添加/删除 SQL Server 的sysadmin权限sp_addSrvRoleMember &amp;#39;username&amp;#39;, &amp;#39;sysadmin&amp;#39;sp_dropSrvRoleMember &amp;#39;username&amp;#39;, &amp;#39;sysadmin&amp;#39;将Sql Server的用户添加/删除到数据库中sp_adduser usernamesp_dropuser username删除Sql Server的用户sp_droplogin username有时候数据库有一个用户名和Sql Serve</summary><published>2010-11-26T15:01:00Z</published><updated>2010-11-26T15:01:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/11/26/1889310.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/11/26/1889310.html"/><content type="html">&lt;p&gt;数据库是我最差的一项了，写个备忘录吧，太容易忘了。&lt;/p&gt;&#xD;
&lt;p&gt;将UserName添加/删除 SQL Server 的sysadmin权限&lt;br /&gt;sp_addSrvRoleMember 'username', 'sysadmin'&lt;br /&gt;sp_dropSrvRoleMember 'username', 'sysadmin'&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;将Sql Server的用户添加/删除到数据库中&lt;/p&gt;&#xD;
&lt;p&gt;sp_adduser username&lt;/p&gt;&#xD;
&lt;p&gt;sp_dropuser username&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;删除Sql Server的用户&lt;/p&gt;&#xD;
&lt;p&gt;sp_droplogin username&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有时候数据库有一个用户名和Sql Server用户名相同，但两者没有映射关系。如果需要修复这种映射关系，可以执行此语句：&lt;/p&gt;&#xD;
&lt;p&gt;EXEC sp_change_users_login 'UPDATE_ONE','username','username'&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;获得数据库用户信息&lt;/p&gt;&#xD;
&lt;p&gt;select * from sysuser&lt;/p&gt;&#xD;
&lt;p&gt;附加一个User_id('username')&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;获得Sql server用户信息&lt;/p&gt;&#xD;
&lt;p&gt;select * from master..syslogins&lt;/p&gt;&#xD;
&lt;p&gt;附加一个sUser_id('username')&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;将数据库所有用户导入到新Server中（SP）&lt;/p&gt;&#xD;
&lt;p&gt;set ANSI_NULLS ON&lt;br /&gt;set QUOTED_IDENTIFIER ON&lt;br /&gt;go&lt;/p&gt;&#xD;
&lt;p&gt;ALTER PROCEDURE [dbo].[sp_help_revlogin] @login_name sysname = NULL AS&lt;br /&gt;DECLARE @name sysname&lt;br /&gt;DECLARE @type varchar (1)&lt;br /&gt;DECLARE @hasaccess int&lt;br /&gt;DECLARE @denylogin int&lt;br /&gt;DECLARE @is_disabled int&lt;br /&gt;DECLARE @PWD_varbinary&amp;nbsp; varbinary (256)&lt;br /&gt;DECLARE @PWD_string&amp;nbsp; varchar (514)&lt;br /&gt;DECLARE @SID_varbinary varbinary (85)&lt;br /&gt;DECLARE @SID_string varchar (514)&lt;br /&gt;DECLARE @tmpstr&amp;nbsp; varchar (1024)&lt;br /&gt;DECLARE @is_policy_checked varchar (3)&lt;br /&gt;DECLARE @is_expiration_checked varchar (3)&lt;/p&gt;&#xD;
&lt;p&gt;DECLARE @defaultdb sysname&lt;br /&gt;&amp;nbsp;&lt;br /&gt;IF (@login_name IS NULL)&lt;br /&gt;&amp;nbsp; DECLARE login_curs CURSOR FOR&lt;/p&gt;&#xD;
&lt;p&gt;SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM &lt;br /&gt;sys.server_principals p LEFT JOIN sys.syslogins l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name &amp;lt;&amp;gt; 'sa'&lt;br /&gt;ELSE&lt;br /&gt;&amp;nbsp; DECLARE login_curs CURSOR FOR&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM &lt;br /&gt;sys.server_principals p LEFT JOIN sys.syslogins l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name&lt;br /&gt;OPEN login_curs&lt;/p&gt;&#xD;
&lt;p&gt;FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin&lt;br /&gt;IF (@@fetch_status = -1)&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp; PRINT 'No login(s) found.'&lt;br /&gt;&amp;nbsp; CLOSE login_curs&lt;br /&gt;&amp;nbsp; DEALLOCATE login_curs&lt;br /&gt;&amp;nbsp; RETURN -1&lt;br /&gt;END&lt;br /&gt;SET @tmpstr = '/* sp_help_revlogin script '&lt;br /&gt;PRINT @tmpstr&lt;br /&gt;SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'&lt;br /&gt;PRINT @tmpstr&lt;br /&gt;PRINT ''&lt;br /&gt;WHILE (@@fetch_status &amp;lt;&amp;gt; -1)&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp; IF (@@fetch_status &amp;lt;&amp;gt; -2)&lt;br /&gt;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT ''&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @tmpstr = '-- Login: ' + @name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT @tmpstr&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (@type IN ( 'G', 'U'))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN -- NT authenticated account/group&lt;/p&gt;&#xD;
&lt;p&gt;SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE BEGIN -- SQL Server authentication&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- obtain password and sid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- obtain password policy state&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'&lt;/p&gt;&#xD;
&lt;p&gt;IF ( @is_policy_checked IS NOT NULL )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF ( @is_expiration_checked IS NOT NULL )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (@denylogin = 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN -- login is denied access&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE IF (@hasaccess = 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN -- login exists but does not have access&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (@is_disabled = 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN -- login is disabled&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT @tmpstr&lt;br /&gt;&amp;nbsp; END&lt;/p&gt;&#xD;
&lt;p&gt;FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin&lt;br /&gt;&amp;nbsp;&amp;nbsp; END&lt;br /&gt;CLOSE login_curs&lt;br /&gt;DEALLOCATE login_curs&lt;br /&gt;RETURN 0&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;set ANSI_NULLS ON&lt;br /&gt;set QUOTED_IDENTIFIER ON&lt;br /&gt;go&lt;/p&gt;&#xD;
&lt;p&gt;ALTER PROCEDURE [dbo].[sp_hexadecimal]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @binvalue varbinary(256),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @hexvalue varchar (514) OUTPUT&lt;br /&gt;AS&lt;br /&gt;DECLARE @charvalue varchar (514)&lt;br /&gt;DECLARE @i int&lt;br /&gt;DECLARE @length int&lt;br /&gt;DECLARE @hexstring char(16)&lt;br /&gt;SELECT @charvalue = '0x'&lt;br /&gt;SELECT @i = 1&lt;br /&gt;SELECT @length = DATALENGTH (@binvalue)&lt;br /&gt;SELECT @hexstring = '0123456789ABCDEF'&lt;br /&gt;WHILE (@i &amp;lt;= @length)&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp; DECLARE @tempint int&lt;br /&gt;&amp;nbsp; DECLARE @firstint int&lt;br /&gt;&amp;nbsp; DECLARE @secondint int&lt;br /&gt;&amp;nbsp; SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))&lt;br /&gt;&amp;nbsp; SELECT @firstint = FLOOR(@tempint/16)&lt;br /&gt;&amp;nbsp; SELECT @secondint = @tempint - (@firstint*16)&lt;br /&gt;&amp;nbsp; SELECT @charvalue = @charvalue +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBSTRING(@hexstring, @firstint+1, 1) +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBSTRING(@hexstring, @secondint+1, 1)&lt;br /&gt;&amp;nbsp; SELECT @i = @i + 1&lt;br /&gt;END&lt;/p&gt;&#xD;
&lt;p&gt;SELECT @hexvalue = @charvalue&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1889310.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/11/26/1889310.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/11/13/1876741.html</id><title type="text">超级灰色按钮克星更新v1.3.1112.40</title><summary type="text">超级灰色按钮克星更新v1.3.1112.40软件简介：传统的灰色按钮克星只能激活Win32平台下的按钮。本软件不仅可以激活Win32平台下的软件，也可以激活DOTNET平台下的软件。点击下载今天终于实现了对目前所有DOTNET平台的支持DOTNET FrameWork 1.1/2.0/3.0/3.5/4.0 。非常开心，很长时间没有更新博客，今天我又回来了。v1.3.1112.40 - 2010/...</summary><published>2010-11-13T15:03:00Z</published><updated>2010-11-13T15:03:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/11/13/1876741.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/11/13/1876741.html"/><content type="html">&lt;p&gt;超级灰色按钮克星更新v1.3.1112.40&amp;nbsp;&lt;/p&gt;&lt;p&gt;软件简介：传统的灰色按钮克星只能激活Win32平台下的按钮。本软件不仅可以激活Win32平台下的软件，也可以激活DOTNET平台下的软件。&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/chengchen/Super_Enablev1.3.rar"&gt;点击下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;今天终于实现了对目前所有DOTNET平台的支持DOTNET FrameWork 1.1/2.0/3.0/3.5/4.0 。非常开心，很长时间没有更新博客，今天我又回来了。&lt;img src="http://www.cnblogs.com/Emoticons/yoyocici/cool.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/chengchen/SuperEnable.JPG" width="342" height="196" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;v1.3.1112.40 - 2010/11/12&lt;/p&gt;&lt;p&gt;*根据某网友需求，新增支持DOTNET Framework 1.1，克服种种困难终于实现了对目前所有DOTNET FrameWork平台的支持！&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;v1.2.814.40 - 2010/8/14&lt;/p&gt;&lt;p&gt;*新增支持DOTNET Framework 4.0&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;v1.1.324.40 - 2010/03/24&lt;/p&gt;&lt;p&gt;*可以多次注入同一程序。&lt;/p&gt;&lt;p&gt;*使用了新的引擎，不再操作注册表。&lt;/p&gt;&lt;p&gt;*使用了新技术，只需要一个DLL文件就可以完成托管注入。&lt;/p&gt;&lt;p&gt;*使用了新的皮肤。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;v1.0 - 2007/10/25&lt;/p&gt;&lt;p&gt;*实现托管注入的伟大创举。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;cicistudio@gmail.com&lt;/p&gt;&lt;p&gt;让程序展现我们的个性，让代码放飞我们的心情。&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/chengchen/Super_Enablev1.3.rar"&gt;点击下载&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1876741.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/11/13/1876741.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/05/22/1741783.html</id><title type="text">Google首页吃豆游戏完整源码下载，以及声音问题的解决</title><summary type="text">Google的Logo昨天就变成了经典的吃豆游戏。废话不说，放上完整源码。由于安全问题，Flash会阻止本地播放，所以本地网页中就没有声音。其实只要访问http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.htmlFlash官网，将音乐文件添加为信任的就行了。本地运行时，还要记得...</summary><published>2010-05-22T13:45:00Z</published><updated>2010-05-22T13:45:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/05/22/1741783.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/05/22/1741783.html"/><content type="html">&lt;p&gt;Google的Logo昨天就变成了经典的吃豆游戏。废话不说，放上完整源码。&lt;/p&gt;&#xD;
&lt;p&gt;由于安全问题，Flash会阻止本地播放，所以本地网页中就没有声音。其实只要访问&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html" target="_blank"&gt;http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Flash官网，将音乐文件添加为信任的就行了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本地运行时，还要记得要允许运行ActiveX控件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/chengchen/GooglePacman.rar" target="_blank"&gt;GooglePacman.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Google保留所有权利。&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1741783.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/05/22/1741783.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/05/12/1733118.html</id><title type="text">VS 2008 SP1 选择工具箱 自动关闭的解决办法</title><summary type="text">今天在使用VS2008的时候遇到了一个非常恶心的问题。我原本想添加一些第三方控件，在选择工具箱的时候VS2008居然自动关闭掉了，看了看日志包含了以下错误：.NET Runtime version 2.0.50727.3053 &amp;#8211; Fatal Execution Engine Error (7A035E00) (80131506)貌似是CLR崩溃掉了。于是用中文关键字Google了一下...</summary><published>2010-05-11T17:40:00Z</published><updated>2010-05-11T17:40:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/05/12/1733118.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/05/12/1733118.html"/><content type="html">&lt;p&gt;今天在使用VS2008的时候遇到了一个非常恶心的问题。我原本想添加一些第三方控件，在选择工具箱的时候VS2008居然自动关闭掉了，看了看日志包含了以下错误：&lt;/p&gt;&#xD;
&lt;p&gt;.NET Runtime version 2.0.50727.3053 &amp;#8211; Fatal Execution Engine Error (7A035E00) (80131506)&lt;/p&gt;&#xD;
&lt;p&gt;貌似是CLR崩溃掉了。于是用中文关键字Google了一下，居然没有找到任何相关内容，于是再用英文关键字Google以下，发现遇到这个问题的人还真不少。（同样是程序员，怎么差距就这么大呢？）&lt;/p&gt;&#xD;
&lt;p&gt;总结如下：&lt;/p&gt;&#xD;
&lt;p&gt;第一种可能：99%的原因是安装了叫做ProwerCommands这个VS插件导致的。解决办法：更新到Prower Commands到最新版本，或者卸载。&lt;/p&gt;&#xD;
&lt;p&gt;第二种可能：安装了例如DEV-Express这样的第三方控件造成的。解决办法：卸载。&lt;/p&gt;&#xD;
&lt;p&gt;其他解决途径：执行 devenv.exe /safemode 进入VS的安全模式就可以使用添加工具箱了，然后恢复到默认设置即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: red"&gt;但是以上解决办法，对我的计算机无效！！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后我大胆猜想：既然是CLR的错，那么微软会不会有新的版本的CLR的补丁包呢，或许新版本顺便就解决了这个问题了（因为我有时在修改bug时，会在无形中修改好其他潜在bug，深有体会）。最后终于让我找到了一个：&lt;/p&gt;&#xD;
&lt;p&gt;说明：&lt;a href="http://support.microsoft.com/kb/963676" target="_blank"&gt;http://support.microsoft.com/kb/963676&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载：&lt;a href="https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=16827" target="_blank"&gt;https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=16827&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;安装补丁后重启，居然问题解决！！&lt;img alt="" src="http://www.cnblogs.com/Emoticons/baimantou/223332482.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后祝你好运，早点过渡到VS2010，希望今后再也不要遇到此问题。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1733118.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/05/12/1733118.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/05/08/1730396.html</id><title type="text">c# 构架WPF 纸牌游戏(斗地主4)</title><summary type="text">最近太忙了，这个游戏DEMO早就已经写好了，可惜没有时间继续下去。这个游戏采用了插件设计，每个玩家都可以使用不同的插件。以后有时间再来详细展开说明，附上程序和简单AI源码（继承IBase接口，您就可以开发自己的AI）。本程序运行至少需要DOTNET Framework 3.5 SP1框架。以后我会再次解释详细源代码，并提供更高的人工智能。点击下载</summary><published>2010-05-08T04:25:00Z</published><updated>2010-05-08T04:25:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/05/08/1730396.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/05/08/1730396.html"/><content type="html">&lt;p&gt;最近太忙了，这个游戏DEMO早就已经写好了，可惜没有时间继续下去。这个游戏采用了插件设计，每个玩家都可以使用不同的插件。&lt;/p&gt;&#xD;
&lt;p&gt;以后有时间再来详细展开说明，附上程序和简单AI源码（继承IBase接口，您就可以开发自己的AI）。&lt;/p&gt;&#xD;
&lt;p&gt;本程序运行至少需要DOTNET Framework 3.5 SP1框架。&lt;/p&gt;&#xD;
&lt;p&gt;以后我会再次解释详细源代码，并提供更高的人工智能。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/chengchen/Card.rar" target="_blank"&gt;&amp;nbsp;点击下载&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1730396.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/05/08/1730396.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/03/29/1699958.html</id><title type="text">c# 构架WPF 纸牌游戏(斗地主3)</title><summary type="text">玩过Win7的纸牌游戏的朋友，一定对于游戏中的发牌动画记忆深刻，现在我们自己来实现这个动画过程。提到发牌动画，90%的程序员肯定会想到利用位置（Location）的变化来刷新界面，可能需要启用一些线程或者计时器之类的。但是朋友们，不要忘了，我们是在WPF环境中，这个天生就是和Flash抗衡的东东，怎么会用那么OUT的方法来实现呢。　　回想一下WPF的动画我们一般是怎么制作的，当然缺少不了Blend...</summary><published>2010-03-29T11:48:00Z</published><updated>2010-03-29T11:48:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/03/29/1699958.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/03/29/1699958.html"/><content type="html">&lt;p&gt;玩过Win7的纸牌游戏的朋友，一定对于游戏中的发牌动画记忆深刻，现在我们自己来实现这个动画过程。提到发牌动画，90%的程序员肯定会想到利用位置（Location）的变化来刷新界面，可能需要启用一些线程或者计时器之类的。但是朋友们，不要忘了，我们是在WPF环境中，这个天生就是和Flash抗衡的东东，怎么会用那么OUT的方法来实现呢。&lt;br /&gt;&amp;nbsp;　　回想一下WPF的动画我们一般是怎么制作的，当然缺少不了Blend工具，但是Blend工具生成的都是一些前台的xaml标记语言。这些动画都是被HardCode的，显然这不符合我们的需求，我们希望通过C#代码在后台控制所有显示的纸牌。在WPF框架中，负责动画的类叫做Storyboard，一个StroyBord对象中可以包含多个TimeLine的动画对象，例如，我们比较熟悉的：DoubleAnimation就是用于线性移动的。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;DoubleAnimation&amp;nbsp;myAnimation&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;DoubleAnimation()&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;声明一个DoubleAnimation&amp;nbsp;对象&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;From&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;form,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;从xx坐标&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;To&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;to,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;移动到xx坐标&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Duration&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Duration(spendTime),&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;移动所需要的时间&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BeginTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;beginTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;这个动画定义的时间&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;};&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;Storyboard.SetTargetName(myAnimation, "...controlname...");&lt;/span&gt;&lt;span style="color: #339966"&gt;//将这个动画赋到那个控件上（参数为控件名称）&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;Storyboard.SetTargetProperty(myAnimation, new PropertyPath("....."));&lt;/span&gt;&lt;span style="color: #339966"&gt;//设置该控件的PropertyPath。这个值可以通过Blend生成的xaml获取到。（随便用Blend生成一个动画，然后看看xaml是怎么写的。可以参考MSDN。这里就不展开说了。）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;上面这段代码只有一个StroyBord，只要设置好BeginTime，那么在StroyBord中增加多个这样的动画，便可以顺利连接起来。&lt;/p&gt;&#xD;
&lt;p&gt;大家要注意的是，如果在同一StroyBord中，对同一控件的不同属性进行了动画设置，那么系统就会自动同时执行这两个动画设置，例如：一段动画设置了横向移动，另外一端动画设置了纵向移动，那么系统会将这两种移动方式合并起来，就是沿着横向和纵向构成角度的1/2斜线处移动。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;创建发牌动画，留三张牌作为底牌&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Storyboard&amp;nbsp;story&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Storyboard();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;51&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CardAnimation&amp;nbsp;animation&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardAnimation(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;m_CardBaseCollection[i].Card);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animation.CardIndex&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayerCardInfo&amp;nbsp;player&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PlayerCardInfo();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.CardBase&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_CardBaseCollection[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayerHelper.AddToPlayer(i,&amp;nbsp;player);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animation.MoveCard(player.Location.X,&amp;nbsp;player.Location.Y,&amp;nbsp;TimeSpan.FromSeconds(GameOptions.DealSpeed&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i),story&amp;nbsp;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;story.Begin(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;最后再运行所有串起来的动画。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;animation.MoveCard(...)是用于设置移动动画的起始位置，和结束位置的，我们来看看代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;MoveCard(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;toX,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;toY,&amp;nbsp;TimeSpan&amp;nbsp;beginTime,Storyboard&amp;nbsp;&amp;nbsp;story&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;story.Children.Add(GetMoveAnimation(toX,beginTime,&amp;nbsp;m_PropertyChainXArray));&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;GetMoveAnimation是自己封装的，就是前面提到的DoubleAnimation生成的对象，这里就不展开来说了&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;story.Children.Add(GetMoveAnimation(toY,beginTime,&amp;nbsp;m_PropertyChainYArray));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;上面的代码并没有解释每张扑克移动的位置是如何计算出来的，animation.MoveCard(...)就直接传入了扑克的位置。&lt;br /&gt;很显然，扑克的位置在PlayerHelper.AddToPlayer(i, player);进行了计算。&lt;br /&gt;我的思想是这样的，i=0 到 51之间的循环中，只要判断 i % 3(取余数)便可以获得当前的这张牌属于哪一家，如果属于自己别忘了将牌翻转过来，至少要让自己看到才行。（还记得上节中提到的SetCard方法吗。）我们来看这个核心类的写法：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('3d1e09a7-1aec-4a5e-9776-ede37775f2ea')"&gt;&lt;img  id="code_img_opened_3d1e09a7-1aec-4a5e-9776-ede37775f2ea" style="display: none" onclick="cnblogs_code_hide('3d1e09a7-1aec-4a5e-9776-ede37775f2ea',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div  id="cnblogs_code_open_3d1e09a7-1aec-4a5e-9776-ede37775f2ea"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PlayerHelper&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_CardCount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;牌之间的间隔&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardSpace&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;25&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;Point&amp;nbsp;LeftPlayerFirstLocation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point(&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;400&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;150&lt;/span&gt;&lt;span style="color: #000000"&gt;);&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point&amp;nbsp;RightPlayerFirstLocation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point(&lt;/span&gt;&lt;span style="color: #800080"&gt;400&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;150&lt;/span&gt;&lt;span style="color: #000000"&gt;);&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point&amp;nbsp;MiddlePlayerFirstLocation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point(&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #800080"&gt;200&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;300&lt;/span&gt;&lt;span style="color: #000000"&gt;);&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_LeftPlayerCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;LeftPlayerCollection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PlayerHelper.m_LeftPlayerCollection;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;PlayerHelper.m_LeftPlayerCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;value;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_RihgtPlayerCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;RihgtPlayerCollection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PlayerHelper.m_RihgtPlayerCollection;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;PlayerHelper.m_RihgtPlayerCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;value;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_MiddlePlayerCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;PlayerCardInfo&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;MiddlePlayerCollection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;PlayerHelper.m_MiddlePlayerCollection;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&amp;nbsp;PlayerHelper.m_MiddlePlayerCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;value;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ClearPlayerCard()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_LeftPlayerCollection.Clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_RihgtPlayerCollection.Clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_MiddlePlayerCollection.Clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_CardCount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;AddToPlayer(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i,PlayerCardInfo&amp;nbsp;player)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_LeftPlayerCollection.Add(player);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.CardPlayer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardPlayer.LeftPlayer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.Location&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point(LeftPlayerFirstLocation.X,&amp;nbsp;LeftPlayerFirstLocation.Y&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardSpace&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_CardCount);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_MiddlePlayerCollection.Add(player);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.CardPlayer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardPlayer.MiddlePlayer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.Location&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point(MiddlePlayerFirstLocation.X&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardSpace&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_CardCount,&amp;nbsp;MiddlePlayerFirstLocation.Y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.CardBase.SetCard();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_RihgtPlayerCollection.Add(player);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.CardPlayer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardPlayer.RihgtPlayer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player.Location&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Point(RightPlayerFirstLocation.X,&amp;nbsp;RightPlayerFirstLocation.Y&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardSpace&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;m_CardCount);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_CardCount&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1699958.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/03/29/1699958.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/03/29/1699484.html</id><title type="text">c# 构架WPF 纸牌游戏(斗地主2)</title><summary type="text">在上一节中我们将资源全部都制作好了，现在开始构架游戏。为了不让代码那么难看，我们很有必要加入设计模式和面向对象思想。　　首先，我们可以将扑克的花色抽象为6个类：方块类(CardDiamond)、红桃类(CardHeart)、黑桃类(CardClub)、梅花类(CardSpader)、小王类(CardSmallJoker)、大王类(CardBigJoker)，让他们全部继承抽象类CardBase。在...</summary><published>2010-03-29T04:52:00Z</published><updated>2010-03-29T04:52:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/03/29/1699484.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/03/29/1699484.html"/><content type="html">&lt;p&gt;在上一节中我们将资源全部都制作好了，现在开始构架游戏。为了不让代码那么难看，我们很有必要加入设计模式和面向对象思想。&lt;br /&gt;&amp;nbsp;　　首先，我们可以将扑克的花色抽象为6个类：方块类(CardDiamond)、红桃类(CardHeart)、黑桃类(CardClub)、梅花类(CardSpader)、小王类(CardSmallJoker)、大王类(CardBigJoker)，让他们全部继承抽象类CardBase。在基类中，CardType属性和SetCard()方法定义为抽象类型。CardType是一个枚举类型，在子类中必须指定当前扑克的花色。SetCard()是读取扑克的正面图片资源，一旦执行，扑克便可以显示出正面（发牌阶段为背面），此处定义为抽象方法后可以利用工厂模式进行调用，使用者不需要具体知道它内部是如何实现的。CardNumber为扑克点数从1到13。定义一个UserControl的属性，就是Card，通过初始化相关的控件，可以动态增加到主程序容器中去。注意：初始化的时候所有的扑克都是背面朝上的，因此可以将这一动作抽象出来放到基类的构造函数中去。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="width: 816px; height: 456px" height="456" alt="" src="http://images.cnblogs.com/cnblogs_com/chengchen/WPFCardGame/2-1.JPG" width="816" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里唯一需要解决的技术问题就是，如何动态的将图片资源对象到每一张牌。参考如下代码，通过设置Background可以实现，但是需要通过FindResource来找到对应的图片资源名称（在上节中生成资源字典的时候会生成此名称）&lt;br /&gt;&amp;nbsp;Brush brush = m_Card.FindResource("ImageBrushFaceDown") as Brush;&lt;br /&gt;&amp;nbsp;m_Card.Background = brush;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;在CardHelper类中，负责生成新牌和洗牌操作。我的思想是这样的，先通过算法按顺序生成54张牌，然后随机抽取这些牌，被抽取的牌从原来集合中删除，直到所有的牌都被抽取完毕为止，从而达到洗牌的目的。参考如下代码：可以看出生成新牌的时候使用了策略模式&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardHelper&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;初始化牌，并洗牌，通过此函数可以获得一副随机的扑克牌。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;CardBase&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;GetCardCollection()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;CardBase&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;cardCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;CardBase&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;13&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;j&lt;/span&gt;&lt;span style="color: #000000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CardBase&amp;nbsp;card&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardClub();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card.Card.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CardClub&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;j.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardDiamond();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card.Card.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CardDiamond&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;j.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardHeart();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card.Card.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CardHeart&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;j.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardSpader();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card.Card.Name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CardSpader&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;j.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;card.CardNumber&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;j;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardCollection.Add(card);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;最后来添加大小王&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardCollection.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardBigJoker());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardCollection.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CardSmallJoker());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;SetCardRnd(cardCollection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;将生成的扑克随机打乱(洗牌操作)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="oldCardCollection"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;已经生成的扑克牌集合&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;CardBase&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;SetCardRnd(List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;CardBase&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;oldCardCollection)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Random&amp;nbsp;ran&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Random();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;CardBase&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;cardCollection&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;CardBase&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;53&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000"&gt;--&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;cardIndex&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ran.Next(&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;随机数可以取到下限值，但是不能取到上限值。&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardCollection.Add(oldCardCollection[cardIndex]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oldCardCollection.RemoveAt(cardIndex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;cardCollection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1699484.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/03/29/1699484.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/03/26/1698100.html</id><title type="text">c# 构架WPF 纸牌游戏(斗地主1)</title><summary type="text">好久没有写文章，尤其是系列文章。最近发现年纪大了，以前写的东西时常自己都遗忘，看样子写一写笔记还是很有好处的。　　写游戏一直是我的梦想，早在DOS时代我就写过五子棋、黑白棋之类的游戏，但是要知道面向过程的编程语言是多么的难以维护，而且没有设计模式的指引，代码垃圾的都让我不好意思开源。不知不觉中工作三年了，从面向过程到面向对象，从DOS到Windows，从C++到C#，从表层到底层，我已经逛了好几个...</summary><published>2010-03-26T15:30:00Z</published><updated>2010-03-26T15:30:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/03/26/1698100.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/03/26/1698100.html"/><content type="html">&lt;p&gt;好久没有写文章，尤其是系列文章。最近发现年纪大了，以前写的东西时常自己都遗忘，看样子写一写笔记还是很有好处的。&lt;/p&gt;&#xD;
&lt;p&gt;写游戏一直是我的梦想，早在DOS时代我就写过五子棋、黑白棋之类的游戏，但是要知道面向过程的编程语言是多么的难以维护，而且没有设计模式的指引，代码垃圾的都让我不好意思开源。不知不觉中工作三年了，从面向过程到面向对象，从DOS到Windows，从C++到C#，从表层到底层，我已经逛了好几个圈，现在有些累了，上个星期终于将所有加密解密和破解相关的代码都扔给一个老外，委托其帮我更新。于是乎，我终于有时间来研究一点游戏的东西。&lt;/p&gt;&#xD;
&lt;p&gt;先从最简单的开始写吧。一步一步来。&lt;/p&gt;&#xD;
&lt;p&gt;写纸牌游戏当然最基本的需要有纸牌资源。Google了一番回来，没发现什么好看的资源，倒是Win7的纸牌蛮漂亮，动画做的也不错，好歹我也是程序员，就算原创功力不够，拷贝能力我还是一流的。这些纸牌图片需要一张一张抓图吗？我可没那么傻。拿出反汇编工具随便翻了翻代码，变找到了System32\CardGames.dll这个和win7纸牌资源相关的DLL文件。拿出汉化工具ExeScope打开这个dll文件。很多好东西呢：&lt;img alt="" src="http://www.cnblogs.com/Emoticons/baimantou/215225166.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img height="577" alt="" src="http://images.cnblogs.com/cnblogs_com/chengchen/WPFCardGame/1-1.JPG" width="867" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;赶快导出图片，再用PS分割出来。&lt;/p&gt;&#xD;
&lt;p&gt;最后居然发现没有大小王（也叫大小鬼）。&lt;/p&gt;&#xD;
&lt;p&gt;没办法，只好再用PS自己造两张，图片就用公司同事给本人画的卡通图好了。我就牺牲一下形象了...&lt;img alt="" src="http://www.cnblogs.com/Emoticons/baimantou/223332482.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img height="133" alt="" src="http://images.cnblogs.com/cnblogs_com/chengchen/WPFCardGame/1-2.JPG" width="208" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;好不容易将所有图片都搞定了。下面开始写程序了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;思想一：将这些资源图片放置到控件库中，便于编写其他纸牌游戏时候调用，尽可能的封装一些通用的调用方法。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;新建一个WPF控件库，并将图片加入到资源字典中去。可以在Blend中将图片拖动到窗体上，然后选择 工具-&amp;gt;生成画笔资源-&amp;gt;生成ImageBursh资源 新建一个资源字典就行了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img height="304" alt="" src="http://images.cnblogs.com/cnblogs_com/chengchen/WPFCardGame/1-3.JPG" width="595" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当然如果已经掌握了资源字典的xml文件规则，自己动手写一个也是非常简单的一件事情。&lt;/p&gt;&#xD;
&lt;p&gt;在资源字典中定义过的图片，今后在代码中调用就非常方便了。&lt;/p&gt;&#xD;
&lt;p&gt;今天就说到这里，下次再见。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chengchen/aggbug/1698100.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/03/26/1698100.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chengchen/archive/2010/03/24/1694260.html</id><title type="text">驱动级键盘模拟（C#）（高手请飘过）</title><summary type="text">   游戏外挂一般分为三个级别：初级是鼠标、键盘模拟，中级是Call游戏内部函数，读写内存，高级是抓包，封包的“脱机挂”（完全模拟客户端网络数据，不用运行游戏）。用C#写外挂的不是很多，大部分是C++，主要原因是MS的C#目前不支持内联汇编功能。因此用C++写底层库，然后用C#调用成为DONET爱好者开发外挂的首选。      对于鼠标键盘模拟的外挂而言，很多人认为没有什么技术含量，因为无非就是SendMessage或者Key_event，再高级点就是Hook进入程序内部操作。我也曾用这种技术开发过一些游戏辅助程序。但最近我在研究XNA的时候遇到了一点麻烦，这种屡试不爽方法居然失效了。游戏对于消息命令一点也不“服从”，我们有这样的疑问：它是如何识别真实键盘的按键的呢？难道是程序中有判断吗？</summary><published>2010-03-24T15:30:00Z</published><updated>2010-03-24T15:30:00Z</updated><author><name>程晨</name><uri>http://www.cnblogs.com/chengchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chengchen/archive/2010/03/24/1694260.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chengchen/archive/2010/03/24/1694260.html"/><content type="html">&amp;nbsp;&amp;nbsp; 游戏外挂一般分为三个级别：初级是鼠标、键盘模拟，中级是Call游戏内部函数，读写内存，高级是抓包，封包的&amp;#8220;脱机挂&amp;#8221;（完全模拟客户端网络数据，不用运行游戏）。用C#写外挂的不是很多，大部分是C++，主要原因是MS的C#目前不支持内联汇编功能。因此用C++写底层库，然后用C#调用成为DONET爱好者开发外挂的首选。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对于鼠标键盘模拟的外挂而言，很多人认为没有什么技术含量，因为无非就是SendMessage或者Key_event，再高级点就是Hook进入程序内部操作。我也曾用这种技术开发过一些游戏辅助程序。但最近我在研究XNA的时候遇到了一点麻烦，这种屡试不爽方法居然失效了。游戏对于消息命令一点也不&amp;#8220;服从&amp;#8221;，我们有这样的疑问：它是如何识别真实键盘的按键的呢？难道是程序中有判断吗？&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果抛开上面的疑问，换另外一个角度思考。在DOS时代，还记得那个经典的去除BIOS密码的Debug命令吗？其原理就是利用了BIOS中断，其实对于键盘按键，不管Windows怎样封装，到最后都会调用BIOS中断来识别按键。然而消息发送毕竟是Windows系统的玩意儿，不管在Windows层面上怎样判断，我们只要让BIOS下一道&amp;#8220;圣旨&amp;#8221;，看哪个游戏还敢如此嚣张！！！&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在解释更详细的原理之前，我们先来抓出幕后黑手，看看是哪个给游戏撑腰？让它有胆子违抗Windows消息命令。究竟是判断了真实键盘信息，还是有其他原因。结果在DirectX编程中发现了DirectInput这个API。就是它绕过了Windows的消息机制，它的目的是为了让游戏的实时性控制更好、更快。Windows消息是队列形式的，在传递过程中会有延时，比如格斗类游戏对实时性控制要求是非常高的，Window消息机制不能满足这个需求。而DirectInput直接和键盘驱动程序打交道，效率当然要高出一大截。我认为大部分游戏不响应消息的真正的原因在这里，而不是故意写了反作弊系统。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 既然知道了是DirectInput在搞鬼，可是我们该怎么办呢？前面我们提到了一点思路，因此最实际的办法就是直接读写键盘端口的方法来模拟硬件事件。在DOS时代每按下一个键就会产生一个键盘中断，这样程序会跳到BIOS中的键盘中断去处理程序执行。在曾经的那个年代我最牛X的是QBasic程序了。QBasic中有一个OUT函数可以向指定端口写入数据，用INP函数可以从指定端口读取数据。因此用QBasic来做硬件级别的键盘模拟非常简单。&lt;br /&gt;&lt;br /&gt;假如这个键的扫描码为0x51，先模拟按下这个键：&lt;br /&gt;OUT &amp;amp;H64,&amp;amp;HD2 '把数据0xD2发送到0x64端口。&lt;br /&gt;OUT &amp;amp;H60,&amp;amp;H51 '把扫描码0x51发送到0x60端口，表示模拟按下扫描码为0x51的这个键&lt;br /&gt;下面再模拟释放这个按键：&lt;br /&gt;OUT &amp;amp;H64,&amp;amp;HD2 '把数据0xD2发送到0x64端口。&lt;br /&gt;OUT &amp;amp;H60,(&amp;amp;H50 OR &amp;amp;H80) '把扫描码0x50与数据0x80进行或运算，表示释放这个键。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当然DOS时代早已经一去不复返，只是刚才提到QBasic时候让我感慨了一下其曾经的强大而已。如果真的用QBasic来写模拟程序，在Win98下可以成功，但是在Win2000以后的版本就不行了，因为进入NT时代后DOS只是一个虚拟机系统了。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 现在的问题很清晰了，就是如何在Windows环境下来进行端口操作。由于比较底层，Windows不会那么轻松让你得逞。一般会有两种方法：其一就是利用驱动，在驱动里面还有什么事情不能做？其二就是利用&amp;#8220;调用门&amp;#8221;从Ring3跳到Ring0去进行相关操作。在网上搜一搜应该都会找到相关的资料。我听格格说过有个VB做的叫做&amp;#8220;按键精灵&amp;#8221;的貌似比较牛X，下载下来研究后发现其使用了老外的WINIO驱动的原理。用WINIO就容易多了，因为我在驱动方面的能力实在是&amp;amp;*^%$^&amp;amp;*。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 于是在WINIO的基础上，我使用C#进行了简单的二次封装，使其适用于DONET平台上使用驱动级别的按键模拟。在我的DLL中提供了以下几个方法：&lt;br /&gt;&lt;br /&gt;InitSuperKeys() 安装WINIO驱动，一般用于Form_Load事件中调用&lt;br /&gt;&lt;br /&gt;CloseSuperKeys() 卸载WINIO驱动，一般用于Form_Closed事件中调用&lt;br /&gt;&lt;br /&gt;KeyDown(Key) 模拟普通Key键按下。&lt;br /&gt;&lt;br /&gt;KeyDownEx(Key)模拟扩展Key键按下。&lt;br /&gt;&lt;br /&gt;KeyUp(Key)模拟普通Key键弹起。&lt;br /&gt;&lt;br /&gt;KeyUpEx(Key)模拟扩展Key键弹起。&lt;br /&gt;&lt;br /&gt;KeyPress(Key)模拟普通Key键按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒&lt;br /&gt;&lt;br /&gt;KeyPress(Key,Int32)模拟普通Key键按下并弹起一次。其中按下和弹起的时间间隔是第二个参数，单位为毫秒。&lt;br /&gt;&lt;br /&gt;KeyPressEx(Key)模拟扩展按键Key按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒，写入扩展按键信息间隔时间为100毫秒&lt;br /&gt;&lt;br /&gt;KeyPressEx(Key,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数，单位为毫秒，写入扩展按键信息间隔时间为100毫秒。&lt;br /&gt;&lt;br /&gt;KeyPressEx(Key,Int32,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数，单位为毫秒，写入扩展按键信息间隔时间是第三个参数，单位为毫秒。&lt;br /&gt;&lt;br /&gt;特别说明：&lt;br /&gt;1、 在执行模拟按键之前必须先执行InitSuperKeys()进行驱动的安装，在窗体关闭之后最好可以卸载驱动。&lt;br /&gt;&lt;br /&gt;2、 以上方法中的参数Key为我在WinIoSys类中定义的一个枚举，并非DONET系统的Key枚举。&lt;br /&gt;&lt;br /&gt;3、 普通Key是指A，B，C，Space这种标准键盘按键。而扩展按键是指&amp;#8220;方向键&amp;#8221;等特殊按键，系统在处理这种扩展键的时候会先有一个写扩展按键信息的时间。&lt;strong&gt;因此没有Ex结尾的方法都是用于标准普通按键的，有Ex结尾的方法是用于特殊的扩展按键的。&lt;/strong&gt;其中他们都有重载，用户可以自己设置间隔时间。至于按键详细分类，请自己上Google搜索。&lt;br /&gt;&lt;br /&gt;4、 模拟一次按键事件后，一定要让程序Sleep一些毫秒，否则下一个按键是无法正常模拟出的。&lt;br /&gt;&lt;br /&gt;5、 貌似USB走的是总线，和端口操作无关，因此该方法理论上不支持USB接口的键盘。&lt;br /&gt;&lt;br /&gt;6、 部分杀毒软件会提醒用户安装驱动，或者将WinIo.sys报为病毒，其实这是正常现象。如果搞这种非正常的事情，杀毒软件当然看不过去。请不要质疑本程序有病毒或木马，最简单的方法就是关闭杀毒软件～。不放心者，请勿使用。 &#xD;
&lt;p&gt;既然有了这么方便的接口，我们来尝试写个小东西看看威力如何。我们就拿《拳皇》来举例子吧。这款游戏就号称针对Window消息绝对无效。&lt;br /&gt;&lt;br /&gt;我们先新建一个EXE工程，并引用我的SuperKeys.dll。定义一个全局变量&lt;br /&gt;WinIoSys m_IoSys = new WinIoSys();&lt;br /&gt;在Load事件中安装驱动&lt;br /&gt;m_IoSys.InitSuperKeys();&lt;br /&gt;在Closed事件中卸载驱动&lt;br /&gt;m_IoSys.CloseSuperKeys();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们当然可以写一个全局钩子，在游戏执行的时候，按下某键就可以进行一系列的按键模拟。但是这仅仅是个DEMO，不用搞那么正式，直接写一个计时器来触发好了。为了节约时间，在每次点击button三秒后执行模拟按键操作，在这三秒中要记得把拳皇游戏窗口激活哦。&lt;br /&gt;我们先来统一下键盘设置，如图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chengchen/JianPanMoni.jpg" width="558" height="368" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们决定来模拟&amp;#8220;八神&amp;#8221;的最简单一招： 暗杀炎（就是从地上放把火过去），如果&amp;#8220;八神&amp;#8221;在左侧，其键盘操作为：：&amp;#8595;&amp;#8600;&amp;#8594;＋A或C。就是上图中的SDU或SDJ按键。以SDJ为例子，在模拟这个键盘时要非常细心才行，我一开始这样模拟：&lt;br /&gt;&lt;br /&gt;m_IoSys.KeyPress(WinIoSys.Key.VK_S);&lt;br /&gt;Thread.Sleep(200);&lt;br /&gt;m_IoSys.KeyPress(WinIoSys.Key.VK_D);&lt;br /&gt;Thread.Sleep(200);&lt;br /&gt;m_IoSys.KeyPress(WinIoSys.Key.VK_J,200);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 结果没有成功。仔细研究了一下，其实我们按SDJ按键的时候，是先将S 按下，再将D键按下，然后弹起S键，再弹起D键，最后再按下J键的。那么真正的过程应该这样写：&lt;br /&gt;&lt;br /&gt;m_IoSys.KeyDown(WinIoSys.Key.VK_S);&lt;br /&gt;Thread.Sleep(100);&lt;br /&gt;m_IoSys.KeyDown(WinIoSys.Key.VK_D);&lt;br /&gt;Thread.Sleep(100);&lt;br /&gt;m_IoSys.KeyUp(WinIoSys.Key.VK_S);&lt;br /&gt;Thread.Sleep(100);&lt;br /&gt;m_IoSys.KeyUp(WinIoSys.Key.VK_D);&lt;br /&gt;Thread.Sleep(10); //这个地方不能间隔太大，太大就整个动作连不起来了。&lt;br /&gt;m_IoSys.KeyPress(WinIoSys.Key.VK_J, 200);&lt;br /&gt;&lt;br /&gt;经过测试，成功模拟我们想要的操作。大家可以看到实际的模拟按键效果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/chengchen/SuperKeys.rar" target="_blank"&gt;点击此处下载DEMO&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/chengchen/KOF.swf" target="_blank"&gt;点击此处察看针对《拳皇》的&amp;#8220;八神&amp;#8221;小特效。&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本程序在VS2008 + WinXP SP3 + WinKawaks1.48XP + KOF 2000 + P/S键盘 下调试通过。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;让驱动级键盘模拟做更多的事情&lt;/strong&gt;&lt;br /&gt;除了写游戏外挂外，这个东东还能做什么呢？听说新版的QQ在键盘防盗技术上很好很强大&amp;#8230;&amp;#8230;。&lt;/p&gt; &lt;img src="http://www.cnblogs.com/chengchen/aggbug/1694260.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chengchen/archive/2010/03/24/1694260.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
