五子棋設計報告-2_第1頁
五子棋設計報告-2_第2頁
五子棋設計報告-2_第3頁
五子棋設計報告-2_第4頁
五子棋設計報告-2_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

北華大學電氣信息工程學院C++項目實習姓名:王文新班級:通信12.1學號:23組長:田莉莉指導教師:高玉峰實習日期:8月25日~9月10日一、開發(fā)環(huán)境MicrosoftVisualC++是Microsoft公司推出的開發(fā)Win32環(huán)境程序,面向?qū)ο蟮目梢暬删幊滔到y(tǒng)。它不但具有程序框架自動生成、靈活方便的類管理、代碼編寫和界面設計集成交互操作、可開發(fā)多種程序等優(yōu)點,而且通過簡單的設置就可使其生成的程序框架支持數(shù)據(jù)庫接口、OLE2,WinSock網(wǎng)絡、3D控制界面。在這次實習中,我們主要采用的是VisualC++6.0提供的MFC類庫,它是一個很大的、擴展了C++類層次結構,使開發(fā)Windows應用程序變得很容易。其中,MFC應用程序的總體結構通常由開發(fā)人員從MFC類派生的幾個類和一個CWinApp類對象(應用程序?qū)ο?組成。并且,MFC也提供了MFCAppWizard自動生成框架。MFC是微軟提供的VC++可以調(diào)用的類庫,其中封裝了開發(fā)人員常用的類,使編程效率大大的提高。二、背景概要五子棋是我國古代傳統(tǒng)的黑白棋種之一,大約在南北朝時期隨圍棋一起先后傳入朝鮮、日本等地。五子棋在日本又叫“連珠棋”。通過一系列的規(guī)則變化使連珠五子棋這個簡單的游戲復雜化、規(guī)范化,而最終成為今天的職業(yè)連珠五子棋,同時也成為一種國際化賽棋。

五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征,“短”、”平”、“快”,又有古典哲學的高深學問“陰陽易理”;其既有簡單易學的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;五子棋文化源遠流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點”的連接。是中西文化的交流點,是古今哲理的結晶。三、模塊分析游戲規(guī)則類:主要負責各種類的調(diào)用及游戲規(guī)則的實現(xiàn)。

棋盤窗口類:主要負責棋盤和棋子等的更新和顯示。

設置對話框類:主要負責參數(shù)的設置與連接。

網(wǎng)絡通信類:主要負責游戲的網(wǎng)絡通信。

