﻿<?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>C++博客-牵着老婆满街逛-随笔分类-文章收藏</title><link>http://www.cppblog.com/tx7do/category/1449.html</link><description>危机感是一种强大前进的动力！&lt;/br&gt;
GMail/GTalk: yanglinbo#google.com;&lt;/br&gt;
MSN/Email: tx7do#yahoo.com.cn;&lt;/br&gt;
QQ: 3 0 3 3 9 6 9 2 0 .</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:12:21 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:12:21 GMT</pubDate><ttl>60</ttl><item><title>上海出名特色菜馆推荐</title><link>http://www.cppblog.com/tx7do/archive/2006/09/28/13068.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Wed, 27 Sep 2006 17:01:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/28/13068.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/13068.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/28/13068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/13068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/13068.html</trackback:ping><description><![CDATA[　　<b>上海风味</b><br /><br />　　上海老饭店（豫园商场）、德兴菜馆（东门路29号）等。 <br /><br />　　虾子大乌参、扣三丝、生炒草头、竹笋腌鲜等。 <br /><br />　　<b>京津风味</b><br /><br />　　燕云楼（南京东路）、国际饭店（南京西路）、北京饭店（提篮桥）等。 <br /><br />　　烤鸭、醋椒鱼等。 <br /><br />　　<b>广东风味</b><br /><br />　　新雅粤菜馆（南京东路）、杏花楼（福州路）、美心酒家（陕西南路）等。 <br /><br />　　烤乳猪、蚝油牛肉、烟熏鲳鱼等。 <br /><br />　　<b>四川风味</b><br /><br />　　洁而精川菜馆（雁荡路）、梅龙镇（南京西路）、绿杨村（南京西路）等。 <br /><br />　　干烧鲫鱼、龙圆豆腐、五柳鱼丝等。 <br /><br />　　<b>扬州风味</b><br /><br />　　扬州饭店（南京东路）、老半斋酒楼（汉口路596号）等 <br /><br />　　蟹粉狮子头、煮干丝、铁板牛肉等。 <br /><br />　　<b>苏锡风味</b><br /><br />　　人民饭店（南京西路）、老正兴菜馆（南京路山东路）等。 <br /><br />　　五味三鲜、瓜姜鱼丝、冰糖甲鱼等。 <br /><br />　　<b>杭州风味</b><br /><br />　　西湖饭店（四川路）、海上明珠大酒楼（南京路福建路）等。 <br /><br />　　龙井虾仁、西湖醋鱼、东坡肉等。 <br /><br />　　<b>宁波风味</b><br /><br />　　甬江状元楼（西藏中路）、沪东状元楼（平凉路通北路）等。 <br /><br />　　锅烧河鳗、雪菜黄鱼汤等。 <br /><br />　　<b>安徽风味</b><br /><br />　　大富贵酒楼（中华路1465号）等。 <br /><br />　　炒鳝糊、葡萄鱼、毛峰熏鸭、杨梅圆等。 <br /><br />　　<b>素斋风味</b><br /><br />　　功德林蔬食处（黄河路）、觉林蔬食处（金陵路福建路）等。 <br /><br />　　炒蟹粉、竹荪莼菜等。 <br /><br />　　<b>清真风味</b><br /><br />　　洪长兴（延安东路）、清真饭店（福州路）、回风楼（河南南路）等。 <br /><br />　　涮羊肉等。 <br /><br />　　<b>西餐</b><br /><br />　　法式红房子西菜馆（陕西南路）烙蛤蜊、洋葱汤等。 <br /><br />　　德式德大西菜社（南京东路）汉堡牛排等。 <br /><br />　　意式天鹅阁西菜社（淮海路东湖路）烙鸡面等。 <br /><br />　　日式友友餐厅（延安东路）生鱼片等。 <br /><br />　　印尼悦宾沙嗲屋（丁香花园）沙嗲等。 <br /><br />　　上海本帮风味中有哪些特色菜？ <br /><br />　　青鱼甩水、清炒鳝糊、红烧明虾、活杀塘鲤鱼、雪菜大汤黄鱼、粉皮花鲢、菜花甲鱼、目鱼烤肉、春笋腌笃鲜、清蒸大闸蟹等。 <br /><br />　　<b>上海有哪些主要美食街？</b><br /><br />　　云南路美食街、豫园商场小吃娱乐城、黄河路小吃街、沙市路小吃街。此外，还有十六铺、新客站、乍浦路、安庆路、五原路等小吃街。 <br /><br />　　<b>上海有哪些风味小吃？</b><br /><br />　　南翔小笼包子，小绍兴鸡粥、广元馒头、生煎馒头、虾肉烧卖、阳春面、小馄饨、三虾面、炒面、蛋炒饭、排骨年糕、蟹壳黄、大饼油条、粢饭糕、粢饭、豆腐浆、鸡鸭血汤、面筋百页、油豆腐线粉、豆腐花、臭豆腐干、五香茶叶蛋、油墩子、春卷、糟田螺、炸麻雀、炸鹌鹑、酒酿圆子、桂花赤豆羹、芝麻汤团、桂花糖藕、糖芋艿等。 <br /><br />　　<b>上海有哪些著名糖果糕点店？</b><br /><br />　　沪式高桥食品店（淮海路）、乔家栅（老西门）、王家沙（南京路）等。苏式老大房（南京路）、采芝斋（西藏路）等。广式利男居（南京路）、杏花楼（福州路）等。潮式元利食品店（河南路）、源诚食品店（南京路）等。宁武叶大昌（四川路）、三阳南货店（南京路）等。清真翠文斋（南京路）等。西式老大昌（淮海路）、上海食品厂（淮海路）、哈尔滨食品厂（淮海路）、剀司令（南京路）等。上海有哪些特色糕点？ <br /><br />　　高桥松饼（细纱千层饼）、一口酥、乔家栅粽子、擂沙圆、八宝饭、粢毛团、双酿团、条头糕、猫耳朵、百果松糕、寿桃蜜糕、方糕、糖年糕、王家沙鲜肉酥饼、奶油蛋糕、花色面包、春节元宵、清明团子、端午粽子、立夏酒酿、中秋月饼、重阳糕、腊八粥等。<img src ="http://www.cppblog.com/tx7do/aggbug/13068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-28 01:01 <a href="http://www.cppblog.com/tx7do/archive/2006/09/28/13068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pietty</title><link>http://www.cppblog.com/tx7do/archive/2006/09/28/13067.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Wed, 27 Sep 2006 16:57:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/28/13067.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/13067.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/28/13067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/13067.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/13067.html</trackback:ping><description><![CDATA[
		<a href="http://www.csie.ntu.edu.tw/~piaip/pietty/">http://www.csie.ntu.edu.tw/~piaip/pietty/</a>
		<br />
		<br />
		<h1>PieTTY/pputty/PuTTY 是什麼?</h1>
		<a href="http://www.csie.ntu.edu.tw/~piaip/pietty/newconn.jpg">
				<img id="screenshot0" title="new connection screenshot" style="FLOAT: right; MARGIN: 1em" height="150" alt="screenshot" src="http://www.csie.ntu.edu.tw/~piaip/pietty/newconn.jpg" width="210" />
		</a>
		<p>
				<a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> 是個小巧方便的 Telnet/SSH 安全遠端連線程式， 但用於非英語系文字時有非常多的問題， 而且它對於初學者來說過於複雜的使用界面也為人詬病已久。 PieTTY 則是源自於 PuTTY ，修正與完整支援亞洲等多國語系字元、 並在使用界面上大幅改進、易學易用的版本。<br /><br />PieTTY is a free SSH client based on PuTTY and dedicated to multilingual (especially CJK) environments, accessibility, and simpler user interface. <br /></p>
		<p id="plandesc">PieTTY 使用 MIT License, 是免費而可自由重新散佈的。 更詳細的歷史或是使用上有問題請見 <a href="http://www.csie.ntu.edu.tw/~piaip/pietty/faqs">FAQ </a>。 <b style="COLOR: red">關於 PieTTY 為何要支援「Unicode 補完計畫」請見 <a href="http://www.csie.ntu.edu.tw/~piaip/pietty/faqs#uao">FAQ</a>。</b></p>
		<h2>關於新版的開發</h2>
		<p>PieTTY 目前仍然常收到各種建議與錯誤報告， 非常感謝大家； 不過除非有安全性的重大錯誤要修正， 否則短時間內 0.3 不會再發行新版， 因為目前要專注在「幫 PuTTY 加上分頁」這項大工程； 完成後會把修正送回官方 PuTTY。 不過這項工程由於實在太大， 暫時也無法估計所需時間。 所以這段期間就請大家繼續使用 0.3.27。 <!--
		<h2>最新版的差異</h2>
		<p style='color: red'> 
		0.3.27 是 0.3 系列以來測試最久、功能最完整的一個版本，
		推出的時間與 pputty 最後一版 0.2.3 剛好相隔一年，
		同時也是 0.3 系列的最後一版，接下來就是 0.4 系列的開發。
		強烈建議您更新到 PieTTY 0.3.27 ！
		--><!--
		預告: PieTTY 0.3.27 即將推出，還有 兩天。
		0.3.27 是 0.3 系列以來測試最久、功能最完整的一個版本，
		推出的時間與 pputty 最後一版 0.2.3 剛好相隔一年，
		同時也會是 0.3 系列的最後一版，接下來就會改為開始 0.4 系列的開發。
		<p> 目前的穩定版是 0.3.25 ，不過正在測試中的 0.3.26/27
		系列可說是徹頭徹尾的不同(可說是 0.3.20 以來改變最多的一版)， 
		對 Big5 內碼、多國語言的支援更是完全超越其它類似的程式。<br/>
		PieTTY 0.3.26 的測試即將進入尾聲，近期內 0.3.27 - 0.3 
		系列的最後一版 - 就會發行， 而 PieTTY 0.3 結束後就會開始 0.4
		的計畫。
		如果您有興趣也歡迎幫忙測試 0.3.26 系列 (見下載列表的下方)，
		以讓它更快進入穩定版。 <br/>
		<small>PieTTY 目前大約是原 PuTTY 程式再加上 5000
			行左右的程式碼。</small>
		--></p>
		<h2>PieTTY 的特色</h2>
		<p style="COLOR: blue">PieTTY 0.3 系列是修改自 PuTTY 0.57/0.58 的版本，以穩定與修正為主。 主要的特色有: <a href="http://www.csie.ntu.edu.tw/~piaip/pietty/pietty_alphablending.png"><img title="screenshot - alphablending" style="FLOAT: right; MARGIN: 1em" alt="screenshot" src="http://www.csie.ntu.edu.tw/~piaip/pietty/pietty_alphablending_tb.png" /></a></p>
		<ul>
				<li>簡單易用的界面(中英文合一)。 主要的功能都可從選單存取 
</li>
				<li>完全相容於傳統 PuTTY，之前的設定全部可直接使用 
</li>
				<li>更強的連線整合管理(session management)， 自動儲存設定 
</li>
				<li>高度可自訂化(customizable)的視窗顯示效果 
</li>
				<li>完整而方便切換的多國語言支援 
