程序設計大賽答辯演講稿_第1頁
程序設計大賽答辯演講稿_第2頁
程序設計大賽答辯演講稿_第3頁
程序設計大賽答辯演講稿_第4頁
程序設計大賽答辯演講稿_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、尊敬的各位評委,各位老師: 你們好,我叫,來自140406班的LZ組合。我們組的題目是連連看輔助工具。 在作品演講之前,請允許我代表我們小組感謝黑馬IT學院和計算機學院能夠提供給我這樣一個展示自我的平臺,謝謝(行禮) 下面,開始我們組的品演示,首先,打開我們的連連看輔助工具,因為在制作之前,我們小組考慮到不同系統(tǒng)的用戶需求,所以制作了三個版本的“連連看輔助工具”,并分別對應W7 32位操作系統(tǒng),W7 64位操作系統(tǒng)和W8 64位操作系統(tǒng),由于我的電腦是W8 64位操作系統(tǒng),所以就只演示W(wǎng)8 64位版本的。 接下來,讓我們進入游戲,考慮到時間問題,所以只用練習模式來演示,首先嘗試“單消”功能,所

2、謂單消,顧名思義,便是只消除一對棋子的意思,它是本游戲的基礎,接下來的一些中重要的功能都是圍繞著它展開;然后,讓我們嘗試一下“秒殺”功能,“秒殺”就是全屏清除,我們可以多嘗試幾個圖(演示); 接下來,讓我們嘗試一下“自動掛機”功能,勾選“自動掛機”我們會發(fā)現(xiàn)游戲開始自動以一個一個的消除,同時我們也可以通過移動下面的滑塊來調(diào)節(jié)自動掛機的速度,這就是我們的“掛機速度調(diào)節(jié)”功能(演示); 至于“去游戲倒計時”功能,是取消游戲倒計時,讓游戲無比流暢;而“無限道具”功能,則是讓游戲的道具增加,下面我給大家試一下(演示) 接下來“自動開局”功能為了讓游戲自動開始;“窗口置頂”功能是將游戲頁面放在桌面最上方

3、,便于對游戲的操作,并使游戲輔助工具更加穩(wěn)定再加上先前“去游戲倒計時”功能都是為了給游戲的自動掛機做鋪墊,讓掛機變得流暢,下面讓我們來試一下這兩個功能(演示) 講解完了本工具的大體功能,讓我們來和別人正式的玩一局。 (游戲時間 需自由發(fā)揮 帶上所有的功能 并突出功能特色) 這真是完美的一次勝利,那它到底是怎樣實現(xiàn)的哪?下面開始進行PPT的講解。 這個輔助工具是由我們計算機科學與工程學院 140406班的LZ組合制作,我們的口號是“理智成就自我”(全組齊聲), “LZ”是“理智”的縮寫,所以我們會用我們的理性和智慧去處理每一件事,這雖然是我們小組第一次參加比賽,但我相信這絕不會是最后一次。 OK

4、,下面讓我們進入正題。 我們的連連看輔助工具共有8項功能,包括:單消、秒殺、無限道具、自動開局、自動掛機、掛機速度調(diào)節(jié)、去游戲倒計時、游戲窗口置頂(翻頁)下面開始“單消”功能的詳細介紹首先讓我們看看程序的流程圖首先,我們讀取棋盤的內(nèi)存數(shù)據(jù)然后判斷是否有相同的棋子接下來模擬鼠標點擊判斷棋子的數(shù)量是否減少如果減少了就更新棋盤數(shù)據(jù)最后結束單消現(xiàn)在讓我們來看看具體的代碼這是一段用來打開進程讀取進程并將棋盤的內(nèi)存數(shù)據(jù)存放到數(shù)組中的程序首先,我們定義一個字節(jié)型的數(shù)組因為棋盤是11行19列,所以定義為chessdata【11】*【19】然后定義一個hWnd gameh 用來表示窗口句柄FindWindow,

5、是用來尋找窗口ID的函數(shù)/FindWindow,LPCTSTR lpClassName, / pointer to class nameLPCTSTR lpWindowName / pointer to window name);這個函數(shù)擁有兩個參數(shù)其中l(wèi)pClassName參數(shù)指向類名,lpWindowName指向窗口名在本程序中不需要指向類名的參數(shù),所以第一個參數(shù)為空,而第二個參數(shù)指向窗口名,也就是之前定義過的gameCaption然后下一步我們需要定義一個Double Word類型的變量 processid 由于每個word為2個字節(jié)的長度,所以processid雙字節(jié)為4個字節(jié)接下來我

