重點演算法解疑 穿越叢林

2021-04-07 13:17:21 字數 1852 閱讀 9110

對mlmap()和move**ap()的理解

有沒有感覺到我的系列文件的每一篇都是在講二個相關或相似的函式,這是一種巧合,作者的書中每篇都恰好用

到了二個這樣的函式,這二個函式可以涵蓋那一章的整體的知識體系,對那一章的理解只要理解了這二個函式就差不多了.

mlmap()顧名思義就是"move & link map",即"移動拼接地圖",move**ap()也帶有地圖移動的意思,可見這二個函

數的作用共同構成了最後的"場景捲動"的效果,具體整個場景的捲動效果是如何通過這二個函式達成的呢?下面會談到,我們把整個暫存區bkdc1(要明確這個暫存區不是靜態的,而是動態的,因為在"顯示區"的物件所在的memdc和地面所在dc會在乙個時間間隔內不停地對它進行重新整理,重新整理就是dc之間的對拷,就是在initdlg()中的ontimer()函式中,模擬想像一下這二個過程吧,同樣的,memdc和地面所在的dc也不是靜態的)看成是"場

景",但是它又不同於"顯示區",顯示區就是作者在書中提到的"螢幕"的說法(這個螢幕不是指計算機的螢幕),"顯示區"顯然比"場景"小得多,場景可以是12*12,但"顯示區"永遠只是主程式介面最左上的那個大方框那麼大,在"廣闊天地"中我們談到,場景=出場的物件+捲動中的地面,其實更精確的說法是,場景=出場的物件中的在顯示區的那一部分+捲動中的地面,於是整個發生在場景上的顯示變化都是由物件的顯示變化和不斷以移動拼接方式顯示的(下面在分析move**ap()時會談到,為什麼不是mlmap()呢,不是說"移動拼接"嗎?下面會解釋到)地面背景dc構成的,一般都把地面(或者說地面所在dc)叫做"背景",而把物件(或者說memdc)叫做"前景",我們在前面的"狩獵謀生"的ontimer()講解多物件的顯示setobj()中已經把物件由memdc貼到bkdc1的過程講完了,現在就只有地面所在dc貼到bkdc1的過程沒有講,只有這二者都完成了,即前景和背景都貼到暫存區bkdc1中了,程式再在乙個時間週期中一次性地將它們貼到dc_mdc中,即"顯示區"中,也可以說是"螢幕"(可見這個螢幕只是整個計算機螢幕的一部分),也就是當前視窗的客戶區中的那一塊方框面積大小的dc中達成最後的我們肉眼可以看到的真實的顯示效果,理解"地面捲動"與"場景捲動"的區別是進一步理解下面的知識的前提,再贅述一次,程式中用到了乙個判斷函式inscreen(),來判斷.dat中定義的rs個物件中有哪些是在顯示區,以決定把在顯示區的那些物件進行實際的從memdc到bkdc1的對貼,因為不必要把不在顯區的物件也貼到當前"顯示區"中來,這樣整個場景中就有了物件了,餘下的就是地面了,地面所在dc貼到bkdc1的過程是由move**ap()而不是mlmap()完成的,書中從來都沒有把單純的地面背景所在的dc貼到bkdc1的過程與效果看成是"場景",也沒有把單純的物件貼到bkdc1的過程與效果看成是"場景",讓我們來模擬想像一下這個過程吧,計算機在高速運轉,"顯示區"在不斷重新整理變動,先假設人物不動(人物跟動物都是活動物件,它們貼到"顯示區"的過程和效果是一樣的,假設人物不動可以減少分析的複雜),不斷有動物從顯示區外的場景走或跑到"顯示區"來而被顯示,在它們跑到"顯示區"之前,它們作為活動物件跟當前"顯示區的"人物物件一樣完成了manmove()和biawfw()(人物雖然是靜止的,也受biawfw()的作用,這個我們在"走四方"中就分析過),只是不實際顯示,跑到"顯示區"內來之後,它們才實際顯示,程式用乙個判斷函式inscreen()來判斷是否要實際顯示,具體整個場景的捲動效果是如何通過這二個函式達成的呢?回到文章的開頭,實際上mlmap()中的"map"就是指整個"顯示區",move**ap()中的"map"才指地面,整個"場景"的捲動是mlmap()的作用而不是move**ap()的作用,mlmap()是面向使用者的,建立在move**ap()之上,move**ap()是面向程式內部的,它們之間的聯絡是乙個"開關"作用的變數move,如果move**ap()體內move=1(使用者滑鼠的任何超出當前顯示區的動作都可以導致move由0變為1),反映到mlmap(),就導致了使用者看到的整個"顯示區"的捲動效果..

王道1 2章重點演算法題

include include include using namespace std define maxsize 20 順序表 typedef struct sqlist 鍊錶 typedef struct lnode linklist,lnode 初始化 void init sqist sql...

程式設計練習 鍊錶必考重點演算法

一 單鏈表反轉 linklist reserve l linklist l 上面這一種是 不算表頭的 表頭里沒有資料 下面這一種是表頭帶資料,表頭也要丟到最後 listnode reverselist listnode phead return preversehead 二 判斷單鏈表是否有環 bo...

面試複試重點 演算法與資料結構

1.演算法的幾個特徵是什麼。2.演算法複雜性的定義。大o 小o分別表示的含義。3.遞迴演算法的定義 遞迴演算法的兩要素。4.分治演算法的思想,經典的分治演算法 全排列 二分搜尋 歸併排序 快速排序 線性時間選擇 最接近點對問題 5.動態規劃演算法解題框架,動態規劃演算法的兩個要素是什麼?備忘錄方法是...