C語言五子棋課程設(shè)計報告_第1頁
C語言五子棋課程設(shè)計報告_第2頁
C語言五子棋課程設(shè)計報告_第3頁
C語言五子棋課程設(shè)計報告_第4頁
C語言五子棋課程設(shè)計報告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、本科控制軟件設(shè)計課程設(shè)計題目五子棋學(xué)院計信院專業(yè)自動化年級2011 級學(xué)號222011321042081姓名譙平同組人張健、李益指導(dǎo)教師黃仁杰2012年9月 6日1、設(shè)計簡介32、設(shè)計模塊43、小組分工44、流程圖45、設(shè)計過程56、調(diào)試過程67、分析與總結(jié)98、源程序9一、設(shè)計簡介五子棋是一種傳統(tǒng)的棋盤游戲,是起源于中國古代的傳統(tǒng)黑白棋種之一。 發(fā)展于日本,流行于歐美。容易上手,老少皆宜,而且趣味橫生,引人入 勝;不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。 這種游戲用筆紙都可以進(jìn)行。本程序設(shè)計為人與人對弈,雙方棋子為一種顏色。一方執(zhí)0棋,一方執(zhí) X棋,執(zhí)0形棋的一方先行下子

2、,移動光標(biāo)鍵為“W(上)、s(下)、a (左)、 d (右)”,落子鍵位“空格”,然后另一方走棋,移動光標(biāo)鍵為“上、下、 左、右”,落子鍵為“Enter”。接著雙方輪流走棋,每方都試圖在游戲結(jié)束 前讓自己的棋子在橫線、豎線、斜線方向五子相連,首先實現(xiàn)五子相連的 一方獲勝,游戲結(jié)束。程序執(zhí)行過程中,要求棋盤、棋子時時可見,并且 人可以通過按鍵盤按鍵移動光標(biāo),擺放棋子。同時在落子不同情況以及出 現(xiàn)贏家的時候都會出現(xiàn)相應(yīng)的聲音。二、設(shè)計模塊三、小組分工李益:初始化模塊譙平:下棋操作模塊張?。簞儇?fù)判斷模塊四、流程圖4交換玩家下棋N,是否有贏家a游戲結(jié)束/五、設(shè)計過程1、列出所需頭文件名2、定義棋盤的制

3、符表及位置3、定義雙方玩家各自的操作鍵4、定義數(shù)據(jù)結(jié)構(gòu)5、說明自定義函數(shù)原型6、定義全局變量7、初始化圖像以及獲得按鍵值8嵌入各自定義函數(shù)編寫主函數(shù)9、編寫界面初始化函數(shù)void Init(void)10編寫畫棋盤函數(shù)voidDrawMap(void)11、編寫交換棋手函數(shù)int ChangeOrder(void)12、編寫獲取按鍵値函數(shù)int GetKey(void)13、編寫落子處理函數(shù)voidDoError(void)14、編寫贏棋處理函數(shù)voidDoWin(int Order)15、編寫走棋函數(shù) int ChessGo(Order , point Cursor)16> 編寫判斷是

4、否贏棋函數(shù) int JudgeWin(Order,point Cursor)17、編寫判斷在規(guī)定方向是否有五子相連函數(shù)intJudgeWinline(Order,point Cursor)18 編寫移動光標(biāo)函數(shù) void MoveCursor(Order,press)19、編寫游戲結(jié)束處理函數(shù)voidEndGame(void)20、編寫顯示當(dāng)前棋方函數(shù)void ShowOrderMsg(Order)21、編寫落子正確處理函數(shù)voidDoOK(void)22、編寫檢查用戶按鍵類別函數(shù)int CheckKey(press)六、調(diào)試過程運行平臺:C/C+程序設(shè)計學(xué)習(xí)與實驗系統(tǒng)1、點擊運行,出現(xiàn)棋盤界

5、面 C:JM$OFTCYuYanbinv/wtemp.exePlayerl key: UPwDOWNS LEFT-a RIGHT-d DOspacePlayer2 key:UPupDOWNdown LEFTleft RIGHT-rightDOENTERexit game:ESCPlayerl go *2、根據(jù)界面提示鍵落子,玩家一先下,雙方輪流落子。 C:JMSOFTCYuYanbinwwtemp.exePlayerl go *Playerl key: UPwDOWNs LEFTa RIGHT-d DOspacePlayer2 key:UPupexit game:DOWNdown LEFTle