6、們要使用GetWindowThreadProcessId這個函數(shù)來找到窗口的進程,這個函數(shù)同樣擁有兩個參數(shù)DWORD GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId);其中第一個參數(shù)指向被查找的句柄 也就是Findwindow的返回值gameh第二個參數(shù)是進程號的存放地址,我們可以指向剛剛定義的processid hWndin (向函數(shù)提供的)被查找窗口的句柄.lpdwProcessIdout 進程號的存放地址(變量地址)接下來我們需要用OpenProcess這個函數(shù)獲取進程的句柄并且將句柄保存在processH中OpenPro

7、cess 函數(shù)用來打開一個已存在的進程對象,并返回進程的句柄。HANDLE OpenProcess(DWORD dwDesiredAccess, /渴望得到的訪問權限(標志)BOOL bInheritHandle, / 是否繼承句柄DWORD dwProcessId/ 進程標示符這個函數(shù)擁有三個參數(shù),第一個參數(shù)是訪問權限,我們定義為 PROCESS_ALL_ACCESS也就是對進程內(nèi)存的全部操作權限 第二個是是否繼承句柄,我們選擇否,也就是false 第三個進程標示符,也就是進程號,我們已經(jīng)通過GetWindowThreadProcessId得到了,也就是processid因此我們得到了進程的

8、句柄processH然后我們需要定義一個同樣是Double Word類型的變量 byread, 再定義一個沒有類型的指針LPCVOID pbase(基礎) 這個指針存放的是棋盤數(shù)據(jù)的首地址 其中這個C代表不能修改變量的意思這個首地址是通過CE(CheatEngine61_cn)這個工具找到的 這個基址是一個十六進制數(shù)字0x00189F74然后再次定義一個沒有類型的指針LPVOID nbuffer(緩沖)用來存放棋盤的數(shù)據(jù)最后我們使用ReadProcessMemory這個函數(shù),這個函數(shù)擁有5個參數(shù),第一個是參數(shù)是進程的句柄,也就是processH;第二個參數(shù)是要讀取內(nèi)存的首地址,也就是我們之前定

9、義的pbase;第三個參數(shù)是我們存入內(nèi)存數(shù)據(jù)的地址,我們將其存在nuffer中;第四個參數(shù)是要傳送的字節(jié)數(shù),因為棋盤是11*19,所以我們就傳送11*19個數(shù)據(jù);第五個參數(shù)是實際傳送的字節(jié)數(shù). 函數(shù)返回時報告實際寫入多少,我們將其存在byread之中BOOL ReadProcessMemory(HANDLE hProcess,PVOID pvAddressRemote,PVOIDpvBufferLocal,DWORD dwSize,PDWORDpdwNumBytesRead);實際應用hProcess in遠程進程句柄。 被讀取者pvAddressRemote in遠程進程中內(nèi)存地址。 從具體

10、何處讀取pvBufferLocal out本地進程中內(nèi)存地址. 函數(shù)將讀取的內(nèi)容寫入此處dwSize in要傳送的字節(jié)數(shù)。要寫入多少pdwNumBytesRead out實際傳送的字節(jié)數(shù). 函數(shù)返回時報告實際寫入多少這樣我們就完成讀取棋盤數(shù)據(jù)的功能了然后我們開始尋找棋盤中相同的棋子,通過查找內(nèi)存中相同的數(shù)據(jù)我們找出相同的棋子程序中的for循環(huán)是用來不斷改變棋子的位子,其中x1,y1是棋子1的位子,x2,y2是棋子二的位子x1=1,y1=1代表第一行第一列的棋子,x1=2,y1=2代表第二行,第二列的棋子,以此類推如果棋子1與棋子2的內(nèi)存數(shù)據(jù)相等,那么我們就模擬鼠標點擊,然后通過鼠標的模擬點擊和

11、棋子數(shù)量是否減少來決定單消的程序是否結束。下面我們開始介紹模擬鼠標點擊的程序,首先我們通過之前的ReadProcessMemory函數(shù),將棋盤中剩余棋子的數(shù)量保存在chessnum中然后將它的值賦給l,通過Findwindow獲得窗口句柄,并且將其保存在hwnd中然后定義一個整型變量lparam根據(jù)棋子1與棋子2的位子來給lparam賦值,因為第一行第一列的鼠標坐標為(192.21)相鄰棋子之間的間隔為35并且由于我們要用到的是32位的鼠標地址,我們我們將x左移16位,所以給lparam賦值為lparam=(p1.y*35+192)<<16)+(p1.x*31+21);接下來我們開