網(wǎng)絡協(xié)議類:主要負責游戲網(wǎng)絡通信協(xié)議的實現(xiàn)。1。棋盤窗口類定義頭文件#if!defined(AFX_BOARD_H__5959DFF1_31AC_463D_969E_D68EA68C106F__INCLUDED_)#defineAFX_BOARD_H__5959DFF1_31AC_463D_969E_D68EA68C106F__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#include"stdafx.h"classCBoard:publicCWnd{private:CImageListm_iml;//棋子圖像intm_color;//玩家顏色BOOLm_bWait;//等待標志 BOOLm_bOldWait;public: CBoard(); virtual~CBoard(); voidRestoreWait();voidClear(BOOLbWait);voidSetColor(intcolor);intGetColor()const;voidSetWait(BOOLbWait);voidSetData(intx,inty,intcolor);voidDrawGame(); voidDraw(intx,inty,intcolor); voidReceive(); voidOver(intx,inty);protected:afx_msgvoidOnPaint();afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);DECLARE_MESSAGE_MAP()};#endif//!defined(AFX_BOARD_H__AA8DF826_F12E_4E8F_BA07_F2144FF643B4__INCLUDED_)旗子及棋盤的繪制調(diào)用#include"StdAfx.h"#include"Board.h"#include"Resource.h"#include"Rule.h"#include"FiveChessDlg.h"#defineMAX_LEN256 /*定義最大長度*/////////////////////////////////////////////////////////////////////////////構造函數(shù),初始化棋盤數(shù)據(jù)以及圖像數(shù)據(jù)//////////////////////////////////////////////////////////////////////////CBoard::CBoard(){//初始化圖像列表m_iml.Create(24,24,ILC_COLOR24|ILC_MASK,0,2);//載入黑、白棋子掩碼位圖CBitmapbmpBlack,bmpWhite;bmpBlack.LoadBitmap(IDB_BMP_BLACK);m_iml.Add(&bmpBlack,0xff00ff);bmpWhite.LoadBitmap(IDB_BMP_WHITE);m_iml.Add(&bmpWhite,0xff00ff);}////////////////////////////////////////////////////////////////////////////析構函數(shù)//////////////////////////////////////////////////////////////////////////CBoard::~CBoard(){}//消息映射表BEGIN_MESSAGE_MAP(CBoard,CWnd) //{{AFX_MSG_MAP(CBoard)ON_WM_PAINT()ON_WM_LBUTTONUP() //}}AFX_MSG_MAPEND_MESSAGE_MAP()////////////////////////////////////////////////////////////////////////////處理WM_PAINT消息//////////////////////////////////////////////////////////////////////////voidCBoard::OnPaint(){CPaintDCdc(this);CDCMemDC;MemDC.CreateCompatibleDC(&dc);//裝載棋盤CBitmapbmp;CPenpen;bmp.LoadBitmap(IDB_BMP_QP);//裝載棋盤圖片pen.CreatePen(PS_SOLID,1,0xff);MemDC.SelectObject(&bmp);//選擇對象MemDC.SelectObject(&pen);MemDC.SetROP2(R2_NOTXORPEN);//去除圖片背景//根據(jù)棋盤數(shù)據(jù)繪制棋子intx,y;POINTpt;for(y=0;y<15;y++){for(x=0;x<15;x++){if(-1!=m_data[x][y]){pt.x=12+25*x;pt.y=84+25*y;m_iml.Draw(&MemDC,m_data[x][y],pt,ILD_TRANSPARENT);}}} //完成繪制dc.BitBlt(0,0,395,472,&MemDC,0,0,SRCCOPY);}如下圖所示2.設置對話框類#if!defined(AFX_SETUPDLG_H__44F243EF_655E_4902_97A7_1890780CF9FF__INCLUDED_)#defineAFX_SETUPDLG_H__44F243EF_655E_4902_97A7_1890780CF9FF__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#include"stdafx.h"#include"Resource.h"http:///////////////////////////////////////////////////////////////////////////////CSetupDlgdialogclassCSetupDlg:publicCDialog{//Constructionpublic: CSetupDlg(CWnd*pParent=NULL);//standardconstructor//DialogData //{{AFX_DATA(CSetupDlg) enum{IDD=IDD_SETUP_DLG}; CIPAddressCtrl m_ip_addr; UINT m_net_port; //}}AFX_DATApublic: BOOLm_isHost; //主機類型,TRUE:主機FALSE:客戶機 CStringm_strHostIP;//IP地址//Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CSetupDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL//Implementationprotected: //Generatedmessagemapfunctions //{{AFX_MSG(CSetupDlg) virtualvoidOnCancel();//取消鍵響應 virtualvoidOnOK(); afx_msgvoidOnHostOption();//選中主機選項響應 afx_msgvoidOnClientOption();//選中客戶機選項響應 virtualBOOLOnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX_SETUPDLG_H__44F243EF_655E_4902_97A7_1890780CF9FF__INCLUDED_)構建主機客機的接網(wǎng)絡通信類網(wǎng)絡通信就是網(wǎng)絡之間溝通、交流的橋梁,只有相同網(wǎng)絡協(xié)議的計算機才能進行信息的溝通與交流。這就好比人與人之間交流所使用的各種語言一樣,只有使用相同語言才能正常、順利地進行交流。從專業(yè)角度定義,網(wǎng)絡協(xié)議是計算機在網(wǎng)絡中實現(xiàn)通信時必須遵守的約定,也就是通信協(xié)議。主要是對信息傳輸?shù)乃俾?、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等作出規(guī)定并制定出標準。#if!defined(AFX_CONNECT_H__216C3E4C_EE5E_49BD_891E_9D738A98B676__INCLUDED_)#defineAFX_CONNECT_H__216C3E4C_EE5E_49BD_891E_9D738A98B676__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#include<afxsock.h>classCConnect:publicCAsyncSocket{public: CConnect(); virtual~CConnect();protected: virtualvoidOnAccept(intnErrorCode);//主機建立連接成功響應函數(shù) virtualvoidOnConnect(intnErrorCode);//客戶端建立連接成功響應函數(shù) virtualvoidOnReceive(intnErrorCode);//接收數(shù)據(jù)響應函數(shù) virtualvoidOnClose(intnErrorCode);//關閉端口時響應函數(shù)};#endif//!defined(AFX_CONNECT_H__216C3E4C_EE5E_49BD_891E_9D738A98B676__INCLUDED_)#include"stdafx.h"#include"FiveChessDlg.h"#include"Connect.h"#include"Board.h"#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////CConnect::CConnect(){}CConnect::~CConnect(){}voidCConnect::OnAccept(intnErrorCode)//主機建立連接成功響應函數(shù){ CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd(); pDlg->Accept();//調(diào)用祝對話框的處理函數(shù) pDlg->SetMenuState(FALSE);}voidCConnect::OnClose(intnErrorCode)//關閉端口響應函數(shù){ CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd(); pDlg->MessageBox(_T("對方已經(jīng)退出游戲"),_T("五子棋"),MB_ICONINFORMATION); pDlg->SetMenuState(TRUE); pDlg->m_board.SetWait(TRUE);//設置等待狀態(tài) pDlg->m_conncet.Close();//關閉監(jiān)聽連接端口 pDlg->m_sock.Close();//關閉連接端口 pDlg->m_bIsConnect=FALSE;//設置連接狀態(tài)變量}voidCConnect::OnConnect(intnErrorCode)//客戶端建立連接成功響應函數(shù){ CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd(); pDlg->Connect();//調(diào)用主對畫框 pDlg->SetMenuState(FALSE);}voidCConnect::OnReceive(intnErrorCode)//接收響應函數(shù){CBoard*pBoard=(CBoard*)AfxGetMainWnd()->GetDlgItem(IDC_BOARD);pBoard->Receive();//調(diào)用棋盤類的接受處理函數(shù)}連接成功游戲規(guī)則類一:無禁手規(guī)則:黑白雙方依次落子,由黑先下,當棋盤上有三個子時(兩黑一白),如果此時白方覺得開的局不利于自已可以提出交換,黑方無條件接受!也可以不交換,主動權在白方!然后繼續(xù)下棋,任一方先在棋盤上形成橫向、豎向、斜向的連續(xù)的相同顏色的五個(含五個以上)棋子的一方為勝。二:禁手規(guī)則禁手是針對黑棋而言的,禁手是指一手黑棋棋形成:雙活三,雙四,長連(五子以上)為輸!這種方法限制了黑棋先行的優(yōu)勢!禁手對白棋無效!#if!defined(AFX_RULE_H__2972EE6C_5A44_45B0_AD67_39204309FC3A__INCLUDED_)#defineAFX_RULE_H__2972EE6C_5A44_45B0_AD67_39204309FC3A__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#define_WIN0x00#define_LOST0x01#define_OTHER0x02classCRule{public: CRule(); virtual~CRule(); intWin(intcolor,intx,inty); //勝負判斷接口函數(shù) BOOLBan(intx,inty,intcolor); //禁手判斷接口函數(shù)private: BOOLforbid2(intx,inty); //非連子禁手判斷 BOOLforbid1(intx,inty); //連子禁手判斷};#endif//!defined(AFX_RULE_H__2972EE6C_5A44_45B0_AD67_39204309FC3A__INCLUDED_)#include"stdafx.h"#include"FiveChess.h"#include"Rule.h"#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif#defineNONE-1CRule::CRule(){}CRule::~CRule(){}//禁手判斷接口函數(shù)BOOLCRule::Ban(intx,inty,intcolor){ if(forbid1(x,y)||forbid2(x,y)) { returnTRUE; } returnFALSE;}//連五判斷//返回0為勝利1為禁手2為無狀態(tài)intCRule::Win(intcolor,intxpos,intypos){ intx,y;//判斷橫向for(y=0;y<15;y++){for(x=0;x<11;x++){if(color==m_data[x][y]&&color==m_data[x+1][y]&&color==m_data[x+2][y]&&color==m_data[x+3][y]&&color==m_data[x+4][y]){return_WIN;}}}//判斷縱向for(y=0;y<11;y++){for(x=0;x<15;x++){if(color==m_data[x][y]&&color==m_data[x][y+1]&&color==m_data[x][y+2]&&color==m_data[x][y+3]&&color==m_data[x][y+4]){return_WIN;}}}//判斷“\”方向for(y=0;y<11;y++){for(x=0;x<11;x++){if(color==m_data[x][y]&&color==m_data[x+1][y+1]&&color==m_data[x+2][y+2]&&color==m_data[x+3][y+3]&&color==m_data[x+4][y+4]){return_WIN;}}}//判斷“/”方向for(y=0;y<11;y++){for(x=4;x<15;x++){if(color==m_data[x][y]&&color==m_data[x-1][y+1]&&color==m_data[x-2][y+2]&&color==m_data[x-3][y+3]&&color==m_data[x-4][y+4]){return_WIN;}}} if(color==BLACK) { if(Ban(xpos,ypos,color)) { return_LOST; } } return_OTHER;}////////////////////////////////////////////////////////////////////////////連子禁手判斷//返回TRUE為禁手//////////////////////////////////////////////////////////////////////////BOOLCRule::forbid1(intx,inty){ inttab[9]={0};intw[4]={0}; intj3=0,j4=0,j6=0; intt1=0,t2=0,t3=0,t4=0; //水平方向 for(inti1=1;i1<5;i1++) { if(m_data[x-i1][y]==BLACK) { tab[1]++; } elseif(m_data[x+1][y]==WHITE||m_data[x-i1][y]==WHITE) { tab[1]=0; break; } } for(inti2=1;i2<5;i2++) { if(m_data[x+i2][y]==BLACK) { tab[1]++; } elseif(m_data[x-1][y]==WHITE||m_data[x-i2][y]==WHITE) { tab[5]=0; break; } }if(tab[1]+tab[5]==2&&t1==1) { w[0]=0; } else { w[0]=tab[1]+tab[5]; } //豎直方向 for(inti3=1;i3<5;i3++) { if(m_data[x][y-i3]==BLACK) { tab[2]++; } elseif(m_data[x][y+1]==WHITE||m_data[x][y+i3]==WHITE) { tab[2]=0; break; } } for(inti4=1;i4<5;i4++) { if(m_data[x][y+i4]==BLACK) { tab[2]++; } elseif(m_data[x][y-1]==WHITE||m_data[x][y+i4]==WHITE) { tab[6]=0; break; } }if(tab[2]+tab[4]==2&&t2==1){w[1]=0; } else { w[1]=tab[2]+tab[6]; } //右下方向 for(inti5=1;i5<5;i5++) { if(m_data[x-i5][y-i5]==BLACK) { tab[1]++; } elseif(m_data[x+1][y+1]==WHITE||m_data[x-i5][y-i5]==WHITE) { tab[3]=0; break; } } for(inti6=1;i6<5;i6++) { if(m_data[x+i6][y+i6]==BLACK) { tab[7]++; } elseif(m_data[x-1][y-1]==WHITE||m_data[x+i6][y+i6]==WHITE) { tab[7]=0;break;}if(tab[3]+tab[6]==2&&t3==1){w[2]=0; } else { w[2]=tab[3]+tab[7]; } //左下方向 for(inti7=1;i7<5;i7++){ if(m_data[x-i7][y+i7]==BLACK) { tab[4]++; } elseif(m_data[x+1][y-1]==WHITE||m_data[x-i7][y+i7]==WHITE) { tab[4]=0; break;}for(inti8=1;i8<5;i8++) { if(m_data[x+i8][y-i8]==BLACK) { tab[8]++; } elseif(m_data[x-1][y+1]==WHITE||m_data[x+i8][y-i8]==WHITE) { tab[8]=0; break;}}if(tab[3]+tab[6]==2&&t4==1) {w[3]=0;}else { w[3]=tab[4]+tab[8]; }for(inti=0;i<4;i++) { if(w[i]==2) { j3++; } elseif(w[i]==3) { j4++; } elseif(w[i]==5) { j6++; } }if(j3==2&&j4!=2||j4==2||j3==2&&j4==1||j6==1) { returnTRUE; }returnFALSE;}//非連子禁手判斷//返回TRUE為禁手BOOLCRule::forbid2(intx,inty){ //三三禁手if((m_data[x-1][y]==BLACK&&m_data[x-2][y]==BLACK&&m_data[x-3][y]==NONE&&m_data[x+1][y]==NONE ||m_data[x+1][y]==BLACK&&m_data[x+2][y]==BLACK&&m_data[x+3][y]==NONE&&m_data[x-1][y]==NONE) &&(m_data[x][y+1]==NONE&&m_data[x][y+2]==BLACK&&m_data[x][y+3]==BLACK&&m_data[x][y+4]==NONE&&m_data[x][y-1]==NONE) ||m_data[x][y-1]==NONE&&m_data[x][y-2]==BLACK&&m_data[x][y-3]==BLACK&&m_data[x][y-4]==NONE&&m_data[x][y+1]==NONE) { returnTRUE; } elseif((m_data[x][y+1]==BLACK&&m_data[x][y+2]==BLACK&&m_data[x][y+3]==NONE&&m_data[x][y-1]==NONE ||m_data[x][y-1]==BLACK&&m_data[x][y-2]==BLACK&&m_data[x][y-3]==NONE&&m_data[x][y+1]==NONE) &&(m_data[x+1][y]==NONE&&m_data[x+2][y]==BLACK&&m_data[x+3][y]==BLACK&&m_data[x+4][y]==NONE&&m_data[x-1][y]==NONE ||m_data[x-1][y]==NONE&&m_data[x-2][y]==BLACK&&m_data[x-3][y]==BLACK&&m_data[x+1][y]==NONE&&m_data[x-4][y]==NONE)) { returnTRUE; } elseif((m_data[x-1][y-1]==BLACK&&m_data[x-2][y-2]==BLACK&&m_data[x-3][y-3]==NONE&&m_data[x+1][y+1]==NONE ||m_data[x+1][y+1]==BLACK&&m_data[x+2][y+2]==BLACK&&m_data[x+3][y+3]==NONE&&m_data[x-1][y-1]==NONE) &&(m_data[x+1][y-1]==NONE&&m_data[x+2][y-2]==BLACK&&m_data[x+3][y-3]==BLACK&&m_data[x+4][y-4]==NONE ||m_data[x-1][y+1]==NONE&&m_data[x-2][y+2]==BLACK&&m_data[x-3][y+3]==BLACK&&m_data[x-4][y+4]==NONE)) { returnTRUE; } elseif((m_data[x-1][y+1]==BLACK&&m_data[x-2][y+2]==BLACK&&m_data[x-3][y+3]==NONE&&m_data[x+1][y-1]==NONE ||m_data[x+1][y-1]==BLACK&&m_data[x+2][y-2]==BLACK&&m_data[x+3][y-3]==NONE&&m_data[x-1][y+1]==NONE) &&(m_data[x+1][y+1]==NONE&&m_data[x+2][y+2]==BLACK&&m_data[x+3][y+3]==BLACK&&m_data[x+4][y+4]==NONE ||m_data[x-1][y-1]==NONE&&m_data[x-2][y-2]==BLACK&&m_data[x-3][y-3]==BLACK&&m_data[x-4][y-4]==NONE)) { returnTRUE; } //四四有界禁手 elseif((m_data[x-1][y]==BLACK&&m_data[x-2][y]==NONE&&m_data[x-3][y]==BLACK&&m_data[x-4][y]==BLACK&&m_data[x-6][y]==NONE &&m_data[x-5][y]==0&&m_data[x+2][y]==BLACK&&m_data[x+3][y]==BLACK&&m_data[x+1][y]==NONE&&m_data[x+4][y]==0&&m_data[x+5][y]==NONE) ||(m_data[x][y+1]==NONE&&m_data[x][y+2]==BLACK&&m_data[x][y+3]==BLACK&&m_data[x][y+4]==WHITE&&m_data[x][y+5]==NONE &&m_data[x][y-1]==BLACK&&m_data[x][y-2]==NONE&&m_data[x][y-3]==BLACK&&m_data[x][y-4]==BLACK&&m_data[x][y-5]==WHITE&&m_data[x][y-6]==NONE) ||(m_data[x][y+1]==BLACK&&m_data[x][y+2]==NONE&&m_data[x][y+3]==BLACK&&m_data[x][y+4]==BLACK&&m_data[x][y+5]==WHITE&&m_data[x][y+6]==NONE &&m_data[x][y-1]==NONE&&m_data[x][y-2]==BLACK&&m_data[x][y-3]==BLACK&&m_data[x][y-4]==WHITE&&m_data[x][y-5]==WHITE) ||(m_data[x][y+1]==NONE&&m_data[x][y+2]==BLACK&&m_data[x][y+3]==BLACK&&m_data[x][y+4]==WHITE&&m_data[x][y+5]==NONE &&m_data[x][y-6]==NONE&&m_data[x][y-1]==BLACK&&m_data[x][y-2]==NONE&&m_

溫馨提示

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

評論

0/150

提交評論