6、ft RIGHT-right DOENTER3、一方五子相連,判出贏家,游戲結(jié)束。C:JMSOFTCYuYanbinwwtemp.exePlayerl go IPlayerl key: UPDOWNs LEFTa RIGHT-d DOspacePlayer2key:UPpDOWNdownLEFTleftRIGHT-right DOENTERexit game:ESCPLAYER2 WIN!<+>/ C:JMSOFTCYuYanbinvzwtemp.exe4按任意鍵退出游戲。七、問題與與總結(jié)1、用十六進(jìn)制數(shù)制表格的方法不了解,參照網(wǎng)例的時候也不是很明白原 理,以至于表格不是很完善,兩

7、行中間的一行在棋盤上沒有清晰的顯示出 來。2、設(shè)計這樣稍微復(fù)雜的程序時,我們要多多利用自定義函數(shù)的嵌入方法, 這樣把主程序分為若干個自定義函數(shù),不僅可以減少程序設(shè)計中的遺漏現(xiàn) 象,還有利于我們建立完善的設(shè)計思維模式。3、設(shè)計程序前要多翻閱資料與閱讀范例,盡量減少程序編寫時犯錯,程 序編寫時犯錯很浪費吋間和精力,而且往往很難找出錯誤的地方。4、編程的前提是讀懂其他程序,平時需要多練習(xí)才行,這次設(shè)計的過程 步履維艱,就是因為沒有長期的閱讀練習(xí)和教訓(xùn)累積。八、源程序/* 程序中用到的庫函數(shù)所在頭文件應(yīng)用 include 命令包含進(jìn)來 */#includc <stdio.h>#includ

8、e <bios.h>#include <ctype.h>#include <conio.h>#include <dos.h>/*/定義符號常量嚴(yán)定義畫棋盤所需的制表符*/#defineCROSSRUOxbf嚴(yán)右上角點*/#defineCROSSLUOxda/*左上角點*/#defineCROSSLDOxcO/*左下角點*/#defineCROSSRD0xd9/*右下角點*/#defineCROSSL0xc3/*左邊可#defineCROSSR0xb4/*右邊*/#defincCROSSU0xc2/*上邊*/10#define CROSSD#def

9、ine CROSSOxcl0xc5/*下邊*/*十字交叉點*/*定義棋盤左上角點在屏幕上的位置*/#define MAPXOFT5#define MAPYOFT2#definePLAY 1 UP0x1157/* 上移-W*/#definePLAY 1 DOWN0xlf53/* 卜移一'S'*/#definePLAY1LEFT0xle41/* 左移-'A'*/#definePLAY 1 RIGHT0x2044/*右移D*/#definePLAY IDO0x3920/*落子-空格鍵*/木定義1號玩家的操作鍵鍵碼*/*定義2號玩家的操作鍵鍵碼可#define PLAY

10、2UP#define PLAY2DOWN#define PLAY2LEFT#define PLAY2RIGHT#define PLAY2DO0x4800/* :移一方向鍵up*/0x5(X)()/* 卜移一方向誰down*/ 0x4b00/*左移-方向鍵left*/ 0x4d00/* 右移方向鍵 right*/Ox 1 cOd/* 落子"IhI 車鍵 Enter*/*若想在游戲屮途退出,#define ESCAPE可按 Esc 鍵引0x01lb/*定義棋盤上交叉點的狀態(tài),即該點有無棋子/*若有棋子,還應(yīng)能指出是哪個玩家的棋子*/#define CIIESSNULL0沒有棋子#defi

11、neCHESS 1'07/號玩家的棋子#defineCHESS2X/二號玩家的棋子/*定義按鍵類別引#define KEYEXIT#define KEYFALLCHESS#define KEYMOVECURSOR#define KEYINVALID0/*退出鍵*/1/*落子鍵*/2/*光標(biāo)移動鍵*/3嚴(yán)無效鍵*/*定義符號常量:真,假 真為1,#define TRUE1#define FALSE0假為0*/*定義數(shù)據(jù)結(jié)構(gòu)*/*棋盤交叉點坐標(biāo)的數(shù)據(jù)結(jié)構(gòu)引struct point12int x,y;/*/*/voidintintintintvoidvoidvoidvoidvoidvoidi

