|
黑白棋实例
黑白棋又称翻转棋,是一款非常受用户欢迎的棋牌类游戏,可以分为人机对战和人人对战两种,本例通过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
|