</li>
				<li>
						<a href="http://www.csie.ntu.edu.tw/~piaip/pietty/pietty_glass.png">半透明顯示(多種顯示引擎以配合各種硬體配備與<acronym title="Faded drop shadow, similiar to Longhorn">視窗立體陰影</acronym>，配合無框顯示模式效果奇佳 (0.3.27)</a>
				</li>
				<li>支援 ssh:// 式的呼叫，可整合系統設定為 ssh:// 與 telnet:// 處理程式(0.3.27) 
</li>
				<li>
						<img title="pputty with clickable HREF" style="FLOAT: right" alt="href screenshot" src="http://www.csie.ntu.edu.tw/~piaip/pietty/pputty_href.png" />對於各種網址 URL 可直接點選開啟，還有各種可選用的視覺效果 
</li>
				<li>支援拖曳檔案 (Drag-n-drop) 即可 SCP 上傳 </li>
		</ul>
		<b class="green" style="CLEAR: both">對於非英語系字元， PieTTY 特別加強的部份有:</b>
		<ul>
				<li>可使用英文等其它字型，而且不用設定字元集(CHARSET) (傳統 PuTTY 則一定要設定正確才行) 
</li>
				<li>在非 UTF8 模式下 PieTTY 的游標也能正確顯示 (傳統 PuTTY 會破壞游標上的多位元字元組如Big5中文) 
</li>
				<li>重繪螢幕完全不閃動 (PuTTY 在非 UTF8 會閃) </li>
		</ul>
		<b class="green">對台灣 Big5 及 BBS 環境有更多的加強功能：</b>
		<ul>
				<li>內建 Big5-2003 + 中國海字集、 相容Unicode補完計畫2.40版字碼表，免裝 Unicode 補完即可正常剪貼或輸入日文等(0.3.27) <a href="http://www.csie.ntu.edu.tw/~piaip/pietty/pietty_glass.png"><img title="screenshot - glass mode (captionless+borderless)" style="FLOAT: right; MARGIN: 1em" alt="screenshot" src="http://www.csie.ntu.edu.tw/~piaip/pietty/pietty_glass_tb.png" /></a></li>
				<li>內建簡單的漢字(簡繁)轉換，方便閱讀(0.3.27) 
</li>
				<li>支援一字雙色的ANSI碼 (台灣 BBS 特有文化) 
</li>
				<li>複製文字時可自動將屬性顏色以 ANSI 碼或 IRC 形式加入(0.3.27)， BBS 與 IRC 互貼彩色不是夢！ </li>
		</ul>
		<!--
		<a href='pietty_widget.png'
				><img width="200" height="150" 
				src='pietty_widget.png' 
				title="PieTTY 0.3.10 in captionless mode"/></a>
		<br/>		PieTTY 0.3.10, captionless mode
		-->
		<h2>關於作者 About The Author </h2>
		<p>Hung-Te Lin 林弘德, 網路上常用的代號是 piaip。<br />PieTTY 是我自己平日連線到 Solaris 工作站上的必需品， 所以起碼有一個人每天在對最新版做測試 ^^; 也所以，只要有 bug 或是問題，我都會盡量想辦法解決 （尤其是我自己使用上會需要的）。 如果對這個計畫有任何意見， 也歡迎用 email 與我聯絡! </p>
<img src ="http://www.cppblog.com/tx7do/aggbug/13067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-28 00:57 <a href="http://www.cppblog.com/tx7do/archive/2006/09/28/13067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用别的眼光去感悟软件测试</title><link>http://www.cppblog.com/tx7do/archive/2006/09/23/12864.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sat, 23 Sep 2006 15:23:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/23/12864.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12864.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/23/12864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12864.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12864.html</trackback:ping><description><![CDATA[
		<p>曾经对<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>很轻视，因为我那时很无知，只是一名普通的中国程序员，这也是那时绝大多数程序员的心态，那时中国程序员最讲究“编程才是硬道理”。 </p>
		<p>
				<br />如今却非常热爱<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>，包括<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>工具，方法，理论，技术。因为我在3年的测试工作中，深刻体会到<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的重要性和趣味性。此时，我已经跳出了“小程序员”的圈子，以软件系统工程的更大视角审视<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>这项工作。</p>
		<p>
				<br />很长时间以来我一直被下面的问题而困惑，有些问题至今仍然只是具有肤浅的认识，而且，我感觉我做的测试项目越多，阅读的测试书籍越多，我越感到我对<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>理解的越肤浅。因为我越来越感受到<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的广度和深度的无限性，它像大海宽广，像宇宙那样深邃。 为什么要进行<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>？<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的前途如何？<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的工具和思想谁更重要？<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的最高境界是什么？</p>
		<p>
				<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>是保证<a class="Channel_KeyLink" href="http://www.testage.net/QA/">软件质量</a>的重要活动，是软件项目实施的不可缺少的环节。<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的直接目的是发现软件中存在的缺陷。此为测试的有效性。</p>
		<p>
				<br />在软件项目没有结束之前的全部软件缺陷主要由软件开发人员负责，因为软件缺陷来自程序员的编程。软件项目结束后的软件缺陷主要由<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>人员负责，因为<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>人员没有在软件发布之前的测试中没有发现隐藏的错误。 但这不是绝对的，因为软件项目是一个系统工程，<a class="Channel_KeyLink" href="http://www.testage.net/QA/">软件质量</a>牵扯到多个部门和人员，以及需求分析，设计，编码等各个环节和过程。<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>只能证明软件存在缺陷，不能保证软件没有错误。</p>
		<p>
				<br />
				<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>不是万能的，因为不可能发现全部的软件缺陷，而且软件的功能和性能不是由测试决定的。此为测试的有限性。</p>
		<p>
				<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>目前主要以手工测试为主，自动<a class="Channel_KeyLink" href="http://www.testage.net/AutoTest/">测试工具</a>虽然很多，但实际应用的广度和深度还有很大潜力，自动将有很大的发展空间！。</p>
		<p>软件驱动开发的观点说明了测试与编程的关系，测试应该贯穿于软件开发的整个生命周期，编程只是软件开发的一个环节。但往往大家非常重视软件编程，把测试作为编程后的一个辅助环节。这是典型的本末倒置。 <a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的缺陷管理流程非常重要，报告的软件缺陷的质量，应该由他人验证，做到责任明确，方法简便可行。</p>
		<p>
				<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>技术不断进步，但总体来看，国内的测试重视程度还不够，但已经发展很快。差不多两年之前，国内计算机书店中关于<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的书籍非常稀少，如今却琳琅满目，异彩纷呈。</p>
		<p>
				<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>是个可以很快入门的职业，门槛不高，但是，不要认为什么人都可以做好<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>。因为会做和做好是两个概念。<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>人员最好具有软件开发经验，理解软件工程的知识。这是提高<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>能力的基础。对于刚刚毕业的学生，如果希望今后从事软件开发，那么，先从事一段时间的测试可能更有利于今后的编程。而对于具有多年编程经验的程序员，如果改行做测试，更容易提高技术。 <a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>不是孤立的活动或过程，需要开发和市场人员的参与和交流，需要<a class="Channel_KeyLink" href="http://www.testage.net/QA/">软件质量</a>保证人员SQA的积极配合和沟通。</p>
		<p>
				<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>的技术不断进步，与具体<a class="Channel_KeyLink" href="http://www.testage.net/TestTech/">测试技术</a>相比，掌握测试的核心思想比具体技术更重要！测试的最高境界在于运用最简单有效的<a class="Channel_KeyLink" href="http://www.testage.net/TestTech/">测试技术</a>，最大限度的发现软件缺陷!</p>
		<p>应当承认，目前国内的<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>工程师的地位和待遇仍然很低，而且不少测试人员存在浮躁的心态（我甚至感到整个软件行业始终存在着浮躁的泡沫）。如何改变这种局面，这应该是个漫长的过程。当整个IT业真正以客户为上帝时，当<a class="Channel_KeyLink" href="http://www.testage.net/QA/">软件质量</a>成为决定企业生存和发展的决定因素时，当<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>工程师的测试工作给软件企业带来更大的经济效益时，<a class="Channel_KeyLink" href="http://www.testage.net/">软件测试</a>工程师才会得到应有的尊重！</p>
		<p>软件开发是一项复杂的、创造性的协作式游戏。作为游戏它自然存在着乐趣，所以程序员们才会乐此不疲，前仆后继。首先、这种快乐源于一种创造事物的快乐。其次、这种快乐来自于一种开发出对别人有用的东西时所带来的满足感。第三、快乐源自开发过程中，亲眼看到软件按自己预先设想的那种效果运行时所带来的迷人魅力。第四、快乐源自开发过程中持续学习的快乐。最后、快乐源自开发过程中，我们能象诗人一样，仅凭自己的想像，来建造自己的城堡时带来的快乐。编程的快乐在于它不仅满足了我们内心深处进行创建的渴望，而且还唤醒了每个人内心的情感。不幸的是，同样作为游戏它也有苦恼的一面：首先、苦恼来自追求完美主义。其次、苦恼来自总是由他人来设定目标、供给资源、提供信息。第三、苦恼来自于寻找琐碎的BUG却是一项枯燥的、重复性的活动。第四、人们通常希望在项目接近结束时，能收敛得快一些，然而，情况却是越接近完成，收敛得越慢。最后、苦恼来自当投入大量的辛苦劳动后，产品发布时却面临着陈旧过时的危险。作为软件开发者，我们别无选择，只有适应它们，就这样痛并快乐着地面对每一天。</p>
		<p>来自领导的信息只有25%被下级知道并正确理解，从下到上的反馈信息不超过10%，平等交流的信息则可达到90%以上。平等造就信任，信任增进交流。有效地进行适当的意见交流，对一个组织的气候和生产力会产生有益和积极的影响。使顾客满意并和他们面对面地交流，才是蠃得市场的关键。</p>
		<p>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　</p>
		<p>管理是一种控制性游戏，在游戏面前，你只有二种选择：或者，你确信自己能蠃，于是投入足够多的能量来蠃得一切；或者，你不进行这个游戏，放弃它。然而，作为软件项目管理者，你也应该知道，早投入、高风险才会有高回报。逃避风险是致命的，因为这也会让你得不到与风险同在的利益，久而久之，你就会面临着被市场淘汰的危险。风险是"遭受损失的可能性"，由条件、结果以及周围的环境构成。风险和问题的区别在于：风险是尚未发生的问题，而问题是业也成真的风险，昨天的风险可能会是今天的问题。风险管理主要包括下面几个方面：</p>
		<p>第一、风险识别：</p>
		<p>从头脑想像中抽取出各种风险并加以筛选，再加上在整个开发过程中，保持持续不断的风险发现机制，以发现新的风险。</p>
		<p>第二、风险分析：</p>
		<p>对风险出现的可能性和潜在的危害性进行量化分析。</p>
		<p>第三、应急计划：</p>
		<p>如果识别出的风险真的出现，你将采取的应急措施。</p>
		<p>第四、风险缓解：</p>
		<p>为了使应急计划得以有效实施，必须在风险转化为真之前所采取的措施。</p>
		<p>第五、持续的监控：</p>
		<p>跟踪需要管理的风险，寻找风险出现的迹象。</p>
		<p>项目面临的某些风险可能是致命的，发生时会使项目严重滞后或直接废弃。这类风险是最需要管理的，但有效的管理它们也许会使你与你的上级发生冲突(如时间上最后期限等)，对于这类风险往往超出了你的管理权限，可以先将它们列为项目假定风险，然后把它们转交给上级来管理。风险可能出自技术、政治、经济、资源或其它各个方面，几乎无所不在，并且会对项目开发、市场占有率或是达到项目目标(如进度、预算、质量等)造成灾难性后果。但在所有软件项目中，通常会共存五大核心风险，分别如下：</p>
		<p>第一、缺乏合理的进度安排</p>
		<p>这是导致项目滞后的最主要的原因。首先、它源于开发人员们普遍存在的乐观主义精神，我们总是期待在实现过程中不会碰到困难，然而我们的构思是有缺陷的，因此总会发现BUG。</p>
		<p>
				<br />第二.它源于一种错误的认识，人员数量和开发时间是可以互换的，既投入两倍的人数会在一半时间内完成开发工作。然而，这种理论却忽略了随着人数的增加，相应的也会增加新人培训和人们相互交流所需的负担,另外，还有任务重新分配所造成工作中断带来的负担，正如Alistair Cockburn所说："最有效的交流方式是面对面的交流"当3、5个人的时候很容易做到这种交流方式，随着人数的增长，再也很难做到这种交流方式。交流成本的增加与培训新人所需时间成本的增加、以及任务重分配导致工作中断成本的增加，直接导致一种结果：向进度落后的项目中增加人手，只会使进度更加落后。</p>
		<p>
		</p>
		<p>第三、源于空泛的估算，管理人员特别是高层管理人员为了满足顾客期望的日期而造成的不合理进度安排。如果分配的时间一开始就不够，不管高层领导威胁有多么吓人，工作也无法按时完成，如果人们察觉到管理者可能滥用权力来惩罚自己，他们就会感觉到威胁，没有安全感。安全感的缺乏会让人们反对变化，而在所有成功项目中，变化是唯一不变的要素之一，除非感到安全，否则人们就不会去迎接变化，只会按部就班，这样往往丧失了很多走捷径的好机会，而这些机会原可以大大缩减时间进度的。第四、如果你没有认真估算产品规模，那么你预计的进度就是空中楼阁，唯一的依据只是你的希望。在估计产品规模时，除了正常的时间计算以外，不但应该将"可能需要做"的事情所需工作时间加上，还要将某些"可能不需要做"的事情所需工作时间加上。项目的超期不应归咎于开发者的低效率。</p>
		<p>
		</p>
		<p>最后、项目的滞后不是一下子造成的，而是在一天天的不知不觉中造成的，有无数种方法可以浪费一天的时间，但是没有任何方法可以拿回一天的时间。高层管理者的不良反应肯定会对信息的完全公开造成压制；相反，仔细区分状态报告、毫无惊慌地接收报告、决不压制下级，将能鼓励诚实的进度汇报，而这会使你在第一时间掌握实际进度，把握先机，及早做出正确的修订，从而避免了晚期才获得这些实际信息时，那种无力挽天时的无奈。此外、也可以在项目管理中设定一个合理的进度安排和一个具有挑战性的期望目标完成时间。期望目标和合理进度不同，期望目标完成时间，可以设为项目完成的成功率在30%左右时的日期，这样很具有挑战性，但不能强迫要求必须完成此期望目标。毕竟，合理进度安排才是更合理的时间安排。另外、需要指出的是现代敏捷方法论对此进行了有效改进，如XP(极限编程)中，就利用用户素材与CRC卡，进行优先级划分并进行快速增量迭代开发，针对原来开发的产品或第一次迭代开发后的原型完成的功能量，来计算功能点，从而估算每个CRC卡的功能点，得到总功能点来推导出比较准确的进度安排。</p>
		<p>
		</p>
		<p>第二、需求的变化</p>
		<p>
				<br />从项目的角度来说，需求总是向着膨胀的方向在变化。就连去掉某些已经做好的东西，也是一种膨胀，因为它增加了工作量。开发人员交付的是用户满意程度，而不仅仅是实际的产品，用户的实际需要会随着程序的构建和使用而变化。要知道，一个活着的软件必须面对变化，只有死掉的软件才不会有需求变化(没人用了)，我们应该尽早面对现实，而不是逃避，事先为它们做好思想准备。变化是好事不是什么坏事。同样，现代敏捷方法论强调对需求变化的快速响应，如XP(极限编程)就采用快速增量迭代开发，来在短时间内开发出功能不断增强的原型软件提交给用户使用的方法，来快速响应需求的变化。</p>
		<p>
		</p>
		<p>第三、人员的变更</p>
		<p>
				<br />在我们有些管理者中，总是假设开发者都是可以随便替换的，新员工马上可以取代离去的老员工，多么愚蠢的假设。解雇员工或高的员工替换率最大的影响，是使软件项目失去了连续性。这是在抱着这种假设的团队文化中，大量员工会在项目进行到一半时离开，新来员工往往需要1到3个月的上道时间，在这段时间内，他们做不了什么，还经常需要其它老员工的帮助，从而浪费了其它老员工很多不必要时间，导致项目进展更加缓慢，最终造成项目的很大损失。</p>
		<p>
				<br />另外、还有一种现象在中国软件事业中普遍存在，当正在进行一个项目时，另一个项目由于进度落后或最后期限等原因所致，高层管理者就会从你的团队中抽掉一些人去到另一个项目中补墙。这种拆东墙补西墙的作法，往往导致的结果是两个项目都会落后，因为它不仅十分错误作了团队人员可以随意替换的假设，而且还作了将开发人数与开发所需时间可以互换的错误假设。盲目的认为，投入大量人数后，新人马上会投入新的工作，这样项目开发所需时间就会成倍缩短。在这种组织文化中，是不会形成一支稳定的团队的，成员整天只会忙碌着补自已的墙或为别人补墙，充当着类似消防员的角色，那儿有火那儿就有我们的身影。</p>
		<p>
				<br />同样，现代敏捷方法论非常注重人的能力，如XP中通过权力下放、教练角色、将团队紧密围在一起并结对编程、小团队组成等方式，来组成一个强有力的团队，由于有凝聚力，所以很少有大的人员变动，他们往往可以完成两倍于他们人数所能完成的任务。非常小的团队能够产生非常大的物质生产力，有时候，小团队可以在很短时间内创造奇迹，而大型团队极少能做到。但是，小团队却往往得不到足够的政策支持，从而导致任由团队超编，这是一种病态组织文化所致。作为管理者必须明确知道，拥有一支稳定的、有凝聚力的开发团队是组织最大的财富，而不是障碍。</p>
		<p>第四、规约崩溃</p>
		<p>
				<br />这种情况只有两种结果：要么发生，要么不发生，不会有不同程度的影响。但它真的发生时，它会直接毁灭你的整个项目。在项目启动之初，项目各方需要通过一系列商谈来确定需求的范围，规约崩溃就是指这个谈判过程的崩溃。在商谈期间，很多时候当遇到严重冲突时，由于双方都不愿意让步，但又不想放弃这个项目，从而导致这些冲突被掩盖起来。最终项目便朝着一个带着缺陷的、含混不清的目标前进了，被掩盖的问题暂时不会打扰你，但不是永远。尽管你可以含混说明一个产品，但不能含混构造一个产品，所以，最终在项目晚期这些问题将发生，在大半甚至所有预算时间和金钱都已付出的时候，此时，任何一方不再全力支持，都将使项目被取消。任何规格文档中的含糊标志着不同的系统参与者之间存在着未解决的冲突。只要在开发过程中有多个参与者，就一定会有冲突存在。谈判困难而调解容易，如果两个人的利益是完全或部分相斥的，预先做好安排，准备好请双方通过调解来解决冲突。同样，现代敏捷方法论通过客户的积极参与胜过合同谈判的方试，来尽早发现和避免规约崩溃。</p>
		<p>
				<br />第五、低效率</p>
		<p>
				<br />对于项目成功而言，项目人员的素质、人员的组织和管理是比使用的工具或采用的技术方法更重要的因素。团队质量是项目成功最大的决定因素，对人的关注、激励和培养胜过一切。项目管理人员的职责不是要人们去工作，而是给人们创造工作的可能。创造力来自于个人，而不是组织架构和流程，项目管理者面临的中心问题就是如何设计架构和流程，来提高而不是压制人们的主动性和创造力。通过权力的向下委派，从而产生了改进的质量、提高的生产率、高涨的士气，进而使中心的权威实际上得到了加强。就整体而言，组织机构会更加融洽和繁荣。增加加班时间只会降低生产力，压力之下的人们无法更快地思考既也会降低生产力。使用压力和加班的真正原因是为了在项目失败时让人们看上去能好受一些。</p>
		<p>
				<br />正式的过程改进程序需要花钱、花时间，特定的过程改进工作还会延缓项目进度，尽管最终会体现生产力上的收获，它们也不可能抵消花在过程改进上的时间。多种技术的改进程序(如CMM提级)很可能让项目比不实施这些程序完成得更晚，对于人员超编的项目，标准过程会为多余的人们制造出足够的工作，让所有人都忙个不停，尽管很多是无用的，这也导致生产率低下。人员超编的团队往往生产率低下，因为它们团队内部耦合度提高，会议时间、重复劳动和无效工作都会增加。理想的人员安排是在项目的大部分时间里由小型核心团队来做设计工作，在开发的最后阶段再逐渐加入大量人手。如果不大幅度减少调试的时间，就没办法让项目大幅度提前完成，而要成比例减少调试时间，就需要成比例增加设计所需时间，因为绝大多数的错误源于接口缺陷，编码前进行的正规而完善的设计，可以大幅度减少错误。同样，现代敏捷方法论通过注重人、快速迭代开发、自组织的团队和提倡可持续的开发速度，来避免跑的过快导致团队精力耗尽、出现短期行为而导致崩溃的问题，从而保持了稳定的生产率。</p>
		<p>
				<br />精兵简政是失败公司使用的办法，它让员工负担失败的责任。成功公司的目标应该正好相反：兴旺、发达、而人性化。 </p>
		<p>　　　　　　　　　　　　　　　　　　　　　　　　　　　　<br />企业的最大风险则与价值相关：在低价值的项目上浪费资源，付出高价值的机会成本，就这是企业最大风险。勇于承担风险是好事，但必须由收益来导航，愿意承担多少风险，必须取决于能获得多少收益。真正的项目评估不是倾向于不断削减成本，来提高价值，而是在风险与价值之间取得平衡点。通过不确定的价值和不确定风险组合效果的净收益图，来指导你把资本投入到最适当的地方。我们每个软件从业人员都必须明白：顾客真正需要的，是我们能够给他的、某种他想得到的利益。</p>
<img src ="http://www.cppblog.com/tx7do/aggbug/12864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-23 23:23 <a href="http://www.cppblog.com/tx7do/archive/2006/09/23/12864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)连连看API版本的源代码</title><link>http://www.cppblog.com/tx7do/archive/2006/09/17/12597.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 17 Sep 2006 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/17/12597.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12597.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/17/12597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12597.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12597.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#0000ff" size="6">head.h</font>
		</p>
		<p>#define M 14<br />//M为连连看牌的高+2<br />#define N 10<br />//N为连连看牌的宽+2</p>
		<p>struct point<br />{<br /> int x;<br /> int y;<br />};</p>
		<p>/*********************************************************/</p>
		<p>template &lt; typename T, int m, int n &gt; class Matrix<br />{<br />protected: <br /> T matrix[M][N];<br />public:<br /> Matrix();<br /> Matrix( char* filename );//通过文件里的数据初始化<br /> void show_matrix();//输出矩阵<br /> void set_element( int x, int y, T num );//num为元素值<br /> T get_element( int x, int y );<br />};</p>
		<p>/*********************************************************/</p>
		<p>class Linker_Matrix:public Matrix &lt; int, M, N &gt;  //连连看的牌矩阵类<br />{<br /> /* matrix[M][N]为牌矩阵；<br />  从[1][1]开始，到[M-2][N-2]有效;<br />  外围一圈为预留的配对路径;<br />  值＝0为无牌，即牌配对之后被消掉的的状态;<br />  其他值即为牌的类别，相同值的牌方可配对;  <br /> */<br />private:<br /> //time_t curtime;<br /> point p1,p2,way[ 4 ];<br />  //p1为起点，p2为终点，way[M+N]用于记录搜索到的路径<br /> int index;//路径的长度;<br /> int turn_count;//路径的转弯次数,&gt;2就搜索失败;<br /> Matrix &lt; int, M, N &gt; visited;<br />  //是否访问过矩阵类，1:访问过 0:未访问 <br />public:</p>
		<p> Linker_Matrix();<br /> Linker_Matrix( int low, int high, int num );<br />  //随机选择元素初始化，元素值的范围在low－high，<br />  //每个值有num个;<br /> Linker_Matrix( int num );<br />  //随机选择元素初始化，从1开始，每个值有num个;<br />  <br /> void show_matrix();<br /> void count( int low, int high );//统计各个值的个数，测试用;<br /> bool auto_search();//自动搜索出一对配对的牌<br /> bool find_way( point p1, point p2 );<br />  //搜索路径 true－有路径 false－无;  <br /> void auto_play();//自动完成所有的配对；<br /> void init_search();//进行搜索前的初始化 <br /> bool man_search( point p1,  point p2);<br /> bool is_matched( point p1, point p2 );<br />  //是否配对 true－配对 false－否;<br /> int  get_element( int x, int y );<br /> void get_point(point &amp;p1,point &amp;p2);<br />  //通过p1,p2提取自动搜索出的匹配两点<br /> void reShuffle();//重新洗牌;<br />};</p>
		<p>/*********************************************************/<br /></p>
		<p>
				<font color="#0000ff" size="6">head.cpp</font>
		</p>
		<p>#include "head.h"<br />#include&lt;iostream.h&gt;<br />#include&lt;fstream.h&gt;<br />#include&lt;stdlib.h&gt;<br />#include&lt;stdio.h&gt;<br />#include&lt;math.h&gt;<br />#include&lt;time.h&gt;<br />#include&lt;conio.h&gt;</p>
		<p>
		</p>
		<p>template &lt; typename T, int m, int n &gt; <br />Matrix &lt; T, m, n &gt;::Matrix()<br />{<br /> for( int i=0; i&lt;m; i++ )<br />  for( int j=0; j&lt;n; j++ )<br />   matrix[i][j] = 0;<br /> <br />}</p>
		<p>template &lt; typename T, int m, int n &gt; <br />Matrix&lt; T, m, n &gt;::Matrix( char* filename )<br />{<br /> ifstream infile(filename);<br /> <br /> for( int i=0; i&lt;M; i++ )<br />  for( int j=0; j&lt;N; j++ )<br />   infile &gt;&gt; matrix[i][j];<br />}</p>
		<p>
		</p>
		<p>template &lt; typename T, int m, int n &gt; <br />void Matrix&lt; T, m, n &gt;::show_matrix()<br />{ <br /> for( int i=0; i&lt;m; i++ )<br /> {<br />  for( int j=0; j&lt;n; j++ )<br />   cout&lt;&lt; matrix[i][j]&lt;&lt;'\t';<br />  cout&lt;&lt;endl;<br /> }<br /> cout&lt;&lt;endl;<br />}</p>
		<p>template &lt; typename T, int m, int n &gt; <br />inline void Matrix&lt; T, m, n &gt;::set_element( int x, int y, T element )<br />{<br /> matrix[x][y] = element;<br />}</p>
		<p>template &lt; typename T, int m, int n &gt; <br />T Matrix&lt; T, m, n &gt;::get_element( int x, int y )<br />{<br /> return matrix[x][y];<br />}</p>
		<p>/*********************************************************/</p>
		<p>Linker_Matrix::Linker_Matrix():Matrix&lt; int, M, N &gt;()<br />{<br /> p1.x = p1.y = 0;<br /> p2.x = p2.y = 0;<br /> index = 0;<br /> turn_count = 0;<br /> //max=0;</p>
		<p> for( int k=0; k&lt;4; k++ )<br />  way[k].x = way[k].y = 0;<br />}</p>
		<p>Linker_Matrix::Linker_Matrix( int low, int high, int num )<br /> :Matrix&lt; int, M, N &gt;()<br />{ <br /> <br /> int m,n;<br /> time_t curtime; //记录当前时间</p>
		<p> p1.x = p1.y = 0;<br /> p2.x = p2.y = 0;<br /> index = 0;</p>
		<p> time(&amp;curtime);//取得当前时间<br /> //srand(curtime);//用当前时间作种子，产生随机数</p>
		<p> for( int k=0; k&lt;4; k++ )<br />  way[k].x = way[k].y = 0;</p>
		<p> for( int i=low; i&lt;=high; i++ )<br />  for( int j=0; j&lt;num; j++ )<br />  {<br />   do<br />   {<br />    m = rand()%(M-2) + 1;<br />    n = rand()%(N-2) + 1;<br />   }<br />   while( 0==m || 0==n || 0!=matrix[m][n] );<br />   matrix[m][n]=i;<br />  }<br />}</p>
		<p>Linker_Matrix::Linker_Matrix(int num ):Matrix&lt; int, M, N &gt;()<br />{ <br /> <br /> int m,n;<br /> time_t curtime; //记录当前时间</p>
		<p> p1.x = p1.y = 0;<br /> p2.x = p2.y = 0;<br /> index = 0;</p>
		<p> time(&amp;curtime);//取得当前时间<br /> srand(curtime);//用当前时间作种子，产生随机数</p>
		<p> for( int k=0; k&lt;4; k++ )<br />  way[k].x = way[k].y = 0;</p>
		<p> for( int i=1; i&lt;=(M-2)*(N-2)/num; i++ )<br />  for( int j=0; j&lt;num; j++ )<br />  {<br />   do<br />   {<br />    m = rand()%(M-2) + 1;<br />    n = rand()%(N-2) + 1;<br />   }<br />   while( 0==m || 0==n || 0!=matrix[m][n] );<br />   matrix[m][n]=i;<br />  }<br />}</p>
		<p>void Linker_Matrix::show_matrix()<br />{<br /> <br /> for( int i=1; i&lt;M-1; i++ )<br /> {<br />  for( int j=1; j&lt;N-1; j++ )<br />   cout&lt;&lt;matrix[i][j]&lt;&lt;'\t';<br />  cout&lt;&lt;endl;<br /> }<br /> cout&lt;&lt;endl;<br />}</p>
		<p>void Linker_Matrix::count( int low, int high )<br />{<br /> int *num,k;</p>
		<p> //动态分配 <br /> num = new int[ high-low+2 ];<br /> //初始化<br /> for( k=0; k&lt;high-low+2; k++ )<br />  num[k]=0;<br /> <br /> //计数<br /> for( int i=1; i&lt;M-1; i++ )<br />  for( int j=1; j&lt;N-1; j++ )<br />   num[ matrix[i][j] ]++; <br />  <br /> //输出<br /> for( k=0; k&lt;high-low+2; k++ )<br />  cout&lt;&lt;k&lt;&lt;":"&lt;&lt;num[k]&lt;&lt;'\t';<br /> cout&lt;&lt;endl;</p>
		<p> //销毁<br /> delete[] num;<br />}</p>
		<p>inline bool Linker_Matrix::is_matched( const point p1, const point p2 )<br />{<br /> return matrix[ p1.x ][ p1.y ] == matrix[ p2.x ][ p2.y ];<br />}</p>
		<p>bool Linker_Matrix::auto_search()<br />{<br /> int i,j,m,n;<br /> //static k = 0;<br /> bool all_is_zero = true;//是否所有元素都为0 true:yes false:no</p>
		<p> for( i=1; i&lt;M-1; i++ )<br /> for( j=1; j&lt;N-1; j++ )<br /> {<br />  if( matrix[i][j]!=0 )//元素不为0时方进行配对<br />  {<br />   all_is_zero=false;<br />   p1.x = i; p1.y = j;</p>
		<p>   for( m=1; m&lt;M-1; m++ )<br />   for( n=1; n&lt;N-1; n++ )<br />   { <br />    if( i!=m || j!=n )//元素不为本身时，方进行搜索路径<br />    { <br />     //k++;<br />     p2.x=m; p2.y=n;</p>
		<p>     init_search();<br />     /*if(k==29)<br />     {<br />      init_search();<br />      show_matrix();<br />     }*/<br />     <br />     if ( is_matched( p1, p2 ) &amp;&amp; find_way( p1, p2 ) )<br />     /*逻辑式这样写的原因是只要is_matched(p1,p2)为false，<br />     逻辑式必为false，find_way(p1,p2)就不会执行；<br />     当两元素数值相同且有路径时，执行下面<br />     */<br />     { <br />       //show_matrix();<br />       //cout&lt;&lt;turn_count&lt;&lt;endl;<br />       //matrix[ p1.x ][ p1.y ] = 0;<br />       //matrix[ p2.x ][ p2.y ] = 0;<br />       //k++;<br />       //cout&lt;&lt;p1.x&lt;&lt;' '&lt;&lt;p1.y&lt;&lt;' '&lt;&lt;p2.x&lt;&lt;' '&lt;&lt;p2.y&lt;&lt;':'&lt;&lt;k&lt;&lt;endl;<br />       //show_matrix();<br />       //count(1,21);<br />       //goto jump;<br />       //找到一个就退出<br />      <br />       return true;<br />      //}<br />     }<br />     <br />    }/*<br />    if( k&gt;MAX)//搜索次数过大，强制跳出<br />        return false;*/<br />   }<br />  }<br />  //jump:  ;<br /> }</p>
		<p> if( true==all_is_zero )//元素全部为0，返回false<br />  return false;<br /> return false;//没有匹配时,返回false<br />}</p>
		<p>bool Linker_Matrix::find_way(  point p1, point p2 )<br />{<br /> /*<br /> 本方法是本程序的核心算法，<br /> 作用是以p1为起点，p2为终点进行路径的搜索；*/<br /> /*采用水平垂直扫描法,先确定两个转折点之间是否相通,再判断<br /> 转折点与相应端点间是否相通<br /> */</p>
		<p> int i,j;<br /> int px1,px2,py1,py2;<br /> int temp;<br /> bool x_across,y_across;</p>
		<p> //如果相邻<br /> if( ( p1.x+1==p2.x &amp;&amp; p1.y==p2.y )<br />  || ( p1.x==p2.x &amp;&amp; p1.y+1==p2.y )<br />  || ( p1.x-1==p2.x &amp;&amp; p1.y==p2.y )<br />  || ( p1.x==p2.x &amp;&amp; p1.y-1==p2.y ) )<br /> {<br />  //把路径记录下来<br />  //起点<br />  way[0].x=p1.x;<br />  way[0].y=p1.y;<br />  //直线转折点为0<br />  way[1].x=0;<br />  way[1].y=0;<br />  way[2].x=0;<br />  way[2].y=0;<br />  //终点<br />  way[3].x=p2.x;<br />  way[3].y=p2.y;</p>
		<p>  return true;<br /> }</p>
		<p> //直线连通<br /> //如果在水平方向上<br /> if( p1.x==p2.x )<br /> {<br />  if(p1.y&gt;p2.y)<br />  {<br />   temp=p1.y;<br />   p1.y=p2.y;<br />   p2.y=temp;<br />  }</p>
		<p>  for(j=p1.y+1; j&lt;p2.y; j++ )<br />  {<br />   if( matrix[p1.x][j]!=0)<br />   {<br />    break;<br />   }<br />  }</p>
		<p>  //如果两点之间相通<br />  if(j==p2.y &amp;&amp;  matrix[p1.x][j-1]==0 )<br />  {<br />   <br />   //把路径记录下来<br />   //起点<br />   way[0].x=p1.x;<br />   way[0].y=p1.y;<br />   //直线转折点为0<br />   way[1].x=0;<br />   way[1].y=0;<br />   way[2].x=0;<br />   way[2].y=0;<br />   //终点<br />   way[3].x=p2.x;<br />   way[3].y=p2.y;</p>
		<p>   return true;<br />  }<br /> }</p>
		<p> //如果在垂直方向上<br /> if( p1.y==p2.y )<br /> {<br />  if(p1.x&gt;p2.x)<br />  {<br />   temp=p1.x;<br />   p1.x=p2.x;<br />   p2.x=temp;<br />  }</p>
		<p>  for(i=p1.x+1; i&lt;p2.x; i++ )<br />  {<br />   if( matrix[i][p1.y]!=0)<br />   {<br />    break;<br />   }<br />  }<br />  //如果两点之间相通<br />  if(i==p2.x &amp;&amp;  matrix[i-1][p1.y]==0 )<br />  {</p>
		<p>
				<br />   //把路径记录下来<br />   //起点<br />   way[0].x=p1.x;<br />   way[0].y=p1.y;<br />   //直线转折点为0<br />   way[1].x=0;<br />   way[1].y=0;<br />   way[2].x=0;<br />   way[2].y=0;<br />   //终点<br />   way[3].x=p2.x;<br />   way[3].y=p2.y;</p>
		<p>   return true;<br />  }<br /> }</p>
		<p>
				<br /> <br /> //折线连通<br /> /*if( p1.x!=p2.x &amp;&amp; p1.y!=p2.y)<br /> {*/<br />  if(p1.y&gt;p2.y)<br />  {<br />   //两点交换<br />   temp=p1.x;<br />   p1.x=p2.x;<br />   p2.x=temp;</p>
		<p>   temp=p1.y;<br />   p1.y=p2.y;<br />   p2.y=temp;</p>
		<p>
				<br />  }</p>
		<p>
				<br /> //横向扫描<br /> for(i=0;i&lt;=M-1;i++)<br /> {  <br />  x_across=true;</p>
		<p>  //是否水平连通<br />  for(j=p1.y+1; j&lt;=p2.y-1; j++ )<br />  {<br />   if(matrix[i][j]!=0 )<br />   {<br />    x_across=false;<br />    break;<br />   }<br />  }</p>
		<p>  if(matrix[i][p1.y]!=0  )<br />  {<br />   if( i!=p1.x )<br />    x_across=false;<br />  }<br />  if(matrix[i][p2.y]!=0  )<br />  {<br />   if( i!=p2.x )<br />    x_across=false;<br />  } <br />   <br />  if(x_across)<br />  {//水平连通才执行下面<br />  /* for(j=1; j&lt;N-2; j++ )<br />   {*/<br />    //检验在垂直上是否连通</p>
		<p>   px1=px2=i;<br />   py1=p1.y;<br />   py2=p2.y;<br />   while( px1!=p1.x || px2!=p2.x )<br />   {<br />    //如果当前点不空且不为p1点,就跳出循环,从下一行开始检测<br />    if( matrix[px1][py1]!=0 &amp;&amp; (px1!=p1.x || py1!=p1.y) )<br />     break;</p>
		<p>    //如果当前点不空且不为p2点,就跳出循环,从下一行开始检测<br />    if( matrix[px2][py2]!=0 &amp;&amp; (px2!=p2.x || py2!=p2.y) )<br />     break;</p>
		<p>    //如果两点都为空<br />    //垂直向p1点靠近一格<br />    if(px1&lt;p1.x)<br />     px1++;<br />    else if(px1&gt;p1.x)<br />     px1--;<br />    //垂直向p2点靠近一格<br />    if(px2&lt;p2.x)<br />     px2++;<br />    else if(px2&gt;p2.x)<br />     px2--;<br />   }<br />     <br />   //如果能到达两个端点<br />   if(px1==p1.x &amp;&amp; py1==p1.y &amp;&amp; px2==p2.x &amp;&amp; py2==p2.y )<br />   {<br />    //起点<br />    way[0].x=p1.x;<br />    way[0].y=p1.y;<br />    //两个转折点<br />    way[1].x=i;<br />    way[1].y=p1.y;<br />    way[2].x=i;<br />    way[2].y=p2.y;<br />    //终点<br />    way[3].x=p2.x;<br />    way[3].y=p2.y; <br />    return true;<br />   }</p>
		<p>  }<br /> }</p>
		<p> if(p1.x&gt;p2.x)<br />  {<br />   //两点交换<br />   temp=p1.x;<br />   p1.x=p2.x;<br />   p2.x=temp;</p>
		<p>   temp=p1.y;<br />   p1.y=p2.y;<br />   p2.y=temp;</p>
		<p>
				<br />  }<br /> //纵向扫描<br /> for(j=0;j&lt;=N-1;j++)<br /> {  <br />  y_across=true;<br />  //是否垂直连通<br />  for(i=p1.x+1; i&lt;=p2.x-1; i++ )<br />  {<br />   if(matrix[i][j]!=0)<br />   {<br />    y_across=false;<br />    break;<br />   }<br />  }</p>
		<p>  if(matrix[p1.x][j]!=0  )<br />  {<br />   if( j!=p1.y )<br />    y_across=false;<br />  }<br />  if(matrix[p2.x][j]!=0  )<br />  {<br />   if( j!=p2.y )<br />    y_across=false;<br />  }<br />    <br />  if(y_across)<br />  {//垂直连通才执行下面<br />  /* for(j=1; j&lt;N-2; j++ )<br />   {*/<br />    //检验在水平上是否连通</p>
		<p>   py1=py2=j;<br />   px1=p1.x;<br />   px2=p2.x;<br />   while( py1!=p1.y || py2!=p2.y)<br />   {<br />    //如果当前点不空且不为p1点,就跳出循环,从下一行开始检测<br />    if( matrix[px1][py1]!=0 &amp;&amp; (px1!=p1.x || py1!=p1.y) )<br />     break;</p>
		<p>    //如果当前点不空且不为p2点,就跳出循环,从下一行开始检测<br />    if( matrix[px2][py2]!=0 &amp;&amp; (px2!=p2.x || py2!=p2.y) )<br />     break;</p>
		<p>    //如果两点都为空<br />    //水平向p1点靠近一格<br />    if(py1&lt;p1.y)<br />     py1++;<br />    else if(py1&gt;p1.y)<br />     py1--;<br />    //水平向p2点靠近一格<br />    if(py2&lt;p2.y)<br />     py2++;<br />    else if(py2&gt;p2.y)<br />     py2--;<br />   }<br />     <br />   //如果能到达两个端点<br />   if(px1==p1.x &amp;&amp; py1==p1.y &amp;&amp; px2==p2.x &amp;&amp; py2==p2.y )<br />   {<br />    //起点<br />    way[0].x=p1.x;<br />    way[0].y=p1.y;<br />    //两个转折点<br />    way[1].x=p1.x;<br />    way[1].y=j;<br />    way[2].x=p2.x;<br />    way[2].y=j;<br />    //终点<br />    way[3].x=p2.x;<br />    way[3].y=p2.y; <br />    return true;<br />   }</p>
		<p>  }<br /> }<br /> //} <br /> return false;</p>
		<p>}</p>
		<p>void Linker_Matrix::init_search()<br />{<br /> visited = Matrix&lt; int, M, N &gt;();<br /> index = 0;<br /> turn_count = 0;<br />}</p>
		<p>void Linker_Matrix::auto_play()<br />{<br />  while( auto_search() );<br />}</p>
		<p>bool Linker_Matrix::man_search(const point p1, const point p2)<br />{<br /> init_search();<br /> if( find_way( p1, p2 ) )<br /> {<br />  matrix[p1.x][p1.y]=0;<br />  matrix[p2.x][p2.y]=0;<br />  return true;<br /> }<br /> return false;<br />}</p>
		<p> int Linker_Matrix::get_element( int x, int y )<br /> {<br />  return matrix[x][y];<br /> }</p>
		<p>void Linker_Matrix::get_point(point &amp;p1,point &amp;p2)<br />{<br /> //if( auto_search() )<br /> //{<br />  p1=this-&gt;p1;<br />  p2=this-&gt;p2;<br />  //return true;<br /> //}<br /> <br /> //return false;<br />}</p>
		<p>void Linker_Matrix::reShuffle()<br />{<br /> int m,n,k;<br /> time_t curtime; //记录当前时间</p>
		<p> //p1.x = p1.y = 0;<br /> //p2.x = p2.y = 0;<br /> //index = 0;</p>
		<p> time(&amp;curtime);//取得当前时间<br /> srand(curtime);//用当前时间作种子，产生随机数</p>
		<p> //for( int k=0; k&lt;4; k++ )<br /> // way[k].x = way[k].y = 0;</p>
		<p> for( int i=1; i&lt;=(M-2); i++ )<br /> for( int j=1; j&lt;=(N-2); j++ )<br /> {<br />  if(matrix[i][j]!=0)<br />  {<br />   do<br />   {<br />    m = rand()%(M-2) + 1;<br />    n = rand()%(N-2) + 1;<br />   }<br />   while( 0==matrix[m][n] );</p>
		<p>   k=matrix[i][j];<br />   matrix[i][j]=matrix[m][n];<br />   matrix[m][n]=k;<br />  }<br /> }<br />}</p>
		<p>
		</p>
		<p>
				<font color="#0000ff" size="6">linker.cpp</font>
		</p>
		<p>#include&lt;stdlib.h&gt;<br />#include&lt;stdio.h&gt;<br />#include&lt;string.h&gt;<br />#include &lt;windows.h&gt;</p>
		<p>#include "head.h"<br />#include "resource.h"</p>
		<p>TCHAR szAppName[] = TEXT ("Linker") ;//程序名称<br />const int xsize=610,ysize=520;<br />const int TimerID=1;</p>
		<p>
				<br />LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ) ;</p>
		<p>int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,<br />                    PSTR szCmdLine, int iCmdShow )<br />{ <br /> HWND         hwnd ;<br /> MSG          msg ;<br /> WNDCLASS     wndclass ;<br /> HACCEL hAccel ;//快捷键表</p>
		<p>
				<br /> wndclass.style         = CS_HREDRAW | CS_VREDRAW ;<br /> wndclass.lpfnWndProc   = WndProc ;<br /> wndclass.cbClsExtra    = 0 ;<br /> wndclass.cbWndExtra    = 0 ;<br /> wndclass.hInstance     = hInstance ;<br /> wndclass.hIcon         = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)) ;<br /> wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;<br /> wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;<br /> wndclass.lpszMenuName  = szAppName ;<br /> wndclass.lpszClassName = szAppName ;</p>
		<p> if (!RegisterClass (&amp;wndclass))<br /> {<br />  MessageBox (NULL, TEXT ("This program requires Windows NT!"), <br />    szAppName, MB_ICONERROR) ;<br />  return 0 ;<br /> }<br />     <br /> hwnd = CreateWindow ( szAppName,  // window class name<br />                          TEXT ("连连看 V1.08.18.01"), // window caption<br />                          WS_OVERLAPPEDWINDOW &amp; <br />     ~WS_MAXIMIZEBOX &amp; ~WS_SIZEBOX,// window style<br />     //没有最大化按钮和无法改变窗口大小<br />                          CW_USEDEFAULT,  // initial x position<br />                          CW_USEDEFAULT,  // initial y position<br />                          xsize,  // initial x size<br />                          ysize,  // initial y size<br />                          NULL,    // parent window handle<br />                          NULL,    // window menu handle<br />                          hInstance,   // program instance handle<br />                          NULL ) ;   // creation parameters<br />     <br /> ShowWindow (hwnd, iCmdShow) ;<br /> UpdateWindow (hwnd) ;<br />     <br /> hAccel = LoadAccelerators (hInstance, TEXT ("MY_ACCELERATOR")) ;</p>
		<p> while(GetMessage (&amp;msg, NULL, 0, 0))<br /> {<br />  if(!TranslateAccelerator (hwnd, hAccel, &amp;msg))<br />  {<br />                  TranslateMessage (&amp;msg) ;<br />                  DispatchMessage (&amp;msg) ;<br />  }<br /> }</p>
		<p> return msg.wParam ;<br />}</p>
		<p>BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, <br />                            WPARAM wParam, LPARAM lParam)<br />{<br />     switch (message)<br />     {<br />     case WM_INITDIALOG :<br />          return TRUE ;<br />          <br />     case WM_COMMAND :<br />          switch (LOWORD (wParam))<br />          {<br />          case IDOK :<br />          case IDCANCEL :<br />               EndDialog (hDlg, 0) ;<br />               return TRUE ;<br />          }<br />          break ;<br />     }<br />     return FALSE ;<br />}</p>
		<p>LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, <br />    WPARAM wParam, LPARAM lParam )<br />{<br /> HDC  hdc,hdcMem;<br /> //HBRUSH hBrush ;<br /> PAINTSTRUCT ps ;//绘图结构<br /> static RECT  rect,rect2 ;//矩形<br /> static HBITMAP hBitmap1,hBitmap2;//两个位图文件句柄<br /> HBITMAP hBitmap3;<br /> BITMAP  bitmap ;//位图文件<br /> static int cxBack,cyBack,cxPre,cyPre,cxStart,cyStart;<br />    //cxBack,cyBack:背景图片大小<br />    //cxPre,cyPre:牌面图片大小  <br /> int x,y,i,j,num;</p>
		<p> bool find;//是否有路径标志<br /> static bool first_started=false;//是否是刚打开程序<br /> static bool bPrompt=false;//是否提示<br /> TCHAR    szBuffer[14];<br /> static HINSTANCE hInstance ;<br /> static HMENU  hMenu ;//菜单句柄<br /> static int  iCurrentLevel = IDM_APP_LOW ;//记录游戏难度<br /> static int  iTime = 100 ;//记录游戏的剩余时间<br /> static  int  iShuffle=0,iPrompt=0;<br />  //iShuffle:重新洗牌的剩余次数,iPrompt:提示的剩余次数<br /> static int iCount=0;//统计消去的对数,用于判断是否胜利<br /> static Linker_Matrix linker ;//连连看的运算矩阵<br /> static point  pSelected[2] ;//用于记录选择的两个点<br />     <br /> switch (message)<br /> {<br /> case WM_CREATE://进行初始化；<br />  //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;<br />  //GetClientRect(hwnd,&amp;rect);</p>
		<p>  MoveWindow(hwnd,(GetSystemMetrics(SM_CXSCREEN)-xsize)/2,(GetSystemMetrics(SM_CYSCREEN)-ysize)/2,xsize,ysize,false);<br />  //将窗口移置屏幕中间</p>
		<p>  hInstance = ((LPCREATESTRUCT) lParam)-&gt;hInstance ;<br />  hMenu = GetMenu (hwnd) ;<br />  pSelected[0].x=pSelected[0].y=0;<br />  pSelected[1].x=pSelected[1].y=0;</p>
		<p>  hBitmap1 = LoadBitmap (hInstance, TEXT ("IDB_BITMAP_BACK"));<br />  hBitmap2 = LoadBitmap (hInstance, TEXT ("IDB_BITMAP_PRE"));<br />  </p>
		<p>  GetObject (hBitmap1, sizeof (BITMAP), &amp;bitmap) ;</p>
		<p>  cxBack = bitmap.bmWidth ;<br />  cyBack = bitmap.bmHeight/7 ;<br />  GetObject (hBitmap2, sizeof (BITMAP), &amp;bitmap) ;</p>
		<p>  cxPre = bitmap.bmWidth/2 ;<br />  cyPre = bitmap.bmHeight/42 ;</p>
		<p>  //SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);<br />  first_started=true;<br />  <br />  return 0 ;</p>
		<p> case WM_TIMER:<br />  if(iTime&gt;0)<br />   iTime--;</p>
		<p>  //使字体所在区域无效化,重绘<br />  rect.left = 0;<br />  rect.right = xsize;<br />  rect.top  = 0;<br />  rect.bottom = 20;<br />  InvalidateRect (hwnd, &amp;rect, true) ;<br />  rect.left = 0;<br />  rect.right = 0;<br />  rect.top  = 0;<br />  rect.bottom = 0;</p>
		<p>  if( iTime&lt;=0 )<br />  {<br />   iCount=0;<br />   KillTimer (hwnd, TimerID) ;<br />   MessageBox (hwnd, TEXT ("时间到，你输了!!"),szAppName, MB_OK | MB_ICONQUESTION) ;<br />   </p>
		<p>   SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);</p>
		<p>   linker=Linker_Matrix();<br />   InvalidateRect (hwnd, NULL, true) ;<br />  }<br />  </p>
		<p>
				<br />  return 0;</p>
		<p>  </p>
		<p> case WM_PAINT:<br />  hdc = BeginPaint (hwnd, &amp;ps) ;<br />  <br />  //GetClientRect (hwnd, &amp;rect) ;<br />  hdcMem = CreateCompatibleDC (hdc) ;<br />   <br />  </p>
		<p>  //绘制牌面<br />  for(i=1; i&lt;=M-2; i++ )<br />   for(j=1; j&lt;=N-2; j++ )<br />   {<br />    num=linker.get_element(i,j);<br />    if( num!=0 )<br />    {<br />    x=i*(cxBack-3);<br />    y=j*(cyBack-4)-30;<br />    SelectObject (hdcMem, hBitmap1) ;<br />    BitBlt (hdc, x, y, cxBack, cyBack, hdcMem, 0, cyBack*(num%6+1), SRCCOPY) ;<br />    SelectObject (hdcMem, hBitmap2) ;<br />    BitBlt (hdc, x+1, y+6, cxPre, cyPre, hdcMem,  cxPre, cyPre*num, SRCAND) ;<br />    BitBlt (hdc, x+1, y+6, cxPre, cyPre, hdcMem,  0, cyPre*num, SRCPAINT) ;<br />   <br />    }<br />   }<br />  <br />  //当选中第一张牌时，在上面画个圈<br />  if(rect.left!=0 &amp;&amp; rect.right!=0 &amp;&amp; rect.top!=0 &amp;&amp; rect.bottom!=0 &amp;&amp; bPrompt==false)<br />  {<br />   SelectObject (hdc, GetStockObject (GRAY_BRUSH)) ;<br />   Ellipse(hdc,rect.left ,rect.top ,rect.left+10 ,rect.top+10 );<br />   rect.left=0;<br />   rect.right=0 ;<br />   rect.top=0; <br />   rect.bottom=0;</p>
		<p>  }<br />  if( first_started==false)<br />  {<br />   sprintf(szBuffer,"剩余时间: %d 秒",iTime);<br />   TextOut (hdc, 0, 0, szBuffer, strlen (szBuffer)) ;<br />   TextOut (hdc, xsize/5, 0, TEXT("每消去一对剩余时间+2秒"), strlen (TEXT("每消去一对剩余时间+3秒"))) ;<br />   sprintf(szBuffer,"剩余洗牌次数: %d 次",iShuffle);<br />   TextOut (hdc, xsize/2+10, 0, szBuffer, strlen (szBuffer)) ;<br />   sprintf(szBuffer,"剩余提示次数: %d 次",iPrompt);<br />   TextOut (hdc, xsize/4*3, 0, szBuffer, strlen (szBuffer)) ;<br />  }</p>
		<p>  if(first_started)<br />  {//第一次打开程序</p>
		<p>   /*SendMessage(hwnd,WM_COMMAND,IDM_APP_ABOUT,0);<br />   //发送 单击关于菜单 消息<br />   SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);<br />   //发送 单击开始游戏菜单 消息，询问是否开始；*/<br />   hBitmap3 = LoadBitmap (hInstance, TEXT ("IDB_BITMAP_START"));<br />   GetObject (hBitmap3, sizeof (BITMAP), &amp;bitmap) ;<br />   cxStart = bitmap.bmWidth;<br />   cyStart = bitmap.bmHeight;</p>
		<p>   SelectObject (hdcMem, hBitmap3) ;<br />   StretchBlt  (hdc, 0, 0, xsize, ysize, hdcMem, 0,0, cxStart, cyStart,MERGECOPY) ;<br />   PlaySound (TEXT ("start.wav"), NULL, SND_FILENAME | SND_ASYNC) ;<br />   //first_started=false;<br />  }<br /> <br />  if(bPrompt)<br />  {<br />   SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;<br />   Ellipse(hdc,rect.left ,rect.top ,rect.left+10 ,rect.top+10 );<br />   Ellipse(hdc,rect2.left ,rect2.top ,rect2.left+10 ,rect2.top+10 );<br />   rect.left=0;<br />   rect.right=0 ;<br />   rect.top=0; <br />   rect.bottom=0;<br />   rect2.left=0;<br />   rect2.right=0 ;<br />   rect2.top=0; <br />   rect2.bottom=0;</p>
		<p>   bPrompt=false;<br />  }</p>
		<p>  DeleteDC (hdcMem) ;<br />  EndPaint (hwnd, &amp;ps) ;</p>
		<p>
		</p>
		<p>  return 0 ;<br /> case WM_INITMENUPOPUP:</p>
		<p>  if( first_started==false )<br />  {<br />   EnableMenuItem ((HMENU) wParam, IDM_APP_RESHUFFLE,   MF_ENABLED) ;<br />   EnableMenuItem ((HMENU) wParam, IDM_APP_PROMPT,   MF_ENABLED) ;<br />  }</p>
		<p>  if(iShuffle==0)<br />   EnableMenuItem ((HMENU) wParam, IDM_APP_RESHUFFLE,  MF_GRAYED) ;<br />  if(iPrompt==0)<br />   EnableMenuItem ((HMENU) wParam, IDM_APP_PROMPT,  MF_GRAYED) ;</p>
		<p>  <br />  break;</p>
		<p> case WM_COMMAND :<br />  switch (LOWORD (wParam))<br />  {</p>
		<p>  case IDM_APP_START://单击开始游戏菜单<br />   if ( IDYES == MessageBox (hwnd, TEXT ("开始游戏吗？"),<br />    szAppName, MB_YESNO | MB_ICONQUESTION) )<br />   //弹出确认窗口，按YES开始游戏<br />   {<br />    if ( iCurrentLevel==IDM_APP_LOW )<br />    {//难度为低<br />     iTime=90;<br />     iPrompt=3;<br />     iShuffle=2;<br />     linker=Linker_Matrix(6);<br />    <br />    }</p>
		<p>    if ( iCurrentLevel==IDM_APP_MIDDLE )<br />    {//难度为中<br />     iTime=90;<br />     iPrompt=3;<br />     iShuffle=2;<br />     linker=Linker_Matrix(4);<br />     <br />    }<br />    <br />    if ( iCurrentLevel==IDM_APP_HIGH )<br />    {//难度为高<br />     iTime=60;<br />     iPrompt=3;<br />     iShuffle=1;<br />     linker=Linker_Matrix(4);<br />    <br />    }<br />   <br />    SetTimer (hwnd, TimerID, 1000, NULL) ;<br />    InvalidateRect (hwnd, NULL, TRUE) ;<br />    first_started=false;<br />    iCount=0;</p>
		<p>   }<br />   else<br />    SendMessage(hwnd,WM_CLOSE,0,0);<br />   break;</p>
		<p>  case IDM_APP_EXIT ://单击退出游戏菜单<br />   SendMessage(hwnd,WM_CLOSE,0,0);<br />   break;</p>
		<p>  case IDM_APP_ABOUT ://单击关于菜单<br />   DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;<br />   break ;</p>
		<p>  case IDM_APP_LOW:<br />  case IDM_APP_MIDDLE:<br />  case IDM_APP_HIGH:<br />   //单击难度菜单<br />   CheckMenuItem (hMenu, iCurrentLevel, MF_UNCHECKED) ;<br />   iCurrentLevel = LOWORD (wParam) ;<br />   CheckMenuItem (hMenu, iCurrentLevel, MF_CHECKED) ;<br />   break;</p>
		<p>  case IDM_APP_RESHUFFLE://单击重新洗牌按钮<br />   if(iShuffle&gt;0 )<br />   { <br />    iShuffle--;<br />    linker.reShuffle();<br />   }<br />   //if(iShuffle==0)<br />    //EnableMenuItem ((HMENU) wParam, IDM_APP_RESHUFFLE,  MF_GRAYED) ;<br />   <br />   //使文字所在区域无效化,重绘<br />   /*rect.left = 0;<br />   rect.right = xsize;<br />   rect.top  = 0;<br />   rect.bottom = 20;*/<br />   InvalidateRect (hwnd, NULL , true) ;<br />   rect.left = 0;<br />   rect.right = 0;<br />   rect.top  = 0;<br />   rect.bottom = 0;<br />   break;</p>
		<p>  case IDM_APP_PROMPT:<br />   if(iPrompt&gt;0 &amp;&amp; linker.auto_search() )//提示次数&gt;0,且找到匹配<br />   {<br />    //pSelected[0].x=pSelected[0].y=0;<br />    linker.get_point(pSelected[0],pSelected[1]);<br />    iPrompt--;</p>
		<p>    //使文字所在区域无效化,重绘<br />    rect.left = 0;<br />    rect.right = xsize;<br />    rect.top  = 0;<br />    rect.bottom = 20;<br />    InvalidateRect (hwnd, &amp;rect, true) ;<br />    rect.left = 0;<br />    rect.right = 0;<br />    rect.top  = 0;<br />    rect.bottom = 0;<br />     <br />    //sprintf(szBuffer," %d %d %d %d",pSelected[0].x,pSelected[0].y,pSelected[1].x,pSelected[1].y);<br />    //MessageBox (hwnd, szBuffer,szAppName, MB_OK | MB_ICONQUESTION) ;<br />    <br />    rect.left = pSelected[0].x*(cxBack-3);<br />    rect.right = rect.left+(cxBack-3)+3;<br />    rect.top  = pSelected[0].y *(cyBack-4)-30;<br />    rect.bottom = rect.top + (cyBack-4)+4;<br />    //Ellipse(hdc,rect.left ,rect.top ,rect.right ,rect.bottom );<br />    InvalidateRect (hwnd, &amp;rect, true) ;<br />    <br />    rect2.left = pSelected[1].x *(cxBack-3);<br />    rect2.right = rect2.left+(cxBack-3)+3;<br />    rect2.top  = pSelected[1].y *(cyBack-4)-30;<br />    rect2.bottom = rect2.top + (cyBack-4)+4;<br />    //Ellipse(hdc,rect.left ,rect.top ,rect.right ,rect.bottom );<br />    InvalidateRect (hwnd, &amp;rect2, true) ;<br /> <br />    pSelected[0].x=0;<br />    pSelected[0].y=0;<br />    pSelected[1].x=0;<br />    pSelected[1].y=0;</p>
		<p>   }</p>
		<p>
		</p>
		<p>   bPrompt=true;<br />   //if(iPrompt==0)<br />    //EnableMenuItem ((HMENU) wParam, IDM_APP_PROMPT,  MF_GRAYED) ;<br />   break;<br />  }<br />  return 0 ;<br /> case WM_LBUTTONUP:<br />  //取得鼠标坐标<br />  x= LOWORD (lParam)/(cxBack-3);<br />  y= ( HIWORD (lParam)+30)/(cyBack-4);<br />  if (x&gt;=1 &amp;&amp; x&lt;=M-2 &amp;&amp; y&gt;=1 &amp;&amp; y&lt;=N-2 &amp;&amp; linker.get_element(x,y)!=0 )<br />  {<br />  /*<br />  sprintf(szBuffer,"%d",y);<br />  MessageBox (hwnd, TEXT (szBuffer),<br />    szAppName, MB_YESNO | MB_ICONQUESTION) ;*/<br />  //如果是在第一张牌按下鼠标<br />  if(pSelected[0].x==0 &amp;&amp; pSelected[0].y==0 )<br />  {<br />   //hBrush = GetStockObject (GRAY_BRUSH) ;<br />   //SelectObject (hdc, hBrush) ;<br />   <br />   //hdc = BeginPaint (hwnd, &amp;ps) ;<br />   //SelectObject (hdc, GetStockObject (BLACK_PEN)) ;</p>
		<p>   //在该牌上画圆<br />    rect.left = x *(cxBack-3);<br />    rect.right = rect.left+(cxBack-3)+3;<br />    rect.top  = y *(cyBack-4)-30;<br />    rect.bottom = rect.top + (cyBack-4)+4;<br />    //Ellipse(hdc,rect.left ,rect.top ,rect.right ,rect.bottom );<br />    InvalidateRect (hwnd, &amp;rect, true) ;<br />    //EndPaint (hwnd, &amp;ps) ;<br />   //把牌的位置记录下来<br />   pSelected[0].x=x;<br />   pSelected[0].y=y;<br />  }<br />  else <br />  { //如果是第二张牌上按鼠标</p>
		<p>   //把牌的位置记录下来<br />   pSelected[1].x=x;<br />   pSelected[1].y=y;</p>
		<p>  <br />   if( (pSelected[0].x!=pSelected[1].x ||<br />    pSelected[0].y!=pSelected[1].y) &amp;&amp;<br />    linker.is_matched(pSelected[0],pSelected[1]) )<br />   {//如果不是同一张牌并且花色一致<br />    <br />    //寻找路径<br />    find=linker.man_search(pSelected[0],pSelected[1])<br />     || linker.man_search(pSelected[1],pSelected[0]);;</p>
		<p>    if(find)<br />    {//找到</p>
		<p>     //GetClientRect (hwnd, &amp;rect) ;<br />     rect.left = pSelected[0].x *(cxBack-3);<br />     rect.right = rect.left+(cxBack-3)+3;<br />     rect.top  = pSelected[0].y *(cyBack-4)-30;<br />     rect.bottom = rect.top + (cyBack-4)+4;<br />     InvalidateRect (hwnd, &amp;rect, true) ;</p>
		<p>     rect.left = pSelected[1].x *(cxBack-3);<br />     rect.right = rect.left+(cxBack-3)+3;<br />     rect.top  = pSelected[1].y *(cyBack-4)-30;<br />     rect.bottom = rect.top + (cyBack-4)+4;<br />     InvalidateRect (hwnd, &amp;rect, true) ;</p>
		<p>     rect.left=0;<br />     rect.right=0 ;<br />     rect.top=0; <br />     rect.bottom=0;</p>
		<p>     iCount++;<br />     iTime+=2;</p>
		<p>     PlaySound (TEXT ("yes.wav"), NULL, SND_FILENAME | SND_ASYNC) ;</p>
		<p>     //InvalidateRect (hwnd, NULL, true) ;</p>
		<p>    }<br />    else<br />    {//没找到<br />    /*<br />     sprintf(szBuffer,"%d",find);<br />     MessageBox (hwnd, TEXT (szBuffer),<br />     szAppName, MB_YESNO | MB_ICONQUESTION) ;*/</p>
		<p>     rect.left = pSelected[0].x *(cxBack-3);<br />     rect.right = rect.left+(cxBack-3)+3;<br />     rect.top  = pSelected[0].y *(cyBack-4)-30;<br />     rect.bottom = rect.top + (cyBack-4)+4;<br />     InvalidateRect (hwnd, &amp;rect, true) ;</p>
		<p>     rect.left=0;<br />     rect.right=0 ;<br />     rect.top=0; <br />     rect.bottom=0;<br />     PlaySound (TEXT ("no.wav"), NULL, SND_FILENAME | SND_ASYNC) ;<br />    <br />    }<br />    pSelected[0].x=0;<br />    pSelected[0].y=0;<br />    pSelected[1].x=0;<br />    pSelected[1].y=0;</p>
		<p>    <br />   }<br />   else<br />   {//同一张牌或花色不一致</p>
		<p>    rect.left = pSelected[0].x *(cxBack-3);<br />    rect.right = rect.left+(cxBack-3)+3;<br />    rect.top  = pSelected[0].y *(cyBack-4)-30;<br />    rect.bottom = rect.top + (cyBack-4)+4;<br />    InvalidateRect (hwnd, &amp;rect, true) ;</p>
		<p>    pSelected[0].x=x;<br />    pSelected[0].y=y;<br />    pSelected[1].x=0;<br />    pSelected[1].y=0;</p>
		<p>    rect.left = pSelected[0].x *(cxBack-3);<br />    rect.right = rect.left+(cxBack-3)+3;<br />    rect.top  = pSelected[0].y *(cyBack-4)-30;<br />    rect.bottom = rect.top + (cyBack-4)+4;<br />    InvalidateRect (hwnd, &amp;rect, true) ;<br />    /*<br />    rect.left=0;<br />    rect.right=0 ;<br />    rect.top=0; <br />    rect.bottom=0;*/<br />   }<br />  </p>
		<p>  }<br />  }</p>
		<p>  if( iCount==(M-2)*(N-2)/2 )<br />  { <br />   iCount=0;<br />   KillTimer (hwnd, TimerID) ;<br />   MessageBox (hwnd, TEXT ("恭喜你，你赢了!!"),szAppName, MB_OK | MB_ICONQUESTION) ;</p>
		<p>
				<br />   SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);<br />  }<br />  return 0;<br />  </p>
		<p> case WM_CLOSE://用户关闭程序<br />  if ( IDYES == MessageBox (hwnd, TEXT ("确认关闭程序"),<br />    szAppName, MB_YESNO | MB_ICONQUESTION) )<br />  //弹出确认窗口，按YES退出程序<br />  {<br />   PlaySound (TEXT ("close.wav"), NULL, SND_FILENAME | SND_ASYNC) ;<br />   KillTimer (hwnd, TimerID) ;<br />   DestroyWindow (hwnd) ;<br />   Sleep(2000);<br />  }<br />  return 0 ;<br /> case WM_DESTROY:<br />  <br />  PostQuitMessage (0) ;<br />  return 0 ;<br /> }</p>
		<p> return DefWindowProc (hwnd, message, wParam, lParam) ;<br />}</p>
