五子棋设计报告-2_第1页
五子棋设计报告-2_第2页
五子棋设计报告-2_第3页
五子棋设计报告-2_第4页
五子棋设计报告-2_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北华大学电气信息工程学院C++项目实习姓名:王文新班级:通信12.1学号:23组长:田莉莉指导教师:高玉峰实习日期:8月25日~9月10日一、开发环境MicrosoftVisualC++是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。在这次实习中,我们主要采用的是VisualC++6.0提供的MFC类库,它是一个很大的、扩展了C++类层次结构,使开发Windows应用程序变得很容易。其中,MFC应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。并且,MFC也提供了MFCAppWizard自动生成框架。MFC是微软提供的VC++可以调用的类库,其中封装了开发人员常用的类,使编程效率大大的提高。二、背景概要五子棋是我国古代传统的黑白棋种之一,大约在南北朝时期随围棋一起先后传入朝鲜、日本等地。五子棋在日本又叫“连珠棋”。通过一系列的规则变化使连珠五子棋这个简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际化赛棋。

五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征,“短”、”平”、“快”,又有古典哲学的高深学问“阴阳易理”;其既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;五子棋文化源远流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。是中西文化的交流点,是古今哲理的结晶。三、模块分析游戏规则类:主要负责各种类的调用及游戏规则的实现。

棋盘窗口类:主要负责棋盘和棋子等的更新和显示。

设置对话框类:主要负责参数的设置与连接。

网络通信类:主要负责游戏的网络通信。

网络协议类:主要负责游戏网络通信协议的实现。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_)旗子及棋盘的绘制调用#include"StdAfx.h"#include"Board.h"#include"Resource.h"#include"Rule.h"#include"FiveChessDlg.h"#defineMAX_LEN256 /*定义最大长度*/////////////////////////////////////////////////////////////////////////////构造函数,初始化棋盘数据以及图像数据//////////////////////////////////////////////////////////////////////////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);}////////////////////////////////////////////////////////////////////////////析构函数//////////////////////////////////////////////////////////////////////////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);//去除图片背景//根据棋盘数据绘制棋子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"///////////////////////////////////////////////////////////////////////////////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_)构建主机客机的接网络通信类网络通信就是网络之间沟通、交流的桥梁,只有相同网络协议的计算机才能进行信息的沟通与交流。这就好比人与人之间交流所使用的各种语言一样,只有使用相同语言才能正常、顺利地进行交流。从专业角度定义,网络协议是计算机在网络中实现通信时必须遵守的约定,也就是通信协议。主要是对信息传输的速率、传输代码、代码结构、传输控制步骤、出错控制等作出规定并制定出标准。#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);//主机建立连接成功响应函数 virtualvoidOnConnect(intnErrorCode);//客户端建立连接成功响应函数 virtualvoidOnReceive(intnErrorCode);//接收数据响应函数 virtualvoidOnClose(intnErrorCode);//关闭端口时响应函数};#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)//主机建立连接成功响应函数{ CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd(); pDlg->Accept();//调用祝对话框的处理函数 pDlg->SetMenuState(FALSE);}voidCConnect::OnClose(intnErrorCode)//关闭端口响应函数{ CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd(); pDlg->MessageBox(_T("对方已经退出游戏"),_T("五子棋"),MB_ICONINFORMATION); pDlg->SetMenuState(TRUE); pDlg->m_board.SetWait(TRUE);//设置等待状态 pDlg->m_conncet.Close();//关闭监听连接端口 pDlg->m_sock.Close();//关闭连接端口 pDlg->m_bIsConnect=FALSE;//设置连接状态变量}voidCConnect::OnConnect(intnErrorCode)//客户端建立连接成功响应函数{ CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd(); pDlg->Connect();//调用主对画框 pDlg->SetMenuState(FALSE);}voidCConnect::OnReceive(intnErrorCode)//接收响应函数{CBoard*pBoard=(CBoard*)AfxGetMainWnd()->GetDlgItem(IDC_BOARD);pBoard->Receive();//调用棋盘类的接受处理函数}连接成功游戏规则类一:无禁手规则:黑白双方依次落子,由黑先下,当棋盘上有三个子时(两黑一白),如果此时白方觉得开的局不利于自已可以提出交换,黑方无条件接受!也可以不交换,主动权在白方!然后继续下棋,任一方先在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个(含五个以上)棋子的一方为胜。二:禁手规则禁手是针对黑棋而言的,禁手是指一手黑棋棋形成:双活三,双四,长连(五子以上)为输!这种方法限制了黑棋先行的优势!禁手对白棋无效!#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); //胜负判断接口函数 BOOLBan(intx,inty,intcolor); //禁手判断接口函数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(){}//禁手判断接口函数BOOLCRule::Ban(intx,inty,intcolor){ if(forbid1(x,y)||forbid2(x,y)) { returnTRUE; } returnFALSE;}//连五判断//返回0为胜利1为禁手2为无状态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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论