版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、姓 名: 學(xué) 院: 計算機與通信學(xué)院 班 級: 通信工程101班 指導(dǎo)老師: 目錄一、需求分析31.1 開發(fā)背景32.2 功能簡介3二、系統(tǒng)設(shè)計42.1 函數(shù)一覽42.2 “封面”的設(shè)計42.3 二維數(shù)組與控制臺52.4 鍵盤操作62.5判定72.6 悔棋的實現(xiàn)8三、調(diào)試運行93.1 進入界面93.2 棋盤的初始狀態(tài)103.3 激戰(zhàn)中103.4 游戲結(jié)束11四、解決問題的關(guān)鍵11五、課設(shè)總結(jié)11六、附錄126.1 畫圖代碼126.2 初始化146.3 play函數(shù)14一、需求分析1.1 開發(fā)背景學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)該門課程,對于枯燥無味的理論知識,我們是否能夠通過所學(xué)的知識在課程設(shè)計中做出有趣味東西
2、,然后讓我們對于數(shù)據(jù)結(jié)構(gòu)更加的感興趣呢?于是我和我的室友陳明建開始醞釀著寫些什么東西。上個學(xué)期就已經(jīng)寫了通訊錄那之類的鏈?zhǔn)浇Y(jié)構(gòu),這次我們決心有所改變,我們學(xué)習(xí)了棧、隊列、樹、圖,字典樹有人選了,我們就來寫一個基于圖的小程序,五子棋,對,圖的簡單應(yīng)用,于是我們開始著手來寫這個小小的程序,祝我們好運!2.2 功能簡介既然是五子棋,我們要做的是時時刻刻的將整個圖(以下稱為棋局)的狀態(tài)呈現(xiàn)出來,那么界面就是必不可少的。mfc不會?沒關(guān)系,我們就用基于控制臺的字符輸出來構(gòu)建這個棋局吧,當(dāng)然這只是第一步,詳細(xì)如下:擁有一個良好的進入界面,以及必要的選項;擁有一個二維的數(shù)組來記錄和更新實時的狀態(tài),并且能夠有
3、一種方法在dos界面下繪制出整個棋局的實時狀態(tài)(包括棋盤和棋子);能夠通過鍵盤上的按鍵完成所選位置的移動和選定操作;能夠在每一次的走棋后判定是否游戲結(jié)束(棋盤走滿或者是一方勝出);能夠完成悔棋的功能,并保證這之間的棋局繪圖能夠與二維數(shù)組數(shù)據(jù)同步,做到真正意義上的悔棋。二、詳細(xì)設(shè)計2.1 函數(shù)一覽2.2 “封面”的設(shè)計首先還是講些題外話,該程序由于與控制臺有密切的關(guān)系,于是在代碼中使用了不少 conio.h 中的函數(shù),當(dāng)然在顯示時又使用了windows.h 中的 sleep( )函數(shù),正是有了這些函數(shù)的使用,程序才得以順利完成,尤其是后面頻繁使用的gotoxy( ) 函數(shù)。進入正題,由于是一個小
4、的程序,因此將每一個功能分成一個一個的函數(shù),這樣將在以后的修改和完成進度上都有很大的幫助。由上面的函數(shù)一覽可以知道這個“封面”就是在logo( ) 函數(shù)里面實現(xiàn)的,函數(shù)實現(xiàn)過程中使用了sleep( )函數(shù),使之有動態(tài)效果:void logo( ) char wel30= made by lyush& mirs chen ; printf( ttt 歡迎試用五子棋系統(tǒng)n ); printf( tt ); for( int i= 0; i strlen( wel ); +i ) putchar( weli ); sleep( 200 ); / 可使字符一個一個的輸出 putchar( 10 );
5、/ 換行對應(yīng)的 ascii 碼值為十進制的 102.3 二維數(shù)組與控制臺二維數(shù)組是用來使得整個棋盤的信息全部記錄下來,因此在結(jié)構(gòu)體中二維數(shù)組的聲明是最關(guān)鍵的。struct int statusmax/2+2max/2+2; int minbox; int step; char graph33; char *fillgraph9; sta stack; chessboard;聲明全局變量是為了使得各函數(shù)能夠更方便地使用到這個結(jié)構(gòu)體,現(xiàn)假設(shè)某點的坐標(biāo)為( 1, 1 ),那么如何在屏幕上打印這個點呢?這就利用到了changecoordinates( )與gotoxy( ) 函數(shù),前者使坐標(biāo)進行轉(zhuǎn)換,
6、后者讓光標(biāo)走到所指的那個點,其實主要還是因為類似“、”在橫向上所占都是兩個英文字母的距離,因此在控制臺上反映的就是和數(shù)組下標(biāo)倍數(shù)關(guān)系了。部分代碼如下:handle hconsole= getstdhandle( std_output_handle );void changecoordinates( int _x, int _y, int *x, int *y ) *x= ( _x- 1 )* 2; *y= ( _y- 1 )* 4; void gotoxy( int x, int y ) /這是光標(biāo)的函數(shù) coord coord; coord.y= x; / 在實際的應(yīng)用過程中發(fā)現(xiàn)交換x與y的
7、賦值 coord.x= y; / 更好理解,即橫行位x,縱行為y。 setconsolecursorposition( hconsole, coord ); 2.4 鍵盤操作在剛開始寫這個五子棋的時候是以坐標(biāo)來確定玩家的每一步棋,但后來發(fā)現(xiàn)這樣操作性實在是差,鍵盤操作是更好的選擇。這里又要用到一個函數(shù) getch( ),其作用是無回顯的接受從鍵盤輸入的字符,讓屏幕不會出現(xiàn)你輸入的字符且等待著按回車確定有了這個寶貝函數(shù),馬上得到 “” 對應(yīng)的ascii碼為 -32和72 兩個連著的數(shù)值,依次可得其他對應(yīng)的ascii碼。 后面在使玩家一和玩家二分離操作,玩家一則是利用 w、s、a、d + spac
8、e來操作, 玩家二則是 上下左右+ enter。配合changecoordinates( )與gotoxy( ) 函數(shù),完成對走棋的控制。部分代碼如下:if( opreat0= 13& ply= 2| opreat0= 32& ply= 1 )if( chessboard.statusmove_xmove_y= 0 ) int ttop= +chessboard.stack.top;chessboard.statusmove_xmove_y= ply;chessboard.stack.recordttop0= move_x;chessboard.stack.recordttop1= move_
9、y;printf( %s, graph );return true; / 該次走棋操作有效 else if( opreat0= -32& opreat1= 72| opreat0= w| opreat0= w )/ 凡是接受了“上操作”,則move_x的值減一, if( currect( move_x- 1, move_y ) ) move_x-= 1; else if( ) / 這是接下來的轉(zhuǎn)換操作changecoordinates( move_x, move_y, &temp_x, &temp_y );gotoxy( temp_x, temp_y );2.5判定對于每次走棋后,首先應(yīng)該做的
10、就是判定一否有五個棋子已經(jīng)連成一線,也是一個簡單的搜索過程,由于每次走的點不一定是最外部的點,因此從每次走的點的兩頭同時搜索,當(dāng)遇到兩端同時結(jié)束時,搜索結(jié)束。當(dāng)滿足五子時游戲結(jié)束。當(dāng)然,當(dāng)棋盤被走滿時,游戲亦結(jié)束。代碼如下:bool legal( int point ) if( point max/ 2+ 1 ) return false; else return true;/搜索45度角是否為滿足chessboard.minbox 以x正軸為參考軸 if( !flag )count= 1;for( int i1= x- 1, j1= y+ 1, i2= x+ 1, j2= y- 1 ; le
11、gal( i1 )& legal( j1 )| legal( i2 )& legal( j2 ) ; i1-, j1+, i2+, j2- ) int lastcount= count; if( legal( i1 )& legal( j1 )& chessboard.statusi1j1= ply ) count+; if( legal( i2 )& legal( j2 )& chessboard.statusi2j2= ply ) count+; if( lastcount= count ) break; if( count= chessboard.minbox ) flag= 1; re
12、turn true; 2.6 悔棋的實現(xiàn)雖說下棋悔棋是一種不道義的行為,但是如果雙方約定好了,未嘗不可。在沒寫悔棋之前,只是記錄了“上一次”的位置,聲明了last_x, last_y; 當(dāng)然既然要求悔棋,那么直接調(diào)用棧頂元素,即可定位上次走棋的位置。那么悔棋呢,取出“上一次”的位置,判定位置(不同的位置對應(yīng)不同的填充圖形類型)在二維數(shù)組中撤銷走棋時所賦予的 ply 值(玩家一走時,其值為1,玩家二走時,其值為2),重新將 chessboard.status last_x last_y 賦為0。代碼如下:int getfilltype( int x, int y ) if( x= 1 ) if(
13、 y= 1 ) return 0; else if( y= 16 ) return 2; else return 1; else if( x= 16 ) if( y= 1 ) return 6; else if( y= 16 ) return 8; else return 7; else if( y= 1 ) return 3; else if( y= 16 ) return 5; else return 4; bool retract( int *x, int *y ) int temp_x, temp_y, ttop, filltype; if( !stackempty( ) ) ttop
14、= chessboard.stack.top-; *x= chessboard.stack.recordttop0; *y= chessboard.stack.recordttop1; chessboard.status*x*y= 0;/ 將該點置為真正意義上的空點 filltype= getfilltype( *x, *y ); changecoordinates( *x, *y, &temp_x, &temp_y ); gotoxy( temp_x, temp_y ); printf( %s, chessboard.fillgraphfilltype ); return true; els
15、e gotoxy( 9, 65 ); printf( 您已不能悔棋 ); sleep( 300 ); gotoxy( 9, 65 ); printf( ); return false; 三、調(diào)試運行3.1 進入界面3.2 棋盤的初始狀態(tài)3.3 激戰(zhàn)中3.4 游戲結(jié)束四、解決問題的關(guān)鍵這個五子棋的程序并沒有什么復(fù)雜的算法,只是利用了簡單的圖知識和一個棧的應(yīng)用,在這里主要的關(guān)鍵問題就是如何將程序有條理的寫下來,有一個好的邏輯思維。將程序分成了多個功能函數(shù),盡量的讓一個函數(shù)的功能單一,只是在內(nèi)部調(diào)用了其他的函數(shù)以輔助改函數(shù)功能的實現(xiàn),比如判定坐標(biāo)是否越界,坐標(biāo)是否合法,悔棋的點的位置狀態(tài) 這樣便能做
16、到各個擊破,程序的形成也就變得暢通許多了。五、課設(shè)總結(jié)剛開始寫這個程序,認(rèn)為一定要用到 graphics.h, 無奈電腦tc不兼容,因此只好強行來畫這個界面了,使用輸入法里面的制表符,效果還不錯,通過一長串的if else 最好還是畫出來了,這個時候覺得控制臺的簡單圖形還是能夠畫出來的,并且可以盡量去美化它的界面。后面的附錄中將給出畫棋盤和棋子的源代碼。在程序設(shè)計的過程中,尤其是為源程序加上悔棋的功能,這期間總是有許多意想不到的錯誤,比如加上后,有時走了5個連子棋,但是程序并沒有判定輸贏,而是可以繼續(xù)走、有時沒有五個卻已經(jīng)結(jié)束了,光標(biāo)沒有復(fù)位,悔棋后,玩家的走棋順序沒有跟著改變通過后來的一步步
17、修改終于使得這些問題都一一解決了,比如說對 prompt( 提示 ) 函數(shù)引進了返回值,判斷該次操作是否成功,如果下了棋則為 true, 如果是悔棋就是 false 了,這樣便使得后面的操作更規(guī)范了和統(tǒng)一了。六、附錄#include #include #include #include #include #include #include #define max 31#define sta_1 1#define sta_2 2#define sta_0 0handle hconsole= getstdhandle( std_output_handle ); void hidecursor( )
18、 console_cursor_info cursor_info = 1, 0; setconsolecursorinfo(getstdhandle(std_output_handle), &cursor_info);typedef struct int record2602; int base; int top; sta;struct int statusmax/2+2max/2+2; int minbox; int step; char graph33; char *fillgraph9; sta stack; chessboard;void gotoxy( int x, int y )
19、/這是光標(biāo)的函數(shù) coord coord; coord.y= x; coord.x= y; setconsolecursorposition( hconsole, coord ); void logo( ) char wel30= made by lyush& mirs chen ; printf( ttt 歡迎試用五子棋系統(tǒng)n ); printf( tt ); for( int i= 0; i ); scanf( %s, chessboard.graph1 ); chessboard.graph12= 0; printf( 玩家二的 diy 棋子 - ); scanf( %s, chessb
20、oard.graph2 ); chessboard.graph22= 0; printf( nn請選擇先手玩家:_ nn); printf( nntttttt1 對應(yīng) 玩家一 2 對應(yīng) 玩家二n ); if( request= y| request= y ) gotoxy( 10, 16 ); /原函數(shù)是 第一個參數(shù)為列,后一個參數(shù)為行,把gotoxy函數(shù)做了更改 else gotoxy( 8, 16 ); scanf( %d, &mode ); if( mode!= 1& mode!= 2 ) return mode% 2+ 1; else return mode;void initches
21、sbiard( ) int ttop= chessboard.stack.top; fflush( stdin ); chessboard.step= 0; chessboard.stack.top= 0; chessboard.stack.base= 0; chessboard.stack.recordttop0= 8; / 棧的0號位存儲初始化的棋盤位置 chessboard.stack.recordttop1= 8; chessboard.minbox= 5; chessboard.fillgraph0=; chessboard.fillgraph1=; chessboard.fillg
22、raph2=; chessboard.fillgraph3=; chessboard.fillgraph4=; chessboard.fillgraph5=; chessboard.fillgraph6=; chessboard.fillgraph7=; chessboard.fillgraph8=; strcpy( chessboard.graph1, ); strcpy( chessboard.graph2, ); memset( chessboard.status, 0, sizeof( chessboard.status ) );bool legal( int point ) if(
23、point max/ 2+ 1 ) return false; else return true;bool currect( int x, int y ) if( legal( x )& legal( y ) ) return true; else return false;void changecoordinates( int _x, int _y, int *x, int *y ) *x= ( _x- 1 )* 2; *y= ( _y- 1 )* 4; void draw( ) / 畫棋盤 for( int i= 1; i= max; +i ) for( int j= 1; j=max; +j ) if( i= 1 ) if( j= 1 ) printf( ); else if( j= max ) printf( n ); else if( j%2 ) printf( ); / 橫向占兩個坐標(biāo)位,豎向占一個坐
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來就業(yè)市場的變化及職業(yè)定位分析
- 現(xiàn)代建筑設(shè)計與智能化技術(shù)的融合實踐
- 生態(tài)文明產(chǎn)業(yè)園的教育培訓(xùn)與人才培養(yǎng)策略
- 團委國慶節(jié)觀影活動方案
- 術(shù)后康復(fù)神經(jīng)外科手術(shù)患者的居家照護
- Unit 2 Wildlife Protection Reading and Thinking 第二課時說課稿-2024-2025學(xué)年高一英語人教版(2019)必修第二冊
- 2024秋八年級歷史上冊 第一單元 中國開始淪為半殖民地半封建社會 第3課 太平天國運動說課稿 新人教版001
- 2024年五年級英語上冊 Unit 6 My e-friend第1課時說課稿 牛津譯林版
- 《100 以內(nèi)的加法和減法(二)-進位加》(說課稿)-2024-2025學(xué)年二年級上冊數(shù)學(xué)人教版001
- 2024年一年級品生下冊《春天在哪里》說課稿 山東版
- GB/T 13404-2008管法蘭用非金屬聚四氟乙烯包覆墊片
- 危險化學(xué)品MSDS(五氯化磷)
- 雞蛋浮起來實驗作文課件
- 醫(yī)療器械設(shè)計開發(fā)流程培訓(xùn)課件
- 警情處置與執(zhí)法安全匯編課件
- 動物生物技術(shù)(課件)
- 注塑成型工藝流程圖
- 廣東省緊密型縣域醫(yī)療衛(wèi)生共同體雙向轉(zhuǎn)診運行指南
- C型鋼檢驗報告
- 檢驗科臨檢組風(fēng)險評估報告文書
- 幼小銜接拼音試卷-帶彩圖-幼小銜接拼音試卷圖片-幼小拼音試卷習(xí)題
評論
0/150
提交評論