<img src ="http://www.cppblog.com/tx7do/aggbug/12597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-17 21:48 <a href="http://www.cppblog.com/tx7do/archive/2006/09/17/12597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"运行"命令七武器助你驰骋Windows</title><link>http://www.cppblog.com/tx7do/archive/2006/09/17/12590.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 17 Sep 2006 11:26:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/17/12590.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12590.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/17/12590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12590.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12590.html</trackback:ping><description><![CDATA[
		<table class="content02" cellspacing="0" cellpadding="5" width="540" border="0">
				<tbody>
						<tr>
								<td style="LEFT: 0px; WIDTH: 540px; WORD-WRAP: break-word">作者：meifazhan </td>
						</tr>
				</tbody>
		</table>
		<table class="content02">
				<tbody>
						<tr>
								<td style="LEFT: 0px; WIDTH: 540px; WORD-WRAP: break-word">
										<p>首先我们通过单击“开始→运行”命令，打开“运行”对话框，逐一输入以下命令<br />1． Winmsd——该命令可以打开“系统信息”窗口，供用户查看Windows系统的硬件资源、组件和软件资源等信息，让你将系统一览无余。<br /><br />　　2． Devmgmt．msc——该命令可以打开“设备管理器”窗口，显示系统中所安装硬件的详细信息，包括名称、驱动程序、相应资源分配等。<br /><br />　　3． Drwtsn32——看这名目就知道，关怀备至的Watson医生又来望闻问切了，你的Windows系统有什么不舒服，尽管对它如实道来吧！<br /><br />　　4． Dxdiag—－玩游戏是家用电脑最突出的一项娱乐功能，所以，作为游戏好伙伴的DirectX的重要性也不言而喻了，可对于它，你又了解多少呢？“DirectX诊断工具”就是你“窥探”它秘密的利器，赶快打开它看个究竟吧！<br /><br />　　5． Perfmon．msc——你想知道你的爱机在工作时的即时状态吗？键入此命令，可以打开计算机性能监视程序，它通过多种方式将系统性能数据展现在你的面前，是不是很直观呢！<br /><br />　　6． Explorer——在江湖上闯荡，该出手时就要出手，所以，打开资源管理器，详尽了解自己的各种“装备”，才能使自己的宝刃在合适的时候，发挥出最大的威力，做到办公娱乐两不误。<br /><br />　　7． Regedt32、Regedit——系统在使用了一段时间以后，总会出现一些小问题或者遇到某些需要调整的地方，那么我们就让“注册表编辑器”来帮忙解决。用这两条命令都可以打开“注册表编辑器”（Windows 9x系统键入“regedit”，其注册表编辑器没有任何权限限制，可以被任意用户打开。Windows 2000/XP/2003系统打开方法有二：键入“regedit”，其功能同Windows 9x系统；键入“regedt32”，打开的注册表编辑器允许用户设置权限，出于安全性的考虑，建议高级用户合理设置使用权限，以免被他人恶意修改），找到相应项目修改即可，如此这般之后，你的系统会更加完善和快捷。 </p>
										<p>      8.msconfig－－系统配置实用工具（的确非常实用！！）主要用来管理系统启动时运行的程序和进程。这些程序有的会出现在“开始”菜单的“程序”里的“启动”项中，很多会出现在系统通知区域（就是任务栏“时间”的左边），如果在该工具的启动选项卡里不知道这些程序到底指的是什么程序，可以看看“命令”这栏，仔细留心自己安装的软件，你就会熟悉他们了。每次修改完之后，系统会提示你重新启动以使更改生效，其实完全不用选“是”，等你下次重启系统的时候自然会生效；如果只是看看目前都有哪些程序在系统启动时运行，之后要按“取消”，否则即使没有做任何变动，系统也会提示你重启！如果还有疑问，建议看看windows的帮助，查找“系统配置实用工具”，结果应该会让你受益非浅的</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/tx7do/aggbug/12590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-17 19:26 <a href="http://www.cppblog.com/tx7do/archive/2006/09/17/12590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chess engine 资源 </title><link>http://www.cppblog.com/tx7do/archive/2006/09/12/12383.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Tue, 12 Sep 2006 12:01:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/12/12383.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12383.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/12/12383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12383.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12383.html</trackback:ping><description><![CDATA[平台：<br />    winboard or xboard:   <a href="http://www.tim-mann.org/chess.html">http://www.tim-mann.org/chess.html</a><br />winboard综合网站：<br />    <a href="http://wbec-ridderkerk.nl/">http://wbec-ridderkerk.nl/</a><br />    比赛信息，排名，engine更新都很全，推荐其中pp的logo收集，让你见识到形形色色的engine<br />    <a href="http://wbec-ridderkerk.nl/html/download/Dave_logosA.html">A-D</a>，<a href="http://wbec-ridderkerk.nl/html/download/Dave_logosB.html">E-M</a>，<a href="http://wbec-ridderkerk.nl/html/download/Dave_logosC.html">N-Z</a><br />编程：<br />    <a href="http://chess.verhelst.org/programming.html">http://chess.verhelst.org/programming.html</a><br /><br />更多的去看里面的友情连接，engine的世界丰富多彩<br /><img src ="http://www.cppblog.com/tx7do/aggbug/12383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-12 20:01 <a href="http://www.cppblog.com/tx7do/archive/2006/09/12/12383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GNU Chess</title><link>http://www.cppblog.com/tx7do/archive/2006/09/12/12382.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Tue, 12 Sep 2006 12:00:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/12/12382.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12382.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/12/12382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12382.html</trackback:ping><description><![CDATA[
		<a name="GNUChess">GNU Chess</a>
		<p>
				<strong>GNU Chess</strong> is a chess program from the Free Software Foundation. 
