1、C+毕业课程设计报告(此文档为word格式,下载后您可任意编辑修改!)青岛理工大学C+面向对象课程设计报告院(系): _ 专业: _ 学生姓名: _ 班级: 学号:题目: _ 起讫日期:_设计地点: _ 指导老师: _ 一.游戏概述.3 1.1.游戏介绍.3 1.2.游戏玩法.3 1.3.运行环境.32.具体步骤.3 2.1.棋盘设计.3 2.2.棋子设计.4 2.3.电脑算法.6 2.4.胜负判断.83.游戏运行图.114.总结.13 41.自我总结.13 4.2.程序的不足和需要改进的地方.14致谢.14附录一 参考文献.15附录二 程序源代码.151.游戏概述1.1.游戏介绍五子棋是一种
2、两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。1.2.游戏玩法 黑白双方依次落子,由黑先下,当棋盘上有三个子时,如果此时白方觉得开的局不利于自已可以提出交换,黑方无条件接受!也可以不交换,主动权在白方!然后继续下棋,任一方先在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个棋子的一方为胜。1.3.运行环境Windows7 VC+6.02具体步骤2.1.棋盘设计 棋盘和棋子可以用GDI来实现,棋盘用GDI划线,基本上就是LineTo(x,y),Move
3、To(x,y),一个棋盘就出来了。具体代码如下在OnPaint()函数的else内加入如下代码 CPaintDC dc(this); dc.SelectStockObject(BLACK_PEN); int i,j; for(i=40;i=530;i=i+35) dc.MoveTo(i,40); dc.LineTo(i,530); for(j=40;j=530;j=j+35) dc.MoveTo(40,j); dc.LineTo(530,j); 2.2.棋子设计 至于如何画棋子,就用GDI来画圆,然后填充上不同的颜色,黑子、白子也就实现了。这里的棋子不应该是一个独立的量,它有自己的区域,应该能
4、判断鼠标是不是点击到了这个区域,当点击这个区域的时候是否应该显示,应该显示什么颜色的旗子 把这么多东西集合在一起,应该定义一个类,于是Cqiz 这个类就出现了。 Cqiz 有四个变量如下:int flag; CRect rect; int y; int x;x,y表示这个区域的中心,rect为以x,y为中心的边长为30的矩形,flag用来表示该对象的状态(0:空白 1:黑子 -1:白字)。然后又定义了5个成员函数 bool isWhite();/如果为白子,返回true CRect getRect();/获得该对象对应的CRect bool isBlack();/如果为黑子,返回true bo
5、ol isEmpty();/如果为空,返回true bool isOn(CPoint point);/如果该点出在该区域返回true,用来判断鼠标单击对应的区域。 定义了一个vector容器vector qz;在OnInitDialog()内对qy进行初始化 int i,j,k; Cqiz q; for(i=60,k=0;i=550;i=i+35,k+) for(j=60;j=550;j=j+35) q.x=i; q.y=j; qzk.push_back(q); 当鼠标单击的时候,判断单击的是哪一个区域,如果该区域为空则修改区域状态 void CWuZiQiDlg:OnLButtonDown(
6、UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default int i,j; for(i=0;i15;i+) for(j=0;j15;j+) if(qzij.isOn(point)&!over&qzij.isEmpty() qzij.flag=1; x=i;y=j; ison=true; Invalidate();/引发重绘 return; CDialog:OnLButtonDown(nFlags, point);2.3.电脑算法 在OnLButtonUp()中实现ai,电脑
7、走棋 void CWuziqidlgDlg:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default int i,j,m,n,score=0; for(i=0;i15;i+) for(j=0;j=score) score=getScore(); m=i;n=j; if(ison&!over) if(score=1&qz77.flag=0) qz77.flag=-1; x=7; y=7; else qzmn.flag=-1; x=m;y=n; ison
8、=false; Invalidate(); CDialog:OnLButtonUp(nFlags, point);OnPaint()函数中实现绘制,每次先把棋盘画好,然后遍历各区域,如果不为空就绘制相应的棋子。还要判断是否有一方获胜,如果有就结束游戏。这个程序主关键的是算分,对不同的走法进行算法,得分最高的为要真正要走的。判断是否能成5, 如果是机器方的话给予900000分,如果是人方的话给予400000分; 判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予150000分,如果是人方的话给予70000分; 判断是否已成双活3,如果是机器方的话给予30000分,如果是人方的话给予
9、15000 分; 判断是否成死3活3,如果是机器方的话给予1000分,如果是人方的话给予1000 分; 判断是否能成死4,如果是机器方的话给予500分,如果是人方的话给予500分; 判断是否能成单活3,如果是机器方的话给予200分,如果是人方的话给予200分; 判断是否已成双活2,如果是机器方的话给予100分,如果是人方的话给予100分; 判断是否能成死3,如果是机器方的话给予50分,如果是人方的话给予50分; 判断是否能成双活2,如果是机器方的话给予10分,如果是人方的话给予10分; 判断是否能成活2,如果是机器方的话给予5分,如果是人方的话给予5分; 判断是否能成死2,如果是机器方的话给予
10、3分,如果是人方的话给予3分。下五子棋不光要进攻,还要防守,所以要先对假设那些空的格子下自己的棋子能得多少分,得出一个最高分,然后假设这些格子放上对方的棋子,得出一个最高分,如果进攻的最高分大于等于防守的最高分,则进攻,否则先进行防守。2.4.胜负判断根据上面的介绍,如果有一方的5个棋子连成一线,那么这方就胜利了。if(Win(x,y)&!over) if(qzxy.flag=1) MessageBox(你赢了!); else MessageBox(电脑赢!); over=true; first=false; ison=false; bool CWuZiQiDlg:Win(int x,int
11、y) if(qzxy.flag=0) return false; int count1=0,count2=0,i,j; for(i=0;i15;i+) if(qziy.flag=qzxy.flag) count1+; else count1=0; if(qzxi.flag=qzxy.flag) count2+; else count2=0; if(count1=5|count2=5) return true; count1=count2=1; i=x+1; j=y-1; while(i=0&qzij.flag=qzxy.flag) count1+; i+; j-; i=x-1; j=y+1;
12、while(i=0&j=0&j=0&qzij.flag=qzxy.flag) count2+; i-; j-; i=x+1; j=y+1; while(i15&jLoadIcon(IDR_MAINFRAME);void CWuZiQiDlg:DoDataExchange(CDataExchange* pDX)/AFX_DATA_MAP(CWuZiQiDlg) / NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CWuZiQiDlg, CDialog)/AFX_MSG_MAP(
13、CWuZiQiDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CWuZiQiDlg message handlersBOOL CWuZiQiDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. men
14、u item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);int i,j,k;Cqiz q;for(i=40,k=0;i=530;i=i+35,k+)for(j=40;j=530;j=j+35) q.x=i;q.
15、y=j;qzk.push_back(q);ison=false;over=false;first=false;x=0;y=0; / Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herere
16、turn TRUE; / return TRUE unless you set the focus to a controlvoid CWuZiQiDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/
17、 to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CWuZiQiDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the ico
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1