中國象棋復盤.doc_第1頁
中國象棋復盤.doc_第2頁
中國象棋復盤.doc_第3頁
中國象棋復盤.doc_第4頁
中國象棋復盤.doc_第5頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

河北工業(yè)大學計算機軟件技術(shù)基礎(VB)課 程 設 計 任 務 書本題難度級別:A 實現(xiàn)基本要求代碼: 約230行 主要涉及: 基本控件、算法、文件操作一、設計題目:中國象棋復盤(出題人:曹新國)因題目中涉及象棋規(guī)則,不會下棋的不要選。二、目的與要求1.目的培養(yǎng)學生綜合利用VB語言進行程序設計的能力,主要是利用VB的標準控件進行界面設計,用VB的文件功能讀取文件內(nèi)容并進行處理。2.基本要求裝載一個文本棋譜文件,按照棋譜的內(nèi)容將弈棋過程復現(xiàn)出來。詳細要求如下:n 能夠裝載任意一個與聯(lián)眾中國象棋游戲存盤文本文件格式兼容的棋譜文件。n 裝載棋譜后先暫停,點開始后再出現(xiàn)所有棋子,然后進行計時并可以走子。復盤過程中可以隨時點開始并能返回初始狀態(tài)。n 每走一步,按照棋譜中的指令在棋盤上吃子或者更改棋子的位置,棋子可以以圖片形式表現(xiàn),也可以用標簽標明棋子所在位置。n 可以利用下一步或者上一步來回進行研究。根據(jù)當前進度,要自動禁止不可用的鈕。n 支持直接定位功能,可以通過雙擊棋譜列表中的任意一行讓布局呈現(xiàn)此招前的狀態(tài)。n 棋局開始后,有標志(一個閃爍的“將”或“帥”的圖標)指示當前的行棋方。u 為了能仔細分析棋局,可以通過點擊時間顯示標簽暫?;謴妥詣幼咂?。u 支持自動演示,5秒鐘不手動走子則自動走子。雙擊時間顯示標簽可進行設置,設置有效范圍為1-60秒(因為可以暫?;謴?,不需要太長,否則就不是象棋而是相面了)。u 能夠表示當前著法涉及到棋子的移動起止位置,以閃爍方框或者其它形式。u 支持鍵盤熱鍵操作,例如:上一步,下一步,打開文件,退出等。3.創(chuàng)新要求在基本要求達到后,進行創(chuàng)新設計,創(chuàng)新方向提示如下: 給程序增加換棋盤和換棋子功能。如果是文字表示,改變字體屬性即可,如果以圖像方式表示棋盤和棋子,設計素材中提供了兩個棋盤和兩套棋子的圖片可供使用。 拖放棋譜文件到本程序圖標能夠?qū)崿F(xiàn)自動運行程序并直接打開棋譜。 直接將棋譜文件拖入界面上的棋譜列表框能夠裝載棋譜(即不用打開文件對話框)。 增加走棋時的聲音效果:分為落子、吃子和將軍三種不同聲音。(設計素材中已經(jīng)提供了三種不同的聲音文件,也可以自行加上開局和終局聲音效果) 支持換邊。即可以將紅方和黑方的位置進行交換。 增加鼠標直拖棋子功能,即可以隨時將任意一個棋子拖動到其它位置方便分析拆解。(設計素材中已經(jīng)提供了手形光標文件,可直接利用) 支持人工單機對弈模式(需要先完成上一個要求),對弈時可以記錄行棋過程并可存成自身能處理的棋譜文件。 實現(xiàn)人機對弈功能。(素材中提供了VB和VC的源程序,可供參考)三、設計方法和基本原理1. 問題描述在進行象棋游戲時,一般的程序都能將走棋過程保存成棋譜,用于事后分析。通過復現(xiàn)別人的下棋過程從中學習來提高自己的水平,本題就是要設計這樣一個程序,將給定的一些棋譜(見設計素材)的走法以直觀的形式展現(xiàn)出來。2. 問題的解決方案設計程序界面。因為除了通用對話框外和圖像列表控件以外全是基本控件(這兩個控件都是運行時不可見控件,可以隨意放置),界面設計沒有什么難度,放到合適位置即可。完成本題基本要求需要如右圖所示的一些控件,包括5個按鈕用于處理不同的命令,一個列表框用于顯示棋譜,一個圖像列表控件用于提供棋盤和棋子圖片,一個定時器用于控制走棋方閃爍和計時,一個框架用于改善界面布局,兩個Shape控件用于表示最后移動棋子的起止位置,一個標簽顯示時間,還有幾個圖片框用于顯示走棋方及棋盤和棋子(棋子顯示用控件數(shù)組)。設置控件屬性先將程序中需要的圖片裝入圖像列表控件ImageList1,在運行時根據(jù)需要從中取出用于顯示。如果采用的不是圖像棋盤棋子界面,這一步可以省略。設置定時器的定時間隔為500ms。設置Form的Icon為給定的“中國象棋圖標.ICO”,以取代VB默認的程序圖標。設置Form的其它屬性,具體特性可以通過運行所附的樣例程序來觀察。設置Shape1的顔色屬性和寬度屬性。(僅用于“表示出最后移動的棋子”功能)設置其它控件的屬性,在此不一一指明。編寫代碼包括事件處理過程和功能函數(shù),還有必要的聲明。變量聲明部分包括本程序所需要的變量和數(shù)組,數(shù)組主要是棋盤數(shù)組,可以定義為109,還需要定義幾個窗體級的變量,用于表示當前走棋步數(shù),當前用時,輪到哪一方走棋,是否顯示位置標志等。事件處理和功能模塊主要包括下面幾個:Form_Load() 作一些初始化的工作。主要是加載用于顯示棋子的控件數(shù)組。Form_KeyDown(KeyCode As Integer, Shift As Integer)處理快捷鍵,包括:ESC鍵,N鍵和P鍵,根據(jù)實現(xiàn)情況也可以包括其它鍵。CommandXXX_Click()處理各個命令。包括載入文件,開始,下一步,上一步和退出。List1_DblClick()雙擊列表框中的棋譜時產(chǎn)生的事件,棋局直接跳到該步前的狀態(tài)。Timer1_Timer()定時器事件,顯示計時和當前走棋方是黑還是紅。Sub ProcessStep(ByVal s As String)最核心的子程序,處理每一步走子,例如“前炮進八,馬3退2”之類。Function LoadRecord(filename As String) As Boolean關(guān)鍵函數(shù),載入指定文件中的棋譜。四、主要技術(shù)問題的描述本題中涉及的方面比較多,包括各種控件的使用,文件操作,算法,如果采用圖像界面,還需要對VB的圖像處理有所了解,想得到走子時的聲音效果,還要知道VB如果控制發(fā)聲。最核心的問題有兩個:文件讀取并分析走子算法。其它都屬于普通內(nèi)容。0.預備知識在讀入文件前首先要搞清楚文件的構(gòu)成。文本形式的棋譜文件中分成若干行,需要按行讀入并進行分析,典型的棋譜文件格式如下:VB課程設計任務書 中國象棋復盤 第6頁共6頁中 國 象 棋 對 局 記 錄-對局名稱:戰(zhàn)無不勝zwbszwbs - 2006xxxy66198288比賽日期:2006年6月8日1時 比賽地點:紅 方:戰(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. 馬二進三 馬8進9 3. 車一平二 車9平8 4. 炮八平六 卒3進1118. 炮七平六 將4進1119. 帥五平六 將4退1120. 炮六進三 將4退1121. 炮六進一 1-01.文本棋譜文件的讀入此處給出將文本文件的內(nèi)容讀入內(nèi)存中的字符串變量的示意代碼(假設已經(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.分析棋譜并放入列表框中按預備知識中的說明,我們知道應該從什么時候記錄棋譜。讀文件時一直讀下去,直到碰到某行頭兩個字符是“棋譜”的時候為止,如果文件結(jié)束了還沒碰到,則不是棋譜文件。這一操作的關(guān)鍵代碼如下所示: Do Line Input #10, oneLine Loop Until Left(oneLine, 2) = 棋譜 Or EOF(10) If EOF(10) Then MsgBox “不是棋譜文件!”從下一行開始,我們就要將讀入的內(nèi)容中的紅黑方著法提取出來并分別記入列表框中。3.走子算法這個問題比較復雜,需要先弄明白棋子的行棋規(guī)則(詳見本題資料之“中國象棋競賽規(guī)則.DOC”和“著法表示.DOC”),假設棋盤Board是一個109的數(shù)組,開局時每個子都有缺省位置,比如黑在上方則黑車分別放置在Board(1,1)和Board(1,9)中,而黑炮則放在Board(2,2)和Board(2,8)中,紅的對應子則放在Board(10,1)和Board(10,9)及Board(8,2)和Board(8,8)中。初始狀態(tài)設置好后就可以開始走棋了,下面分析幾個典型著法的處理過程:炮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的行坐標(假設為2),列坐標是8,炮的起始位置已經(jīng)確定。然后看一下是怎么走子,炮的走法分“進退平”三種,如果是平5,則是改變X坐標,如果是進5,那就成了改變Y坐標了,平5的算法是這樣的,目標行不變(變了就不平了),目標列直接修成為指定值,即目標位置為(2,5)。要是進5,則是目標列不變,目標行要加上指定的步數(shù),最后坐標應該位于(7,8)。得到了原始行列和目標行列的值,就可以進行走子處理了,偽代碼示意如下:If Board(2,5)0 then Sound(吃子聲) else Sound(走子聲) 0代表無子Board(2,5)=Board(2,8) 將8路炮移到5路Board(2,8)=0 將原來的位置設置成“無子”狀態(tài)馬2進3和馬2進4假設馬的編碼用2來表示,找2路馬的過程和上面找炮的過程沒什么不同,假設找到了馬的原始位置為(1,2),下面看一下如何計算目標位置。在象棋中馬要走“日”字,就是每個移動的行和列的增量的絕列值的和要為3,如果馬2要進到3的話,則水平方向只走了一步,垂直方向一定要走兩步。而馬2進4則是水平方向上走了兩步,垂直方向上只能走一步了,上述兩種著法的目標位置分別是(4,3)和(3,4)。除了馬以外,尚有象和士不走直線,需要進行這樣的調(diào)整,但比馬要簡單。后炮進5 (注:最多處理到這樣復雜程度的棋譜,不考慮“中兵進1,三兵平六”等)這樣的著法處理起來稍復雜些,說明炮都在一列上,但哪個在前哪個在后呢?這就需要程序來判斷了,用二重循環(huán)按著規(guī)定的方向?qū)λ袛?shù)據(jù)元素進行比較,假設炮的代碼是3,剛相應的尋找前相過程可以用類似這樣的代碼: For I = 1 To 10 注意I是行,如果是前炮就應該倒著掃描,改為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坐標和兩個Y坐標,然后根據(jù)是前還是后將Y分別取值為Y1和Y2即可找到棋子的原始位置,假設找到的是(1,3),則后炮進5的計算方法是:X坐標直接賦為指定值,Y坐標需要加5(退則需要減5),結(jié)果:目標位置為(6,3)。4.如何顯示棋盤和棋子?棋盤比較簡單,可以設置一個圖片框,然后指定其Picture屬性即可顯示出棋盤。棋子的顯示如果用標簽來進行,則需要事先設定32個標簽控件數(shù)組,并分別設置為車馬炮等,顯示時根據(jù)坐標經(jīng)過計算后直接移動標簽的位置到相應處就行了(原有位置的子要被吃掉)。如果采用圖片顯示棋子,則需要使用32個圖片框控件數(shù)組,在初始化時裝載相應的棋子圖片,然后移到相應位置或設置成不顯示的狀態(tài)(棋子被吃后,相應的標簽或圖片應該隱藏)。5.如何發(fā)出走子的聲音效果?VB控制發(fā)聲比較簡單,可以用多媒體控件MMControl或者MCI指令或者系統(tǒng)的多媒體函數(shù)來進行,MCI指令部分見教程的第十三章,API函數(shù)部分可以從網(wǎng)上查找一些資料。如果要將聲音文件附著在執(zhí)行程序中,還需要知道VB如何利用資源文件的知識。使用Microsoft MultiMedia Control控件(MCI32.OCX)控制發(fā)聲的方法如下:MMControl1.DeviceType = WaveAudioMMControl1.FileName = 吃子聲.WAV依自己情況修改文件MMControl1.Command = Open其它發(fā)聲的方法還有很多,不再一一說明。6.如何判斷是否“將”軍?一方的棋子攻擊對方的帥(將),并在下一著要把它吃掉,稱為“照將”,或簡稱“將”。雖然照將不必聲明,看不見將死也算輸,但是人性化的程序還是應該給出提示,以提示行棋者或研究者注意。每走一步后都要進行照將的判斷。以決定是是發(fā)出走子聲、吃子聲還是照將聲。判斷的方法是檢查將或者帥所在的行和列上有沒有對方的車、炮和兵(卒),如果有中間是否隔子?隔幾個子?隔0個子車將,隔1個子炮將,兵則要相鄰才有可能“將”。如果兵(卒)在將(帥)后則不構(gòu)成照將。除了車、炮、兵(卒)以外,還有“馬”可以“將”,檢查方法是對將或者帥周圍的8個位置進行查找,看看是否有對方的馬,如果有,還要檢查是否“絆馬腿”。五、參考資料 Visual Basic 程序設計教程 及 Visual Basic 實驗教程 VB6.0程序員指南 VB6.0控件參考手冊 MSDN中文版,課程設計網(wǎng)站上提供的其它資料。在本題設計素材中還提供了

溫馨提示

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

評論

0/150

提交評論