</p>
		<h3>Version 5</h3>
		<p>The GNU Chess 5 series is a completely new chess program that shares no code with versions 1-4. GNU Chess 5.00 was announced by Stuart Cracraft and Chua Kong-Sian on 10 October 1999. Here is the <a href="http://www.tim-mann.org/gnuchess/5.00.txt">announcement</a> that Stuart posted to Usenet. 
</p>
		<p>I'm not involved with the development of GNU Chess 5 and am no longer the GNU Chess FAQ maintainer. The new program looks nice, and I hope the authors continue to develop it. 
</p>
		<p>For information about GNU Chess 5, see the <a href="http://www.gnu.org/software/chess/chess.html">GNU Chess page</a> on the GNU web site. See also the <a href="news:gnu.chess">gnu.chess newsgroup</a>. 
</p>
		<p>GNU Chess 5 works with XBoard and WinBoard. The current version of the WinBoard self-installer has both GNU Chess 4 and GNU Chess 5 bundled in with it. 
</p>
		<h3>Old versions</h3>
		<p>Although GNU Chess 4 is no longer being developed, it is still of some interest to folks who like to study and compare chess engines. Here is a small collection of old versions that I've kept. The "Source code" versions can be compiled for Windows to work with WinBoard, or for Unix to work with XBoard. The "Windows ports" use their own custom graphical interface, not WinBoard. 