12、ntintvoidvoidInit(void);GetKey(void);CheckKey(int press);ChangeOrder(void);ChessGo(intOrder,structDoError(void);DoOK(void);DoWin(int Order);MoveCursor(intDrawCross(intDrawMap(void);JudgeWin(intOx,int y);Order,structpointpress);pointCursor);Cursor);JudgeWinLine(int Order,struct point Cursor,i

13、nt direction);ShowOrderMsg(int Order);EndGame(void);/*木*木*水*/*水*/*/int*/structchargPlayOrder;八指示當(dāng)前行棋方point gCursor;gChessBoard1919y*用J記錄棋盤上各點的狀態(tài)*/*光標(biāo)在棋盤上的位置*/*/*/*主兩數(shù)*/void main()int press;intbOutWhile=FALSE;/* 退出循環(huán)標(biāo)志 */Init();/*初始化圖象,數(shù)據(jù)対while(l)press=GetKey()y*獲取用戶的按鍵值*/16switch(CheckKey(press)/* 判

14、斷按鍵類別 */*是退岀鍵*/case KEYEXIT:clrscr();/*iij 屏 */bOutWhile = TRUE;break;是落子鍵*/case KEYFALLCHESS:if(ChessGo(gPlayOrder,gCursor)=FALSE)/* 走棋 */ DoError();/* 落子錯誤 */elseDoOK();/*落子止確引/*如果當(dāng)前行棋方贏棋*/ if(JudgeWin(gPIayOrder,gCursor)=TRUE)DoWin(gPlayOrder);bOutWhile =TRUE;/*退出循環(huán)標(biāo)志置為真*/*否則*/else/*交換行棋方*/Change

15、Order();break;/*是光標(biāo)移動鍵*/case KEYMOVECURSOR:MoveCursor(gPlayOrder,press);break;/*是無效鍵*/case KEYINVALID:break;)if(bOutWhile=TRUE)break;)EndGame();/弋"丄".%J"%1%l>"%* A > >rB bjvT*T *jTTT* J j«g/*界而初始化,數(shù)據(jù)初始化*/void Init(void)int i,j;char *Msg="Player 1 key:",HUP

16、 w”,”DOWN-sH,HLEFT-aH,“RIGHT-d","DO-space",HH,” Player2 key:1',“UP up”,”DOWNdown”,"LEFT-left",”RIGHT-righf”DO一ENTER”,Ull"exit game:"," ESC",NULL,I;/*先手方為1號玩家*/gPlayOrder = CHESS 1;/*棋盤數(shù)據(jù)清零,即棋盤上各點開始的時候都沒有棋子*/ for(i=0;i<19;i+)for0=O;j<19;j+) gChes

17、sBoardi|j=CHESSNULL;/*光標(biāo)初始位置*/gCursor.x=gCursor.y=0;/*畫棋盤木/textmode(C40);DrawMapO;嚴(yán)顯示操作鍵說明*/i=0;textcolor(BROWN);while(Msgi!=NULL)gotoxy(25,3+i);cputs(Msgi);i+;/*顯示當(dāng)前行棋方*/ShowOrderMsg(gPlayOrder);/*光標(biāo)移至棋盤的左上角點處*/gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);)/*畫棋盤*/void DrawMap(void)int i,j;clrscr();f

18、or(i=0;i<19;i+)for(j=0;j<19;j +)DrawCross(ij);/*畫棋盤上的交叉點void DrawCross(int x,int y)gotoxy(x+MAPXOFT,y+MAPYOFT);/*交叉點上是一號玩家的棋子*/if(gChessBoardxy=CHESS 1)textcolor(LIGHTBLUE);putch(CHESSl);return;)/*交叉點上是二號玩家的棋子*/if(gChessBoardxy=CHESS2)textcolor(LIGHTBLUE); putch(CHESS2);return;textcolor(GREEN)

19、;/*左上角交叉點*/ if(x=0&&y=0)putch(CROSSLU); return;廣左下角交叉點*/ if(x=O&&y= 18) putch(CROSSLD); return;/*右上角交叉點*/ if(x=18&&y=0)putch(CROSSRU); return;/*右下角交叉點*/ if(x 二二 18&&y18) putch(CROSSRD); return;/*左邊界交叉點*/if(x=0)putch(CROSSL); return;/*右邊界交叉點*/if(x=18)putch(CROSSR); ret

