c++課程設計論文_第1頁
c++課程設計論文_第2頁
c++課程設計論文_第3頁
c++課程設計論文_第4頁
c++課程設計論文_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

畢業(yè)設計課程定做 QQ1714879127VC+課程設計報告課 程: 院 系:選題名稱: TICTACTOE游戲(三子連珠游戲)題目級別: B級班 級:學 號: 姓 名:時 間:指導老師: v 程序功能簡介 該程序是TICTACTOE游戲,棋盤為3*3,3個棋子連起來即為贏。輸入參數時,若輸入的數字超過邊界或在已有棋子的地方再輸入,則提示出錯,要求重新輸入。v 課程設計要求1.將程序改寫成類。2.將棋盤擴充成4*4。3.統計輸贏結果并打印輸出。4.選做:使游戲更生動。(輸贏條件相同)評定難易程度:Bv 程序設計思想 設計一個玩家下棋的操作類,里面封裝了棋盤棋子類別和輸贏次數等成員數據。 操作類的函數包括有初始化棋盤下棋判斷輸贏等。定義一個類的對象,在調用類中函數時直接使用對象名加函數名即可。 將兩個玩家定義為兩個數組用于區(qū)分他們的信息,分別用O和X代表兩個玩家所用棋子,然后分別對兩個玩家通過已定義的類的對象調用類中的函數,完成下棋過程。 進一步改進程序:1. 程序中用if else if格式的語句來判斷玩家的輸贏,當棋盤增大時,三子連珠的各種可能性成倍增加,使得語句非常繁瑣,所以將其改為for語句的循環(huán)結構進行判斷,當棋盤增大時,只需更改循環(huán)條件結束的參數即可,可靈活使用于各種尺寸的棋盤。2. 為防止用戶誤操作,特別是在姓名的輸入時的失誤,可以采用cin.getline函數讀入在判斷確認。3. 在完成第一步的基礎上可將三子連珠擴充為標準的五子棋。v 原程序各個功能說明1. 原程序的結構(見下頁)開始輸出菜單及提示信息輸入姓名由“O”先手下棋結束輸出最終結果詢問是否繼續(xù)下棋“O”輸入棋子所在的行列判斷勝負和棋條件輸出結果“X”輸入棋子所在的行列不符合錯誤正確錯誤正確符合 YN2. 類的說明 類是對一組具有相同屬性、相同行為的對象的抽象的描述,不占用內存空間??梢园杨惪醋鳌袄碚撋稀钡膶ο螅簿褪钦f,它為對象提供藍圖,但在內存中并不存在。從這個藍圖可以創(chuàng)建任何數量的對象。從累創(chuàng)建的所有對象都有相同的成員:屬性、行為或方法。這些對象才是具體的獨立的個體,占用存儲空間,因此,對象又稱作類的實例。 下面以具體程序說明。 在頭文件之后定義了一個名為CGobang的類:class CGobang char board44;/用數組來定義一個4*4的棋盤public:void Guize();/打印菜單總體情況,說明游戲規(guī)則和方法,無返回值 void Dayinqp();/打印棋盤,無返回值void Xiaqi(char*,int &,int &,char);/下棋,無返回值int Huosheng(int,int,char);/判斷那個選手贏,返回值為一整形數void Choice(char &);/是否再玩,無返回值void Chongzhi();/重置棋盤,無返回值; 在這個類中,定義了一個未經說明的數組被默認為私有成員,即char board44,用它來存儲玩家在下棋的過程中所輸入的棋子的坐標,并以此來區(qū)分表示不同的兩個玩家。另外,這個類中還說明了五個沒有返回值的函數以及一個返回值為整形數的函數,對它們的定義將出現在主函數完成之后,所以本著“先定義,后調用”的原則,在類中的說明相當于自定義函數中的函數說明,這樣可以使在主函數調用類中的公有函數時變得更加明了清晰。 在這個函數中,對類的對象的定義出現在了主函數第一行,即:CGobang s;/定義類的一個對象s對這個對象的定義的目的是,在下面不同玩家的下其中的不同操作中,可以直接通過這個對象來分別調用類中的任意公有成員函數,這樣就避免了通過類名來調用函數時可能出現的冗長。可以說,在這個程序里,這個對象s起到了把主函數與類連接起來的橋梁作用。v 課程設計要求的實現一、類的封裝。 首先,在源程序代碼中出現的主要函數程序有:void PrintBoard(); / 打印棋盤void PrintInfo(); /輸出游戲提示信息void PrintStats(int, int, int); / 輸出統計的勝負信息void IfError(int&, int&); / 判斷輸入時候有錯void ChoiceOfChar(char&); / 詢問用戶是否在玩一局void PromptTurnO(int&, int&); / 選擇“O”的玩家下棋(先走)void PromptTurnX(int&, int&); / 選擇“X”的玩家下棋(后走)char board33; / 棋盤在我的程序中的主要函數程序為:void Guize();/打印菜單總體情況,說明游戲規(guī)則和方法,無返回值void Dayinqp();/打印棋盤,無返回值void Xiaqi(char*,int &,int &,char);/下棋,無返回值int Huosheng(int,int,char);/判斷那個選手贏,返回值為一整形數void Choice(char &);/是否再玩,無返回值void Chongzhi();/重置棋盤,無返回值以此來對比說明。源代碼中的關于打印棋盤以及規(guī)則提示的說明的函數沒有變動。去掉了關于輸出統計勝負信息的函數,在主函數體中用三個一組的條件自增變量代替,這樣減少了復雜的函數調用,說明以及定義,精簡了程序,并且達到了預想的目的。由于對玩家輸入是否有錯的判斷在玩家每次確定下棋之后必須進行,所以如果像源代碼一樣把玩家下棋的函數和判斷是否有誤分開定義的話,在沒下一步棋之后都要重復調用判斷函數,顯得十分復雜,所以把源代碼中的判斷是否有錯的函數與玩家下棋合并在 void Xiaqi(char*,int &,int &,char)中,對它們的定義在后面的類的成員函數的定義中一起定義,這樣可以減少很多不必要的麻煩,起到了精簡程序的作用。源代碼中把連個玩家分別定義為兩個函數,用以區(qū)別先后手,然后在定義一個數組char board33(由于源代碼中顯示的是3*3的棋盤,所以數組定義為board33)來表示棋盤。在這點我做了比較大的改動,首先是定義了一個類中的私有成員數組,用以記錄每位玩家所下棋子的坐標,這樣既可以通過用不同的指針變量來指向鍵盤的方法來區(qū)分不同的玩家,亦可以同時用它表示整個棋盤。這樣使程序得到了進一步的精簡。void CGobang:Xiaqi(char*player1,int & x,int & y,char c)cout該player1下棋了,請輸入:endl;coutx;cout y;while(x4|y4|x1|y1| !=boardx-1y-1)/輸入數字超過邊界或在已有棋子的地方再輸入/ !=boardx-1y-1表示已有棋子cout對不起,您的輸入有誤,請重新輸入!endl;coutx;cout y;boardx-1y-1=c;/在x行,y列處下O或X由于需要重復使用空棋盤,我又增加了一個重置棋盤的函數void Chongzhi()來進行每次開始下棋時的棋盤清空重置。void CGobang:Chongzhi()for(int Row=0;Row4;Row+)for(int Column=0;Column4;Column+)boardRowColumn= ;完成對主要函數的改動之后,把它們封裝到類CGobang中即可。二、將棋盤擴充為4*4在類的封裝中已經詳細的將我改動過的棋盤說明了,所以,要把棋盤擴充為n*n只需把定義過的私有成員數組boardnn中的n改為所需數字即可。即,定義board44,就完成了對棋盤4*4的擴充。三、統計輸出結果并打印輸出。同樣,在類的封裝中也已說明我對記錄勝負結果以及輸出的方法,下面給出源代碼:記錄勝負結果:int FirstWin=0,SecondWin=0,Draws=0,x,y,N;在每次獲勝、失敗以及和棋的判斷完成之后,令FirstWin SecondWin Draws分別依情況自增,達到記錄勝負次數的目的。打印輸出:/輸出游戲輸贏次數coutplayer1贏了FirstWin次endl;coutplayer2贏了SecondWin次endl;cout和Draws次endl;cout謝謝使用。endl;cout任意鍵繼續(xù)。endl;即在主函數結束時輸出已記錄的數值即可完成。l 主要源程序及注釋1主函數void main ()/主函數CGobang s;/定義類的一個對象s s.Guize();/通過已定義的類的對象s調用Guize函數,提示玩家如何進行游戲char player120,player220;/定義兩個玩家的姓名變量,分別用兩個數組儲存int FirstWin=0,SecondWin=0,Draws=0,x,y,N;/說明變量,并對部分變量付初值,以待計算輸贏結果char choice=Y;cin.ignore(20,n);/輸入輸出流,前面如果有輸入把輸入行所有字符 /取空,以便后面的輸入從新的一行開始cout請輸入第一個玩家姓名:;cin.getline(player1,20);/連續(xù)讀取數據,實現對玩家一命名cout請輸入第二個玩家姓名:;cin.getline(player2,20);/連續(xù)讀取數據,實現對玩家二命名while(choice=Y|choice=y)/條件成立,開始下棋 s.Chongzhi();/通過對象s調用Chongzhi函數 N=0;/對變量付初值,表示已經下在棋盤上的妻子總數while(N=16)/在棋盤未滿的條件下下棋s.Dayinqp();/打印棋盤s.Xiaqi(player1,x,y,O);/調用下棋的運行函數N+;/記錄已下棋子數if(s.Huosheng(x-1,y-1,O)/返回值不為0則條件成立coutplayer1贏了。endl;FirstWin+;/記錄玩家一所贏局數break;/終止本次循環(huán)s.Dayinqp();/交換玩家下棋,下棋方法同上s.Xiaqi(player2,x,y,X);N+;if(s.Huosheng(x-1,y-1,X)coutplayer2贏了。endl;SecondWin+;/記錄玩家二所贏局數break;if(N=16)/當棋盤滿時,此局結束cout和棋!;Draws+;/記錄平局總數break;s.Choice(choice);/讓玩家選擇是否在玩一次/輸出游戲輸贏次數coutplayer1贏了FirstWin次endl;coutplayer2贏了SecondWin次endl;cout和Draws次endl;cout謝謝使用。endl;cout任意鍵繼續(xù)。=0)&(y-a=0)&(boardx-ay-a=c);a+)if(+count=3) return 1;/從 右斜下 方向判斷是否構成勝利條件for(a=1;(x+a4)&(y+a=0)&(boardx-ay=c);a+)if(+count=3) return 1;/從 下向上 方向判斷是否構成勝利條件for(a=1;(x+a=0)&(boardxy-a=c);a+)if(+count=3) return 1;/從 右至左 方向判斷是否構成勝利條件for(a=1;(y+a=0)&(y+a4)&(boardx-ay+a=c);a+)if(+count=3) return 1;/從 左斜下 方向判斷是否構成勝利條件for(a=1;(x+a=0)&(boardx+ay-a=c);a+)if(+count=3) return 1;return 0;v 設計過程中的疑難及解答方案和設計的不足 設計過程中的疑難及解答方案在這次課程設計的過程中,我遇到了不小的阻力,還有也從中學習到了很多以前沒有掌握好或這根本沒有掌握的知識。 在定義玩家名字的輸入接受的時候我遇到了一個從未見過的函數cin.ignore(),這個函數是我從一個同樣是輸入存儲用戶姓名的程序里看到的,上面對它的注釋是:“輸入輸出流,前面如果有輸入把輸入行所有字符去空,一邊后面的輸入從新的一行開始?!蔽覍@個想了很長時間,但是一直沒有明白。最后解決問題的方法是我通過網絡查詢找到了這個函數,在其他一些人那里得到了答案:“cin.ignore(a,ch)方法是從輸入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每拋棄一個字符,它都要計數和比較字符:如果計數值達到a或者被拋棄的字符是ch,則cin.ignore()函數執(zhí)行終止;否則,它繼續(xù)等待。它的一個常用功能就是用來清除以回車結束的輸入緩沖區(qū)的內容,消除上一次輸入對下一次輸入的影響。比如可以這么用:cin.ignore(1024,n),通常把第一個參數設置得足夠大,這樣實際上總是只有第二個參數n起作用,所以這一句就是把回車(包括回車)之前的所以字符從輸入緩沖(流)中清除出去?!边@樣我就對這個函數有了很清楚的認識,所以就將它應用到了我的設計中了。 在設計過程中最大的困難就是對勝負判斷條件的改寫。依據課本中程序設計思想的提示,我需要把源代碼中的if else格式的語句改寫成for循環(huán)語句,以便于后面對任意大棋盤的n子連珠程序的擴展。 起初我只是單單從for循環(huán)的簡單語句中找答案,但是一直沒有結果,我也覺得不應該那么簡單,但是卻找不到突破口。于是我向另一位同學請教,在我們倆的共同努力下,我們覺得應該把for循環(huán)語句與if條件語句結合使用,于是,我便得出了我現在的判斷方法。下面舉例詳細說明:例如從左斜上方向判斷 課本中的源代碼是else if (board20= O & board11= O & board02= O) cout O player wins the game =0)&(y-a=0)&(boardx-ay-a=c);a+)if(+count=3) return 1; 需要注意的是,源代碼只是局限于3*3的棋盤進行三子游戲的從左斜上的獲勝判斷,不論棋盤變化或者子數變化都會引起代碼的非常大的變動,這樣顯然不利于棋盤以及游戲的擴充。而對于修改后的判斷方法,如果棋盤變化,只需修改相應的a的值即可,如果游戲子數變化,那么只要把if(+count=3)中的3改掉就可以了。比如說五子棋可以改為if(+count=5)。 當小錯誤解決了以后,在重復運行程序的過程中,我測試了各種數據及不同數據類型的輸入,發(fā)現在玩家輸入坐標的時候如果不是int型的,就會導致程序的無效死循環(huán),為了解決這個問題我才又引入了while(!cin) /當輸入的行坐標不是int型時char str20;cin.clear();/清空輸入緩沖區(qū)cin.getline(str,20);/接收原輸入數據coutx; /重新輸入這一程序,從而解決了這個問題。設計的不足 我的設計已經完成了,但是其中還有很多不足之處,其中最明顯的就是我沒有完成課程設計要求中的選作項,起初,我是想按照課本程序設計思想中提到的設一個電腦玩家可以與人競賽的程序的,但是我在思考之后還是決定不添加這個項目,原因是我并沒有什么好的辦法來完成這個程序段。這個問題也算這次設計過后的一個遺留問題吧,我會在以后的學習中努力掌握這個問題的解決方法的。v 個人心得體會 在這次課程設計中,我不只一次的從早上八點一直到下午六點一直坐在機房,調試已經寫好的程序,當晚上拖著疲憊的身體走進食堂開始這一天第一頓飯時,我的心里雖然能很清楚的感受到身體的疲憊,但卻一直充滿了喜悅,這大概就是付出的喜悅吧。 還有,通過這次設計,我還掌握了很多有用但以前不知道的知識:首先,我比以前更加知道了注釋的重要性,而且學到了一些關于注釋的技巧,比如說,當一段注釋的話比較長的時候,為了美觀起見,可以用/*開頭,在用*/結尾,這樣就可以輕松

溫馨提示

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

評論

0/150

提交評論