</p>
		<ul>
				<li>Source code 
<ul><li><a href="http://www.tim-mann.org/gnuchess/gnuchess-4.0.pl80.tar.gz">GNU Chess 4.0 patchlevel 80</a></li><li><a href="http://www.tim-mann.org/gnuchess/gnuchess-4.0.pl79.tar.gz">GNU Chess 4.0 patchlevel 79</a></li><li><a href="http://www.tim-mann.org/gnuchess/gnuchess-4.0.pl78.tar.gz">GNU Chess 4.0 patchlevel 78</a></li><li><a href="http://www.tim-mann.org/gnuchess/gnuchess-4.0.pl77.tar.gz">GNU Chess 4.0 patchlevel 77</a></li><li><a href="http://www.tim-mann.org/gnuchess/gnuchess-4.0.pl75.tar.gz">GNU Chess 4.0 patchlevel 75</a></li><li><a href="http://www.tim-mann.org/gnuchess/gnuchess-3.1+.tar.gz">GNU Chess 3.1+</a></li></ul><p></p></li>
				<li>Windows ports 
<ul><li><a href="http://www.tim-mann.org/gnuchess/gnuchessPC-4.15.zip">GNU Chess for Windows 4.15</a> (Conor McCarthy) 
</li><li><a href="http://www.tim-mann.org/gnuchess/gnuchessPC-4.14.zip">GNU Chess for Windows 4.14</a> (Conor McCarthy) 
</li><li><a href="http://www.tim-mann.org/gnuchess/chess321.tar.Z">GNU Chess for Windows 3.21</a> (Daryl Baker) </li></ul><p></p></li>
				<li>Macintosh ports 