12、始使用這個SendMassage函數(shù),該函數(shù)將指定的消息發(fā)送到一個或多個窗口。此函數(shù)為指定的窗口調(diào)用窗口程序,直到窗口程序處理完消息再返回而我們就需要這個函數(shù)發(fā)送一個鼠標消息,這個函數(shù)擁有四個參數(shù),第一個是我們通過Findwindow找到的窗口的句柄hwnd;第二個是消息的標識(志)符,我們模擬的是鼠標點擊所以就是WM_LBUTTONDOWN和WM_LBUTTONUP,對應的是鼠標的按下和抬起;第三個和第四個參數(shù)都是32位的特定附加信息,我們使用第四個,也就是將第三個參數(shù)設為零,第四個參數(shù)設為鼠標地址也就是我們之前定義的lparamsendmessagehWnd 是接收消息的窗口的句柄Msg

13、是消息標識符wParam 是32位的特定附加信息。lParam 是32位特定附加信息這樣我們就可以模擬點擊棋子1了,然后我們再次按照上面的方法點擊棋子二,通過下面if語句,判斷如果棋子減少了,就返回大于一的數(shù);終止循環(huán)。如果棋子不變,就返回0,讓上面的循環(huán)繼續(xù),知道棋子數(shù)發(fā)生變化為止這樣,我們的單消功能就完成了下面我們開始講解秒殺的程序先看看流程圖,首先我們需要執(zhí)行單消這個程序,然后我們需要判斷棋子數(shù)是否為零,如果為零就退出循環(huán)結束程序,如果不為零,就繼續(xù)執(zhí)行單消程序下面開始講解代碼的實現(xiàn)我們先將單消的函數(shù)進行封裝,定義成clearpair()函數(shù)然后我們經(jīng)行while循環(huán),直到棋子數(shù)為零,才

14、終止循環(huán);此時,我們也就完成了秒殺功能下面我們開始介紹無限道具的程序對于無限道具,我們只需要找到游戲道具的內(nèi)存地址,并且將其改寫就OK了下面開始講解程序程序前面我們已經(jīng)講解過,定義窗口名,獲取窗口句柄,獲取進程句柄,唯一不同的是我們要用到writeprocessmemory函數(shù)來寫入進程WriteProcessMemory此函數(shù)能寫入某一進程的內(nèi)存區(qū)域(直接寫入會出Access Violation錯誤,故需此函數(shù))。VC+聲明BOOL WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nS

15、ize,LPDWORD lpNumberOfBytesWritten);參數(shù):hProcess由OpenProcess返回的進程句柄。如參數(shù)傳數(shù)據(jù)為 INVALID_HANDLE_VALUE 【即-1】目標進程為自身進程lpBaseAddress要寫的內(nèi)存首地址再寫入之前,此函數(shù)將先檢查目標地址是否可用,并能容納待寫入的數(shù)據(jù)。lpBuffer指向要寫的數(shù)據(jù)的指針。nSize要寫入的字節(jié)數(shù)。返回值非零值代表成功。該函數(shù)一共擁有5個參數(shù),第一個參數(shù)是由openprocess返回的進程句柄;第二個是要寫入的首地址,也就是我們游戲道具的首地址;要寫入數(shù)據(jù)的指針,也就是我在上面定義的數(shù)組a,b,c,d,

16、e,;第四個是要寫入的字節(jié)數(shù),我們都定義為1個字節(jié);第五個是返回值,我們把上面定義的bywritesize放到這里,存儲返回值;由于道具是有兩個內(nèi)存地址控制,一個地址控制道具種類,一個地址控制道具數(shù)量,例如第一個函數(shù)控制的是道具的數(shù)量,第二個控制的就是“重列”這個道具是否出現(xiàn)這樣我們就完成游戲道具內(nèi)存的寫入了下面開始講解自動掛機的功能這個功能很簡單,只需要在單消的基礎上加入一個定時器函數(shù)就行了,流程圖也很簡單,就是更新數(shù)據(jù),然后定時器函數(shù)重復單消,然后再次更新數(shù)據(jù)下面開始講解代碼的實現(xiàn),首先我們先定義兩個常量,一個變量,然后更新棋盤數(shù)據(jù),通過if語句來判斷此項功能是否被勾選,如果被勾選,就再次

