|
网络五子棋
相信许多人都玩儿过五子棋的游戏。是否想过自己设计一个五子棋游戏呢?本例中笔者设计了一个五子棋游戏,效果如图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
|