圍棋打譜軟體中自動提子功能的實現,C C 原始碼

2022-08-14 22:24:22 字數 730 閱讀 1332

在下圍棋時,當乙個棋子落到棋盤上,它會對周圍對方棋子的死活產生影響,如果對方棋子沒有氣了(死了),必須從棋盤上拿掉(提子)。這個過程體現到圍棋軟體中,就需要通過程式**判斷某乙個棋子或某一片棋子的死活狀態,進而把死掉的棋子從棋盤上移除。

進一步分析的話,剛落下的棋子,只可能威脅到周圍與其緊臨的上下左右方向的四個對方棋子(也可能是三個或兩個,如在邊角的話),而這四個方向上的對方棋子,可能是孤立的乙個棋子,也可能是多個棋子相連的一片棋子(一塊棋)。要判斷一塊棋是否還活著,需要逐個檢查這塊棋中的每乙個棋子:如果其中某個棋子旁邊沒有棋子,說明這塊棋至少還有一口氣,因而確定它還沒有死;如果檢查完這塊棋中的所有棋子,始終不能找到一口氣,可以確定這整塊棋都死掉了。看上去這是乙個需要採用遞迴處理的情況。遞迴處理整塊棋時,切記需要記錄已經處理過的棋子,不能重複處理同乙個棋子,否則可能會導致迴圈遞迴、死遞迴的情況發生。一旦確定了棋子的生死,從棋盤上拿掉它是很容易的事情,只是在程式中做一些標記而已。

注意,我(liigo)這裡說的某塊棋「還活著」,並不等同於圍棋術語中的「已做活」,而只是表示這塊棋「暫時還沒有死」,至於將來會不會死,不在現在的處理範圍之內。別忘了,我們的目標是「如果棋子死了,把它從棋盤上拿掉」,既然還沒死(或沒死絕),又何必管它呢(如果非要提前提子,反而違反圍棋規則了)。

以下c/c++源**,實現了上面說到的自動提子功能。

以上**來自我(liigo)最近開發的「m8圍棋譜」軟體,此專案已在 google code 上開源:

如有錯漏疏忽之處,誠請批評指正。

DrawText中的自動換行功能

本文摘自 使用drawtext函式輸出文字,如果需要讓輸出的內容在指定矩形內自動換行,則可以使用dt wordbreak選項。但根據api說明,該選項只能截斷單詞,即只在單詞間的空格處分割。如果輸出內容是一長串沒有空格分隔的ascii碼 如英文本元或數字 那麼該長串會被當做乙個單詞來處理而不會自動換...

軟體自動更新功能的實現

今天一朋友在群裡面問,軟體自動更新功能怎麼做,大家都不知道怎麼搞,我下午剛好沒事情,就研究了下。客戶端 主程式 呼叫公升級程式,公升級程式連線到最新的伺服器上。2 公升級程式獲取伺服器上的xml配置檔案中最新程式的更新日期或版本號或檔案大小等。3 公升級程式獲取客戶端 主程式 的xml配置檔案的更新...

TP框架中的自動驗證功能 validate

thinkphp 中 validate 關鍵字是在模型中定義的自動驗證資料的功能。驗證的規則可以是進行資料型別 業務規則 安全判斷等方面的驗證操作。資料驗證有兩種方式 靜態方式 在模型類裡面通過 validate屬性定義驗證規則。動態方式 使用模型類的validate方法動態建立自動驗證規則。無論是...