版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、山東凱文科技職業(yè)學(xué)院PAGE 山東凱文科技職業(yè)學(xué)院2011屆畢業(yè)論文基于Visual C+的五子棋游戲設(shè)計主要算法的設(shè)計與實現(xiàn)學(xué) 院: 信息學(xué)院 學(xué)生姓名: XXX 指導(dǎo)教師: 張老師 專 業(yè): 軟件技術(shù) 班 級: 08軟件1班 完成時間: 2011年6月29日 摘 要本論文主要闡述以面向?qū)ο蟮某绦蜷_發(fā)語言VC+為開發(fā)工具,設(shè)計一個五子棋游戲。本系統(tǒng)是個小型游戲,可以單機使用,也可以網(wǎng)絡(luò)兩個人游戲,也可以和電腦進行游戲。論文首先介紹了開發(fā)背景及開發(fā)語言的介紹。然后介紹設(shè)計該游戲的框架結(jié)構(gòu),然后介紹了程序的設(shè)計過程,以及程序的相關(guān)算法。其中算法是我主要負責(zé)的,算法(Algorithm)是一系列解
2、決問題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問題的策略機制。也就是說,能夠?qū)σ欢ㄒ?guī)范的輸入,在有限時間內(nèi)獲得所要求的輸出。如果一個算法有缺陷,或不適合于某個問題,執(zhí)行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務(wù)。關(guān)鍵詞:游戲,系統(tǒng),圖片,算法, Visual C+ Abstract This paper mainly expounds on object-oriented programming language for development tools, design of vc + + a renju game. This system is a
3、 small game, can use single, also can network two game, can also and computer games. It firstly introduces the development background and development of language is introduced. And then introduced the design frame structure of the game, then introduces the design process of the program, and the rela
4、ted algorithm procedures. Among them is I mainly responsible for the Algorithm, the Algorithm (done) is a series of the solution to the problem of clear instructions, the Algorithm represents a systematic approach describe the solving strategy mechanism. That is, to some of the standard input, in li
5、mited time get required output. If an algorithm with a defect, or is not suitable for a problem is, carry out the algorithm will not solve the problem. Different algorithm may use different time, space or efficiency to complete the same task. Keywords: The game, the system, pictures,algorithm, Visua
6、l C + + 目 錄 TOC o 1-3 h z u HYPERLINK l _Toc296063835 1引言 PAGEREF _Toc296063835 h 1 HYPERLINK l _Toc296063836 1.1五子棋介紹 PAGEREF _Toc296063836 h 1 HYPERLINK l _Toc296063837 1.2開發(fā)背景 PAGEREF _Toc296063837 h 1 HYPERLINK l _Toc296063838 1.3開發(fā)環(huán)境及運行環(huán)境 PAGEREF _Toc296063838 h 1 HYPERLINK l _Toc296063839 1.3.
7、1開發(fā)環(huán)境 PAGEREF _Toc296063839 h 1 HYPERLINK l _Toc296063840 1.3.2運行環(huán)境 PAGEREF _Toc296063840 h 1 HYPERLINK l _Toc296063841 2 C+簡介 PAGEREF _Toc296063841 h 2 HYPERLINK l _Toc296063842 3軟件架構(gòu) PAGEREF _Toc296063842 h 2 HYPERLINK l _Toc296063843 3.1棋盤類 PAGEREF _Toc296063843 h 3 HYPERLINK l _Toc296063844 3.2游
8、戲模式類 PAGEREF _Toc296063844 h 3 HYPERLINK l _Toc296063845 4主要算法 PAGEREF _Toc296063845 h 4 HYPERLINK l _Toc296063846 4.1判斷勝負 PAGEREF _Toc296063846 h 4 HYPERLINK l _Toc296063847 4.2人機對弈算法 PAGEREF _Toc296063847 h 6 HYPERLINK l _Toc296063848 4.2.1獲勝組合 PAGEREF _Toc296063848 h 6 HYPERLINK l _Toc296063849 4
9、.2.2落子后處理 PAGEREF _Toc296063849 h 7 HYPERLINK l _Toc296063850 4.2.3查找棋盤空位 PAGEREF _Toc296063850 h 7 HYPERLINK l _Toc296063851 4.2.4落子打分 PAGEREF _Toc296063851 h 8 HYPERLINK l _Toc296063852 4.2.5防守策略 PAGEREF _Toc296063852 h 10 HYPERLINK l _Toc296063853 4.2.6選取最佳落子 PAGEREF _Toc296063853 h 11 HYPERLINK
10、l _Toc296063854 4.2.7統(tǒng)計數(shù)據(jù) PAGEREF _Toc296063854 h 11 HYPERLINK l _Toc296063855 5幾點補充說明 PAGEREF _Toc296063855 h 15 HYPERLINK l _Toc296063856 6心得體會 PAGEREF _Toc296063856 h 15 HYPERLINK l _Toc296063857 參考文獻 PAGEREF _Toc296063857 h 16 HYPERLINK l _Toc296063858 致謝 PAGEREF _Toc296063858 h 16PAGE 251引言1.1五
11、子棋介紹五子棋是起源于中國古代的傳統(tǒng)黑白棋種之一。現(xiàn)代五子棋日文稱之為“連珠”,英譯為“Renju”,英文稱之為“Gobang”或“FIR”(Five in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問“陰陽易理”;它既有簡單易學(xué)的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點”的連接。它是中西文化的交流點,是古今哲理
12、的結(jié)晶。1.2開發(fā)背景當前網(wǎng)絡(luò)上流傳的五子棋游戲功能并不盡善盡美,其中最主要的問題就是人機對戰(zhàn)和網(wǎng)絡(luò)對戰(zhàn)不能夠一起實現(xiàn),所以我決定開發(fā)1一個既能夠人機對戰(zhàn),又能夠進行網(wǎng)絡(luò)對戰(zhàn)的五子棋系統(tǒng)。1.3開發(fā)環(huán)境及運行環(huán)境1.3.1開發(fā)環(huán)境Intel Pentium Y450,2G內(nèi)存,320G硬盤Microsoft Windows XP ProfessionalMicrosoft Visual C+ 6.0Microsoft Developer Network for Visual Studio.NET 2003Visual Assist X 10.1.1301.01.3.2運行環(huán)境Intel Pen
13、tium 2及以上處理器,32M以上內(nèi)存,4G以上硬盤Microsoft Windows 9X/NT操作系統(tǒng)800*600或以上的屏幕分辨率2 C+簡介語言之所以要起名為“C”,是因為它是主要參考那個時候的一門叫B的語言,它的設(shè)計者認為C語言是B語言的進步,所以就起名為C語言;但是B語言并不是因為之前還有個A語言,而是B語言的作者為了紀念他的妻子,他的妻子名字的第一個字母是B; 當C語言發(fā)展到頂峰的時刻,出現(xiàn)了一個版本叫C with Class,那就是C+最早的版本,在C語言中增加class關(guān)鍵字和類,那個時候有很多版本的C都希望在C語言中增加類的概念;后來C標準委員會決定為這個版本的C起個新
14、的名字,那個時候征集了很多種名字,最后采納了其中一個人的意見,以C語言中的+運算符來體現(xiàn)它是C語言的進步,故而叫C+,成立了C+標準委員會。C+是一種語言,僅僅是它的語法、特性、標準類庫就已經(jīng)是一門非常高深的課程,C+設(shè)計成靜態(tài)類型、和C同樣高效且可移植的多用途程序設(shè)計語言。設(shè)計成直接的和廣泛的支援多種程序設(shè)計風(fēng)格(程序化程序設(shè)計、資料抽象化、面向?qū)ο蟪绦蛟O(shè)計、泛型程序設(shè)計)。設(shè)計成給程序設(shè)計者更多的選擇,即使可能導(dǎo)致程序設(shè)計者選擇錯誤。設(shè)計成盡可能與C兼容,籍此提供一個從C到C+的平滑過渡。避免平臺限定或沒有普遍用途的特性。不使用會帶來額外開銷的特性。設(shè)計成無需復(fù)雜的程序設(shè)計環(huán)境。C+標準演
15、變了許多年。C+模板是近幾年來對此語言的一種擴展,模板是根據(jù)類型參數(shù)來產(chǎn)生函數(shù)和類的機制,有時也稱模板為“參數(shù)化的類型”。使用模板,可以設(shè)計一個對許多類型的數(shù)據(jù)進行操作的類,而不需要為每個類型的數(shù)據(jù)建立一個單獨的類。標準模板庫(Standard Tempalte Library,STL )和微軟的活動模板庫(Active Tempalte Library,ATL )都基于這個C+語言擴展。C+標準可分為兩部分, C+語言本身和C+標準庫。C+標準庫對于Visual C+是相當新的,實際上微軟只是在發(fā)布Visual C+ 5.0時去除了一些“bug”。標準庫提供了標準的輸入/輸出、字符串、容器(
16、如矢量、列表和映射等)、非數(shù)值運算(如排序、搜索和合并等)和對數(shù)值計算的支持。應(yīng)該說, C/C+包含了相對少的關(guān)鍵字,而且很多最有用的函數(shù)都來源于庫,C+標準庫實現(xiàn)容器和算法的部分就是STL。 STL是數(shù)據(jù)結(jié)構(gòu)和算法的一個框架,數(shù)據(jù)結(jié)構(gòu)包括矢量、列表和映射等,算法包括這些數(shù)據(jù)結(jié)構(gòu)的查找、拷貝和排序等。1994年7月,ANSI/ISO C+標準委員會投票決定接受STL為C+標準庫的一部分,這個建議是根據(jù)Alex Stepanov、Meng Lee和David Musser這三人的編程和軟件庫研究提出的。STL的產(chǎn)生是為了滿足通用性的設(shè)計目標,而不是為了提高性能。3軟件架構(gòu)軟件的總體架構(gòu)如圖3.1
17、:二人游戲類一人游戲類 游戲類指針棋盤類主界面用戶圖3.1 軟件架構(gòu)考慮到整個的下棋過程(無論對方是電腦抑或其他網(wǎng)絡(luò)玩家)可以分為:己方落子、等待對方落子、對方落子、設(shè)置己方棋盤數(shù)據(jù)這一系列過程,因此一人游戲類、二人游戲類和棋盤類之間的關(guān)系參考了AbstractFactory(抽象工廠)模式,以實現(xiàn)對兩個不同模塊進行一般化的控制。23.1棋盤類整個架構(gòu)的核心部分,類名為CTable。封裝了棋盤的各種可能用到的功能3,如保存棋盤數(shù)據(jù)、初始化、判斷勝負等。用戶操作主界面,主界面與CTable進行交互來完成對游戲的操作。3.2游戲模式類用來管理人機對弈/網(wǎng)絡(luò)對弈兩種游戲模式,類名為CGame。CGa
18、me是一個抽象類,經(jīng)由它派生出一人游戲類COneGame和網(wǎng)絡(luò)游戲類CTwoGame,如圖3.2:抽象類CGameCOneGameCTwoGame 圖3.2 CGame類派生關(guān)系這樣,CTable類就可以通過一個CGame類的指針4,在游戲初始化的時候根據(jù)具體游戲模式的要求實例化COneGame或CTwoGame類的對象;然后利用多態(tài)性5,使用CGame類提供的公有接口就可以完成不同游戲模式下的不同功能了。4主要算法五子棋游戲中,有相當?shù)钠撬惴ǖ牟糠帧o論是人機對弈,還是網(wǎng)絡(luò)對弈,都需要合理算法的支持,本節(jié)中將詳細介紹五子棋中使用的算法。134.1判斷勝負五子棋的勝負,在于判斷棋盤上是否有
19、一個點,從這個點開始的右、下、右下、左下四個方向是否有連續(xù)的五個同色棋子出現(xiàn),如圖4.1:圖4.1 判斷勝負方向這個算法也就是CTable的Win成員函數(shù)。從設(shè)計的思想上,需要它接受一個棋子顏色的參數(shù),然后返回一個布爾值,這個值來指示是否勝利,代碼如下:BOOL CTable:Win( int color ) const int x, y; / 判斷橫向 for ( y = 0; y 15; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy &color = m_datax + 1y & color = m_datax + 2y &color
20、 = m_datax + 3y & color = m_datax + 4y ) return TRUE; / 判斷縱向 for ( y = 0; y 11; y+ ) for ( x = 0; x 15; x+ ) if ( color = m_dataxy &color = m_dataxy + 1 & color = m_dataxy + 2 &color = m_dataxy + 3 & color = m_dataxy + 4 ) return TRUE; / 判斷“”方向 for ( y = 0; y 11; y+ ) for ( x = 0; x 11; x+ ) if ( co
21、lor = m_dataxy &color = m_datax + 1y + 1 & color = m_datax + 2y + 2 &color = m_datax + 3y + 3 & color = m_datax + 4y + 4 ) return TRUE; / 判斷“/”方向 for ( y = 0; y 11; y+ ) for ( x = 4; x 15; x+ ) if ( color = m_dataxy &color = m_datax - 1y + 1 & color = m_datax - 2y + 2 &color = m_datax - 3y + 3 & col
22、or = m_datax - 4y + 4 ) return TRUE; / 不滿足勝利條件 return FALSE;需要說明的一點是,由于這個算法所遵循的搜索順序是從左到右、自上而下,因此在每次循環(huán)的時候,都有一些坐標無需納入考慮范圍。例如對于橫向判斷而言,由于右邊界所限,因而所有橫坐標大于等于11的點,都構(gòu)不成達到五子連的條件,所以橫坐標的循環(huán)上界也就定為11,這樣也就提高了搜索的速度。4.2人機對弈算法人機對弈算法完全按照CGame基類定義的接口標準,封裝在了COneGame派生類之中。下面將對這個算法進行詳細地介紹。144.2.1獲勝組合獲勝組合是一個三維數(shù)組,它記錄了所有取勝的情況
23、。也就是說,參考于CTable:Win中的情況,對于每一個落子坐標,獲勝的組合一共有15 * 11 * 2 + 11 * 11 * 2 = 572種。而對于每個坐標的獲勝組合,應(yīng)該設(shè)置一個1515572大小的三維數(shù)組。在擁有了這些獲勝組合之后,就可以參照每個坐標的572種組合給自己的局面和玩家的局面進行打分,也就是根據(jù)當前盤面中某一方所擁有的獲勝組合多少進行權(quán)值的估算,給出最有利于自己的一步落子坐標。由于是雙方對弈,所以游戲的雙方都需要一份獲勝組合,也就是:bool m_Computer1515572; / 電腦獲勝組合bool m_Player1515572; / 玩家獲勝組合在每次游戲初始
24、化(COneGame:Init)的時候,需要將每個坐標下可能的獲勝組合都置為true。此外,還需要設(shè)置計算機和玩家在各個獲勝組合中所填入的棋子數(shù):int m_Win2572;在初始化的時候,將每個棋子數(shù)置為0。4.2.2落子后處理每當一方落子后,都需要作如下處理:如果己方此坐標的獲勝組合仍為true,且仍有可能在此獲勝組合處添加棋子,則將此獲勝組合添加棋子數(shù)加1;如果對方此坐標的獲勝組合仍為true,則將對方此坐標的獲勝組合置為false,并將對方此獲勝組合添加棋子數(shù)置為-1(不可能靠此組合獲勝)。以玩家落子為例,代碼為:for ( i = 0; i 572; i+ ) / 修改狀態(tài)變化 if
25、 ( m_PlayerstepPut.xstepPut.yi &m_Win0i != -1 ) m_Win0i+; if ( m_ComputerstepPut.xstepPut.yi ) m_ComputerstepPut.xstepPut.yi = false; m_Win1i = -1; 4.2.3查找棋盤空位在計算機落子之前,需要查找棋盤的空位,所以需要一個SearchBlank成員函數(shù)完成此項工作,此函數(shù)需要進行不重復(fù)的查找,也就是說,對已查找過的空位進行標記,并返回找到空位的坐標,其代碼如下:bool COneGame:SearchBlank( int &i, int &j,int
26、 nowTable15 ) int x, y; for ( x = 0; x 15; x+ ) for ( y = 0; y 15; y+ ) if ( nowTablexy = -1 & nowTablexy != 2 ) i = x; j = y; return true; return false;4.2.4落子打分找到空位后,需要對這個點的落子進行打分,這個分數(shù)也就是這個坐標重要性的體現(xiàn),代碼如下:int COneGame:GiveScore( const STEP& stepPut ) int i, nScore = 0; for ( i = 0; i GetColor() = st
27、epPut.color ) / 玩家下 if ( m_PlayerstepPut.xstepPut.yi ) switch ( m_Win0i ) case 1: nScore -= 5; break; case 2: nScore -= 50; break; case 3: nScore -= 500; break; case 4: nScore -= 5000; break; default: break; else / 計算機下 if ( m_ComputerstepPut.xstepPut.yi ) switch ( m_Win1i ) case 1: nScore += 5; bre
28、ak; case 2: nScore += 50; break; case 3: nScore += 100; break; case 4: nScore += 10000; break; default: break; return nScore;如代碼所示,考慮到攻守兩方面的需要,所以將玩家落子給的分數(shù)置為負值。4.2.5防守策略落子的考慮不單單要從進攻考慮,還要從防守考慮。這一細節(jié)的實現(xiàn)其實就是讓計算機從玩家棋盤布局分析戰(zhàn)況,然后找出對玩家最有利的落子位置。整個過程如下:for ( m = 0; m GetColor(); step.x = i; step.y = j; ptemp =
29、GiveScore( step ); if ( pscore ptemp ) / 此時為玩家下子,運用極小極大法時應(yīng)選取最小值 pscore = ptemp;for ( m = 0; m cscore ) cscore = ctemp + pscore; bestx = pi; besty = pj;在這之后,重新改變一下棋盤的狀態(tài)(4.2.2)即可。4.2.7統(tǒng)計數(shù)據(jù) 在對戰(zhàn)結(jié)束的時候我們可以查詢一下我們的勝率和一些別的戰(zhàn)斗情況。代碼如下:CStatDlg:CStatDlg(CWnd* pParent /*=NULL*/): CDialog(CStatDlg:IDD, pParent)/AF
30、X_DATA_INIT(CStatDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INITvoid CStatDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CStatDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CStatDlg, CDialog)/AF
31、X_MSG_MAP(CStatDlg)ON_BN_CLICKED(IDC_BTN_RESET, OnBtnReset)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CStatDlg message handlersBOOL CStatDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization here / 讀取姓名 CTable *pTable = (CTable *)GetParent()-GetDlgItem( IDC_TABLE ); SetDlgItemText( IDC_ST_N
32、AME, pTable-m_strMe ); ShowStat();return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSEvoid CStatDlg:OnOK() / TODO: Add extra validation here CFiveApp *pApp = (CFiveApp *)AfxGetApp(); / 寫入戰(zhàn)績統(tǒng)計 TCHAR str10; wsprintf( str, _T(%d), pApp-m_n
33、Win ); :WritePrivateProfileString( _T(Stats), _T(Win), str, pApp-m_szIni ); wsprintf( str, _T(%d), pApp-m_nDraw ); :WritePrivateProfileString( _T(Stats), _T(Draw), str, pApp-m_szIni ); wsprintf( str, _T(%d), pApp-m_nLost ); :WritePrivateProfileString( _T(Stats), _T(Lost), str, pApp-m_szIni );CDialog
34、:OnOK();void CStatDlg:OnBtnReset() / TODO: Add your control notification handler code here CFiveApp *pApp = (CFiveApp *)AfxGetApp(); pApp-m_nWin = 0; pApp-m_nDraw = 0; pApp-m_nLost = 0; ShowStat();void CStatDlg:ShowStat() CFiveApp *pApp = (CFiveApp *)AfxGetApp(); CString str; str.Format( _T(%d), pAp
35、p-m_nWin ); SetDlgItemText( IDC_ST_WIN, str ); str.Format( _T(%d), pApp-m_nDraw ); SetDlgItemText( IDC_ST_DRAW, str ); str.Format( _T(%d), pApp-m_nLost ); SetDlgItemText( IDC_ST_LOST, str ); / 計算勝率 if ( 0 = pApp-m_nWin ) str = _T(勝率:0%); else str.Format( _T(勝率:%d%), pApp-m_nWin * 100 / ( pApp-m_nWin
36、 + pApp-m_nDraw + pApp-m_nLost ) ); SetDlgItemText( IDC_ST_PERCENT, str );代碼執(zhí)行后的效果圖如下:圖4.2 效果圖5幾點補充說明考慮到程序的響應(yīng)速度,人機對弈算法只對玩家的棋子進行了一步的推測。由于計算機在落子時選取的是得分最高的一步落子,所以如果玩家在開局的時候不改變落子步驟,那么將會獲得從頭至尾相同的棋局??紤]到下棋同時還要聊天,所以并未對落子時間加入任何限制,同樣如果玩家離開游戲也不會判負。對于人機對弈的悔棋處理,由于這個算法的開銷相當大,每一步落子都會存在不同的棋盤布局,所以實現(xiàn)從頭到尾的悔棋不是很現(xiàn)實(將會存在
37、過多的空間保存棋盤布局),因而在人機對弈模式下,只允許玩家悔最近的兩步落子。6心得體會經(jīng)過這段時間的緊張忙碌,這次的畢業(yè)設(shè)計已制作了一個較完整的五子棋游戲,從各方面來講,都有比較大的收獲,同時也大大提高了實際操作的能力,當然,期間遇到的困難也是層出不窮。由于對游戲的概念比較模糊,在前期的編程設(shè)計過程中腦海中僅僅有一個框架,而很多卻細節(jié)沒有考慮到,結(jié)果一度走入一邊編程,一邊改模版的尷尬境地,進度緩慢,思路不清。后來,在艱難進展的過程中漸漸領(lǐng)悟到了一些編程的方法和系統(tǒng)設(shè)計的思想,所謂眼過千遍不如手過一遍,在自己實際操作中暴露出來的問題自己的體會最深刻,也就更有想法去克服他。在困境中摸索,總結(jié),轉(zhuǎn)變
38、思路,繼續(xù)前進,這是對我制作本游戲過程的一個概括。在不斷的學(xué)習(xí)與改進中我體會到:1.做畢業(yè)設(shè)計本身也是一個學(xué)習(xí)新鮮事物的過程,從設(shè)計初的不懂到最后順利完成設(shè)計,我體會到在實踐中學(xué)習(xí)的重要性,我想這對于我以后的工作受益匪淺。2.設(shè)計的過程是漫長而困難重重的,設(shè)計過程中需要理論與實際的結(jié)合,這就要求有扎實的理論知識,靈活的頭腦,我本身所做的設(shè)計并不算十分復(fù)雜,但由于以前沒有獨立做過系統(tǒng)所以剛開始時有點亂,好在有老師的幫助,我很快理清了思路,找到了自己的出發(fā)點。3.由于前期工作的不徹底,對系統(tǒng)的需求分析的要求認識不夠清楚,使得后續(xù)的工作不得不經(jīng)常返回去修改個別代碼。使我體會到在設(shè)計中的每一步的重要性
39、,如果上一個步驟不能很好的完成,在后續(xù)的設(shè)計將會付出幾倍的代價??傊?,經(jīng)過這么長時間的設(shè)計,我與我的同學(xué)完成了這個一個功能比較完善的五子棋游戲。我深刻體會到要做好一個完整的事情,需要有系統(tǒng)的思維方式和方法,還要有一個團隊合作的精神。對待一個新的問題,要耐心、要細心,也要有很好的團結(jié),共同努力的團隊協(xié)作精神。參考文獻MSDN for Visual Studio 6.0設(shè)計模式可復(fù)用面向?qū)ο筌浖幕A(chǔ),Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides著,李英軍/馬曉星/蔡敏/劉建中 等譯,機械工業(yè)出版社深入淺出MFC(第2版),侯俊杰著,華
40、中科技大學(xué)出版社Microsoft Visual C+.NET 技術(shù)內(nèi)幕(第6版),George Shepherd/David Kruglinski著,潘愛民譯,清華大學(xué)出版社Visual C+網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實現(xiàn),汪曉平/鐘軍 等編著,人民郵電出版社C+編程思想,Bruce Eckel著,劉宗田/邢大紅/孫慧杰 等譯,機械工業(yè)出版社21天學(xué)通C+,Jesse Liberty著,康博創(chuàng)作室譯,人民郵電出版社C+標準程序庫,Nicolai M.Josuttis著,侯捷/孟巖 譯,華中科技大學(xué)出版社Windows程序設(shè)計,Charles Petzold著,北京博彥科技發(fā)展有限公司譯,北京大學(xué)
41、出版社Visual C+.NET網(wǎng)絡(luò)編程,易君 編著,中國鐵道出版社五子棋的核心算法,蟈蟈俊.net/ghj/articles/12727.aspx致謝本設(shè)計的完成是在我們的導(dǎo)師張老師的細心指導(dǎo)下進行的。在每次設(shè)計遇到問題時老師不辭辛苦的講解才使得我的設(shè)計順利的進行。從設(shè)計的選題到資料的搜集直至最后設(shè)計的修改的整個過程中,花費了張老師很多的寶貴時間和精力,在此向?qū)煴硎局孕牡馗兄x!導(dǎo)師嚴謹?shù)闹螌W(xué)態(tài)度,開拓進取的精神和高度的責(zé)任心都將使學(xué)生受益終生!附錄資料:不需要的可以自行刪除Abstract: Based on the comprehensive analysis on the plasti
42、c parts structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of internal side core pulling was des
43、igned, the working process of the mould was introducedC語言詳解 - 枚舉類型注:以下全部代碼的執(zhí)行環(huán)境為VC+ 6.0在程序中,可能需要為某些整數(shù)定義一個別名,我們可以利用預(yù)處理指令#define來完成這項工作,您的代碼可能是:#define MON 1#define TUE 2#define WED 3#define THU 4#define FRI 5#define SAT 6#define SUN 7在此,我們定義一種新的數(shù)據(jù)類型,希望它能完成同樣的工作。這種新的數(shù)據(jù)類型叫枚舉型。1. 定義一種新的數(shù)據(jù)類型 - 枚舉型 以下代碼定義
44、了這種新的數(shù)據(jù)類型 - 枚舉型enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;(1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號,隔開。(2) DAY是一個標識符,可以看成這個集合的名字,是一個可選項,即是可有可無的項。(3) 第一個枚舉成員的默認值為整型的0,后續(xù)枚舉成員的值在前一個成員上加1。(4) 可以人為設(shè)定枚舉成員的值,從而自定義某個范圍內(nèi)的整數(shù)。(5) 枚舉型是預(yù)處理指令#define的替代。(6) 類型定義以分號;結(jié)束。2. 使用枚舉類型對變量進行聲明新的數(shù)據(jù)類型定義完成后,它就可以使用了。我們已經(jīng)見過
45、最基本的數(shù)據(jù)類型,如:整型int, 單精度浮點型float, 雙精度浮點型double, 字符型char, 短整型short等等。用這些基本數(shù)據(jù)類型聲明變量通常是這樣:char a; /變量a的類型均為字符型charchar letter;int x, y, z; /變量x,y和z的類型均為整型intint number;double m, n;double result; /變量result的類型為雙精度浮點型double既然枚舉也是一種數(shù)據(jù)類型,那么它和基本數(shù)據(jù)類型一樣也可以對變量進行聲明。方法一:枚舉類型的定義和變量的聲明分開enum DAY MON=1, TUE, WED, THU,
46、FRI, SAT, SUN;enum DAY yesterday;enum DAY today;enum DAY tomorrow; /變量tomorrow的類型為枚舉型enum DAYenum DAY good_day, bad_day; /變量good_day和bad_day的類型均為枚舉型enum DAY方法二:類型定義與變量聲明同時進行:enum /跟第一個定義不同的是,此處的標號DAY省略,這是允許的。 saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /變量workday的類型為枚
47、舉型enum DAYenum week Mon=1, Tue, Wed, Thu, Fri Sat, Sun days; /變量days的類型為枚舉型enum weekenum BOOLEAN false, true end_flag, match_flag; /定義枚舉類型并聲明了兩個枚舉型變量方法三:用typedef關(guān)鍵字將枚舉類型定義成別名,并利用該別名進行變量聲明:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /此處的workday為枚舉型
48、enum workday的別名workday today, tomorrow; /變量today和tomorrow的類型為枚舉型workday,也即enum workdayenum workday中的workday可以省略:typedef enum saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /此處的workday為枚舉型enum workday的別名workday today, tomorrow; /變量today和tomorrow的類型為枚舉型workday,也即enum workd
49、ay也可以用這種方式:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday;workday today, tomorrow; /變量today和tomorrow的類型為枚舉型workday,也即enum workday注意:同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量。錯誤示例如下所示:錯誤聲明一:存在同名的枚舉類型typedef enum wednesday, thursday, friday workday;typedef enum WE
50、EK saturday, sunday = 0, monday, workday; 錯誤聲明二:存在同名的枚舉成員typedef enum wednesday, thursday, friday workday_1;typedef enum WEEK wednesday, sunday = 0, monday, workday_2;3. 使用枚舉類型的變量3.1 對枚舉型的變量賦值。實例將枚舉類型的賦值與基本數(shù)據(jù)類型的賦值進行了對比:方法一:先聲明變量,再對變量賦值#include/* 定義枚舉類型 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN
51、;void main() /* 使用基本數(shù)據(jù)類型聲明變量,然后對變量賦值 */ int x, y, z; x = 10; y = 20; z = 30; /* 使用枚舉類型聲明變量,再對枚舉型變量賦值 */ enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf(%d %d %d n, yesterday, today, tomorrow);方法二:聲明變量的同時賦初值#include /* 定義枚舉類型 */enum DAY MON=1, TUE, WED, THU,
52、FRI, SAT, SUN ;void main() /* 使用基本數(shù)據(jù)類型聲明變量同時對變量賦初值 */ int x=10, y=20, z=30; /* 使用枚舉類型聲明變量同時對枚舉型變量賦初值 */ enum DAY yesterday = MON, today = TUE, tomorrow = WED; printf(%d %d %d n, yesterday, today, tomorrow);方法三:定義類型的同時聲明變量,然后對變量賦值。#include /* 定義枚舉類型,同時聲明該類型的三個變量,它們都為全局變量 */enum DAY MON=1, TUE, WED, T
53、HU, FRI, SAT, SUN yesterday, today, tomorrow;/* 定義三個具有基本數(shù)據(jù)類型的變量,它們都為全局變量 */int x, y, z;void main() /* 對基本數(shù)據(jù)類型的變量賦值 */ x = 10; y = 20; z = 30; /* 對枚舉型的變量賦值 */ yesterday = MON; today = TUE; tomorrow = WED; printf(%d %d %d n, x, y, z); /輸出:10 20 30 printf(%d %d %d n, yesterday, today, tomorrow); /輸出:1
54、2 3方法四:類型定義,變量聲明,賦初值同時進行。#include /* 定義枚舉類型,同時聲明該類型的三個變量,并賦初值。它們都為全局變量 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday = MON, today = TUE, tomorrow = WED;/* 定義三個具有基本數(shù)據(jù)類型的變量,并賦初值。它們都為全局變量 */int x = 10, y = 20, z = 30;void main() printf(%d %d %d n, x, y, z); /輸出:10 20 30 printf(%d %d %d n, ye
55、sterday, today, tomorrow); /輸出:1 2 33.2 對枚舉型的變量賦整數(shù)值時,需要進行類型轉(zhuǎn)換。#include enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() enum DAY yesterday, today, tomorrow; yesterday = TUE; today = (enum DAY) (yesterday + 1); /類型轉(zhuǎn)換 tomorrow = (enum DAY) 30; /類型轉(zhuǎn)換 /tomorrow = 3; /錯誤 printf(%d %d %d n, yesterday, today, tomorrow); /輸出:2 3 303.3 使用枚舉型變量#includeenum BELL = a, BACKSPACE = b, HTAB = t, RETURN = r, NEWLINE = n, VTAB = v, SPACE = ;enum
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆河北省唐山市唐山第一中學(xué)高二物理第一學(xué)期期中統(tǒng)考模擬試題含解析
- 北京海淀外國語2025屆高三物理第一學(xué)期期末經(jīng)典試題含解析
- 2025屆云南省紅河州云南市蒙自一中高三物理第一學(xué)期期中達標檢測模擬試題含解析
- 江蘇省南京師大蘇州實驗學(xué)校2025屆高二物理第一學(xué)期期末達標檢測試題含解析
- 2025屆云南省曲靖市宣威三中物理高三上期中統(tǒng)考試題含解析
- 2025屆上海市閘北區(qū)高一物理第一學(xué)期期末統(tǒng)考試題含解析
- 黑龍江齊齊哈爾市(2024年-2025年小學(xué)五年級語文)人教版開學(xué)考試(下學(xué)期)試卷及答案
- 情境二汽車玻璃裝飾課件
- 2024裝載機租聘合同范本
- 2024物業(yè)管理合同范本
- 2024-2030年狂犬疫苗行業(yè)市場深度分析及發(fā)展策略研究報告
- 《基因指導(dǎo)蛋白質(zhì)的合成》(第 1課時)教學(xué)設(shè)計
- 2024-2030年果蔬行業(yè)市場發(fā)展現(xiàn)狀及競爭格局與投資戰(zhàn)略研究報告
- 2 0 2 4 年 7 月 國開??啤斗ɡ韺W(xué)》期末紙質(zhì)考試 試題及答案
- 大疆在線測評題答案
- 公共政策分析第一章
- 行業(yè)協(xié)會重大活動備案報告制度
- 北京市海淀區(qū)2024學(xué)年七年級上學(xué)期語文期中試卷【含參考答案】
- 2024年新人教版七年級上冊數(shù)學(xué)教學(xué)課件 5.2 解一元一次方程 第4課時 利用去分母解一元一次方程
- Unit 4 My Favourite Subject教學(xué)設(shè)計2024-2025學(xué)年人教版(2024)英語七年級上冊
- 第9課《這些是大家的》(課件)-部編版道德與法治二年級上冊
評論
0/150
提交評論