17、更新棋盤數(shù)據(jù),然后使用settimer這個定時器函數(shù)UINT_PTR SetTimer(HWND hWnd, / 窗口句柄UINT_PTR nIDEvent, / 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器UINT nElapse, / 時間間隔,單位為毫秒TIMERPROC lpTimerFunc / 回調(diào)函數(shù));在MFC程序中SetTimer被封裝在CWnd類中,調(diào)用就不用指定窗口句柄了,所以這個函數(shù)就只有三個參數(shù),第一個參數(shù)是定時器的ID,我們把它指向之前定義的playID;第二個是時間間隔q的值為1000,所以時間間隔為1s;第三個參數(shù)是回調(diào)函數(shù),我們這回調(diào)函數(shù)中放入單消

18、的函數(shù),在下面這個程序里面了;這樣就是每間隔1s就執(zhí)行一次單消函數(shù),所以就實現(xiàn)了自動掛機的功能下面開始介紹自動開局功能首先,讓我們看看流程圖,我們需要先更新數(shù)據(jù),然后判斷棋子的數(shù)量,如果棋子數(shù)量為零,那么我們就模擬鼠標點擊“開始游戲”,如果不為零的話就重新更新棋盤數(shù)據(jù),直到它為0為止下面讓我們看看程序的實現(xiàn)首先通過IF語句來判斷棋子數(shù)是否為零,如果為0就延時1s,并獲取窗口的句柄,并且模擬鼠標的點擊“開始游戲”這樣就完成自動開局的功能下面開始介紹掛機速度調(diào)節(jié)功能讓我們看看流程圖首先,我們需要創(chuàng)建一個滑塊然后定義一個變量并且將變量傳給 自動掛機里的時間標識,然后更新數(shù)據(jù)下面讓我們看看那代碼的實現(xiàn)

19、首先,我們需要更新一下數(shù)據(jù),然后將滑塊的值賦給m_num,其中this是關鍵字,屬于實體(entity),是一個指針右值,而后面的m_ctl_slider.GetPos();是滑塊當前的位子的值至于這個*pResult = 0;是為了防止對未知的位子進行操作,增加程序的穩(wěn)定性然后我們將滑塊的值傳遞給Q,通過滑塊改變Q的值,就能改變下面自動掛機函數(shù)的時間間隔,進而改變自動掛機的速度下面是去游戲倒計時功能這個功能和無限道具功能的代碼類似,都是讀取進程,然后寫入進程就行了這里就不過多的解釋了下面是游戲窗口置頂功能首先,我們要更新一下游戲數(shù)據(jù)然后獲取游戲窗口名,最后使用一下窗口置頂函數(shù)讓我們看看代碼的

20、實現(xiàn)用FINDWINDOW找到窗口的句柄然后使用SetWindowPos函數(shù),這個函數(shù)一共有7個參數(shù),第一個參數(shù)是窗口的句柄,也就是我們之前定義的gameh;第二個參數(shù)是我們要把這個窗口放到哪,我們選擇 HWND_NOTOPMOST:將窗口置于所有非頂層窗口之上;第三個參數(shù)到第六個參數(shù)設定窗口的位子和大小,我們將其都設為0;第七個窗口是窗口尺寸和定位的標志,我們使用這三個參數(shù),組合成一個參數(shù),分別是SWP_NOMOVE:維持當前位置(忽略X和Y參數(shù))。SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數(shù))SWP_SHOWWINDOW:顯示窗口。BOOL SetWindowPos(HWND h

21、Wnd, const CWnd* pWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags);這樣我們就完成了窗口置頂?shù)脑O置HWND_NOTOPMOST:將窗口置于所有非頂層窗口之上(即在所有頂層窗口之后)。如果窗口已經(jīng)是非頂層窗口則該標志不起作用。x以客戶坐標指定窗口新位置的左邊界。Y以客戶坐標指定窗口新位置的頂邊界。cx以像素指定窗口的新的寬度。cy以像素指定窗口的新的高度。SWP_NOMOVE:維持當前位置(忽略X和Y參數(shù))。SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數(shù))SWP_SHOWWINDOW:顯示窗口。下面開始對我們作品的優(yōu)點進行總結首先我們對大量的函數(shù)進行了封裝,例如單消函數(shù),模擬鼠標點擊函數(shù)等等,盡量簡潔了函數(shù)其次,我們添加了自動使用重列的函數(shù),因為我們在游戲的時候,很可能會遇到這種情況(提示請使用重列道具),此時,我們不得不手動的去使用重列道具因此我們在單消函數(shù)中添加了自動使用重列,這樣就能在無解的情況下自動使用重列下面讓我們來看看自動使用重列的代碼,使用自動重列的條件是棋子的數(shù)量在經(jīng)過一次完整的單消循環(huán)后還沒有變化,此時就會模擬鼠標點擊重列道具但是經(jīng)過我們幾百次的實驗,發(fā)現(xiàn)有的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論