<ul><li>GNU Chess for Macintosh 4.0b5 (Dan Oetting)<br /><a href="http://www.tim-mann.org/gnuchess/gnuchessMAC40b5.README">README file</a> / <a href="http://www.tim-mann.org/gnuchess/gnuchessMAC40b5.hqx">executable</a> / <a href="http://www.tim-mann.org/gnuchess/gnuchessMAC-src-v40b5.hqx">source</a></li></ul></li>
		</ul>
		<p>Also see <a href="ftp://cap.connx.com/pub/chess-engines/new-approach/">Dann Corbit's FTP site</a> for versions of GNU Chess 4 that Dann has patched to fix some bugs. </p>
<img src ="http://www.cppblog.com/tx7do/aggbug/12382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-12 20:00 <a href="http://www.cppblog.com/tx7do/archive/2006/09/12/12382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Chess Engines</title><link>http://www.cppblog.com/tx7do/archive/2006/09/12/12381.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Tue, 12 Sep 2006 11:59:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/12/12381.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12381.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/12/12381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12381.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12381.html</trackback:ping><description><![CDATA[
		<a name="engines">Chess Engines</a>
		<h3>Information for authors</h3>
		<p>If you are writing a chess engine and you want it to work with xboard/WinBoard, or if you are writing a user interface and want it to work with these engines, please read the <a href="http://www.tim-mann.org/xboard/engine-intf.html">Chess Engine Communication Protocol</a> document, and consider joining the mailing list for engine authors, hosted at <a href="http://groups.yahoo.com/group/chess-engines/">http://groups.yahoo.com/group/chess-engines/</a>. 
</p>
		<h3>Information for players</h3>
		<p>Here is a partial list of chess engines (programs that play chess) that work with xboard and/or WinBoard. 
</p>
		<p>
				<b>
						<i>I am currently not keeping this list updated.</i>
				</b> The last update was November 2002. <b><i>For an up-to-date list of WinBoard engines with information about each one, see <a href="http://wbec-ridderkerk.nl/">Leo Dijksman's web site</a>.</i></b> For announcements of new engines, see Leo's site and the <a href="http://wbforum.vpittlik.org/">WinBoard Forum</a>. To be able to use still more engines, see my <a href="http://www.tim-mann.org/extensions.html">Extensions and Drivers</a> page for drivers that allow some Auto232 and UCI engines to work with WinBoard. For help getting started with alternative chess engines, see <a href="http://www.aarontay.per.sg/Winboard/index.html">Aaron Tay's FAQ</a>, as well as the other links on my <a href="http://www.tim-mann.org/chesslinks.html">Chess Web Sites</a> page. 
</p>
		<p>Disclaimers: I have not tried most of these engines, so I can't guarantee they will work for you or offer help installing them. Contact the author of each engine if you need help with it beyond what is provided in its documentation. The list is in alphabetical order, not in order of merit. 
</p>
		<ol>
				<li>
						<a href="http://paladijn.dhs.org/chess/31337.html">31337</a>
				</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/">Adam</a>
				</li>
				<li>
						<a href="http://home.t-online.de/home/roman.korba/">Abrok</a>
				</li>
				<li>
						<a href="http://www.codenet.se/alarm/">Alarm</a> (not released yet) 
</li>
				<li>
						<a href="http://members.xoom.it/xaldebaran/">Aldebaran</a>
				</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/html/EnginesIndex.html">Amateur</a>
				</li>
				<li>
						<a href="http://www.nada.kth.se/kurser/kth/2D1464/amundsen/">Amundsen</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Amy</a>
				</li>
				<li>
						<a href="http://www.geocities.com/zodiamoon/amyan/">Amyan</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">AnMon</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Ant</a>
				</li>
				<li>
						<a href="http://www.arasanchess.org/">Arasan</a>
				</li>
				<li>
						<a href="http://www.zipproth.com/chess/">Aristarch</a>
				</li>
				<li>
						<a href="http://www.armageddon.szach.pl/">Armageddon</a>
				</li>
				<li>
						<a href="http://www.geocities.com/asteriskchess/">Asterisk</a>
				</li>
				<li>
						<a href="http://www.geocities.com/josec_averno/">Averno</a>
				</li>
				<li>
						<a href="http://home.vicnet.net.au/~chess/programs.html">Awesome</a>
				</li>
				<li>
						<a href="http://www.geocities.com/axchess/">Ax</a>
				</li>
				<li>
						<a href="http://user.cs.tu-berlin.de/~kunegis/bch/">Baby Chess</a>
				</li>
				<li>
						<a href="http://www.cse.msu.edu/~bowronch/">BACE</a> (also known as BCE) 
</li>
				<li>
						<a href="http://home.wish.net/~pijltjes/">Baron</a>
				</li>
				<li>
						<a href="http://www.codenet.se/alarm/download.asp">Beaches</a>
				</li>
				<li>
						<a href="http://sq2foa.republika.pl/">Belzebub</a>
				</li>
				<li>
						<a href="http://www.ast.cam.ac.uk/~cmf/chess/beowulf.html">Beowulf</a>
				</li>
				<li>
						<a href="http://www.geocities.com/lyapko/winboard.htm">Bestia</a>
				</li>
				<li>
						<a href="http://userfs.cec.wustl.edu/~lwr1/">Betsy</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/bigbookdetail.html">BigBook</a>
				</li>
				<li>
						<a href="http://www.gemuh.de/">BigLion</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Bionic Impakt</a>
				</li>
				<li>
						<a href="http://www.oellermann.com/blikskottel/">Blikskottel</a>
				</li>
				<li>
						<a href="http://web.tiscali.it/BremboCE/">BremboCE</a>
				</li>
				<li>
						<a href="http://www.reubold.onlinehome.de/">Bringer</a> (also known as Der Bringer) 
</li>
				<li>
						<a href="http://b0n0.free.fr/bsc/bsc.html">BSC</a>
				</li>
				<li>
						<a href="http://republika.pl/markol4/">Butcher (also known as Rzeznik)</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Capture</a> (commercial) 
</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/">Cefap</a>
				</li>
				<li>
						<a href="http://members.fortunecity.com/clairesbro/chess/">Chad's Chess</a>
				</li>
				<li>
						<a href="http://www.rikus.com/chess/">Chess-Rikus</a>
				</li>
				<li>
						<a href="http://home.datacomm.ch/m.luescher/">ChessterfieldCL</a>
				</li>
				<li>
						<a href="http://www.geocities.com/thechessthinker/">ChessThinker</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Chezzz</a>
				</li>
				<li>
						<a href="http://milin.multimania.com/">Cilian</a>
				</li>
				<li>
						<a href="http://www.ast.cam.ac.uk/~cmf/chess/colchess/colchess.html">ColChess</a>
				</li>
				<li>
						<a href="http://members.aol.com/utuerke/comet/">Comet</a>
				</li>
				<li>
						<a href="http://www.vanheusden.com/cpp1/">Cpp1</a>
				</li>
				<li>
						<a href="http://www.tim-mann.org/crafty.html">Crafty</a>
				</li>
				<li>
						<a href="http://titanic.nyme.hu/~wyx/crux/">Crux</a>
				</li>
				<li>
						<a href="http://web.tiscali.it/pagno/">CyberPagno</a>
				</li>
				<li>
						<a href="http://billpoint.tripod.com/damas.htm">Damas</a>
				</li>
				<li>
						<a href="http://www.geocities.com/SiliconValley/Mouse/3246/">DChess</a>
				</li>
				<li>
						<a href="http://www.wpi.edu/~bdean/deepbug.html">Deep Bug</a> (bughouse and crazyhouse only) 
