﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-xingd.net</title><link>http://www.cnblogs.com/xingd/</link><description>.net related techonology</description><language>zh-cn</language><lastBuildDate>Wed, 19 Nov 2008 04:57:59 GMT</lastBuildDate><pubDate>Wed, 19 Nov 2008 04:57:59 GMT</pubDate><ttl>60</ttl><item><title>Minesweeper: 新版代码</title><link>http://www.cnblogs.com/xingd/archive/2008/03/22/1117713.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Sat, 22 Mar 2008 07:54:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/03/22/1117713.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1117713.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/03/22/1117713.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1117713.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1117713.html</trackback:ping><description><![CDATA[摘要: MineBoard类，将布局和交互的功能都移到另外的类上实现。CodeCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->usingSystem;usingSystem.Collections;usingSystem.Collections.Generic&nbsp;&nbsp;<a href='http://www.cnblogs.com/xingd/archive/2008/03/22/1117713.html'>阅读全文</a><img src ="http://www.cnblogs.com/xingd/aggbug/1117713.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43606/" target="_blank">[新闻]李彦宏首次表态竞价排名问题:有错能改善莫大焉</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Minesweeper: 代码结构改进</title><link>http://www.cnblogs.com/xingd/archive/2008/03/19/1113868.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Wed, 19 Mar 2008 14:09:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/03/19/1113868.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1113868.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/03/19/1113868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1113868.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1113868.html</trackback:ping><description><![CDATA[接着前一篇文章，<a class="titlelink" id="Editor_Results_rprSelectionList_ctl01_LinkTitle" href="http://www.cnblogs.com/xingd/archive/2008/03/06/1093943.html">Minesweeper: GDI+ 初步实现</a>，本文在代码结构上做一些改进，不涉及新的功能。<br />
<br />
首先我们来看MineBoard类的Init方法：<br />
<br />
<span style="color: #000000">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Init(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rows,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;columns,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mines)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rows&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;columns&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;mines&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;columns&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;rows)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArgumentException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;cells&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MineCell[rows,&nbsp;columns];<br />
&nbsp;&nbsp;&nbsp;&nbsp;totalMines&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mines;<br />
&nbsp;&nbsp;&nbsp;&nbsp;makedMines&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GameStatus.NotStarted;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;PlaceRandomMines();<br />
&nbsp;&nbsp;&nbsp;&nbsp;UpdateNearbyMinesCount();<br />
}</span></div>
<p><br />
实际的游戏开发中，随机布局整个游戏区域的情况并不多，更为常见的还是从地图中读取。同时，为了实现游戏过程中保存当前的游戏进展，然后读取后继续，或者支持从网络上下载布局，以及同其他人分享等，需要将布局的功能移到MineBoard在之外。</p>
<p>调整后的代码如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IMineBoardBuilder<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;TotalMines&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MarkedMines&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;MineCell[,]&nbsp;BuildMineCells();<br />
}<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RandomBoardBuilder&nbsp;:&nbsp;IMineBoardBuilder<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rows;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;columns;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;totalMines;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;RandomBoardBuilder(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rows,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;columns,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mines)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rows&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;columns&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;mines&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;columns&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;rows)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArgumentException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.rows&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rows;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.columns&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;columns;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.totalMines&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mines;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;TotalMines&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;totalMines;&nbsp;}&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MarkedMines&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;}&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MineCell[,]&nbsp;BuildMineCells()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MineCell[,]&nbsp;cells&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MineCell[rows,&nbsp;columns];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlaceRandomMines(cells);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateNearbyMinesCount(cells);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cells;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #000000">}</span></div>
<br />
PlaceRandomMines和UpdateNearbyMinesCount实现跟上一篇文章中一样，就不给出了。<br />
<br />
MineBoard的Init方法则重构为：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Init(IMineBoardBuilder&nbsp;builder)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;cells&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;builder.BuildMineCells();<br />
&nbsp;&nbsp;&nbsp;&nbsp;totalMines&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;builder.TotalMines;<br />
&nbsp;&nbsp;&nbsp;&nbsp;makedMines&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;builder.MarkedMines;<br />
&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GameStatus.NotStarted;<br />
}</span></div>
</span><br />
下面的这个类可以很容易的实现二进制地图文件的读取。文本/XML格式的地图读取，也可以很容易的实现。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">[Serializable]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BoardFileLoader&nbsp;:&nbsp;IMineBoardBuilder<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;MineCell[,]&nbsp;cells;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;totalMines;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;markedMines;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;TotalMines&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;totalMines;&nbsp;}&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MarkedMines&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;markedMines;&nbsp;}&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MineCell[,]&nbsp;BuildMineCells()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cells;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>相应的，可以为MineBoard类添加保存游戏进展的功能。<br />
<br />
在交互方面，也可作如下改进：<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;WalkNearByCells(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;row,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;col,&nbsp;MineWalkCallback&nbsp;callback,&nbsp;Predicate</span><span style="color: #000000">&lt;</span><span style="color: #000000">MineCell</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;match)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(IsValidCell(row,&nbsp;col))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callback(</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;cells[row,&nbsp;col]);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(match(cells[row,&nbsp;col]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WalkNearByCells(row&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i,&nbsp;j&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i,&nbsp;callback,&nbsp;match);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DoAction(IMineBoardAction&nbsp;action)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;action.Run(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
}</span></div>
<p>这两个新增的方法可以将连续揭开一片区域、计算相邻雷数等操作实现移到MineBoard类外实现，这样就可以进一步引入脚本引擎，将一些逻辑实现在脚本中。<br />
<br />
项目文件下载：<a href="http://www.cnblogs.com/Files/xingd/20080319.zip">20080319.zip</a><br />
系列索引：<a class="singleposttitle" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/xingd/archive/2008/02/19/1072850.html">Minesweeper: 索引</a> </p>
<img src ="http://www.cnblogs.com/xingd/aggbug/1113868.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43605/" target="_blank">[新闻]杨致远发表博客解释辞职原因</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Minesweeper: GDI+ 初步实现</title><link>http://www.cnblogs.com/xingd/archive/2008/03/06/1093943.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Thu, 06 Mar 2008 10:14:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/03/06/1093943.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1093943.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/03/06/1093943.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1093943.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1093943.html</trackback:ping><description><![CDATA[摘要: 逻辑代码部分借鉴木野狐博客中的代码，参考http://www.cnblogs.com/RChen/archive/2005/07/07/188107.html，之后我会加入自己的设计调整。一些必要的枚举：publicenumGameStatus{NotStarted,Playing,Win,Lose}publicenumMineCellStatus:short{Covered,MarkDoubt,&nbsp;&nbsp;<a href='http://www.cnblogs.com/xingd/archive/2008/03/06/1093943.html'>阅读全文</a><img src ="http://www.cnblogs.com/xingd/aggbug/1093943.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43604/" target="_blank">[新闻]微软公布免费安全软件计划</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Minesweeper: GDI+ 综述</title><link>http://www.cnblogs.com/xingd/archive/2008/03/02/1088087.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Sun, 02 Mar 2008 13:37:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/03/02/1088087.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1088087.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/03/02/1088087.html#Feedback</comments><slash:comments>29</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1088087.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1088087.html</trackback:ping><description><![CDATA[<p><font face="Verdana">系列前面的两篇文章写的内容太简单了，本文对我理解的GDI+做一个综述，不再涉及代码细节。<br />
<br />
GDI+中共有三种坐标，全局坐标、页面坐标和设备坐标。在GDI+的绘图调用中，传入的坐标位于全局坐标内，全局坐标经由全局变换转换到页面坐标，页面坐标再通过页面变换计算出设备坐标。</font></p>
<p><font face="Verdana">全局变换通过Graphics.Transform指定，其类型为Matrix。GDI+中的矩阵为3x3浮点矩阵，可以通过Matrix类的方法和属性来修改全局变换，也可以通过Graphics类上的TranslateTransform等方法来设定。页面变换通过Graphics类的PageUnit和PageScale来设定坐标单位和缩放倍数。</font></p>
<p><font face="Verdana">Point, Size, Rectangle是GDI+中常用的度量类型，并且都具有对应的float类型。Color则代表了32位A8R8G8B8的颜色。这一些都是基本的值类型，在实际使用的时候，要牢记其值类型的特征，类似o.Size.Width = 100的代码是没有作用的，因为.Width = 100是作用在了o.Size返回的临时变量上了，对于o的状态没有任何影响。</font></p>
<p><font face="Verdana">GraphicsPath，Region, Image则是GDI+中的一些资源性的类型，在使用完成后要尽快Dispose。GraphicsPath是一系列连续的线，包含直线和曲线。Region则表示封闭的一个区域，这个区域的边界可以由GraphicsPath来描述。Image表示一个图形，其中表现像素组成的位图的派生类为Bitmap，表现失量绘图指令组成的图形的派生类为Metafile。计算机屏幕最擅长展现两维的数据，因此Rectangle视为最简单的一种Region，并且应用面也非常广泛，计算包含整个Region的Rectangle也是非常常见的一种操作。</font></p>
<p><font face="Verdana">Brush用来填充一个Region，填充时可以使用单色填充，可以使用纹理（图片）填充，也可以使用线型填充和渐变填充，.NET中封充的GDI+提供了SolidBrush，TextureBrush，HatchBrush，LinearGradientBrush和PathGradientBrush类。Brush也是需要及时Dispose的，对于SolidBrush，可使用SystemBrushes和Brushes中的静态属性，获取预定义的Brush对表，免去Dispose的麻烦。</font></p>
<p><font face="Verdana">Pen是用来画线的，GDI+的线是有宽度的，也就有其内部区域，因此GDI+中的Pen需要一个Brush实例来构造。同样SystemPens和Pens中提供了预定义的单色Pen实例。</font></p>
<p><font face="Verdana">此外Font对象用来实现GDI+中不同字体的输出，Graphics类提供了一个MeasureString方法计算一段字符串绘制出来时占据的区域大小。</font></p>
<p><font face="Verdana">Graphics类提供了一系列Draw...方法，使用特定的Pen来绘制一定的形状，Fill...系列则使用特定的Brush来填充指定区域。</font></p>
<p><font face="Verdana">Graphics的Clip属性通过一个Region类的实例指定GDI+有效绘制区域，这是一个基础信息，Graphics的属性ClipBounds，IsClipEmpty，IsVisibleClipEmpty，VisibleClipBounds均基于Clip属性，并且为只读的。</font></p>
<p><font face="Verdana">CompositingQuality，InterpolationMode，PixelOffsetMode，SmoothingMode，TextRenderingHint用来控制绘制输出质量，质量越高，速度越慢。CompositingMode用来启用Alpha Blend，TextContrast控制文本输出时的Gamma值，RenderingOrigin用来控制8bit/16bit色深时的色彩拌动和Hatch Brush的起始点。<br />
<br />
这些内容对之后的Minesweeper内容足够了，如果有问题，欢迎在评论中提出。</font></p>
  <img src ="http://www.cnblogs.com/xingd/aggbug/1088087.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43603/" target="_blank">[新闻]《时代》：杨致远被Google玩弄于股掌之间？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL Server 2008: Change Data Capture和Change Tracking</title><link>http://www.cnblogs.com/xingd/archive/2008/03/02/1087599.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Sat, 01 Mar 2008 16:03:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/03/02/1087599.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1087599.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/03/02/1087599.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1087599.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1087599.html</trackback:ping><description><![CDATA[<p><font face="Verdana">经常会有需求记录用户表中由DML操作(Insert/Updae/Delete)引起的数据变化，在SQL Server 2008 以前的版本中，要实现这样的功能只能通过Trigger或者数据比对（例如SCD处理），而且必须针对每个用户表开发。SQL Server 2008中新增了两种记录数据变化的功能，本文就Change Data Capture（CDC）和Change Tracking的特性做简要对比。</font></p>
<p><font face="Verdana">Change Data Capture<br />
CDC通过对事务日志的异步读取，记录DML操作的发生时间、类型和实际影响的数据变化，然后将这些数据记录到启用CDC时自动创建的表中。通过cdc相关的存储过程，可以获取详细的数据变化情况。由于数据变化是异步读取的，因此对整体性能的影响不大，远小于通过Trigger实现的数据变化记录。</font></p>
<p><font face="Verdana">下图来自于SQL Server Books Online，说明了CDC可用于获取不同时间段内的变化。<br />
</font></p>
<p><font face="Verdana"><img height="357" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingd/change_data_capture.png" width="463" border="0" /><br />
<br />
Change Tracking<br />
不同于Change Data Capture，Change Tracking仅记录DML操作的发生时间、类型和影响到的字段，不包含具体的变化数值，客户端通过传传递上次同步的版本号来获取从上次同步到现在的变化记录。对于应用数据缓存的场合，这个功能非常实用，可以每隔一定时间获取数据表中的变化记录，然后根据变化记录中的主键来获取更新过的数据从而刷新缓存。</font></p>
<p><font face="Verdana">Change Tracking通过对要执行的DML语句的分析获取变化记录，而不是去读取日志。DML语句提交执行时Change Tracking便已可用，而不需要等待DML完成后事务日志写入时才可用，因此Change Tracking的响应比Change Data Capture要快。</font></p>
<p><font face="Verdana">Change Tracking记录的数据比Change Data Capture少，对服务器性能的影响也小。<br />
</font></p>
<p><font face="Verdana"><img height="275" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingd/change_tracking.png" width="346" border="0" /><br />
<br />
关于CDC具体的操作，可以参考以下文章：<br />
&nbsp;<br />
在SQL Server 2008中实现change data capture (CDC)，基于July CTP (CTP3)：<br />
Part One: <a href="http://www.cnblogs.com/esestt/archive/2007/06/10/777934.html">http://www.cnblogs.com/esestt/archive/2007/06/10/777934.html</a> <br />
Part Two: <a href="http://www.cnblogs.com/esestt/archive/2007/06/10/778321.html">http://www.cnblogs.com/esestt/archive/2007/06/10/778321.html</a> <br />
&nbsp;<br />
IT专家网的文章, SQL Server 2008新功能 捕获数据变化，基于November CTP (CTP4)：<br />
&nbsp;<a href="http://database.ctocio.com.cn/tips/327/7826327.shtml">http://database.ctocio.com.cn/tips/327/7826327.shtml</a> <br />
&nbsp;<a href="http://database.ctocio.com.cn/tips/393/7826393.shtml">http://database.ctocio.com.cn/tips/393/7826393.shtml</a> <br />
&nbsp;<a href="http://database.ctocio.com.cn/tips/438/7826438.shtml">http://database.ctocio.com.cn/tips/438/7826438.shtml</a> </font></p>
<img src ="http://www.cnblogs.com/xingd/aggbug/1087599.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43603/" target="_blank">[新闻]《时代》：杨致远被Google玩弄于股掌之间？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL Server 2008: 常见缩写汇总</title><link>http://www.cnblogs.com/xingd/archive/2008/02/27/1083721.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Wed, 27 Feb 2008 06:20:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/02/27/1083721.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1083721.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/02/27/1083721.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1083721.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1083721.html</trackback:ping><description><![CDATA[有一些在SQL Server 2008/2005的文章中常见的缩写，本文汇总一下，以方便大家阅读。<br />
<br />
SSAS: SQL Server Analysis Services<br />
SSIS: SQL Server Integration Services<br />
SSRS: SQL Server Reporting Services<br />
<br />
SSMS：SQL Server Management Studio<br />
BIDS：Business Intelligence Development Studio<br />
<br />
OLTP: Online Transaction Processing<br />
OLAP: Online Analytical Processing<br />
<br />
SQL：Structured Query Langauge<br />
MDX: Multidimentional Expression<br />
DMX：Data Mining Extension<br />
XMLA: XML for Analysis<br />
RDL: Report Definition Language<br />
<br />
DAC: Dedicated Administrator Connection<br />
<br />
CDC: Change Data Capture<br />
SCD: Slowing Changing Dimension<br />
<br />
我想到的最常见的就是这些，欢迎补充。 
 <img src ="http://www.cnblogs.com/xingd/aggbug/1083721.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43602/" target="_blank">[新闻]Mozilla即将结束对FireFox 2的支持</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL Server 2008: Feb CTP 企业数据平台增强</title><link>http://www.cnblogs.com/xingd/archive/2008/02/26/1082744.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Tue, 26 Feb 2008 11:03:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/02/26/1082744.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1082744.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/02/26/1082744.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1082744.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1082744.html</trackback:ping><description><![CDATA[<p>SQL Server Analysis Services没有太多变化，主要是Designer的改进。Cube Wizard简化和增强了，聚合设计器增强，而且提供了手工聚合设计调整，不像SQL Server 2005中需要自己打开XML定义修改。维度设计器也有改进，比如新的Attribute Relationship的设计器和Key Column设计对话框。存储结构有一些改进，在查询和备份/恢复速度上都有一些提升，具体的比较要等到正式版发布后才能比较了。<br />
<br />
Analysis Services还提供了一些新的AMO警告，以及建立在用户Session上的个性化。当然Analysis Services仍旧仅支持Windows集成认证。<br />
<br />
数据挖掘方面改进了时间序列算法，以支持更长的时间跨度的预测。模型设计器有一些改进，在创建模型时，可以在Model Cases指定过滤条件和列别名。Drillthough现在可以查询模型的数据缓存，包含训练和测试数据的详细条目。<br />
<br />
相对于Analysis Services，Integration Services的变化要明显得多，主要有：<br />
<br />
</p>
<ol>
    <li>对Database Engine的新功能Change Data Capture的完全支持。
    <li>对T-SQL新功能的支持，如Merge，OUTPUT子句等。在bulk load时，如果数据流排序条件与表中的cluster index相同，则大幅提供了数据存取性能。
    <li>服本组件与VSTA无缝集成，支持VB.NET和C#。
    <li>新增了三种时间数据类型，DT_DBTIME2，DT_DBTIMESTAMP2，DT_DBTIMESTAMPOFFSET。
    <li>Lookup组件通过Cache管理的改进而提升性能，并且Cache可以在多个Lookup组件间共享。
    <li>SQL导入导出向导中增强了数据类型的处理能力。
    <li>数据流中新增ADO.NET源和ADO.NET目标。
    <li>新增的Data Profiling任务可用来分析数据表中的数据情况，例如空值比例，值的分布等。 </li>
</ol>
<p>Integration Services 2008可与2005并存，并可将2005的包升级为2008的包，另外依然支持SQL Server 2000中的DTS包。<br />
<br />
Replication和Services Broker都有一些改进，比较散，就不列出来了。<br />
<br />
变动最大的可以说是Reporing Services了，SQL Server 2008 Reporting Services拥有新的系统架构，最主要的有：</p>
<ol>
    <li>不再依赖IIS，直接在Http.sys中支持Http监听。
    <li>全新的Chart控件，媲美Excel中的图表，收购Dundas的效果表现出来了。
    <li>全新的Gauge控件，一样来源于Dundas。
    <li>全新的Tablix，融合了Matrix和Table的优点。 </li>
</ol>
<p><img height="518" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingd/ssrs_chart_type.png" width="577" border="0" /></p>
 <img src ="http://www.cnblogs.com/xingd/aggbug/1082744.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43601/" target="_blank">[新闻]IBM"走鹃"险胜"Cray Jaguar" 连任世界最快超级计算机</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL Server 2008: Feb CTP 关系数据库引擎增强</title><link>http://www.cnblogs.com/xingd/archive/2008/02/24/1079463.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Sun, 24 Feb 2008 07:12:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/02/24/1079463.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1079463.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/02/24/1079463.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1079463.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1079463.html</trackback:ping><description><![CDATA[<p>这篇文章中介绍的SQL Server 2008 关系数据库引擎（Database Engine）增强，包含所有的CTP中的累计更新，基本会与SQL Server 2008正式版发布一致。<br />
<br />
新增的功能点非常多，下面先就大部分应用开始人员关心的特性作说明。</p>
<ol>
    <li>Change Data Capture (CDC)： 变化数据捕获，可以捕获SQL Server数据表中的新增、修改和更新，并以一种易于使用的格式提供。CDC是SQL Server 2008中新增的一项非常重要的功能，在BI应用中从业务数据库抽取更新数据到数据仓库时非常有用。随后会有专文介绍CDC。</li>
    <li>DDL Triggers and Event Notifications： 除了SQL Server 2005中的DDL语句外，SQL Server 2008可以为某些行为等同于DDL的存储过程增加触发器。</li>
    <li>Merge： T-SQL中新增的Merge语句支持批量数据的新增/更新/删除，通过两个表类型数据的Join，按照Join的不同情况对目标表按源表的数据作增删改操作。</li>
    <li>Table-Valued Parameters： 存储过程和函数中新增表值参数类型的支持，可以将多行数据放在一个参数中传递到存储过程和函数中。</li>
    <li>Group By 增强： Group by中新增了Rollup，Cube和Grouping Sets子句，用于分组后的数据统计。</li>
    <li>Insert 增强: 支持一条Insert语句中插入多条数据。</li>
    <li>Table Hints 增强：新增了Force Seek，强制查询优化器仅使用Index Seek。</li>
    <li><font face="Verdana">hierarchyid Data Type：新增的hierarchyid数据类型用于层次化数据的支持，SQL Server 2008在hierarchyid类型上提供了层次化数据处理的一些基本功能。</font></li>
    <li>FILESTREAM存储，允许SQL Server将非结构化数据存储在文件系统上。</li>
    <li>Plan Guide增强。可以通过Hints微调查询计划。 </li>
    <li>空间数据的支持，存储，查询，索引等。微软2007年加入了OGC（Open Geospatial Consortium）。 </li>
    <li>SSMS加入IntelliSense支持。</li>
    <li>SSMS中打开表时，返回Top N的功能又回来了。</li>
    <li><font face="Verdana"><font face="Verdana">Filtered Indexes and Statistics，支持在表的一部分数据上建立索引和统计，而不是在全部数据上。</font></font></li>
    <li>全文索引紧密集成到了关系数据库引擎中，而不是像SQL Server 2005那样由另外的进程提供。</li>
</ol>
<p>DBA 关心的特性有：</p>
<ol>
    <li>Dynamic Management Views (DMVs)： 动态管理视图中新增了内存、依赖项方面的多个视图。</li>
    <li><font face="Verdana">Data Collector：可以从不同的数据源进行数据收集</font></li>
    <li>Backup 压缩：<font face="Verdana">仅有Enterprise以上版本支持备份压缩，所有版本都支持从压缩过的备份恢复。</font></li>
    <li>Declarative Management Framework支持对Server Group进行管理，这是通过Configuration Servers实现的。具体应用的时候，可以支持T-SQL同时在N台Server上同时执行</li>
    <li>运行时添加CPU。这个功能可以在硬件升级时保持可用。</li>
    <li>表分区交换功能。大型的数据仓库非常有用，SQL Server 2008中通过对Alter Table语实扩展，提供了更为方便的表分区交换调用。</li>
    <li>资源管理，CPU和内存等资源的管理。</li>
    <li>管理方面新增Extensible Key Management和透明数据加密。</li>
    <li>服务器管理和维护方面的大幅增强。</li>
    <li><font face="Verdana">PowerShell Provider and Cmdlets，方便在PowerShell中对SQL Server 2008进行管理。</font></li>
</ol>
<p>&nbsp;另外一些系统功能的增强，但不需要显式来使用的特性有</p>
<ol>
    <li>Optimized Bitmap Filter： Oracle有显式的Bitmap类型索引，SQL Server则在并行查询计划中动态的使用Bitmap过滤，在星型架构（Star Schema）下可大幅提高事实表中无效的记录。</li>
    <li>Database Mirror：增强了日志性能，增加了自动从Partner修复错误的数据页的功能。</li>
    <li>增强了分区表查询时的性能。</li>
    <li>稀疏数据存储优化。</li>
</ol>
<p>增强之外，也有一些功能逐步移除或替代了，虽然在SQL Server 2008中依旧支持，但在将来的版本中会消失。在性能计数器或跟踪中，这部分功能会明确标出废弃，具体的功能列表会在随后的文章中介绍。<br />
<br />
从2005开始，SQL Server不仅仅是一个数据库软件，而是往企业数据库平台的方向发展，在ETL，OLAP，Data Mining，Reporting，Application Server等方向都有大量的新组件，新特性和增强。SQL Server 2008在这一方向上更进一步，随后的文章中将会介绍SQL Server 2008在关系数据引擎之外的增强。<br />
</p>
   <img src ="http://www.cnblogs.com/xingd/aggbug/1079463.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43600/" target="_blank">[新闻]微软正式发布Exchange/SharePoint Online</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL Server 2008: Installation Center</title><link>http://www.cnblogs.com/xingd/archive/2008/02/24/1079190.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Sat, 23 Feb 2008 17:30:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/02/24/1079190.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1079190.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/02/24/1079190.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1079190.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1079190.html</trackback:ping><description><![CDATA[<p>SQL Server 2008将拥有全新的安装体验。从Nov CTP开始，新的安装过程代替了这前的CTP中类似SQL Server 2005的安装过程，而最新的Feb CTP中，SQL Server Installation Center将新安装、从SQL Server 2000或SQL Server 2005升级、组件维护、Samples和Failover Cluster的管理集成在了一个统一的页面。下图为Feb CTP中Installation Center的截图。</p>
<p><img height="551" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingd/sql_install_center.png" width="800" border="0" /><br />
<br />
SQL Server 2008的系统需求中已经不包含Windows Server 2000，不过依然包含对XP Professional SP2的支持。SQL Server 2008不支持在Windows Server 2008 Core上安装。完全安装需要1.7G空间，实际需要的空间在2G以上。SQL Server 2008会安装.NET Framework到3.5版。<br />
<br />
<img height="600" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingd/sql_install_feature.png" width="800" border="0" /><br />
<br />
简单提一下几个组件（Feature）的变化，具体的功能变化会在下一篇文章中介绍。<br />
<br />
Full text search已成为SQL Server同一进程内提供的功能。<br />
Reporting Services的代码进行了大幅重写。<br />
SQL Server 2005中的Notification Services已经被移除了，不要再花时间学习和部署SSNS应用了。<br />
<br />
SQL Server 2005的目录以MSSQL1，MSSQL2，MSSQL3等方式命名，不够直观，而SQL Server 2008的目录名改进为MSSQL10.{Instance}，MSAS10.{Instance}，MSRS10.{Instance}的方式，其中{Instance}为SQL Server实例的名字，默认实例名为<font face="Verdana">MSSQLSERVER。<br />
<br />
安装好后，开始菜单中包含的项目如下：<br />
<br />
<img height="502" alt="" src="http://www.cnblogs.com/images/cnblogs_com/xingd/sql_startup_menu.png" width="400" border="0" /></font></p>
<img src ="http://www.cnblogs.com/xingd/aggbug/1079190.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43600/" target="_blank">[新闻]微软正式发布Exchange/SharePoint Online</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SQL Server 2008: Feb CTP 开放下载</title><link>http://www.cnblogs.com/xingd/archive/2008/02/22/1077868.html</link><dc:creator>xingd</dc:creator><author>xingd</author><pubDate>Fri, 22 Feb 2008 08:39:00 GMT</pubDate><guid>http://www.cnblogs.com/xingd/archive/2008/02/22/1077868.html</guid><wfw:comment>http://www.cnblogs.com/xingd/comments/1077868.html</wfw:comment><comments>http://www.cnblogs.com/xingd/archive/2008/02/22/1077868.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/xingd/comments/commentRss/1077868.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xingd/services/trackbacks/1077868.html</trackback:ping><description><![CDATA[<font face="Verdana">可以在此地址下载：<a href="http://msdn2.microsoft.com/zh-cn/bb851668.aspx">http://msdn2.microsoft.com/zh-cn/bb851668.aspx</a><br />
<br />
作为最后一个CTP，Feb CTP已包含了SQL Server 2008的所有功能，并且将BIDS使用的Visual Studio Shell升级到了2008。等待这个CTP已经很久了，已经下载好了，随后我会参照这个CTP写一些文章。在正式工作中，我已有7年多的SQL Server使用经验，主要集中在应用开发和商务智能方面，作为架构师和开发主管参与开发了<a href="http://www.u-soft.com.cn">极光商智</a>产品，该产品基于SQL SERVER Analysis Services 2000/2005。最近两年成为微软SQL签约讲师，SOHO期间先后为Satyam、中兴、华为、中原地产等做过SQL Server培训和咨询。以前很少写blog，现在因为全职在大众点评网担任系统架构师，没有时间再去做培训，这次希望借助SQL Server 2008的发布，多在自己和团队的blog中介绍SQL Server 2008。如果有一些可以在周末进行的培训和技术交流，欢迎与我联系xingd[at]263.net。<br />
<br />
我的个人主页(<a href="http://www.stevenxu.com">www.stevenxu.com</a>)上有两篇<a href="http://www.stevenxu.com/?p=12">SQL Server 2008 Nov CTP的新特性介绍</a>，这个周末我会重新整理为SQL Server 2008的新特性介绍，按针对应用开发人员和针对DBA分为两篇介绍。<br />
<br />
SQL Server 2008计划在今年Q2发布RC版，Q3发布RTM版。<br />
<br />
另外关注的2个产品的release，如果有朋友看到了，也可以提醒我一下，十分感谢。<br />
<br />
1. EntLib 4.0，msdn博客中提及会在2月底发布。<br />
2. DirectX SDK March 2008，增加对Visual Studio 2008的支持，这样我可以彻底不用安装Visual Studio 2005了。<br />
<br />
其他两个产品发布，也许对部分人有用：<br />
1. Gentoo 2008.0，计划March 17, 2008发布<br />
2. Freebsd 7.0，计划Feb, 2008发布。</font>
     <img src ="http://www.cnblogs.com/xingd/aggbug/1077868.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43598/" target="_blank">[新闻]应用程序架构指导包2.0 Beta 2发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>