




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C+課程設(shè)計(jì)報(bào)告 指導(dǎo)老師:胡老師 日期:2021 01 18目錄:第一章 本課程設(shè)計(jì)的目的3第二章 選題思路3第三章 解決方法3第四章 具體功能模塊及代碼61、準(zhǔn)備模塊62、初始化73、盤面分析填寫棋型表94、環(huán)控制模塊16第五章 存在的問題16第六章 致謝18參考文獻(xiàn) 19第一章 本課程設(shè)計(jì)的目的(1)加深學(xué)生對(duì)c+語言數(shù)據(jù)類型,運(yùn)算,語句結(jié)構(gòu)及其程序設(shè)計(jì)的根本方法理解和掌握。(2)熟練掌握流程圖的繪制。(3)熟悉所用計(jì)算機(jī)系統(tǒng)的操作方法。(4)學(xué)會(huì)上機(jī)調(diào)試程序,善于發(fā)現(xiàn)程序中的錯(cuò)誤,并能夠快速排除這些錯(cuò)誤。(5)學(xué)會(huì)運(yùn)用c+語言解決實(shí)際中的問題的能力。(6)學(xué)習(xí)用文檔書寫程序設(shè)計(jì)說明。第
2、二章 選題思路我選擇比擬常見的小游戲,五子棋。五子棋是有兩個(gè)人在一盤棋上進(jìn)行對(duì)抗的競(jìng)技運(yùn)動(dòng)。在對(duì)局開始時(shí),先由用戶選擇哪方先開局,先開局一方將一枚棋子落在一點(diǎn)上,然后由另一方在對(duì)方棋周圍的交叉點(diǎn)上落子,如此輪流落子,直到某一方首先在棋盤的直線、橫線或斜線上形成連續(xù)的五子那么該方就算獲勝。此時(shí),算法結(jié)束。當(dāng)有任何一方想退出時(shí),都可在算法中實(shí)現(xiàn)。 第三章 解決方法本程序中包含一個(gè)主函數(shù)和16個(gè)子函數(shù),它們的函數(shù)名及功能分別如下: 主函數(shù) : int main(void) 子函數(shù) :(1)void CGobang:Draw() 判斷平局(2)void CGobang:InitialBoard() 初
3、始化棋盤(3)void CGobang:PrintBoard() 按用戶輸入大小輸出棋盤(4)int CGobang:GetFull() 判斷棋盤是否一滿(5) void CGobang:Win() 判斷贏棋(6) void CGobang:savefile() 將棋盤保存至文件,以便下次繼續(xù)(7) void CGobang:Lose() 判斷輸棋(8) void CGobang:PlayTurn(void) 走一步棋(9) int CGobang:Judge() 判斷是否連成五子(10) void CGobang:PrintInfo(void) 打印總體情況(11) void CGobang
4、:readBoard() 以二進(jìn)制形式從文件中讀出棋盤(12) void huiqi() 悔棋(13)void PrintRule(void) 打印游戲規(guī)那么(14) int JudgePlay(CGobang &SideX,CGobang &SideO) 每下一步進(jìn)行輸贏的判斷(15)void Play(CGobang &SideX,CGobang &SideO) 開始一局游戲(16)void continute() 可以接著上次的游戲玩參數(shù)說明(1) int a90,b90; 定義全局?jǐn)?shù)組(2) char chSort; 棋子的類別(3) int nWin;
5、 贏棋的次數(shù)(4) int nLose; 輸棋的次數(shù)(5) static int nDraw; 平局次數(shù)(6) static char achBoard99; 棋盤(7) static int nSize; 棋盤的尺寸系統(tǒng)流程圖輸出游戲規(guī)那么Error!玩家遵守Y Y誰先下棋,輸入棋盤大小s戲畫出s*s大小的棋盤Y是否繼續(xù)上次游戲Y用戶決定誰先走NX方先走 N保存的文件畫o畫x Y 下棋 改變玩家Y 下棋輸如<0,0>退出,是否保存 N橫豎斜有五個(gè)相同顏色的棋子相連x棋 N Y N輸出:o方獲勝輸出:x方獲勝 Y是否繼續(xù) Y 退出程序N第四章 具體功能模塊及代碼1、準(zhǔn)備模塊:文件所
6、需的頭函數(shù)、結(jié)構(gòu)體的定義。即為本程序的運(yùn)行作準(zhǔn)備的函數(shù)模塊:#include <iostream>#include <string>#include <fstream>#include <iomanip>using namespace std;int a90,b90; /定義全局?jǐn)?shù)組int k=0;class CGobang /棋子類private:char chSort; /棋子的類別int nWin; /贏棋的次數(shù)int nLose; /輸棋的次數(shù)static int nDraw; /平局次數(shù)public:static char achBoa
7、rd99; /棋盤static int nSize; /棋盤的尺寸nSize*nSizeCGobang(char chsort) /構(gòu)造函數(shù),決定一方棋子的類別chSort=chsort;nWin=nLose=nDraw=0;friend void huiqi(); /悔棋static void savefile(); /將棋盤保存至文件static void readBoard(); /從文件中讀入棋盤void continute(); /接著上次的游戲玩void PlayTurn(void); /走一步棋int Judge(); /判斷是否連成五子,是那么返回1void Win(void)
8、; /贏棋void Lose(void); /輸棋static void Draw(void); /平局void PrintInfo(void); /打印總體情況static void PrintBoard(void); /輸出棋盤static int GetFull(void); /判斷棋盤是否一滿static void InitialBoard(void); /初始化棋盤;2、初始化:首先,建立盤面數(shù)組、對(duì)戰(zhàn)雙方的棋型表和并將它們清零以備使用;然后初始化顯示器、鍵盤、鼠等輸入輸出設(shè)備并在屏幕上畫出棋盤。char CGobang:achBoard99;int CGobang:nSize=0;
9、int CGobang:nDraw=0;void CGobang:Draw() /平局cout<<"nntt平局!nn"nDraw+;void CGobang:InitialBoard() /初始化棋盤for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+)achBoardij=' ' void CGobang:PrintBoard() /輸出棋盤int i,j;cout<<endl;cout<<"ttt"for(i=1;i<=nSize;i+)co
10、ut<<" "<<i;cout<<endl;for(i=0;i<nSize;i+)cout<<"ttt"cout<<i+1;for(j=0;j<nSize;j+)cout<<achBoardij<<"|"cout<<endl;int CGobang:GetFull() /判斷棋盤是否一滿,假設(shè)是返回1for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+)if(achBoardij
11、=' ')return 0;return 1;void CGobang:Win() /贏棋cout<<"nntt"<<chSort<<"方獲勝!nn"nWin+;void CGobang:savefile() /將棋盤保存至文件ofstream outfile("C+.txt",ios:out);if(!outfile)cerr<<"open file error!"<<endl;exit(1);for(int i=0;i<nSize
12、;i+)for(int j=0;j<nSize;j+) outfile.write(char *) &achBoardij,sizeof(achBoardij); outfile.close();3、盤面分析填寫棋型表:本程序核心模塊之一,人工智能算法的根本依據(jù)!其具體實(shí)現(xiàn)方法如下:您在下五子棋時(shí),一定會(huì)先根據(jù)棋盤上的情況,找出當(dāng)前最重要的一些點(diǎn)位,如“活三、“沖四等;然后再在其中選擇落子點(diǎn)。但是,電腦不會(huì)像人一樣分析問題,要讓它知道哪是“活三、哪是“沖四,就得在棋盤上逐點(diǎn)計(jì)算,一步一步的教它。 先來分析己方的棋型,我們從棋盤左上角出發(fā),向右逐行搜索,當(dāng)遇到一個(gè)空白點(diǎn)時(shí),以它為中
13、心向左挨個(gè)查找,如果遇到己方的子那么記錄然后繼續(xù),如果遇到對(duì)方的子、空白點(diǎn)或邊界就停止查找。左邊完成后再向右進(jìn)行同樣的操作;最后把左右兩邊的記錄合并起來,得到的數(shù)據(jù)就是該點(diǎn)橫向上的棋型,然后把棋型的編號(hào)填入到Computerxyn中就行了x、y代表坐標(biāo),n=0、1、2、3分別代表橫、豎、左斜、右斜四個(gè)方向。而其他三個(gè)方向的棋型也可用同樣的方法得到,當(dāng)搜索完整張棋盤后,己方棋型表也就填寫完畢了。然后再用同樣的方法填寫對(duì)方棋型表。注意:所有棋型的編號(hào)都要事先定義好,越重要的號(hào)數(shù)越大!void CGobang:Lose() /輸棋nLose+;void CGobang:PlayTurn(void)
14、/走一步棋int nRow,nCol;char choice1,choice2;docout<<"t現(xiàn)在該"<<chSort<<"方下棋,請(qǐng)輸入棋盤坐標(biāo)(x,y):"cin>>nRow>>nCol;if(nRow>nSize|nCol>nSize)cout<<"t輸入的坐標(biāo)越界,x與y的范圍應(yīng)小于等于"<<nSize<<",請(qǐng)重新輸入n"else if(nRow>0&&nCol>0
15、&&achBoardnRow-1nCol-1!=' ')cout<<"t棋盤("<<nRow<<","<<nCol<<")處已有棋子,請(qǐng)重新輸入n" else if(nRow=-1) huiqi();else if(nRow=0&&nCol=0)cout<<"t確認(rèn)你想結(jié)束游戲嗎(y,n)?"cin.get(); cin>>choice1;if(choice1='y'|
16、choice1='Y')cout<<"t是否保存(y,n)?:"cin.get();cin>>choice2;if(choice2='y'|choice2='Y')CGobang:savefile();cout<<"t保存成功,歡送下次再玩!n"exit(1);elsecout<<"t游戲結(jié)束,歡送再次使用五子棋游戲!"cout<<endl;exit(0);else achBoardnRow-1nCol-1=chSort;ak=
17、nRow-1;bk=nCol-1;k+;break;while(1);int CGobang:Judge() /判斷是否連成五子,是那么返回1int i,j;for(i=0;i<nSize;i+)for(j=0;j<nSize;j+)if(achBoardij=chSort)if(j+4<nSize)if(achBoardij+1=chSort&&achBoardij+2=chSort&&achBoardij+3=chSort&&achBoardij+4=chSort)return 1;if(i+4<nSize)if(ac
18、hBoardi+1j=chSort&&achBoardi+2j=chSort&&achBoardi+3j=chSort&&achBoardi+4j=chSort)return 1;if(i+4<nSize&&j+4<nSize)if(achBoardi+1j+1=chSort&&achBoardi+2j+2=chSort&&achBoardi+3j+3=chSort&&achBoardi+4j+4=chSort)return 1;if(i-4>0&&
19、j+4<nSize)if(achBoardi-1j+1=chSort&&achBoardi-2j+2=chSort&&achBoardi-3j+3=chSort&&achBoardi-4j+4=chSort)return 1;return 0;void CGobang:PrintInfo(void) /打印總體情況cout<<"Size"<<chSort<<"方共計(jì)贏"<<nWin<<"局,輸"<<nLose&
20、lt;<"局,平"<<nDraw<<"局。"<<endl;void CGobang:readBoard() /以二進(jìn)制形式從文件中讀出棋盤ifstream infile("C+.txt",ios:in); if(!infile)cerr<<"open file eror!"<<endl;exit(1);else for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+) infile.read(char
21、*) &achBoardij,sizeof(achBoardij);infile.close();void huiqi() /悔棋 k-;CGobang:achBoardakbk=' 'k-;CGobang:achBoardakbk=' 'CGobang:PrintBoard();void PrintRule(void) /打印游戲規(guī)那么cout<<"t_nn"cout<<"tt 歡送使用五子連珠游戲!"<<endl<<endl; cout<<"
22、t-nn" cout<<"t游戲規(guī)那么:"<<endl; cout<<"t1.每1步輸入要下棋子的格子的x,y坐標(biāo),按Enter鍵n" cout<<"t2.有1方首先5個(gè)棋子連成一線即判獲勝n" cout<<"t3.當(dāng)旗子布滿棋盤但仍無獲勝方即為平局n" cout<<"t4.一局結(jié)束后,假設(shè)想繼續(xù)按Y鍵,假設(shè)退出那么按其他鍵n" cout<<"t5.假設(shè)想中途退出游戲,請(qǐng)輸入(0,0),再按照
23、提示保存游戲n" cout<<"t6.悔棋請(qǐng)輸入(-1,0)n" cout<<"nntt請(qǐng)按任意鍵開始下棋!nn"int JudgePlay(CGobang &SideX,CGobang &SideO) /每下一步要進(jìn)行輸贏判斷,有贏的那么返回1 if(SideX.Judge() /X方獲勝SideX.Win();SideO.Lose();return 1;else if(SideO.Judge() /O方獲勝SideO.Win();SideX.Lose();return 1;elsereturn 0;v
24、oid Play(CGobang &SideX,CGobang &SideO) /開始一局游戲while(1)system("cls"); cout<<"t*n" cout<<"tt.悔棋請(qǐng)輸入(-1,0)n" cout<<"tt.中途退出請(qǐng)輸出(0,0),并根據(jù)提示保存n" cout<<"t*n"CGobang:PrintBoard(); /輸出棋盤SideX.PlayTurn(); /X方下棋if(JudgePlay(SideX
25、,SideO) /判斷輸贏 break;if(CGobang:GetFull() /判斷是否平局CGobang:Draw();break;system("cls"); /清屏cout<<"t*n"cout<<"tt.悔棋請(qǐng)輸入(-1,0)n"cout<<"tt.中途退出請(qǐng)輸出(0,0),并根據(jù)提示保存n"cout<<"t*n"CGobang:PrintBoard(); /輸出棋盤SideO.PlayTurn(); /O方下棋if(JudgePlay
26、(SideX,SideO) /判斷輸贏break;if(CGobang:GetFull() /判斷是否平局CGobang:Draw();break;void continute() /接著上次的游戲玩 char str; cin.get();cout<<"t你是否接著玩上一次的游戲(y/n)?:"cin>>str;if(str='Y'|str='y')CGobang:readBoard();else cout<<"t請(qǐng)玩新游戲n"4、環(huán)控制模塊:控制下棋順序,當(dāng)輪到某方下子時(shí),負(fù)責(zé)將程序
27、轉(zhuǎn)到相應(yīng)的模塊中去,主要擔(dān)當(dāng)一個(gè)調(diào)度者的角色。int main(void) CGobang SideX('X'),SideO('O'); /定義兩個(gè)旗子類對(duì)象,分別代表X方與O方system("cls");PrintRule();cin.get();string strChoice;docout<<"請(qǐng)選擇棋盤大小(59):"cin>>CGobang:nSize;cout<<endl;if(CGobang:nSize>9|CGobang:nSize<5)cout<<"請(qǐng)重新輸入:"cin>>CGobang:nSize;cout<<end
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 石大學(xué)前兒童保育學(xué)課外必讀:中國(guó)居民膳食營(yíng)養(yǎng)素參考攝入量表(DRIS)
- 2025年三年級(jí)寓言故事閱讀試題
- SnO2-鈦中空纖維電催化膜的制備及水處理性能研究
- 飲料行業(yè)客戶細(xì)分與個(gè)性化服務(wù)策略-洞察闡釋
- 專精特新小巨人企業(yè)的定義與行業(yè)定位
- 綠色園區(qū)的能源管理與低碳減排策略
- 建立產(chǎn)業(yè)協(xié)同機(jī)制促進(jìn)跨界融合
- 新文科背景下傳統(tǒng)文化類課程建設(shè)與實(shí)踐
- 第七章運(yùn)動(dòng)和力教學(xué)設(shè)計(jì)
- 高中美術(shù)跨學(xué)科教學(xué)的現(xiàn)狀與發(fā)展趨勢(shì)
- 醫(yī)療器械隨貨同行單模版
- 康復(fù)科實(shí)習(xí)生入科教育
- GB∕T 17466.1-2019 家用和類似用途固定式電氣裝置的電器附件安裝盒和外殼 第1部分:通用要求
- 青島市 主要片區(qū) 項(xiàng)目 拆遷補(bǔ)償方案 鏈接
- Q∕GDW 11612.2-2018 低壓電力線高速載波通信互聯(lián)互通技術(shù)規(guī)范 第2部分:技術(shù)要求
- 《國(guó)際貿(mào)易實(shí)務(wù)》全書電子教案完整版教學(xué)設(shè)計(jì)
- JTT888-2020公共汽車類型劃分及等級(jí)評(píng)定_(高清-最新)
- DR曝光參考條件
- 房地產(chǎn)營(yíng)銷策略外文翻譯文獻(xiàn)
- 辦公室面積整改方案
- 組織學(xué)與胚胎學(xué)實(shí)驗(yàn):循環(huán)系統(tǒng)組胚實(shí)驗(yàn)
評(píng)論
0/150
提交評(píng)論