</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Deep Trouble</a>
				</li>
				<li>
						<a href="http://holandany.20m.com/Holand03.htm">Defeo</a> (plays a Czech variant of crazyhouse called "tetris holandany") 
</li>
				<li>
						<a href="http://www.sira.it/msb/delfi.htm">Delfi</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Dragon</a>
				</li>
				<li>
						<a href="http://www.lordking.bbk.org/">Duke</a>
				</li>
				<li>
						<a href="http://www.codenet.se/embracer/">Embracer</a>
				</li>
				<li>
						<a href="http://www.enginmax.de/">EnginMax</a>
				</li>
				<li>
						<a href="http://escx.cjb.net/">Esc</a>
				</li>
				<li>
						<a href="http://home.earthlink.net/~econerd/EXchess.html">EXchess</a>
				</li>
				<li>
						<a href="http://faile.sourceforge.net/">Faile</a>
				</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/html/EnginesIndex.html">Fauce</a>
				</li>
				<li>
						<a href="http://www.stanford.edu/~jjshed/chess/NPP">Fimbulwinter</a>
				</li>
				<li>
						<a href="http://freeweb.econophone.ch/fortress/">Fortress</a>
				</li>
				<li>
						<a href="http://www.btinternet.com/~tom_king/">Francesca</a>
				</li>
				<li>
						<a href="http://www.fys.ku.dk/~fischer/frenzee/frenzee.html">Frenzee</a> (formerly ChessCraft) 
</li>
				<li>
						<a href="http://www.geocities.com/SiliconValley/Lab/3716/projects.html">Freyr</a>
				</li>
				<li>
						<a href="http://www.suurballe.dk/">Gandalf</a> (commercial) 
</li>
				<li>
						<a href="http://digilander.iol.it/gargamellachess/">Gargamella</a>
				</li>
				<li>
						<a href="http://www.msu.edu/~ballicor/gav">Gaviota</a>
				</li>
				<li>
						<a href="http://www.naddei.it/gedeone/gedeone.php">Gedeone</a>
				</li>
				<li>
						<a href="http://www.cs.biu.ac.il/~davoudo/">Genesis</a>
				</li>
				<li>
						<a href="http://www.seanet.com/~brucemo/gerbil/gerbil.htm">Gerbil</a>
				</li>
				<li>
						<a href="http://www.ghostchess.de/">Ghost</a>
				</li>
				<li>
						<a href="http://www.geocities.com/Colosseum/Field/8203/giveaway.zip">Giveaway Wizard</a> (aka Losing Chess Wizard) - <a href="http://www.chessvariants.com/people.dir/goldovski.html">see also</a></li>
				<li>
						<a href="http://www.tim-mann.org/gnuchess.html">GNU Chess</a>
				</li>
				<li>
						<a href="http://www.geocities.com/TimesSquare/Chaos/9481/">Golem</a>
				</li>
				<li>
						<a href="http://www.7sun.com/chess/">Green Light Chess</a>
				</li>
				<li>
						<a href="http://bearlodge.webservis.ru/chess/greko.html">GreKo</a>
				</li>
				<li>
						<a href="http://home.snafu.de/~lawi/">Grizzly</a>
				</li>
				<li>
						<a href="http://home.t-online.de/home/hobblefrank">Gromit</a>
				</li>
				<li>
						<a href="http://gully.borriss.com/">Gullydeckel</a>
				</li>
				<li>
						<a href="http://www.friedelprivat.de/">Hagrid</a>
				</li>
				<li>
						<a href="http://www.wbholmes.de/">Holmes</a>
				</li>
				<li>
						<a href="http://www.horizonchess.com/">Horizon</a>
				</li>
				<li>
						<a href="http://www.go.to/inmichess">Inmichess</a>
				</li>
				<li>
						<a href="http://www.eiganic.com/">Jester</a>
				</li>
				<li>
						<a href="http://aaronbaird.net/kace/">KACE</a>
				</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/">Kaissa2</a>
				</li>
				<li>
						<a href="http://kasparvoxchess.cjb.net/">KasparovX</a>
				</li>
				<li>
						<a href="http://www.kingofkingschess.com/kingofkings/">King of Kings</a>
				</li>
				<li>
						<a href="ftp://samba.anu.edu.au/pub/KnightCap/">KnightCap</a> - <a href="http://www.dkfz-heidelberg.de/spec/KnightCap_AB/">bug fix</a></li>
				<li>
						<a href="http://www3.tripnet.se/~owemelin/johan/KnightDreamer.html">KnightDreamer</a>
				</li>
				<li>
						<a href="http://technochess.free.fr/">Knightx</a> (also known as Techno Chess) 
</li>
				<li>
						<a href="http://www.winboardengines.de/ladameblanche/">La Dame Blanche</a>
				</li>
				<li>
						<a href="http://www.lordking.bbk.org/">LadyGambit</a>
				</li>
				<li>
						<a href="http://homepages.caverock.net.nz/~peter/chess.htm">lambChop</a>
				</li>
				<li>
						<a href="http://it.geocities.com/pietro_valocchi/lamosca/welcome.html">LaMoSca</a>
				</li>
				<li>
						<a href="http://digilander.iol.it/larsenvb/">LarsenVB</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/leiladetail.html">Leila</a>
				</li>
				<li>
						<a href="http://www.amateurschach.de/schach/download/download.htm">List</a>
				</li>
				<li>
						<a href="http://www.borgstaedt.de/">Little Goliath</a>
				</li>
				<li>
						<a href="http://www.lordking.bbk.org/">LordKing</a>
				</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/">Madeleine</a>
				</li>
				<li>
						<a href="http://www.winboard.hpg.ig.com.br/wbuk.htm">Matheus</a>
				</li>
				<li>
						<a href="http://home.texoma.net/~garnax/">MFChess</a>
				</li>
				<li>
						<a href="http://www-und.ida.liu.se/~chrso085/mint/">Mint</a>
				</li>
				<li>
						<a href="http://www.stevemaughan.com/chess.htm">Monarch</a>
				</li>
				<li>
						<a href="http://www.geocities.com/SiliconValley/Campus/6258/">Monik</a>
				</li>
				<li>
						<a href="http://manson.ath.cx/m0Vax/">Mooboo</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Morphy</a>
				</li>
				<li>
						<a href="http://www.amateurschach.de/schach/download/download.htm">Movei</a>
				</li>
				<li>
						<a href="http://www.geocities.com/superchesscraze/drchess">Mr Chess</a> (formerly Dr Chess) 
</li>
				<li>
						<a href="http://brick.bitpit.net/~marcelk/">MSCP</a>
				</li>
				<li>
						<a href="http://www.freston.org/muriel.html">Muriel</a> (aka KDLChess) 
</li>
				<li>
						<a href="http://www.geocities.com/lyapko/winboard.htm">Mustang</a>
				</li>
				<li>
						<a href="http://www.geocities.com/fabianmue/">Mystery</a>
				</li>
				<li>
						<a href="http://nejmet.multimania.com/">Nejmet</a>
				</li>
				<li>
						<a href="http://www.mit.jyu.fi/~huikari/">Nero</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Nimzo</a> (commercial) 
</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">NoonianChess</a>
				</li>
				<li>
						<a href="http://btcips73x1.cip.uni-bayreuth.de/~oliver/">OliThink</a>
				</li>
				<li>
						<a href="http://www.hut.fi/~jostrovs/">Ozwald</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Patzer</a> (commercial) 
</li>
				<li>
						<a href="http://chessplus.cjb.net/">Pentagon</a> - dead link? 
</li>
				<li>
						<a href="http://www.winboardengines.de/pepito/">Pepito</a>
				</li>
				<li>
						<a href="http://dusan.freeshell.org/phalanx/">Phalanx</a> - <a href="ftp://ftp.math.muni.cz/pub/math/people/Dobes">alternate link</a></li>
				<li>
						<a href="http://www.fzibi.com/pharaon.htm">Pharaon</a> (formerly ZChess) 
</li>
				<li>
						<a href="http://pierre.alexboby.com/">Pierre</a>
				</li>
				<li>
						<a href="http://home.online.no/~malin/sjakk/">PolarChess</a>
				</li>
				<li>
						<a href="http://joselauro.tripod.com/prechess-en.html">PreChess</a>
				</li>
				<li>
						<a href="http://www.digichess.gr/pyotr/">Pyotr</a>
				</li>
				<li>
						<a href="http://www.quarkchess.de/">Quark</a>
				</li>
				<li>
						<a href="http://home.wxs.nl/~ammeraal/">Queen</a>
				</li>
				<li>
						<a href="http://www.linformatica.com/scacchi.html">Raffaela</a>
				</li>
				<li>
						<a href="http://groups.msn.com/RudolfPosch/freewareprogramrdchess.msnw?pgmarket=en-us">RDChess</a>
				</li>
				<li>
						<a href="http://www.fortunecity.com/campus/cottingham/359/">Replicant</a>
				</li>
				<li>
						<a href="http://webusers.siba.fi/~ssalmine/requiem.html">Requiem</a>
				</li>
				<li>
						<a href="http://home.t-online.de/home/p_rosendahl/">Resp</a>
				</li>
				<li>
						<a href="http://www.redhotpawn.com/rival/">Rival Chess</a> (also known as NewRival) 
</li>
				<li>
						<a href="http://www.robinchess.of.pl/">Robin</a>
				</li>
				<li>
						<a href="http://www.codenet.se/alarm/download.asp">RoboKewlper</a>
				</li>
				<li>
						<a href="http://ruffian.hkust.se/">Ruffian</a>
				</li>
				<li>
						<a href="http://www.winboard.info/forum/topic.asp?TOPIC_ID=11">Sachy</a>
				</li>
				<li>
						<a href="http://www.sdbsoft.com/sdbchess/">SdBC</a>
				</li>
				<li>
						<a href="http://www.amateurschach.de/schach/download/download.htm">Siboney</a>
				</li>
				<li>
						<a href="http://sjeng.sourceforge.net/">Sjeng</a> (also plays several chess variants) 
</li>
				<li>
						<a href="http://home.att.net/~glazarou/skaki.htm">Skaki</a>
				</li>
				<li>
						<a href="http://members.optushome.com.au/alito/smallpotato.html">Small Potato</a> (also known as unches) 
</li>
				<li>
						<a href="http://www.aigroup.narod.ru/">SmarThink</a>
				</li>
				<li>
						<a href="http://www.freewebz.com/sinefit/chess.html">SnailChess</a>
				</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/html/EnginesIndex.html">Soldat</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">SOS</a>
				</li>
				<li>
						<a href="http://www.ssechess.com/">SSEChess</a>
				</li>
				<li>
						<a href="http://surf.to/standersen/">StAndersen</a>
				</li>
				<li>
						<a href="http://wbec-ridderkerk.nl/">Stan's Chess</a>
				</li>
				<li>
						<a href="ftp://ftp.beutlerhvac.com/pub/">Storm</a>
				</li>
				<li>
						<a href="http://mgkiler.republika.pl/programy.html">StrategicDeep</a>
				</li>
				<li>
						<a href="http://sunsetter.sourceforge.net/">Sunsetter</a> (also plays bughouse and crazyhouse) 
</li>
				<li>
						<a href="http://escx.cjb.net/">Tamerlane</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Tao</a>
				</li>
				<li>
						<a href="http://www.amateurschach.de/schach/download/download.htm">Terra</a>
				</li>
				<li>
						<a href="http://remi.coulom.free.fr/">The Crazy Bishop</a>
				</li>
				<li>The King (commercial, part of <a href="http://www.chessmaster.com/">Chessmaster 8000</a>) - <a href="http://www.ubisoft.com/games/gameinfo.php?id=79">alternate Web page</a> - <a href="http://www.winboardengines.de/html/winboard-detailpages.html">how to use with WinBoard</a>. 