20、urn;/*上邊界交叉點*/ if(y=O)putch(CROSSU); return;/*下邊界交叉點対if(y=18)putch(CROSSD); return;/*棋盤中間的交叉點*/ putch(CROSS);/*交換行棋方引int ChangeOrder(void)if(gPlayOrder=CHESS 1) gPlayOrder=CHESS2; elsegPlayOrder-CIIESSl;retum(gPlayOrder);)/*獲取按鍵值*/int GetKey(void)char lowbyte;int press;while (bioskey(l) =0)尸如果用戶沒有按鍵

21、,空循環(huán)*/press=bioskey(0); lowbyte=press&0xff; press=press&OxffOO+ toupper(lowbyte);retum(press);/*落子錯誤處理*/ void DoError(void)sound(1200);delay(50); nosound();/*贏棋處理*/void DoWin(int Order)sound( 1500);delay(l 00);sound(O);delay(50);sound(8(X); delay(lOO);sound(O);delay(50);sound(l 500);delay(l

22、00);sound(O);delay(50);sound(8(X); delay( 100);sound(O);delay(50);nosound();textcolor(RED+BLEK);gotoxy(25,20);if(Order=CHESSl)cputs( "PLAYER 1WIN!");elsecputs(” PLAYER2WIN!");gotoxy(25,21);cputs(n <A+A>/n);getch();/*走棋*/int ChessGo(int Order,struct point Cursor)/*判斷交叉點上有無棋子*/if(

23、gChessBoard Cursor, x Cursor.刃=CHESSNULL)/*若沒有棋子,則可以落子*/ gotoxy(C ursor. x+MAPXOFT,Cursor. y+M APY OFT); textcolor(LIGHTBLUE);putch(Order);gotoxy(Cursor.x+M APXOFT,Cursor. y+MAPYOFT); gChess Board Cursor, x Cursor, y=Order;return TRUE;elsereturn FALSE;/*判斷當(dāng)前行棋方落子后是否贏棋*/int JudgeWin(int Order,struct

24、point Cursor)int i;for(i=0;i<4;i+)/*判斷在指定方向上是否有連續(xù)5個行棋方的棋子*/ if(JudgeWinLine(Order,Cursor,i) return TRUE;return FALSE;direction)/*判斷在指定方向上是否有連續(xù)5個行棋方的棋子*/int JudgeWinLine(int Order,struct pointCursor,intint i;struct point pos.dpos;const int testnum =5;int count;switch(direction)case 0:/*在水平方向*/pos.

25、x=Cursor.x (testnum 1);pos.y=Cursor.y;dpos.x=l;dpos.y=0;break;case 1 :/*在垂直方向*/pos.x=Curs orx;pos.y=Cursor.y-(testnum-1);dpos.x=0;dpos.y=l;break;case 2:/*在左F至右上的斜方向*/pos.x 二Cursor, x (testnum 1);pos.y=Curso r.y+(testnum-l);dpos.x=l;dpos.y=-l;break;case3:/*在左上至右卜-的斜方向*/pos.x=Cursor.x-(testnum-1);pos.

26、y=Curso r.y-(testnum-1);dpos.x=l;dpos.y=l; break;count=0;for(i=0;i<testnum*2+l ;i+)if(pos.x>=0&& pos.x<=18&&pos.y>=0&& pos.y<=18) if(gChessBoardpos.xpos.y=Order)count+;if(count>=testnum) return TRUE;)elsecount=0;pos.x+二dpos.x; pos.y+二dpos.y;return FALSE/*移動光

27、標(biāo)3«7void MoveCursor(int Order,int press)switch(press)casePLAY 1 UP:if(Order=CHESS 1 &&gCursor.y>0)gCurso uy-;break;casePLAY 1 DOWN:if(Order=CHESS 1 &&gCursor.y<18)gCursor.y+;break;case PLAY 1 LEFT:if(Order=CHESS 1 &&gCursor.x>0) gCurso 匚 x;break;case PLAY 1 RIGHT:if(Order=CHESS 1 &&gCursor.x< 18) gCurso 匚 x+;break;case PLAY2UP:if(Order=CHESS2&&gCursor.y>0) gCursor.y-;break;case PLAY2D0WN:if(Order=CHESS2&&gCursor.y<18) gCursor.y+;break;case PLAY2LEFT:

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論