




免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
河北工業(yè)大學(xué)計(jì)算機(jī)軟件技術(shù)基礎(chǔ)(VB)課 程 設(shè) 計(jì) 任 務(wù) 書本題難度級別:A 實(shí)現(xiàn)基本要求代碼: 約230行 主要涉及: 基本控件、算法、文件操作一、設(shè)計(jì)題目:中國象棋復(fù)盤(出題人:曹新國)因題目中涉及象棋規(guī)則,不會下棋的不要選。二、目的與要求1.目的培養(yǎng)學(xué)生綜合利用VB語言進(jìn)行程序設(shè)計(jì)的能力,主要是利用VB的標(biāo)準(zhǔn)控件進(jìn)行界面設(shè)計(jì),用VB的文件功能讀取文件內(nèi)容并進(jìn)行處理。2.基本要求裝載一個文本棋譜文件,按照棋譜的內(nèi)容將弈棋過程復(fù)現(xiàn)出來。詳細(xì)要求如下:n 能夠裝載任意一個與聯(lián)眾中國象棋游戲存盤文本文件格式兼容的棋譜文件。n 裝載棋譜后先暫停,點(diǎn)開始后再出現(xiàn)所有棋子,然后進(jìn)行計(jì)時并可以走子。復(fù)盤過程中可以隨時點(diǎn)開始并能返回初始狀態(tài)。n 每走一步,按照棋譜中的指令在棋盤上吃子或者更改棋子的位置,棋子可以以圖片形式表現(xiàn),也可以用標(biāo)簽標(biāo)明棋子所在位置。n 可以利用下一步或者上一步來回進(jìn)行研究。根據(jù)當(dāng)前進(jìn)度,要自動禁止不可用的鈕。n 支持直接定位功能,可以通過雙擊棋譜列表中的任意一行讓布局呈現(xiàn)此招前的狀態(tài)。n 棋局開始后,有標(biāo)志(一個閃爍的“將”或“帥”的圖標(biāo))指示當(dāng)前的行棋方。u 為了能仔細(xì)分析棋局,可以通過點(diǎn)擊時間顯示標(biāo)簽暫?;謴?fù)自動走棋。u 支持自動演示,5秒鐘不手動走子則自動走子。雙擊時間顯示標(biāo)簽可進(jìn)行設(shè)置,設(shè)置有效范圍為1-60秒(因?yàn)榭梢詴和;謴?fù),不需要太長,否則就不是象棋而是相面了)。u 能夠表示當(dāng)前著法涉及到棋子的移動起止位置,以閃爍方框或者其它形式。u 支持鍵盤熱鍵操作,例如:上一步,下一步,打開文件,退出等。3.創(chuàng)新要求在基本要求達(dá)到后,進(jìn)行創(chuàng)新設(shè)計(jì),創(chuàng)新方向提示如下: 給程序增加換棋盤和換棋子功能。如果是文字表示,改變字體屬性即可,如果以圖像方式表示棋盤和棋子,設(shè)計(jì)素材中提供了兩個棋盤和兩套棋子的圖片可供使用。 拖放棋譜文件到本程序圖標(biāo)能夠?qū)崿F(xiàn)自動運(yùn)行程序并直接打開棋譜。 直接將棋譜文件拖入界面上的棋譜列表框能夠裝載棋譜(即不用打開文件對話框)。 增加走棋時的聲音效果:分為落子、吃子和將軍三種不同聲音。(設(shè)計(jì)素材中已經(jīng)提供了三種不同的聲音文件,也可以自行加上開局和終局聲音效果) 支持換邊。即可以將紅方和黑方的位置進(jìn)行交換。 增加鼠標(biāo)直拖棋子功能,即可以隨時將任意一個棋子拖動到其它位置方便分析拆解。(設(shè)計(jì)素材中已經(jīng)提供了手形光標(biāo)文件,可直接利用) 支持人工單機(jī)對弈模式(需要先完成上一個要求),對弈時可以記錄行棋過程并可存成自身能處理的棋譜文件。 實(shí)現(xiàn)人機(jī)對弈功能。(素材中提供了VB和VC的源程序,可供參考)三、設(shè)計(jì)方法和基本原理1. 問題描述在進(jìn)行象棋游戲時,一般的程序都能將走棋過程保存成棋譜,用于事后分析。通過復(fù)現(xiàn)別人的下棋過程從中學(xué)習(xí)來提高自己的水平,本題就是要設(shè)計(jì)這樣一個程序,將給定的一些棋譜(見設(shè)計(jì)素材)的走法以直觀的形式展現(xiàn)出來。2. 問題的解決方案設(shè)計(jì)程序界面。因?yàn)槌送ㄓ脤υ捒蛲夂蛨D像列表控件以外全是基本控件(這兩個控件都是運(yùn)行時不可見控件,可以隨意放置),界面設(shè)計(jì)沒有什么難度,放到合適位置即可。完成本題基本要求需要如右圖所示的一些控件,包括5個按鈕用于處理不同的命令,一個列表框用于顯示棋譜,一個圖像列表控件用于提供棋盤和棋子圖片,一個定時器用于控制走棋方閃爍和計(jì)時,一個框架用于改善界面布局,兩個Shape控件用于表示最后移動棋子的起止位置,一個標(biāo)簽顯示時間,還有幾個圖片框用于顯示走棋方及棋盤和棋子(棋子顯示用控件數(shù)組)。設(shè)置控件屬性先將程序中需要的圖片裝入圖像列表控件ImageList1,在運(yùn)行時根據(jù)需要從中取出用于顯示。如果采用的不是圖像棋盤棋子界面,這一步可以省略。設(shè)置定時器的定時間隔為500ms。設(shè)置Form的Icon為給定的“中國象棋圖標(biāo).ICO”,以取代VB默認(rèn)的程序圖標(biāo)。設(shè)置Form的其它屬性,具體特性可以通過運(yùn)行所附的樣例程序來觀察。設(shè)置Shape1的顔色屬性和寬度屬性。(僅用于“表示出最后移動的棋子”功能)設(shè)置其它控件的屬性,在此不一一指明。編寫代碼包括事件處理過程和功能函數(shù),還有必要的聲明。變量聲明部分包括本程序所需要的變量和數(shù)組,數(shù)組主要是棋盤數(shù)組,可以定義為109,還需要定義幾個窗體級的變量,用于表示當(dāng)前走棋步數(shù),當(dāng)前用時,輪到哪一方走棋,是否顯示位置標(biāo)志等。事件處理和功能模塊主要包括下面幾個:Form_Load() 作一些初始化的工作。主要是加載用于顯示棋子的控件數(shù)組。Form_KeyDown(KeyCode As Integer, Shift As Integer)處理快捷鍵,包括:ESC鍵,N鍵和P鍵,根據(jù)實(shí)現(xiàn)情況也可以包括其它鍵。CommandXXX_Click()處理各個命令。包括載入文件,開始,下一步,上一步和退出。List1_DblClick()雙擊列表框中的棋譜時產(chǎn)生的事件,棋局直接跳到該步前的狀態(tài)。Timer1_Timer()定時器事件,顯示計(jì)時和當(dāng)前走棋方是黑還是紅。Sub ProcessStep(ByVal s As String)最核心的子程序,處理每一步走子,例如“前炮進(jìn)八,馬3退2”之類。Function LoadRecord(filename As String) As Boolean關(guān)鍵函數(shù),載入指定文件中的棋譜。四、主要技術(shù)問題的描述本題中涉及的方面比較多,包括各種控件的使用,文件操作,算法,如果采用圖像界面,還需要對VB的圖像處理有所了解,想得到走子時的聲音效果,還要知道VB如果控制發(fā)聲。最核心的問題有兩個:文件讀取并分析走子算法。其它都屬于普通內(nèi)容。0.預(yù)備知識在讀入文件前首先要搞清楚文件的構(gòu)成。文本形式的棋譜文件中分成若干行,需要按行讀入并進(jìn)行分析,典型的棋譜文件格式如下:VB課程設(shè)計(jì)任務(wù)書 中國象棋復(fù)盤 第6頁共6頁中 國 象 棋 對 局 記 錄-對局名稱:戰(zhàn)無不勝zwbszwbs - 2006xxxy66198288比賽日期:2006年6月8日1時 比賽地點(diǎn):紅 方:戰(zhàn)無不勝(zwbszwbs) 耗時: 11分 24秒上面的淡紫色部分不是我們要關(guān)心的,讀取的時候可以直接跳過。我們關(guān)心的是紅色有底紋的部分,其中一個關(guān)鍵字是某行的開頭有兩個字:“棋譜”,從下行起,就是真正的棋譜了,每行記錄的是一個回合(雙方各走一著,稱為一個“回合”)的走子情況,前幾列是回合數(shù),后幾列是著法,我們可以利用MID函數(shù)取出紅方和黑方的著法,紅方數(shù)字以“一”到“九”表示,黑方數(shù)字以“1”到“9”(半角或全角)表示,要注意這個區(qū)別。最后一行表示對局的比分。黑 方:2006xxxy(66198288) 耗時: 13分 58秒比賽結(jié)果:紅勝 裁判員:-棋譜 紅方 黑方 1. 炮二平五 炮2平5 2. 馬二進(jìn)三 馬8進(jìn)9 3. 車一平二 車9平8 4. 炮八平六 卒3進(jìn)1118. 炮七平六 將4進(jìn)1119. 帥五平六 將4退1120. 炮六進(jìn)三 將4退1121. 炮六進(jìn)一 1-01.文本棋譜文件的讀入此處給出將文本文件的內(nèi)容讀入內(nèi)存中的字符串變量的示意代碼(假設(shè)已經(jīng)用通用對話框控件的ShowOpen方法取得文件名并放入infile字符串變量):Dim oneLine As StringOpen infile For Input As #10 打開文件。infile 變量中存放的是文件的名字While Not EOF(10) Line Input #10, oneLine 讀入一整行文本 此時已經(jīng)將文件中的一整行讀入了變量oneLine,在下面加入分析代碼WendClose #10關(guān)閉文件2.分析棋譜并放入列表框中按預(yù)備知識中的說明,我們知道應(yīng)該從什么時候記錄棋譜。讀文件時一直讀下去,直到碰到某行頭兩個字符是“棋譜”的時候?yàn)橹梗绻募Y(jié)束了還沒碰到,則不是棋譜文件。這一操作的關(guān)鍵代碼如下所示: Do Line Input #10, oneLine Loop Until Left(oneLine, 2) = 棋譜 Or EOF(10) If EOF(10) Then MsgBox “不是棋譜文件!”從下一行開始,我們就要將讀入的內(nèi)容中的紅黑方著法提取出來并分別記入列表框中。3.走子算法這個問題比較復(fù)雜,需要先弄明白棋子的行棋規(guī)則(詳見本題資料之“中國象棋競賽規(guī)則.DOC”和“著法表示.DOC”),假設(shè)棋盤Board是一個109的數(shù)組,開局時每個子都有缺省位置,比如黑在上方則黑車分別放置在Board(1,1)和Board(1,9)中,而黑炮則放在Board(2,2)和Board(2,8)中,紅的對應(yīng)子則放在Board(10,1)和Board(10,9)及Board(8,2)和Board(8,8)中。初始狀態(tài)設(shè)置好后就可以開始走棋了,下面分析幾個典型著法的處理過程:炮8平5先找到8路上的炮在什么位置,用按列循環(huán)的方法,比如3代表炮的編碼,則用如下片斷可以找到8路上的炮在第幾行: For I = 1 To 10 If Board(I, 8) = 3 Then POS = I: Exit For Next I此時 POS中含有炮8的行坐標(biāo)(假設(shè)為2),列坐標(biāo)是8,炮的起始位置已經(jīng)確定。然后看一下是怎么走子,炮的走法分“進(jìn)退平”三種,如果是平5,則是改變X坐標(biāo),如果是進(jìn)5,那就成了改變Y坐標(biāo)了,平5的算法是這樣的,目標(biāo)行不變(變了就不平了),目標(biāo)列直接修成為指定值,即目標(biāo)位置為(2,5)。要是進(jìn)5,則是目標(biāo)列不變,目標(biāo)行要加上指定的步數(shù),最后坐標(biāo)應(yīng)該位于(7,8)。得到了原始行列和目標(biāo)行列的值,就可以進(jìn)行走子處理了,偽代碼示意如下:If Board(2,5)0 then Sound(吃子聲) else Sound(走子聲) 0代表無子Board(2,5)=Board(2,8) 將8路炮移到5路Board(2,8)=0 將原來的位置設(shè)置成“無子”狀態(tài)馬2進(jìn)3和馬2進(jìn)4假設(shè)馬的編碼用2來表示,找2路馬的過程和上面找炮的過程沒什么不同,假設(shè)找到了馬的原始位置為(1,2),下面看一下如何計(jì)算目標(biāo)位置。在象棋中馬要走“日”字,就是每個移動的行和列的增量的絕列值的和要為3,如果馬2要進(jìn)到3的話,則水平方向只走了一步,垂直方向一定要走兩步。而馬2進(jìn)4則是水平方向上走了兩步,垂直方向上只能走一步了,上述兩種著法的目標(biāo)位置分別是(4,3)和(3,4)。除了馬以外,尚有象和士不走直線,需要進(jìn)行這樣的調(diào)整,但比馬要簡單。后炮進(jìn)5 (注:最多處理到這樣復(fù)雜程度的棋譜,不考慮“中兵進(jìn)1,三兵平六”等)這樣的著法處理起來稍復(fù)雜些,說明炮都在一列上,但哪個在前哪個在后呢?這就需要程序來判斷了,用二重循環(huán)按著規(guī)定的方向?qū)λ袛?shù)據(jù)元素進(jìn)行比較,假設(shè)炮的代碼是3,剛相應(yīng)的尋找前相過程可以用類似這樣的代碼: For I = 1 To 10 注意I是行,如果是前炮就應(yīng)該倒著掃描,改為10 TO 1 Step -1 For J = 1 To 9 If Board(I, J) = 3 Then X = J: If Y1 = 0 Then Y1 = I Else Y2 = I Next J Next I經(jīng)過這一段程序,得到了一個X坐標(biāo)和兩個Y坐標(biāo),然后根據(jù)是前還是后將Y分別取值為Y1和Y2即可找到棋子的原始位置,假設(shè)找到的是(1,3),則后炮進(jìn)5的計(jì)算方法是:X坐標(biāo)直接賦為指定值,Y坐標(biāo)需要加5(退則需要減5),結(jié)果:目標(biāo)位置為(6,3)。4.如何顯示棋盤和棋子?棋盤比較簡單,可以設(shè)置一個圖片框,然后指定其Picture屬性即可顯示出棋盤。棋子的顯示如果用標(biāo)簽來進(jìn)行,則需要事先設(shè)定32個標(biāo)簽控件數(shù)組,并分別設(shè)置為車馬炮等,顯示時根據(jù)坐標(biāo)經(jīng)過計(jì)算后直接移動標(biāo)簽的位置到相應(yīng)處就行了(原有位置的子要被吃掉)。如果采用圖片顯示棋子,則需要使用32個圖片框控件數(shù)組,在初始化時裝載相應(yīng)的棋子圖片,然后移到相應(yīng)位置或設(shè)置成不顯示的狀態(tài)(棋子被吃后,相應(yīng)的標(biāo)簽或圖片應(yīng)該隱藏)。5.如何發(fā)出走子的聲音效果?VB控制發(fā)聲比較簡單,可以用多媒體控件MMControl或者M(jìn)CI指令或者系統(tǒng)的多媒體函數(shù)來進(jìn)行,MCI指令部分見教程的第十三章,API函數(shù)部分可以從網(wǎng)上查找一些資料。如果要將聲音文件附著在執(zhí)行程序中,還需要知道VB如何利用資源文件的知識。使用Microsoft MultiMedia Control控件(MCI32.OCX)控制發(fā)聲的方法如下:MMControl1.DeviceType = WaveAudioMMControl1.FileName = 吃子聲.WAV依自己情況修改文件MMControl1.Command = Open其它發(fā)聲的方法還有很多,不再一一說明。6.如何判斷是否“將”軍?一方的棋子攻擊對方的帥(將),并在下一著要把它吃掉,稱為“照將”,或簡稱“將”。雖然照將不必聲明,看不見將死也算輸,但是人性化的程序還是應(yīng)該給出提示,以提示行棋者或研究者注意。每走一步后都要進(jìn)行照將的判斷。以決定是是發(fā)出走子聲、吃子聲還是照將聲。判斷的方法是檢查將或者帥所在的行和列上有沒有對方的車、炮和兵(卒),如果有中間是否隔子?隔幾個子?隔0個子車將,隔1個子炮將,兵則要相鄰才有可能“將”。如果兵(卒)在將(帥)后則不構(gòu)成照將。除了車、炮、兵(卒)以外,還有“馬”可以“將”,檢查方法是對將或者帥周圍的8個位置進(jìn)行查找,看看是否有對方的馬,如果有,還要檢查是否“絆馬腿”。五、參考資料 Visual Basic 程序設(shè)計(jì)教程 及 Visual Basic 實(shí)驗(yàn)教程 VB6.0程序員指南 VB6.0控件參考手冊 MSDN中文版,課程設(shè)計(jì)網(wǎng)站上提供的其它資料。在本題設(shè)計(jì)素材中還提供了
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代表聯(lián)系制活動方案
- 代購送贈品活動方案
- 以案為鑒作風(fēng)活動方案
- 儀器活動展示活動方案
- 價值拍賣活動方案
- 重慶市北碚區(qū)2023-2024學(xué)年五年級下學(xué)期數(shù)學(xué)期末測試(含答案)
- 企業(yè)義工活動方案
- 企業(yè)做飯活動方案
- 企業(yè)公司畫冊策劃方案
- 企業(yè)各項(xiàng)文體活動方案
- T/CCMA 0137-2022防撞緩沖車
- 2025商務(wù)英語(BEC)中級考試真題卷:模擬試題及答案解析
- 2024年中考一模 英語(湖北統(tǒng)考專用)(考試版A4)
- 油田數(shù)字化運(yùn)維理論考試題庫-上(單選題)
- 護(hù)理教育程序
- 2025年湖北省新高考信息卷(一)化學(xué)試題及答案
- 校醫(yī)招聘考試試題及答案
- 新能源安規(guī)試題及答案
- 2O25中國商業(yè)航天創(chuàng)新生態(tài)報告
- 江蘇省南通等六市2025屆高三最后一卷英語試卷含解析
評論
0/150
提交評論