</li>
				<li>
						<a href="http://hubbethebauch.bei.t-online.de/">TheLightning</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/tikovchessdetail.html">Tikov</a>
				</li>
				<li>
						<a href="http://membres.lycos.fr/refigny63/nf3.htm">T-Rex</a>
				</li>
				<li>
						<a href="http://www.galahadnet.com/chess/galahad/">Tristram</a>
				</li>
				<li>
						<a href="http://titanic.nyme.hu/~wyx/crux/download.htm">Trynyty</a>
				</li>
				<li>
						<a href="http://home.earthlink.net/~tckjr/">TSCP</a> (Tom Kerrigan's Simple Chess Program) 
</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Ufim</a>
				</li>
				<li>
						<a href="http://www.geocities.com/lyapko/winboard.htm">WildCat</a>
				</li>
				<li>
						<a href="http://wjchess.jeffprod.com/">WJChess</a>
				</li>
				<li>
						<a href="http://home1.stofanet.dk/Moq/">Yace</a>
				</li>
				<li>
						<a href="http://sand.mobilixnet.dk/">YAWCE</a>
				</li>
				<li>
						<a href="http://www.winboardengines.de/html/winboard-detailpages.html">Zephyr</a>
				</li>
		</ol>
<img src ="http://www.cppblog.com/tx7do/aggbug/12381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-12 19:59 <a href="http://www.cppblog.com/tx7do/archive/2006/09/12/12381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>出色图形用户界面（GUI）设计规范</title><link>http://www.cppblog.com/tx7do/archive/2006/09/09/12187.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 08 Sep 2006 22:51:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/09/12187.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12187.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/09/12187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12187.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12187.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 作者：										James Hobart												翻译：										spark.bbs@bbs.nankai.edu.cn												日期：				2001-3-23 								转自：http://nku.nankai.edu.cn/cim/students/doctor/spark/...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/archive/2006/09/09/12187.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/12187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-09 06:51 <a href="http://www.cppblog.com/tx7do/archive/2006/09/09/12187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PixelToaster</title><link>http://www.cppblog.com/tx7do/archive/2006/09/09/12185.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 08 Sep 2006 22:25:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/09/12185.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12185.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/09/12185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12185.html</trackback:ping><description><![CDATA[
		<a href="http://www.pixeltoaster.com/">http://www.pixeltoaster.com/</a>
		<br />
		<br />
		<div class="entry firstpost">
				<h2 class="entrydate">September 2, 2006 </h2>
				<h3 class="entrytitle" id="post-5">
						<a href="http://pixeltoaster.com/archives/pixeltoaster-13-released" rel="bookmark">
								<font color="#cfe393">PixelToaster 1.3 Released </font>
						</a>
				</h3>
				<div class="entrymeta">
						<font color="#cfe393">
						</font>
				</div>
				<div class="entrybody">
						<p>Several months worth of changes previously available only via subversion have been released for everyone to enjoy.</p>
						<p>
								<a href="http://www.pixeltoaster.com/downloads/PixelToaster-1.3.1.zip">
										<font color="#000099">Click here to download</font>
								</a>
						</p>
						<p>
								<strong>New Features:</strong>
						</p>
						<ul>
								<li>XWindows display, mouse and keyboard input 
</li>
								<li>XWindows display works under Linux, BSD and MacOS X 
</li>
								<li>High resolution RTDSC based timer for x86 unix systems 
</li>
								<li>Windows port compiles clean under 64bit Windows and Visual Studio Express </li>
						</ul>
						<p>
								<strong>Coming soon:</strong>
						</p>
						<ul>
								<li>Native MacOS display 
</li>
								<li>Fullscreen XWindows output 
</li>
								<li>Optimizations to reduce buffer copies 
</li>
								<li>The ability to perform partial display updates </li>
						</ul>
						<p>Join the discussion on the <a href="http://www.pixeltoaster.com/forum"><font color="#000099">PixelToaster Forums</font></a>.</p>
				</div>
				<?XML:NAMESPACE PREFIX = RDF /?>
				<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
						<rdf:description rdf:about="http://pixeltoaster.com/archives/pixeltoaster-13-released" dc:identifier="http://pixeltoaster.com/archives/pixeltoaster-13-released" dc:title="PixelToaster 1.3 Released" trackback:ping="http://pixeltoaster.com/archives/pixeltoaster-13-released/trackback/">
						</rdf:description>
				</rdf:rdf>
		</div>
<img src ="http://www.cppblog.com/tx7do/aggbug/12185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-09 06:25 <a href="http://www.cppblog.com/tx7do/archive/2006/09/09/12185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UNIX下C++实现动态载入对象</title><link>http://www.cppblog.com/tx7do/archive/2006/09/05/12035.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Tue, 05 Sep 2006 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/05/12035.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12035.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/05/12035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12035.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12035.html</trackback:ping><description><![CDATA[
		<p>  VC里面实现动态对象载入已经不是什么新鲜事情了，很多的plug-in技术就是例子。Unix下，通过动态载入so获得一个对象也不是什么难事，不过对这个对象的管理就是一件比较麻烦的事情了。一般的需求如下：<br />  有class TMyObj，准确说TMyObj应该是一个接口，根据不同具体情况会有不同的实现，例如 TMyObj1、TMyObj2等等……而这些TMyObj1和TMyObj2分别保存在不同的so当中，需要根据不同的时候load不同的so，建立相应的对象。由于这些对象都拥有TMyObj的接口，所以对于外部来说对这些类的使用就像对TMyObj的使用一样。<br />  看起来好像比较简单，只要在so里面引出一个函数：<br />  TMyObj * onCreateObject(void);<br />  而函数在so中的具体实现就是建立不同的子类，例如在obj1.so中：<br />  TMyObj * onCreateObject(void)<br />   { return new TMyObj1; }<br />  使用的时候只需要动态load入obj1.so，并且找到onCreateObject函数的入口，就可以建立一个具有TMyObj接口的TMyObj1了。<br />  至于释放对象，一般有两种方法：<br />方法一：<br />  so中包含另外一个函数：<br />  void onDestroyObj(void * p)<br />  {<br />    TMyObj1 * tp = (TMyObj1 *)p;<br />    delete tp;<br />  }<br />  从so中导出该函数，并在删除对象的时候调用。<br />方法二：<br />  TMyObj的析构函数声明为虚函数，那么从so导出的onCreateObject()建立的对象，直接执行delete删除就行了，由于析构函数是虚函数，编译器会正确的调用TMyObj1的析构函数。<br />  当然，方法二是比较简单而优雅的方法，既然对于C++来说接口就相当于纯虚函数，多增加一个析构的虚函数又何妨呢。但是无论使用哪种方法，都要注意一个问题，就是载入的obj1.so的生命周期要比最后一个TMyObj1的生存周期长。即只要内存中还存在TMyObj1对象，obj1.so就要一直在内存中，不能卸载。要保证这个同步，是比较麻烦的事情。下面就说说我的解决方法：<br />  <br />  首先，要选择一个通用的载入so的lib，这个可以参考一下common c++的DSO（在file.h）里面。（不想使用common c++？我也只是说“参考”而已）。这个支持DLL和so，通过成员函数void *operator[](const char *);获得指定的symbol的入口。<br />  其次，就要选择一个通用的SmartPtr。这个当然Loki是首选，Loki的SmartPtr的灵活性比boost的smart_ptr强多了，而且Loki也小巧的多。<br />  然后就要实现一个简单的so的manager，其实应该说是一个动态object的factory：<br />  class TObjFactory : protected DSO<br />  {<br />  public:<br />    TObjFactory(void);<br />    <br />    void load(const std::string &amp; strPath);<br />    void * createObj(void) const throw (TSOException);<br />  protected:<br />    typedef void * (*funcCreate)(void ** p);<br />    funcCreate  m_pCreator;<br />  };<br />  可以想象这个类干些什么：load就是载入相应的so，然后获得so中onCreateObject函数的入口，并赋给成员m_pCreator。而createObj就是调用m_pCreator建立对象。不过有所不同的是 m_pCreator所指向的函数形式是void * funcCreate(void ** p)，而多出来void **p用处就是可以让so中的构造函数中产生的exception能够传递出来。这个不能说不是so的麻烦之处，so中函数的exception不能被外部捕获，所以只好这样子做了。<br />  现在，关键的地方来了，就是要保证这个TObjFactory的生存周期了。选择Loki的SmartPtr就能派上用场了。<br />  Loki的SmartPtr可以自己选定适用的StoragePolicy，这正是我们需要的，参考DefaultSPStorage，可以做我们的TMySOStoragePolicy：<br />  template&lt;class T&gt;<br />   class TMySOStoragePolicy<br />   {<br />    .....<br />   protected:<br />    void Destroy()<br />        { <br />         delete pointee_;<br />         m_pFactory = SmartPtr&lt;TObjFactory&gt;();<br />        }   <br />   private:<br />    SmartPtr&lt;TObjFactory&gt; m_pFactory;<br />    StoredType       pointee_;<br />   };<br />  显而易见，这样做的目的就是要保证释放指针的时候就减少TObjFactory的引用计数。<br />  好了，现在就是主角了：<br />  template&lt;class T&gt;<br />  class TDObj : public SmartPtr&lt;T,RefCounted,DisallowConversion,AssertCheck,TMySOStoragePolicy&gt;<br />  {<br />  public:<br />    TDObj(void);<br />    TDObj(const TDObj &amp; obj);<br />    .....<br />    <br />  protected:<br />    friend class TDObjManager;<br />    TDObj(T * p, SmartPtr&lt;TObjFactory&gt; pManager);<br />  };<br />  <br />  class TDObjManager<br />  {<br />  public:<br />    ......<br />    template&lt;class T&gt;<br />     static TDObj&lt;T&gt;  createObj(const std::string &amp; strKeyName)<br />     {<br />       SmartPtr&lt;TObjFactory&gt; pFactory = getFactoryByName(strKeyName);<br />       //这里面可以做很多事情了，例如访问内存，查找相应的Factory；或者读取配置文件、读入新的so并建立新的Factory。<br />       //或者根据一些淘汰算法，先淘汰内存的Factory，然后重新载入新的Factory等等。<br />       std::auto_ptr&lt;T&gt; _au( static_cast&lt;T *&gt;(pFactory-&gt;createObj()) );<br />       return TDObj&lt;T&gt;( _au.release(), pFactory);<br />     }<br />  };<br />  <br />  以后用起来就简单多了：<br />  class TMyObj<br />  {<br />  public:<br />   virtual ~TMyObj(void);<br />   virtual int func(void) = 0;<br />  };<br />  <br />  TDObj&lt;TMyObj&gt; obj1 = TDObjManager::createObj&lt;TMyObj&gt;( "obj1.so") );<br />  TDObj&lt;TMyObj&gt; obj2 = TDObjManager::createObj&lt;TMyObj&gt;( "obj2.so") );<br />  <br />  cout &lt;&lt; obj1-&gt;func() &lt;&lt; endl;<br />  cout &lt;&lt; obj2-&gt;func() &lt;&lt; endl;</p>
		<p>  说了这么久，都是主程序的调用，而so中应该如何呢？其实也很简单：<br />  class TMyObj1 : public TMyObj<br />  {<br />  public:<br />    TMyObj1(void);<br />    ~TMyObj1(void);</p>
		<p>    static void onStaticInit(void);<br />    static void onStaticDestroy(void);<br />    static const char * getVersion(void);<br />    static const char * getObjectName(void);<br />    <br />    virtual int  func(void);<br />  };<br />  <br />  DECLARE_SO_INTERFACE(TMyObj1);<br />  <br />  DECLARE_SO_INTERFACE其实是一个为了方便编写程序而定义的宏:<br />  #define DECLARE_SO_INTERFACE(x) extern "C" { \<br />    void onInstallDLL(void);   \<br />    void onUninstallDLL(void);   \<br />    const char * onGetVersion(void); \<br />    const char * onObjectName(void); \<br />    void * onCreateObject(void ** ppException);  \<br />   }; \<br />   void onInstallDLL(void) { x::onStaticInit(); }    \<br />   void onUninstallDLL(void) { x::onStaticDestroy(); }  \<br />   const char * onGetVersion(void) { return x::getVersion(); }  \<br />   const char * onObjectName(void) { return x::getObjectName(); } \<br />   void * onCreateObject(void ** pException) { \<br />    try { \<br />     *pException = NULL; x * p = new x(); return (void *)p; \<br />    }catch(std::exception &amp; e) { \<br />     *pException = new std::exception(e); \<br />     return NULL;  \<br />    } \<br />   }<br />   <br />  可以看到除了导出onCreateObject函数以外，还导出了：<br />  TMyObj1::onStaticInit用于载入so的时候执行初始化操作；<br />  TMyObj1::onStaticDestroy用于卸载so的时候执行清理操作；<br />  TMyObj1::getVersion 获得对象的版本信息<br />  TMyObj1::onObjectName 获得对象名信息等<br />  可以扩展前面的TObjFactory，实现这些功能。<br /><br />  同理，我们可以做obj2.so：<br />  class TMyObj2 : public TMyObj<br />  {<br />  public:<br />   TMyObj2(void);<br />   ~TMyObj2(void);<br />  <br />   static void onStaticInit(void);<br />   static void onStaticDestroy(void);<br />   static const char * getVersion(void);<br />   static const char * getObjectName(void);<br />  <br />   virtual int  func(void);<br />  };<br />  <br />  DECLARE_SO_INTERFACE(TMyObj2);<br />  <br />  <br />  另外，一个值得讨论的问题是：C++由于没有反射机制，所以无法实现设值注入和构造注入，只能实现接口注入。不过一般来说也已经足够使用了。</p>
<img src ="http://www.cppblog.com/tx7do/aggbug/12035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-05 13:07 <a href="http://www.cppblog.com/tx7do/archive/2006/09/05/12035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 的“反射”技术</title><link>http://www.cppblog.com/tx7do/archive/2006/09/05/12034.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Tue, 05 Sep 2006 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/09/05/12034.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/12034.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/09/05/12034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/12034.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/12034.html</trackback:ping><description><![CDATA[
		<div>
				<strong>Lit Window Library</strong>
		</div>
		<div>来自<a href="http://sourceforge.net/projects/litwindow">http://sourceforge.net/projects/litwindow</a> 大概看了一下，使用了宏建立了一个比较复杂的数据结构，用来提供成员反查以及成员访问。</div>
		<div>
				<div> </div>
				<div>
						<strong>tinybind</strong>
				</div>
				<div>来自<a href="http://sourceforge.net/projects/tinybind/">http://sourceforge.net/projects/tinybind/</a>  这个应该不算是反射，不过通过了定义一个Binding函数实现成员和XML的Element之间的绑定，自动实现了XML&lt;-&gt;class，对实现C++的“反射”也有一定的参考作用。</div>
				<div>
						<div> </div>
						<div>
								<div>
										<strong>OODBC</strong>
								</div>
								<div>来自<a href="http://www.garret.ru/~knizhnik/cpp.html">http://www.garret.ru/~knizhnik/cpp.html</a>  这个也应该不算是反射，也是通过宏建立一个记录成员变量在类中的偏移位置的链表。自动实现数据库字段与成员的绑定，有点Hibernate的味道。呵呵。同时，作者提供的另外几个例如FastDB、GigaBase、goods、POST++都使用了类似的技术。<br /><br /><div><a href="http://www.codeproject.com/library/libreflection.asp" target="_blank"><font color="#002c99">http://www.codeproject.com/library/libreflection.asp</font></a> </div><div> </div><div><font size="5"><strong>AGM::LibReflection: A reflection library for C++.</strong></font></div><div> </div><div>用的是宏，不过实现出来的东西比较有“反射”的味道，而且只需要一个头文件就足够了。不知道g++下表现如何，有空要研究研究。</div><div> </div><div> </div><div>boost出了1.32，去 <a href="http://boost.c-view.org/"><font color="#002c99">http://boost.c-view.org/</font></a> 可以找到。</div><div>其中新增加的部分有：</div><ul><li><a href="http://boost.c-view.org/libs/assign/index.html"><u><font color="#002c99">Assignment Library</font></u></a>: Filling containers with constant or generated data has never been easier, from Thorsten Ottosen. 
</li><li><a href="http://boost.c-view.org/libs/algorithm/minmax/index.html"><u><font color="#002c99">Minmax Library</font></u></a>: Standard library extensions for simultaneous min/max and min/max element computations, from Hervé Brönnimann. 
</li><li><a href="http://boost.c-view.org/libs/multi_index/doc/index.html"><u><font color="#002c99">Multi-index Containers Library</font></u></a>: Containers with multiple STL-compatible access interfaces, from Joaquín M López Muñoz. 
</li><li><a href="http://boost.c-view.org/libs/numeric/conversion/index.html"><u><font color="#002c99">Numeric Conversion Library</font></u></a>: Optimized policy-based numeric conversions, from Fernando Cacciola. 
</li><li><a href="http://boost.c-view.org/doc/html/program_options.html"><u><font color="#002c99">Program Options Library</font></u></a>: Access to configuration data given on command line, in config files and other sources, from Vladimir Prus. 
</li><li><a href="http://boost.c-view.org/libs/range/index.html"><u><font color="#002c99">Range Library</font></u></a>: A new infrastructure for generic algorithms that builds on top of the new iterator concepts, from Thorsten Ottosen. 
</li><li><a href="http://boost.c-view.org/libs/serialization/doc/index.html"><u><font color="#002c99">Serialization Library</font></u></a>: Serialization/de-serialization of arbitrary C++ data structures to various formats including text, binary, and xml, from Robert Ramey. 
</li><li><a href="http://boost.c-view.org/libs/algorithm/string/index.html"><u><font color="#002c99">String Algorithms Library</font></u></a>: Collection of string related algorithms for case conversion, trimming, find/replace operations and more, from Pavol Droba. 
</li><li><a href="http://boost.c-view.org/doc/html/tribool.html"><u><font color="#002c99">Tribool</font></u></a>: 3-state boolean type library, from Doug Gregor. </li></ul><p>其中的 <a href="http://boost.c-view.org/libs/multi_index/doc/index.html"><u><font color="#002c99">Multi-index Containers Library</font></u></a> 还是比较有特色，其他的大部分倒是在其他地方也看到过，可能是那些作者加入了boost了吧，没功夫细究了。<br /><br /></p></div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/tx7do/aggbug/12034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-09-05 13:03 <a href="http://www.cppblog.com/tx7do/archive/2006/09/05/12034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu Dapper 提速脚本</title><link>http://www.cppblog.com/tx7do/archive/2006/08/28/11798.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 28 Aug 2006 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/08/28/11798.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11798.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/08/28/11798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11798.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11798.html</trackback:ping><description><![CDATA[　　曾经埋怨 Ubuntu 运行缓慢的朋友，现在不妨来试试这个提速脚本。该脚本目前可以应用于 Ubuntu Dapper Drake，即 Ubuntu 6.06。据介绍，这个脚本主要是通过安装某些 prelinking 软件包（比如：prelink）、改变硬盘优化参数等措施来达到加快 Ubuntu 运行速度的目的。<br /><br />　　你可以直接下载 FasterDapper 脚本，不过需要注意在运行时使用：sudo ./faster-dapper.sh。祝你好运！<br /><br /><br /><br />下载:<a href="http://linuxtoy.org/dls/faster-dapper.sh" target="_blank"><font color="#666666">http://linuxtoy.org/dls/faster-dapper.sh</font></a><img src ="http://www.cppblog.com/tx7do/aggbug/11798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-28 21:48 <a href="http://www.cppblog.com/tx7do/archive/2006/08/28/11798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件设计/编程的基本技术(附图)</title><link>http://www.cppblog.com/tx7do/archive/2006/08/26/11714.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:43:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/08/26/11714.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11714.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/08/26/11714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11714.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent"> 
<p class="mycss"><strong><font color="#ff0000">目录</font></strong></p><p class="mycss">1.设计父类时考虑不周到，等到设计或者编写子类