虫虫教学

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 567|回复: 0

黑白棋实例

[复制链接]

4449

主题

4659

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
41710

最佳新人发帖达人推广达人热心会员突出贡献优秀讲师

发表于 2021-10-15 18:35:22 | 显示全部楼层 |阅读模式
          黑白棋实例
  黑白棋又称翻转棋,是一款非常受用户欢迎的棋牌类游戏,可以分为人机对战和人人对战两种,本例通过Visual C++来设计一款人人对战的黑白棋游戏。运行本实例,在黑白棋服务器端单击“服务器设置”按钮设置服务器,然后在黑白棋客户端单击“开始游戏”按钮连接服务器并开始游戏,效果如图1所示。
                                          

关键技术
在设计黑白棋游戏时,由于是人和人之间的对战,所以要使用套接字设计网络连接,在对话框上绘制软件的背景位图,在背景中绘制纵、横各8个方格黑白棋的棋子是下在方格中的,在落子时,两个相同颜色之间的不同颜色棋子将被转换为相同颜色的棋子,但是用户落子的位置需要注意,只有能将对方棋子转换为自己棋子的位置才可以落子,如果没有符合条件的落子位置,对方将连续落子,当棋盘中没有空格或者双方都不可以落子时,判断游戏结束,棋子多的一方将获得胜利,这样人人对战的黑白棋就设计完成了。
本实例中设计黑白棋游戏时,主要用Send方法和Receive方法来进行数据的发送和接收,下面对本实例中用到的关键技术进行详细讲解。
(1)Send方法
Send方法用发送数据到连接的套接字上,其语法格式如下:
virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );
u lpBuf:标识要发送数据的缓冲区。
v nBufLen:确定缓冲区的大小。
w nFlags:标识函数调用模式。
(2)Receive方法

Receive方法用于从一个套接字上接收数据,其语法格式如下:
virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );
u lpBuf:是接收数据的缓冲区。
v nBufLen:确定缓冲区的长度。
w nFlags:确定函数的调用模式。
设计过程
(1)新建一个基于对话框的应用程序,将其窗体标题改为“黑白棋服务器端”。
(2)向工程中导入3个BMP位图资源,用来绘制棋盘和棋子,并向对话框中添加一个按钮控件。

(3)创建一个新的对话框资源,修改其ID为IDD_SETSERVER_DIALOG,将其窗体标题改为“服务器设置”,并设置对话框显示的字体信息。
(4)向新建的对话框中添加一个群组控件、两个静态文本控件、两个编辑框控件和两个按钮控件。
(5)通过类向导,以CSocket类为基类派生CSrvSock类和CClientSock类。
(6)在主窗体的OnPaint函数中绘制棋盘和棋子,其实现代码如下:
      CDC* pDC = GetDC();                                             //获得设备上下文
      CBitmap bmp1,bmp2,bk;                                    //声明位图对象
      CDC memdc;
      memdc.CreateCompatibleDC(pDC);                                  //创建兼容的设备上下文
      bmp1.LoadBitmap(IDB_WHITE);                                     //加载白棋图片
      bmp2.LoadBitmap(IDB_BLACK);                               //加载黑棋图片

      bk.LoadBitmap(IDB_CHESSBOARD);                               //加载棋盘图片
       memdc.SelectObject(&bk);                                       //选入棋盘对象
      pDC->BitBlt(0,0,600,600,&memdc,0,0,SRCCOPY);           //绘制棋盘
      DrawChessboard();
      for (int m=0; m<row-1; m++)
      {
            for (int n=0; n<col-1; n++)
            {
                  if (m_NodeList[m][n].m_Color == ncWHITE)       //如果当前节点是白子
                  {

                        memdc.SelectObject(&bmp1);                 //选入白子对象
                         pDC->BitBlt(m_NodeList[m][n].m_Rect.left+3,m_NodeList[m][n].m_Rect.top+3,
                              55,55,&memdc,0,0,SRCCOPY);        //绘制白子
                  }
                  else if (m_NodeList[m][n].m_Color == ncBLACK) //如果当前节点是黑子
                  {
                        memdc.SelectObject(&bmp2);                 //选入黑子对象
                        pDC->BitBlt(m_NodeList[m][n].m_Rect.left+3,m_NodeList[m][n].m_Rect.top+3,
                              55,55,&memdc,0,0,SRCCOPY);        //绘制黑子
                  }

            }
       }
      bk.DeleteObject();
      ReleaseDC(&memdc);
秘笈心法
心法领悟595:数据结构的对齐方式
实例使用了SOCKET库函数在网络中传输数据,在使用send函数发送数据结构对象时,需要将数据结构数据对齐方式设置为一直的,数据结构数据对齐方式通过“Project Settings”对话框的C/C++选项卡下Code Generation目录下的Struct member alignment来设置。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|虫虫教学--虫虫联盟官网

GMT+8, 2025-4-28 23:44 , Processed in 0.104859 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表