C++ 五子棋人机对战游戏设计

更新时间:2023-07-04 20:36:38 阅读: 评论:0

五子棋人机对战游戏
摘要:本文用visual c++来设计与实现简单的五子棋人机对战游戏的基本功能,玩家可以在游戏区域中适当的位置来放棋子,通过程序设计让电脑选择最佳的落棋点,来实现人机对战。
文中对该游戏的算法进行了详细的介绍,其中核心内容包括界面的设计、最佳落棋位置的判断以及游戏胜利判断功能的实现。程序实现起来较简单,同时也比较实用。
关键词:  五子棋 ,vc,人机对战游戏 
1.引言
1.1 游戏介绍
五子棋是一种很受人们喜爱的智力游戏,它的规则简单,但玩法变化多端,富有趣味性,特别锻炼人的智力,适合人们消遣。
1.2 目的
网络小游戏制作的目的是满足了人们休闲的需要,在紧张工作之余休闲类的小游戏能够给人带来最大程度的放松,也可以增进人们之间的交流,沟通,通过游戏还可以认识更多的朋友,也可以到达跨省、跨市,甚至跨国间人们互相娱乐的目的。墨子简介
1.3 主要问题
  开始制作游戏时,主要要解决的问题有以下几个方面:
excel计算1. 如何设置整个游戏的界面;
2 判断是否可以放下棋子;
3. 如何让电脑选择最佳位置;
4. 判断是黑棋胜还是白棋胜。
2.需求分析
关于五子棋游戏的功能描述如下:运行游戏并进行初始化工作,将整个游戏区域中纵线和
横线相交的点坐标化,并且这些点是将来下棋的位置。玩家可以在任意没有放棋子的点放下棋子,直到一方有五个棋子连成一条线为胜方。
    游戏的整体运行效果如图1.1。
图1.1
3.功能模块的设计
3.1 变量和函数
view类中添加变量函数如下:
保存vscomputer时白棋位置    CPoint vspoint;
CPoint bpointcan4,        //这个位置空,它旁边有四个黑棋
wpointcan4,            //这个位置空,它旁边有四个白棋
bpointcan3,            //这个位置空,它的旁边有三个黑棋
wpointcan3,            //这个位置空,它的旁边有三个白棋
bpointcan2,            //描写饺子这个位置空,它的旁边有两个黑棋
wpointcan2,          //这个位置空,它的旁边有两个白棋
bpointcan1;          //康熙雍正乾隆不是以上情况,这个位置空         
在得到最大值和方向上寻找落棋点,其中ij表示搜索起点,n表示方向
void archcandown1(int i,int j,int n);
void archcandown2(int i,int j,int n);
void archcandown3(int i,int j,int n);
void archcandown4(int i,int j,int n);
计算最大值及方向        CPoint maxnum(int a,int b,int c,int d);
最好落棋点                void bestputdown(int i,int j);
计算机下棋                void computerdown();李煜诗词全集赏析
在位置point放下棋子        void putdown(CPoint point);
人对机菜单                afx_msg void OnCpmputer();
3.2.框架的搭建
  新建工程,选择单文档,在Step 4 of 6中先中Windows Sockets复选框
4.算法分析与设计
4.1游戏界面的设计
由于游戏的棋盘大小是一定的,不能改变大小的,是应该符合要求的。如下函数设置窗口大小:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
      if( !CFrameWnd::PreCreateWindow(cs) )
            return FALSE;
      // TODO: Modify the Window class or styles here by modifying
      // the CREATESTRUCT cs
      cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;    //
      cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//;
      //设置窗口大小:400*340
      cs.cx=450;
      cs.cy=500; 
      return TRUE;
}
画棋盘:
OnDraw(CDC* pDC)函数中画棋盘,由于在游戏过程中有可能重画棋盘,而那时棋盘上面有棋子,所以,我们在这个函数里面必须有画棋子的语句。在此用数组的做为1表示白棋,-1表示黑棋。
void CMy3_1View::OnDraw(CDC* pDC)
{
      CMy3_1Doc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
    //画背景
  CBrush mybrush1;
    mybrush1.CreateSolidBrush(RGB(192,192,192));     
    CRect myrect1(0,0,1200,800);
    pDC->FillRect(myrect1,&mybrush1);
      //画棋盘框线
      CPen mypen;
      CPen*myoldPen;
      mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
  myoldPen=pDC->SelectObject(&mypen);
  for(int i=0;i<19;i++)
      {         
            pDC->MoveTo(40,40+i*20);
            pDC->LineTo(400,40+i*20);
            pDC->MoveTo(40+i*20,40);
            pDC->LineTo(40+i*20,400);
      }
  //重画时显示存在的棋子
      CDC Dc;
      if(Dc.CreateCompatibleDC(pDC)==FALSE)
        AfxMessageBox("Can't create DC");
      for(int n=0;n<19;n++)
            for(int m=0;m<19;m++)
                    if(wzq[n][m]==1)
玫瑰花水                    {
                //显示白棋
                Dc.SelectObject(m_bmwhite);
                          pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
                    }
                el if(wzq[n][m]==-1)
                          {
              //显示黑棋
              Dc.SelectObject(m_bmblack);
                          pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
                          }
}
苹果录音机棋盘的效果如图
5.核心算法
在完成界面设计后,就开始展开游戏核心的设计,该部分主要包括计算机搜索最佳落棋位置,游戏胜利判断的实现。
工作上的不足
5.1 搜索最佳落棋位置
计算机是怎样下棋?这就是定位的问题了。即搜索棋盘,找出一个最佳点,放下黑棋。我们实现的方法是:全盘搜索,并把搜索到的位置,保存在变量。由于有多种情况,我们定义变量如下:
CPoint bpointcan4,  //这个位置空,它旁边有四个黑棋
  wpointcan4,        //这个位置空,它旁边有四个白棋
  bpointcan3,        //这个位置空,它的旁边有三个黑棋
  wpointcan3,      //这个位置空,它的旁边有三个白棋
  bpointcan2,      //这个位置空,它的旁边有两个黑棋
  wpointcan2,      //这个位置空,它的旁边有两个白棋
  bpointcan1;      //不是以上情况,这个位置空   
     
并在搜索之前都赋值为(-1-1),然后,进行搜索,并把相应的值保存在相应变量里面,而如果前面已经对变量赋值,我们依然赋值,用新值代替旧值。注意:只保存最后一个值,这样的一个好处是,避免了每次都从左上角开始,并且它的随机性比随机函数还随机。
全盘搜索完之后,由于上面的变量中至少有一个已经被赋值,即不是(-1-1),可以采用多数优先的方法,让已经有多个同色棋子的位置先下棋。
其原理是,如果已经有四个黑棋,计算机再下一个黑棋就赢了;否则,如果人已经有四个白棋,那么计算机就必须放下一个黑棋,阻止白棋下一步赢;如果已经有三个黑棋,再下一个黑棋,变成四个;否则,如果已经有三个白棋,下一个黑棋,破坏它;两个棋子的同理;否则,在刚才白棋下的地方,顺便找一个位置,下棋。computerdown()函数如下:
//轮到计算机下棋
void CMy3_1View::computerdown()
{
      //把各种情形赋值为如下
      bpointcan4=(-1,-1);
      wpointcan4=(-1,-1);
      bpointcan3=(-1,-1);
      wpointcan3=(-1,-1);
      bpointcan2=(-1,-1);
      wpointcan2=(-1,-1);

本文发布于:2023-07-04 20:36:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1067933.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:游戏   棋子   位置   搜索   人们   棋盘
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图