虫虫教学

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

网络五子棋

[复制链接]

4449

主题

4659

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
41710

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

发表于 2021-10-15 18:30:20 | 显示全部楼层 |阅读模式
      网络五子棋
    相信许多人都玩儿过五子棋的游戏。是否想过自己设计一个五子棋游戏呢?本例中笔者设计了一个五子棋游戏,效果如图1所示。
                                       

关键技术
要实现五子棋游戏,关键问题是如何判断哪一方获胜。分析五子棋规则,当在横向、纵向、45度斜角、135度斜角有一个方向出现连续5个相同的棋子,则认为该方获胜。算法分析:
在表格的每一个交叉点处,都可以放置棋子。因此,有多少个交叉点就有多少个棋子。当一方在棋盘上放置一个棋子时,需要从四个方向判断是否有连续5个棋子出现。根据当前棋子,需要知道与其相邻的8个棋子(上、下、左、右、左上、右上、左下、右下),用以判断是否有连续5个棋子出现。可以定义一个棋子的结构,其中包含棋子的颜色、坐标点、临近节点等信息。
设计过程
(1)新建一个基于对话框的应用程序。
(2)从CSocket派生一个服务器套接字CServerSock,改写OnAccept方法
(3)从CSocket派生一个服务器套接字CClientSock,改写OnReceive方法

(4)在对话框类中定义如下成员变量
(5)向对话框中添加DrawGrid方法,绘制表格
(6)向对话框添加GetNodeFromPoint方法,根据坐标点返回棋子
(7)处理对话框的WM_LBUTTONDOWN消息,根据坐标点在棋盘上放置棋子,并判断是否已获胜
//定义节点颜色
typedef enum NODECOLOR{ nWhite,nBlack,nNone};
//定义节点类
class NODE
{

public:
       NODECOLOR  m_Color;       //棋子颜色
      CPoint     m_Point;           //棋子坐标点
public:
      NODE*      m_pRecents[8];  //临近棋子
      BOOL       m_IsUsed;       //棋子是否被用
      NODE(){m_Color = nNone;m_IsUsed=FALSE;}

      ~NODE(){ }
}
在对话框初始化时根据表格的交叉点坐标设置棋子的坐标点。由于表格中每一个单元格的高度和宽度是固定的,因此根据棋子的坐标点就可以设置其临近的8个棋子了。
void CServerDlg::SetRecentNode(NODE* node)
{
      //假设一个节点有8个临近节点
      CPoint pt = node->m_Point;
      //获得8个临近节点的坐标   
      /*******************************
                *  *  *
               *  0  *
               *  *  *
   *********************************/
      //左上方的临近节点
      CPoint pt1 = CPoint(pt.x-cx,pt.y-cy);
      node->m_pRecents[0]= GetNodeFromPoint(pt1);
      //上方临近节点
      CPoint pt2 = CPoint(pt.x,pt.y-cy);
      node->m_pRecents[1]= GetNodeFromPoint(pt2);
       //右上方临近节点
      CPoint pt3 = CPoint(pt.x+cx,pt.y-cy);
      node->m_pRecents[2]= GetNodeFromPoint(pt3);
      //左方节点临近节点
      CPoint pt4 = CPoint(pt.x-cx,pt.y);
      node->m_pRecents[3]= GetNodeFromPoint(pt4);
      //右方节点临近节点
      CPoint pt5 = CPoint(pt.x+cy,pt.y);
      node->m_pRecents[4]= GetNodeFromPoint(pt5);
       //左下方临近节点
      CPoint pt6 = CPoint(pt.x-cx,pt.y+cy);
      node->m_pRecents[5]= GetNodeFromPoint(pt6);
      //下方临近节点
      CPoint pt7 = CPoint(pt.x,pt.y+cy);
      node->m_pRecents[6]= GetNodeFromPoint(pt7);
      //右下方临近节点
      CPoint pt8 = CPoint(pt.x+cx,pt.y+cy);
      node->m_pRecents[7]= GetNodeFromPoint(pt8);
}
秘笈心法
心法领悟592:字节顺序
不同的计算机结构有时使用不同的字节顺序存储数据。例如,基于 Intel 的计算机存储数据的顺序与 Macintosh (Motorola) 计算机相反,通常用户不用担心这个字节顺序,在个别时候才需要从主机顺序转换为网络顺序。

本帖子中包含更多资源

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

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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