版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式系統(tǒng)原理與應(yīng)用課程設(shè)計(jì)嵌入式系統(tǒng)原理與應(yīng)用課程設(shè)計(jì)—五子棋游戲設(shè)計(jì)題目:五子棋游戲設(shè)計(jì)姓名:學(xué)號(hào):專(zhuān)業(yè):指導(dǎo)老師:2013年11月15日目錄TOC\o"1-3"\h\u16762一、系統(tǒng)分析與總體設(shè)計(jì) 393681.1選題的意義 348761.2理解需求 3304541.2.1功能需求 364871.2.2界面設(shè)計(jì)需求 4297081.3EVC的各組成部分的構(gòu)成和作用 4229961.4五子棋游戲的基本要求 5216201.4.1開(kāi)發(fā)環(huán)境描述 5306171.4.2系統(tǒng)總體功能: 6205551.4.3每個(gè)功能的詳細(xì)說(shuō)明: 6200351.5開(kāi)發(fā)工具的選用及介紹 64323二、設(shè)計(jì)內(nèi)容及要求 8218502.1系統(tǒng)總體功能設(shè)計(jì) 8238362.2總體設(shè)計(jì) 861012.3主要模塊功能設(shè)計(jì)流程圖 10103952.4算法實(shí)現(xiàn) 13318822.4.1使用到的主要數(shù)據(jù)結(jié)構(gòu) 1310822.4.2使用到的主要函數(shù) 13218592.4.3搜索算法實(shí)現(xiàn)描述:
144395三、系統(tǒng)實(shí)現(xiàn)與調(diào)試 16225833.1運(yùn)行程序結(jié)果圖 16151933.2調(diào)試過(guò)程中錯(cuò)誤信息和解決方法 18130073.3調(diào)試過(guò)程:程序時(shí)間流程中的解決方法 18196593.4系統(tǒng)運(yùn)行的結(jié)果 195363結(jié)論 2129846參考文獻(xiàn) 2132265附:設(shè)計(jì)程序代碼 22
一、系統(tǒng)分析與總體設(shè)計(jì)1.1選題的意義五子棋是一種兩人對(duì)弈的純策略型棋類(lèi)游戲,棋具與圍棋通用,是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。相傳中華民族的祖先軒轅黃帝無(wú)意之中畫(huà)下了十七條橫線(xiàn)十條豎線(xiàn),這無(wú)意中的發(fā)明造就出了五子棋。后來(lái),中國(guó)古代的五子棋先由中國(guó)傳到高麗(今朝鮮),然后傳到日本。20世紀(jì)初傳統(tǒng)五子棋及連珠從日本傳入歐洲。許多國(guó)家的人對(duì)五子棋都有不同的愛(ài)稱(chēng),例如,韓國(guó)人把五子棋稱(chēng)為“情侶棋”;歐洲人稱(chēng)其為“紳士棋”,代表下五子棋的君子風(fēng)度勝似紳士;日本人則稱(chēng)其為“中老年棋”,說(shuō)明五子棋適合中老年人的生理特點(diǎn)和思維方式;美國(guó)人喜歡將五子棋稱(chēng)為“商業(yè)棋”,也就是說(shuō),商人談生意時(shí)可邊下棋邊談生意,棋下完了生意也談成了。由于五子棋游戲規(guī)則簡(jiǎn)單易懂,老少皆宜,而且趣味橫生,引人入勝;不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。已在各個(gè)游戲平臺(tái)有應(yīng)用?;赪indows的游戲設(shè)計(jì)方式很多,如基于Java的跨平臺(tái)設(shè)計(jì),基于.net平臺(tái)的設(shè)計(jì),基于JAVA的設(shè)計(jì)由于運(yùn)行在虛擬機(jī)上運(yùn)行,等等。嵌入式系統(tǒng)根據(jù)應(yīng)用需求滿(mǎn)足應(yīng)用系統(tǒng)的功能、可靠性、成本、體積等要求,提高了運(yùn)行效率。本文采用EVC在ARM平臺(tái)上進(jìn)行設(shè)計(jì)來(lái)完成五子棋游戲。1.2理解需求1.2.1功能需求實(shí)現(xiàn)游戲界面的顯示;顯示用戶(hù)行程,提示用戶(hù)下子;查看用戶(hù)的輸入是否出界;實(shí)現(xiàn)悔棋功能;實(shí)現(xiàn)新一局游戲開(kāi)始功能;判斷每局游戲輸贏;用戶(hù)選擇是否開(kāi)始新一盤(pán)五子棋游戲;退出游戲。1.2.2界面設(shè)計(jì)需求顯示游戲運(yùn)行界面,棋盤(pán)大小規(guī)格為15*15;根據(jù)功能需求,顯示新游戲和悔棋按鈕;系統(tǒng)和用戶(hù)需要用不同的顏色的棋子,最后以紅色棋子顯示贏家?!鬍VC4.0軟件界面的組成六大組成部分:標(biāo)題欄、菜單欄、工具欄、工作區(qū)、活動(dòng)窗口區(qū)、輸出窗口1.3EVC的各組成部分的構(gòu)成和作用◆標(biāo)題欄顯示當(dāng)前的工程名,活動(dòng)窗口中當(dāng)前打開(kāi)的文件名。當(dāng)當(dāng)前活動(dòng)窗口中沒(méi)有打開(kāi)任何文件,則該欄只顯示當(dāng)前的工程名◆菜單欄●由“File”、“Edit”、”View”等共9個(gè)菜單項(xiàng)組成●幾乎囊括了EVC4.0下可以進(jìn)行的所有操作◆工具欄●在EVC4.0主界面的空白區(qū)右單擊鼠標(biāo),彈出的菜單中列出了所有可視的菜單項(xiàng)●常用的有“Standard”、”WCEConfiguration”等◆工作區(qū)●三個(gè)選項(xiàng)卡:“ClassView”、“ResourceView”、 “FileView”●ClassView選項(xiàng)卡用來(lái)觀察當(dāng)前工作區(qū)中已有工程名以及工程的個(gè)數(shù),每個(gè)工程用到的類(lèi)、結(jié)構(gòu)體、函數(shù)、全局變量?!馬esourceView選項(xiàng)卡用來(lái)觀察所有工程用到的資源●FileView選項(xiàng)卡用來(lái)觀察工作區(qū)中所有工程中包含哪些源代碼文件,如:.C、.cpp等◆活動(dòng)窗口區(qū)●EVC4.0軟件中最大的用于顯示和編輯的區(qū)域●用于顯示工程中的資源文件和源代碼文件●用于編輯資源文件●用于編輯源代碼文件●在程序調(diào)試時(shí),提供可視化界面用作斷點(diǎn)設(shè)置和程序執(zhí)行時(shí)跟蹤觀察1.4五子棋游戲的基本要求1.4.1開(kāi)發(fā)環(huán)境描述隨著個(gè)人掌上電腦PocketPC、智能手機(jī)及工業(yè)控制器等各種嵌入式產(chǎn)品的不斷發(fā)展,人們對(duì)MicrosoftWindowsCE也越發(fā)關(guān)注起來(lái),使用WinCE可以成為新一代智能設(shè)備設(shè)計(jì)高性能的應(yīng)用程序。五子棋游戲軟件基于ARM的wince5.0平臺(tái),利用PXA270RP實(shí)驗(yàn)箱模擬仿真器,利用EVC編程來(lái)具體實(shí)現(xiàn),在實(shí)驗(yàn)箱的觸摸屏上進(jìn)行游戲。嵌入式系統(tǒng)作為芯片和軟件的集成體,在科學(xué)研究、工業(yè)控制、軍事技術(shù)、醫(yī)療衛(wèi)生、消費(fèi)電子等方面有著普遍的應(yīng)用,此軟件基于ARM處理器和windowsCE的研究平臺(tái),windowsCE是由優(yōu)先級(jí)的多任務(wù)操作系統(tǒng)它允許多重功能、進(jìn)程,在相同的時(shí)間系統(tǒng)中運(yùn)行WindownsCE支持最大的32位同步進(jìn)程,微軟WindownsCE被設(shè)計(jì)成針對(duì)小型設(shè)備的通用操作系統(tǒng),它可以通過(guò)設(shè)計(jì)一層位于內(nèi)核和硬件之間代碼來(lái)設(shè)定硬件平臺(tái)。嵌入式工具包包括設(shè)備驅(qū)動(dòng)器(DDK)和軟件開(kāi)發(fā)包(SDK),DDK提供了關(guān)于寫(xiě)驅(qū)動(dòng)器的附加文本,SDK提供庫(kù)、頭文件、樣本代碼、文本以允許,開(kāi)發(fā)者對(duì)基于WindownsCE的平臺(tái)進(jìn)行寫(xiě)操作,WindownsCE提供了相同的程序界面,以用來(lái)為其他的視窗操作系統(tǒng)開(kāi)發(fā)功能。=1\*GB3①技術(shù)可行性運(yùn)用Windows2000/XP以上的操作系統(tǒng),SQLSERVER2000的數(shù)據(jù)庫(kù)技術(shù),開(kāi)發(fā)以WindowsXP為用戶(hù)的操作平臺(tái),界面友善、功能齊全的《五子棋雙人對(duì)戰(zhàn)小游戲》。=2\*GB3②經(jīng)濟(jì)可行性 一方面,新系統(tǒng)中棋盤(pán)界面和更強(qiáng)勁的功能支持,不僅增加了游戲的趣味性,而且使游戲者更盡興;另一方面系統(tǒng)開(kāi)發(fā)成本低,現(xiàn)有PC機(jī)即可提供該系統(tǒng)開(kāi)發(fā)工作需要的所有硬件設(shè)備環(huán)境。=3\*GB3③操作可行性操作上是鍵盤(pán)的使用,主要憑借輸入坐標(biāo)確定棋子落子位置,方便簡(jiǎn)單。使用前只要看明白游戲規(guī)則及其方法即可。1.4.2系統(tǒng)總體功能:通過(guò)判斷棋盤(pán)上的所有相同顏色的子能否五個(gè)相連來(lái)判斷游戲是否結(jié)束。
實(shí)際上,是根據(jù)當(dāng)前最后一個(gè)落子的情況來(lái)判斷勝負(fù)的。實(shí)際上需要從四個(gè)位置判斷,以該子為出發(fā)點(diǎn)的水平,豎直和兩條分別為
45度角和135度角的線(xiàn),目的是看在這四個(gè)方向是否最后落子的一方構(gòu)成連續(xù)五個(gè)的棋子,如果是的話(huà),就表示該盤(pán)棋局已經(jīng)分出勝負(fù)。1.4.3每個(gè)功能的詳細(xì)說(shuō)明:=1\*GB3①游戲開(kāi)始:打開(kāi)游戲,用戶(hù)可以直接進(jìn)入游戲,由用戶(hù)首先開(kāi)始下棋。②游戲進(jìn)悔棋操作:用戶(hù)可以點(diǎn)擊“悔棋”按鈕,取消前一步所下的棋子,重新落子。=3\*GB3③游戲開(kāi)始新游戲操作:用戶(hù)可以點(diǎn)擊“新游戲”按鈕,重新開(kāi)始新一輪的游戲。=4\*GB3④游戲結(jié)束操作:游戲結(jié)束時(shí),用戶(hù)可以選擇是否開(kāi)始新一輪游戲。1.5開(kāi)發(fā)工具的選用及介紹EVC++是C++語(yǔ)言嵌入式設(shè)備應(yīng)用程序的編譯器,該編譯器編譯的程序可以運(yùn)行在便攜式電腦的微軟系列的操作系統(tǒng)中,如WinCE、WindowsMobile。目前市面上最常見(jiàn)的導(dǎo)航軟件,都是用C++語(yǔ)言編寫(xiě)、在EVC++上編譯出來(lái)的。EVC是微軟公司推出的可視化開(kāi)發(fā)工具,主要用來(lái)開(kāi)發(fā)基于WindowsCE的應(yīng)用程序。EVC的主要特性如下:
智能化的開(kāi)發(fā)環(huán)境、支持MFC類(lèi)庫(kù)和ATL、COM組件、更快速的編譯與輸出、支持C/C++、匯編混合編程、支持組件的更新和擴(kuò)展等等。平臺(tái)模擬器是一個(gè)在PC下模擬出來(lái)的操作系統(tǒng)軟件。平臺(tái)模擬器它的運(yùn)行速度比運(yùn)行在實(shí)際的物理平臺(tái)上的操作系統(tǒng)要慢。WindowsCE模擬器在Windows桌面系統(tǒng)上以窗口應(yīng)用程序的形式運(yùn)行,并且可以直接訪(fǎng)問(wèn)CPU以及系統(tǒng)內(nèi)存。從運(yùn)行效率的角度來(lái)看,運(yùn)行在模擬器上的應(yīng)用程序的效率只有在實(shí)際硬件環(huán)境上運(yùn)行效率的80%左右。WindowsCE5.0之前版本中,模擬器只支持X86的結(jié)構(gòu)。如果開(kāi)發(fā)者使用嵌套匯編編程,程序的編寫(xiě)和執(zhí)行效果就會(huì)因CPU結(jié)構(gòu)的不同而產(chǎn)生比較大的差異。開(kāi)發(fā)WindowsCE設(shè)備上的應(yīng)用程序時(shí),開(kāi)發(fā)平臺(tái)和程序運(yùn)行平臺(tái)是兩個(gè)獨(dú)立的操作系統(tǒng),即開(kāi)發(fā)機(jī)和目標(biāo)機(jī)是獨(dú)立的。用戶(hù)經(jīng)常需要在開(kāi)發(fā)機(jī)端查看目標(biāo)平臺(tái)的信息,或在兩者之間傳輸文件。微軟公司在EVC中集成了遠(yuǎn)程管理工具PlatformManager,提供開(kāi)發(fā)機(jī)和目標(biāo)平臺(tái)的遠(yuǎn)程連接。建立遠(yuǎn)程連接需要通過(guò)PlatformManage來(lái)實(shí)現(xiàn),開(kāi)發(fā)機(jī)是通過(guò)TCP/IP協(xié)議來(lái)實(shí)現(xiàn)與模擬器的遠(yuǎn)程連接的。啟動(dòng)模擬器的過(guò)程其實(shí)就是在遠(yuǎn)程連接建立的基礎(chǔ)上進(jìn)行的,即模擬器成功啟動(dòng),就已經(jīng)在開(kāi)發(fā)機(jī)和目標(biāo)機(jī)(即模擬器)之間成功建立了遠(yuǎn)程連接。在使用實(shí)際的WindowsCE設(shè)備時(shí),需要在設(shè)備啟動(dòng)后手動(dòng)建立遠(yuǎn)程連接。遠(yuǎn)程連接工具的功能如下:
(1)RemoteFileViewer工具該工具類(lèi)似Window的資源管理器,可以顯示W(wǎng)indowsCE遠(yuǎn)程機(jī)的目錄文件結(jié)構(gòu),并且可以上傳和下載文件。
(2)RemoteProcessViewer工具該工具類(lèi)似于Windows上的任務(wù)管理器,可以查看WindowsCE目標(biāo)設(shè)備上運(yùn)行的進(jìn)程及線(xiàn)程的詳細(xì)信息,此外還可以終止指定的進(jìn)程。
(3)RemoteZoomin工具該工具可以對(duì)WindowsCE設(shè)備進(jìn)行截屏,可以保存為bmp文件,也可以直接復(fù)制到剪貼板。(4)RemoteRegistryEditor工具。該工具給Windows上的注冊(cè)表管理器一樣,對(duì)WindowsCE目標(biāo)設(shè)備上的注冊(cè)表進(jìn)行管理。
(5)RemoteHeapWalker工具。
該工具顯示W(wǎng)indowsCE目標(biāo)設(shè)備上運(yùn)行的進(jìn)程列表,并詳細(xì)描述堆標(biāo)識(shí)符和標(biāo)志位信息??梢酝ㄟ^(guò)此工具確定某個(gè)應(yīng)用程序是否正在釋放為它分配的所有內(nèi)存隊(duì)列,從而判斷是否存在內(nèi)存泄漏。
(6)RemoteSpy++工具。
與VisualC++提供的工具Spy++一樣,只是它是監(jiān)控WindowsCE目標(biāo)設(shè)備上的窗口消息。(7)RemoteSysteminformation。顯示W(wǎng)indowsCE目標(biāo)設(shè)備上的系統(tǒng)信息。二、設(shè)計(jì)內(nèi)容及要求2.1系統(tǒng)總體功能設(shè)計(jì)游戲開(kāi)始時(shí),由用戶(hù)開(kāi)局,將一枚棋子落在棋盤(pán)一坐標(biāo)上,然后由電腦落子,如此輪流下子,直到某一方首先在棋盤(pán)的豎、橫或斜三方向上的五子連成線(xiàn),則該方該局獲勝;在下棋途中可以悔棋,也可以從新開(kāi)局。2.2總體設(shè)計(jì)將我們定制好的winCE系統(tǒng)下載到開(kāi)發(fā)板上,于此同時(shí)已經(jīng)在EVC上開(kāi)發(fā)平臺(tái)上運(yùn)用VC++語(yǔ)言開(kāi)發(fā)好了五子棋的相關(guān)代碼,剩下的就是將上述三個(gè)過(guò)程整合再一起,達(dá)到最終在開(kāi)發(fā)板上運(yùn)行嵌入式程序的過(guò)程。將開(kāi)發(fā)板連接好電源,下載好winCE系統(tǒng)后,將數(shù)據(jù)線(xiàn)連接好,啟動(dòng)同步軟件,進(jìn)行連接,直到同步軟件顯示連接成功之后,瀏覽板子內(nèi)容,選擇ARM2410開(kāi)發(fā)板SDK,進(jìn)行編譯,將相應(yīng)目錄下的可執(zhí)行文件加到實(shí)驗(yàn)箱目錄下,然后連接鼠標(biāo)到開(kāi)發(fā)板上的USB上,點(diǎn)擊可執(zhí)行程序文件,運(yùn)行開(kāi)發(fā)完成的游戲程序。當(dāng)然在本實(shí)驗(yàn)中我們直接應(yīng)用的是模擬器來(lái)實(shí)現(xiàn)程序的運(yùn)行,不在需要連接試驗(yàn)箱來(lái)進(jìn)行操作,游戲界面設(shè)計(jì)包括:游戲界面的布局,分偉三大板塊,分別是游戲顯示界面,左下角是新游戲開(kāi)始按鈕,右下角是悔棋按鈕。圖2-1圖形界面的設(shè)計(jì)圖2-1五子棋程序流程圖2.3主要模塊功能設(shè)計(jì)流程圖系統(tǒng)系統(tǒng)輸入模塊輸出模塊判斷模塊判斷違規(guī)斷判輸贏判斷命令初始化調(diào)試模塊是否違規(guī)白子贏黑子贏圖2-2系統(tǒng)功能模塊圖結(jié)束開(kāi)始從四個(gè)方向開(kāi)始判斷是否有五子在一條線(xiàn)上NoYesNoNoYesYesNoYes切換用戶(hù)下棋水平豎直上斜下斜贏結(jié)束開(kāi)始從四個(gè)方向開(kāi)始判斷是否有五子在一條線(xiàn)上NoYesNoNoYesYesNoYes切換用戶(hù)下棋水平豎直上斜下斜贏圖2-3判斷輸贏模塊圖下棋下棋從新開(kāi)始?悔棋?五子在一條線(xiàn)上?獲勝切換用戶(hù)YesNoYesNoNoYes結(jié)束開(kāi)始圖2-4判斷命令模塊流程圖2.4算法實(shí)現(xiàn)2.4.1使用到的主要數(shù)據(jù)結(jié)構(gòu)=1\*GB3①wzwin表示哪方獲勝的情況,當(dāng)inner=0時(shí)還未確定哪方獲勝,inter=1,白子獲勝,inter=2黑子獲勝。structwzwin{ intwinner; intnx1; intnx2; intny1; intny2;};=2\*GB3②Wzsave保存下棋記錄,即(ix,iy)這個(gè)坐標(biāo)是否使用,used=0未使用,used=1已使用,colour表示此處棋子的顏色。structwzsave{ boolused; boolcolor; intix; intiy;};2.4.2使用到的主要函數(shù)=1\*GB3①開(kāi)始新游戲的函數(shù):voidNewGame();=2\*GB3②畫(huà)棋子voidDrawQZ(intnx,intny,boolstyle);=3\*GB3③當(dāng)需要畫(huà)棋盤(pán)時(shí)調(diào)用voiddraw(); =4\*GB3④繪圖所用到的函數(shù) 黑色下子booluserAd(intnx,intny); 白色下子booluserBd(intnx,intny);=5\*GB3⑤ booldownzi(intnx,intny);//外部調(diào)用此函數(shù)下子=6\*GB3⑥判斷勝敗函數(shù)boolbewinner2(boolstyle,intnx,intny);=7\*GB3⑦用戶(hù)悔棋函數(shù)boolgoback();=8\*GB3⑧設(shè)置棋子類(lèi)型voidsetback(intnx,intny,boolstyle);=9\*GB3⑨用戶(hù)是否可以悔棋判斷函數(shù)boolgetbackble()。2.4.3搜索算法實(shí)現(xiàn)描述:
注意下面的核心的算法中的變量currentBoardSituation,表示當(dāng)前機(jī)器最新的盤(pán)面情況,
CountList表示第一層子節(jié)點(diǎn)可以選擇的較好的盤(pán)面的集合。核心的算法如下:
void
MainDealFunction()
{
value=-MAXINT;
//對(duì)初始根節(jié)點(diǎn)的value賦值
CalSeveralGoodPlace(currentBoardSituation,CountList);
//該函數(shù)是根據(jù)當(dāng)前的盤(pán)面情況來(lái)比較得到比較好的可以考慮的幾個(gè)盤(pán)面的情況,可以根據(jù)實(shí)際的得分情況選取分?jǐn)?shù)比較高的幾個(gè)盤(pán)面,也就是說(shuō)在第一層節(jié)點(diǎn)選擇的時(shí)候采用貪婪算法,直接找出相對(duì)分?jǐn)?shù)比較高的幾個(gè)形成第一層節(jié)點(diǎn),目的是為了提高搜索速度和防止堆棧溢出。
pos=CountList.GetHeadPosition();
CBoardSituation*
pBoard;
for(i=0;ivalue=Search(pBoard,min,value,0);
Value=Select(value,pBoard->value,max);
//取value和pBoard->value中大的賦給根節(jié)點(diǎn)
}
for(i=0;ivalue)
//找出那一個(gè)得到最高分的盤(pán)面
{
currentBoardSituation=pBoard;
PlayerMode=min;
//當(dāng)前下子方改為人
Break;
}
}
其中對(duì)于Search函數(shù)的表示如下:實(shí)際上核心的算法是一個(gè)剪枝過(guò)程,其中在這個(gè)搜索過(guò)程中相關(guān)的四個(gè)參數(shù)為:(1)當(dāng)前棋局情況;(2)當(dāng)前的下子方,可以是機(jī)器(max)或者是人(min);(3)父節(jié)點(diǎn)的值oldValue;(4)當(dāng)前的搜索深度depth。
double
Search(CBoardSituation&
board,int
mode,double
oldvalue,int
depth)
{
CList
m_DeepList;
if(deptholdvalue))==
TRUE)
{
if(mode==max)
value=select(value,search(successor
Board,min,value,depth+1),max);
else
value=select(value,search(successor
Board,max,value,depth+1),min);
}
return
value;
}
else
{
if
(
goal(board)<>0)
//這里goal(board)<>0表示已經(jīng)可以分出勝負(fù)
return
goal(board);
else
return
evlation(board);
}
}
注意這里的goal(board)函數(shù)是用來(lái)判斷當(dāng)前盤(pán)面是否可以分出勝負(fù),而evlation(board)是對(duì)當(dāng)前的盤(pán)面從機(jī)器的角度進(jìn)行打分。
下面是Select函數(shù)的介紹,這個(gè)函數(shù)的主要目的是根據(jù)
PlayerMode情況,即是機(jī)器還是用戶(hù)來(lái)返回節(jié)點(diǎn)的應(yīng)有的值。
double
Select(double
a,double
b,int
mode)
{
if(a>b
&&
mode==max)¦¦
(a<
b
&&
mode==min)
return
a;
else
return
b;
}
三、系統(tǒng)實(shí)現(xiàn)與調(diào)試3.1運(yùn)行程序結(jié)果圖3.2調(diào)試過(guò)程中錯(cuò)誤信息和解決方法開(kāi)發(fā)五子棋程序中,遇到的問(wèn)題及技術(shù)難題如下:=1\*GB3①錯(cuò)誤信息:C:\Users\qingxue\Desktop\brick\brick.rc(10):fatalerrorRC1015:cannotopenincludefile'afxres.h'.解決方法:C:\WINCE500\OTHERS\MFC\INCLUDE路徑添加到MicrosofteMbeddedVisualC++4.0中ToolsOptionsDirectoriesincludefiles下即可。=2\*GB3②錯(cuò)誤信息:LINK:fatalerrorLNK1104:cannotopenfile'mfcs42d.lib'解決方法:C:\WINCE500\OTHERS\MFC\LIB\X86路徑添加到MicrosofteMbeddedVisualC++4.0中ToolsOptionsDirectoriesLibraryfiles下即可。3.3調(diào)試過(guò)程:程序時(shí)間流程中的解決方法=1\*GB3①首先,建立盤(pán)面,用函數(shù)voiddraw()畫(huà)棋盤(pán),然后初始化顯示器、鍵盤(pán)、鼠等輸入輸出設(shè)備并在屏幕上畫(huà)出棋盤(pán)(棋盤(pán)可以不顯示)。=2\*GB3②當(dāng)輪到用戶(hù)(即黑子)下時(shí),您通過(guò)鍵盤(pán)或鼠標(biāo)在棋盤(pán)上落子,程序會(huì)根據(jù)該點(diǎn)的位置,在map[15][15]數(shù)組的相應(yīng)地方記錄‘1’,以表明該子是用戶(hù)下的;當(dāng)輪到系統(tǒng)(即白子)下時(shí),您通過(guò)鍵盤(pán)或鼠標(biāo)在棋盤(pán)上落子,程序會(huì)根據(jù)該點(diǎn)的位置,在map[15][15]數(shù)組的相應(yīng)地方記錄‘2’,以表明該子是系統(tǒng)下的。=3\*GB3③當(dāng)有棋子落下時(shí),調(diào)用voidDrawQZ()畫(huà)棋子函數(shù)在棋盤(pán)上畫(huà)出。=4\*GB3④booldownzi()外部調(diào)用此函數(shù)下子,控制下棋順序,當(dāng)輪到某方下子時(shí),負(fù)責(zé)將程序轉(zhuǎn)到相應(yīng)的模塊中去。=5\*GB3⑤盤(pán)面分析填寫(xiě)棋型表用戶(hù)在下五子棋時(shí),一定會(huì)先根據(jù)棋盤(pán)上的情況,找出當(dāng)前最重要的一些點(diǎn)位,如“活三”、“沖四”等;然后再在其中選擇落子點(diǎn)。我們從棋盤(pán)左上角出發(fā),向右逐行搜索用戶(hù)棋型表,當(dāng)遇到一個(gè)空白點(diǎn)時(shí),以它為中心向左挨個(gè)查找,如果遇到己方的子則記錄然后繼續(xù),如果遇到對(duì)方的子、空白點(diǎn)或邊界就停止查找。左邊完成后再向右進(jìn)行同樣的操作;最后把左右兩邊的記錄合并起來(lái),得到的數(shù)據(jù)就是該點(diǎn)橫向上的棋型,然后把棋型的編號(hào)填入到儲(chǔ)存棋局中unsignedcharuser[x][y][n]表示用戶(hù)棋局;unsignedcharpc[15][15][4]表示系統(tǒng)棋局;(x、y代表坐標(biāo),n=0、1、2、3分別代表橫、豎、左斜、右斜四個(gè)方向),而其他三個(gè)方向的棋型也可用同樣的方法得到,當(dāng)搜索完整張棋盤(pán)后,用戶(hù)棋型表也就填寫(xiě)完畢了。=6\*GB3⑥對(duì)方落子有了上面填寫(xiě)的兩張棋型表,就是遍歷棋型表user[15][15][4]和pc[15][15][4]找出其中數(shù)值最大的一點(diǎn),在該點(diǎn)下子即可。但這種算法的弱點(diǎn)非常明顯,只顧眼前,不能顧全大局,這就和許多五子棋初學(xué)者一樣犯了目光短淺的毛病。如果在這兒下子將會(huì)形成對(duì)手不得不防守的棋型,例如:‘沖四’、‘活三’,那么下一步對(duì)手就會(huì)照您的思路下子來(lái)防守您,如此一來(lái)便完成了第一步的預(yù)測(cè)。這時(shí)再調(diào)用模塊4對(duì)預(yù)測(cè)后的棋進(jìn)行盤(pán)面分析,如果出現(xiàn)了‘四三’、‘雙三’或‘雙四’等制勝點(diǎn),那么己方就可以獲勝了;否則照同樣的方法向下分析,就可預(yù)測(cè)出第二步、第三步……要是盤(pán)面上沒(méi)有對(duì)手必須防的棋型,那么進(jìn)攻不成的話(huà)就得考慮防守了,將自己和對(duì)手調(diào)換一下位置,然后用上面的方法來(lái)預(yù)測(cè)對(duì)手的棋,這樣既可以防住對(duì)手巧妙的攻擊,又能待機(jī)發(fā)動(dòng)反擊。3.4系統(tǒng)運(yùn)行的結(jié)果圖3-1電腦勝利的結(jié)果圖圖3-2人勝利的結(jié)果圖圖3-3確定繼續(xù)下一盤(pán)的結(jié)果圖結(jié)論在系統(tǒng)分析階段,針對(duì)五子棋游戲,將整個(gè)游戲分成若干個(gè)部分,逐步解決過(guò)程中遇到的每一個(gè)問(wèn)題,初步地實(shí)現(xiàn)了基本功能,并最終實(shí)現(xiàn)所想要的效果。此程序的用戶(hù)界面已基本實(shí)現(xiàn)了俄羅斯方塊游戲的一些基本的控制操作,但由于時(shí)間和能力的限制,程序有許多不足之處,很多功能還沒(méi)有完全實(shí)現(xiàn),或者還沒(méi)有完善。若要設(shè)計(jì)出更加具有可玩性和好玩性的五子棋游戲,就要靠以后更多和更深入的學(xué)習(xí)。通過(guò)這次的課程設(shè)計(jì)也是我認(rèn)識(shí)到了我在程序設(shè)計(jì)方面的嚴(yán)重不足,以及專(zhuān)業(yè)知識(shí)的嚴(yán)重匱乏。我的程序設(shè)計(jì)思想和代碼的編寫(xiě)和調(diào)試能力在此次課設(shè)期間有所提高。這樣一種更貼切實(shí)際的課程設(shè)計(jì),大大的提高了我的學(xué)習(xí)效率,希望能夠在平時(shí)教學(xué)的時(shí)候也能加入一些類(lèi)似課程設(shè)計(jì)的程序設(shè)計(jì)習(xí)題。參考文獻(xiàn)<1>《EVC高級(jí)編程及其應(yīng)用開(kāi)發(fā)》王兵李存斌陳鵬等編著中國(guó)水利水電出版社<2>《270RP_wince實(shí)驗(yàn)指導(dǎo)書(shū)》
附:設(shè)計(jì)程序代碼#include"stdafx.h"#include"AdbonWZQ.h"#include"AdbonWZQDlg.h"#include"MSGDLG.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif//主要下子定位執(zhí)行函數(shù)CAdbonWZQDlg::CAdbonWZQDlg(CWnd*pParent/*=NULL*/) :CDialog(CAdbonWZQDlg::IDD,pParent){ CBitmapb,c,d,e,f; CSizex; b.LoadBitmap(IDB_QP242); x.cx=242;//446; x.cy=242;//446; qp.CreateCompatibleDC(NULL); qp.SelectObject(&b); qp.SetSize(x); b.DeleteObject(); c.LoadBitmap(IDB_QZH16); x.cx=16;//27; x.cy=16;//27; qzh.CreateCompatibleDC(NULL); qzh.SelectObject(&c); qzh.SetSize(x); c.DeleteObject(); d.LoadBitmap(IDB_QZB16); x.cx=16;//27; x.cy=16;//27; qzb.CreateCompatibleDC(NULL); qzb.SelectObject(&d); qzb.SetSize(x); d.DeleteObject(); e.LoadBitmap(IDB_MASK17); x.cx=16;//27; x.cy=16;//27; mask.CreateCompatibleDC(NULL); mask.SelectObject(&e); mask.SetSize(x); d.DeleteObject(); f.LoadBitmap(IDB_DEAD16); x.cx=16;//27; x.cy=16;//27; dead.CreateCompatibleDC(NULL); dead.SelectObject(&f); dead.SetSize(x); f.DeleteObject(); m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}//數(shù)據(jù)交換函數(shù)voidCAdbonWZQDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX);}//實(shí)現(xiàn)信息映射機(jī)制BEGIN_MESSAGE_MAP(CAdbonWZQDlg,CDialog) ON_BN_CLICKED(IDC_BUTNEW,OnButnew) ON_BN_CLICKED(IDC_BUTBACK,OnButback) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_PAINT() //實(shí)現(xiàn)命令傳遞機(jī)制END_MESSAGE_MAP()//函數(shù)中顯示信息操作BOOLCAdbonWZQDlg::OnInitDialog(){ CDialog::OnInitDialog(); //為下面執(zhí)行設(shè)置標(biāo)識(shí) SetIcon(m_hIcon,TRUE); SetIcon(m_hIcon,FALSE); CenterWindow(GetDesktopWindow()); SetWindowPos(this,0,26,240,294,SWP_SHOWWINDOW); CRectrcdlg,rcc; GetClientRect(rcdlg); CButton*m_ctrl=(CButton*)GetDlgItem(IDC_BUTNEW); rcc.left=8; rcc.top=rcdlg.Height()-28; rcc.right=rcc.left+50; rcc.bottom=rcc.top+23; m_ctrl->SetWindowText(TEXT("新游戲")); m_ctrl->MoveWindow(rcc); m_ctrl=(CButton*)GetDlgItem(IDC_BUTBACK); rcc.left=rcdlg.Width()-58; rcc.right=rcc.left+50; m_ctrl->MoveWindow(rcc); m_ctrl->SetWindowText(TEXT("悔棋")); CBitmaptemp; temp.LoadBitmap(IDB_HENT); m_HenMemDC.CreateCompatibleDC(NULL); m_HenMemDC.SelectObject(&temp); temp.DeleteObject(); this->SetWindowText(L"五子棋v1.0"); runpath=""; loadfile(); twzq.SetDc(&qp,&qzh,&qzb,&mask,&dead,this->GetDC()); twzq.NewGame(); GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble()); returnTRUE;}//調(diào)用新開(kāi)局函數(shù)voidCAdbonWZQDlg::OnButnew(){ //這這里添加控制操縱代碼 Invalidate(); twzq.NewGame(); GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble());}//調(diào)用悔棋函數(shù)voidCAdbonWZQDlg::OnButback(){ //這這里添加控制操縱代碼 twzq.goback(); GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble());}voidCAdbonWZQDlg::loadfile(){ twzq.AItype=2; twzq.Model=0;}voidCAdbonWZQDlg::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault intx1,y1; x1=(int)(point.x+2)/16; y1=(int)(point.y+2-32)/16; //沒(méi)有下子時(shí)結(jié)束 if(!twzq.downzi(x1,y1)) { return; } //一局結(jié)束后顯現(xiàn)的信息 GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble()); //操作者輸了后顯示的信息 if(twzq.twinner.winner==1) { MessageBox(L"小樣,輸了吧,回去再練幾年吧!^_^^_^"); GetDlgItem(IDC_BUTBACK)->EnableWindow(FALSE); twzq.draw(); } //操作者贏了后顯示的信息 if(twzq.twinner.winner==2) { MessageBox(L"-_-你是不是作弊了啊,再來(lái)兩盤(pán)..."); GetDlgItem(IDC_BUTBACK)->EnableWindow(FALSE); twzq.draw(); } CDialog::OnLButtonDown(nFlags,point);}voidCAdbonWZQDlg::OnLButtonUp(UINTnFlags,CP
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年車(chē)輛租賃協(xié)議:個(gè)人用車(chē)短期租賃合同
- 2025年專(zhuān)業(yè)家庭護(hù)理勞務(wù)派遣合同標(biāo)準(zhǔn)文本3篇
- 2024版企業(yè)員工續(xù)簽勞動(dòng)協(xié)議模板版B版
- 2024年物流運(yùn)輸服務(wù)合同詳細(xì)條款
- 二零二五年度企業(yè)員工帶薪年假合同范本183篇
- 2025年度數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)合作協(xié)議合同范本3篇
- 2024年度渣土車(chē)土方運(yùn)輸合同運(yùn)輸車(chē)輛維護(hù)保養(yǎng)3篇
- 二零二五年度綠色建筑綠色建材推廣與應(yīng)用勞務(wù)合同規(guī)范模板2篇
- 2025版礦產(chǎn)品國(guó)際貿(mào)易保險(xiǎn)及風(fēng)險(xiǎn)管理合同3篇
- 2024年藥品臨床試驗(yàn)合同書(shū)3篇
- 學(xué)校膳食管理委員會(huì)工作制度和職責(zé)
- 房租收條格式(3篇)
- 期末試卷(試題)2024-2025學(xué)年培智生活語(yǔ)文二年級(jí)上冊(cè)
- 2024伊利在線(xiàn)測(cè)評(píng)題
- 紅色簡(jiǎn)約中國(guó)英雄人物李大釗課件
- 小學(xué)師德考評(píng)細(xì)則
- 軟件定義網(wǎng)絡(luò)(SDN)實(shí)戰(zhàn)教程課件
- 上海市住院醫(yī)師規(guī)范化培訓(xùn)公共科目考試題庫(kù)-重點(diǎn)傳染病防治知識(shí)
- 2024江蘇省鐵路集團(tuán)限公司春季招聘24人高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 2024智能變電站新一代集控站設(shè)備監(jiān)控系統(tǒng)技術(shù)規(guī)范部分
- 企業(yè)反恐專(zhuān)項(xiàng)經(jīng)費(fèi)保障制度
評(píng)論
0/150
提交評(píng)論