局域网对战五子棋游戏设计.docx
- 文档编号:5533342
- 上传时间:2022-12-18
- 格式:DOCX
- 页数:46
- 大小:462.17KB
局域网对战五子棋游戏设计.docx
《局域网对战五子棋游戏设计.docx》由会员分享,可在线阅读,更多相关《局域网对战五子棋游戏设计.docx(46页珍藏版)》请在冰豆网上搜索。
局域网对战五子棋游戏设计
一、需求分析
1.1开发背景
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(FiveinaRow的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
1.2项目目标
我们将主要通过VC++语言,运用面向对象的程序设计方法,开发此款五子棋游戏。
力争使程序短小精悍,简洁明了;游戏界面优美,容易操作;功能丰富,趣味性强。
现在将我们对项目期望实现的目标一一介绍:
(1)能够实现五子棋游戏中的全部规则
□能够对连五的胜负进行判断,并给出提示
□能够对黑方禁手进行判断,并能够在落子后进行直接判负的提示。
(2)能够支持设置网络端口
□玩家可以自行设定连接的服务器IP地址。
通信端口默认使用10000
□支持两个玩家进行练级网络对弈模式。
□支持和棋操作。
1.3运行环境
本游戏短小精悍,而且对电脑配置的要求均不高,目前几乎所有的PC机均可运行该游戏。
但是为了能让大家更好地体验该款游戏,我们给出如下的最低配置:
最低配置:
CPU1GHz内存32M硬盘4GWindows95MicrosoftVisualC++6.0
同时结合我们开发该游戏的环境,我们强烈推荐用户使用如下的配置:
最佳配置:
CPU2GHz及以上内存256M及以上硬盘80G及以上WindowsXP及以上MicrosoftVisualC++6.0
1.4游戏说明
(1)游戏流程:
启动游戏后,显示主菜单。
里面包括开始游戏、和棋、游戏帮助、退出。
(2)游戏规则:
1、黑先白后,从天元开始落子。
然后执白棋的一方在黑棋周围的交叉点上落子,白第二着棋应布在自己河界的一侧。
此后,执黑方在以天元为中心的25个交叉点的范围内布盘面的第三着棋。
2、最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。
3、黑棋禁手判负,白棋无禁手。
黑棋禁手包括“三三”,“四四”,“长连”。
黑方只能“四三”胜。
所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手。
长连禁手是指黑方形成六个或六个以上的连续棋子。
4、双方均不能形成五连为和棋。
5、对局中拔子,中途退场均判为负。
6、五连与禁手同时形成,先五为胜。
因黑方已形成五连,故禁手失效,黑方胜。
7、黑方禁手形成时,白方应立即指出禁手点,黑方即负。
若白方继续应子,则黑方禁手不成立。
8、高段位职业比赛的特殊规定:
“三手可交换”:
黑下完第2手,执白者可提出交换。
即执白方变为执黑方。
“五手两打法”:
执黑下第五手时,必须下两手棋,执白者从这两手棋中任选一步。
本文所论述的联机五子棋系统就是依照这种方式进行的。
1.5项目任务书
(1)班级:
测控1001
(2)组长:
莫旭鹏
(3)成员:
崔州靖苗志涛
(4)项目名称:
五子棋
(5)项目背景:
五子棋是起源于中国古代的传统黑白棋种之一。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”。
(6)项目分工:
崔州靖:
负责完成项目需求分析,并提供给组员。
莫旭鹏:
负责项目的总体设计及详细设计。
将五子棋初期程序给出。
苗志涛:
负责项目的后期测试与调整,并完成测试报告。
(7)项目进度:
1-3天:
前期准备,各类资料收集,流程图,算法等同时完成。
4-7天:
实现基本功能和附加功能。
8-10天:
最后测试,最后优化。
(各类文档的设计与编写穿插于始终)
二、总体设计
2.1总体方案
(1)系统功能架构:
(2)处理流程
整个五子棋的处理流程如图所示:
游戏准备
开始游戏
黑方连五
或禁手
白方连五
游戏结束
(3)类结构设计
游戏由五个类组成,如图所示:
□游戏规则类:
主要负责各种类的调用及游戏规则的实现。
□棋盘窗口类:
主要负责棋盘和棋子等的更新和显示。
□设置对话框类:
主要负责参数的设置与连接。
□网络通信类:
主要负责游戏的网络通信。
□网络协议类:
主要负责游戏网络通信协议的实现。
(4)出错处理设计
当游戏中的一方出现错误。
游戏的错误处理类会采用弹出对话框的方式提示用户出错信息。
2.2详细设计
详细设计就是使设计和实现前面的各种类结构本小组是按:
网络通信协议类设计与实现------交互界面的设计与实现--------棋盘窗口类的设计与实现--------网络交互的设计与实现------游戏规则的设计与实现-------游戏中主对话框类的设计与实现的顺序进行设计和完成编码的
1、网络通信协议的设计与实现
□游戏中棋子在棋盘中的坐标,及棋子的位置。
□游戏中的控制信息。
□其他扩展信息。
为能适应3种不同类的信息的传输,所以在游戏的网络传输协议中,必须加入一个网络协议包结构。
如图:
数据长度
信息类型
数据
按照该格式可以设计出各种数据类型的详细结构。
2、交互界面的设计与实现
(1)控制菜单的设计
在本小组的设计的五子棋中,有3中操作命令需要使用菜单来支持:
A、新游戏操作,当用户进行主界面后,需要这个菜单项来开始新的游戏。
开始新游戏之前需要对网络进行设置。
B、和棋操作,在游戏中由一方提出提前结束游戏。
相当于认输并重新开始新一轮游戏、
C、退出游戏操作,当前用户不需要再玩游戏时,直接退出整个游戏界面。
(2)控制菜单的实现
为实现菜单,就需要在五子棋项目的资源中加入一个菜单栏(IDR_MAIN_MENU),并且要设置相应的ID资源号。
(3)网络设置对话框的设计
在游戏开始时,需要对网络进行设置,其包含的内容如下:
A、可以选择当前用户是主机,还是客户机。
如果是主机则执黑子,如果是客户机则执白子。
B、当用户选择为主机时,IP地址默认为:
“127.0.0.1”,端口号由用户填写。
C、当用户为客户机时,则需要在设置连接到主机的IP地址及端口号。
D、如果上面已经设置过,则从新开始游戏时,把上一次设置的IP地址和端口号显示出来。
3、棋盘窗口类的设计与实现
(1)设计
本组设计的五子棋需支持如下几个功能:
□能够显示棋盘和棋子图片。
□能够接受用户鼠标输入,并把相应的坐标转换成相应的行列数据填充到棋子数组中。
□能够处理来在网络通信的各种数据。
□能够调用规则类来对象判断胜负。
□能够支持清空游戏棋盘上的棋子的功能。
(2)棋盘类的实现
有了支持的功能列表,就需要声明一个棋盘类,其代码如下:
#ifndef__BOARD_H__
#define__BOARD_H__
#include"stdafx.h"
classCBoard:
publicCWnd
{
private:
CImageListm_iml;//棋子图像
intm_color;//玩家颜色
BOOLm_bWait;//等待标志
BOOLm_bOldWait;//原来的等待状态
public:
CBoard();
virtual~CBoard();
voidRestoreWait();
voidClear(BOOLbWait);
voidSetColor(intcolor);
intGetColor()const;
voidSetWait(BOOLbWait);
voidSetData(intx,inty,intcolor);
voidDrawGame();
voidDraw(intx,inty,intcolor);
voidReceive();
voidOver(intx,inty);
protected:
afx_msgvoidOnPaint();
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);
DECLARE_MESSAGE_MAP()
};
#endif
(3)棋盘类函数的实现
以上是声明了类的结构和成员,之后要根据这些声明,对这个类进行基函数实现,其代码如下:
#include"board.h"
#include"Resource.h"
#include"ConnectData.h"
#include"Rule.h"
#include"FiveChessDlg.h"
#defineMAX_LEN256/*定义最大长度*/
//////////////////////////////////////////////////////////////////////////
//构造函数,初始化棋盘数据以及图像数据
//////////////////////////////////////////////////////////////////////////
CBoard:
:
CBoard()
{
//初始化图像列表
m_iml.Create(24,24,ILC_COLOR24|ILC_MASK,0,2);
//载入黑、白棋子掩码位图
CBitmapbmpBlack,bmpWhite;
bmpBlack.LoadBitmap(IDB_BMP_BLACK);
m_iml.Add(&bmpBlack,0xff00ff);
bmpWhite.LoadBitmap(IDB_BMP_WHITE);
m_iml.Add(&bmpWhite,0xff00ff);
}
//////////////////////////////////////////////////////////////////////////
//析构函数
//////////////////////////////////////////////////////////////////////////
CBoard:
:
~CBoard()
{
}
//消息映射表
BEGIN_MESSAGE_MAP(CBoard,CWnd)
//{{AFX_MSG_MAP(CBoard)
ON_WM_PAINT()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
//处理WM_PAINT消息
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
OnPaint()
{
CPaintDCdc(this);
CDCMemDC;
MemDC.CreateCompatibleDC(&dc);
//装载棋盘
CBitmapbmp;
CPenpen;
bmp.LoadBitmap(IDB_BMP_QP);
pen.CreatePen(PS_SOLID,1,0xff);
MemDC.SelectObject(&bmp);
MemDC.SelectObject(&pen);
MemDC.SetROP2(R2_NOTXORPEN);
//根据棋盘数据绘制棋子
intx,y;
POINTpt;
for(y=0;y<15;y++)
{
for(x=0;x<15;x++)
{
if(-1!
=m_data[x][y])
{
pt.x=12+25*x;
pt.y=84+25*y;
m_iml.Draw(&MemDC,m_data[x][y],pt,ILD_TRANSPARENT);
}
}
}
//完成绘制
dc.BitBlt(0,0,395,472,&MemDC,0,0,SRCCOPY);
}
//////////////////////////////////////////////////////////////////////////
//处理左键弹起消息,为玩家落子之用
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
MSGSTRUCTmsg;
CRulerule;
CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd();
BYTEbuf[MAX_LEN]={0};
if(m_bWait)
{
MessageBeep(MB_OK);
return;
}
if(pDlg->m_bIsConnect)
{
intx,y;
x=(point.x-12)/25;
y=(point.y-84)/25;
//如果在(0,0)~(14,14)范围内,且该坐标没有落子,
//则落子于此,否则发声警告并退出过程
if(x<0||x>14||y<0||y>14||m_data[x][y]!
=-1)
{
MessageBeep(MB_OK);
return;
}
else
{
//如果位置合法,则落子
SetData(x,y,m_color);
msg.color=m_color;
msg.x=x;
msg.y=y;
}
//开始等待
m_bWait=TRUE;
msg.msgType=MSG_PUTSTEP;
pDlg->Send(&msg);
if(rule.Win(m_color,msg.x,msg.y)==_WIN)
{//胜利
pDlg->MessageBox(_T("恭喜,您获得了胜利!
"),_T("胜利"),MB_ICONINFORMATION);
pDlg->SetMenuState(TRUE);
}
elseif(rule.Win(m_color,msg.x,msg.y)==_LOST)
{//出现禁手
pDlg->MessageBox(_T("执黑禁手,您输了!
"),_T("失败"),MB_ICONINFORMATION);
pDlg->SetMenuState(TRUE);
}
}
}
//////////////////////////////////////////////////////////////////////////
//清空棋盘
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
Clear(BOOLbWait)
{
intx,y;
for(y=0;y<15;y++)
{
for(x=0;x<15;x++)
{
m_data[x][y]=-1;
}
}
//设置等待标志
m_bWait=bWait;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
//设置玩家颜色
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
SetColor(intcolor)
{
m_color=color;
}
//////////////////////////////////////////////////////////////////////////
//获取玩家颜色
//////////////////////////////////////////////////////////////////////////
intCBoard:
:
GetColor()const
{
returnm_color;
}
//////////////////////////////////////////////////////////////////////////
//设置等待标志
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
SetWait(BOOLbWait)
{
m_bOldWait=m_bWait;
m_bWait=bWait;
}
//////////////////////////////////////////////////////////////////////////
//设置棋盘数据,并绘制棋子
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
SetData(intx,inty,intcolor)
{
m_data[x][y]=color;
Draw(x,y,color);
}
//////////////////////////////////////////////////////////////////////////
//在指定棋盘坐标处绘制指定颜色的棋子
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
Draw(intx,inty,intcolor)
{
POINTpt;
pt.x=12+25*x;
pt.y=84+25*y;
CDC*pDC=GetDC();
CPenpen;
pen.CreatePen(PS_SOLID,1,0xff);
pDC->SelectObject(&pen);
pDC->SetROP2(R2_NOTXORPEN);
m_iml.Draw(pDC,color,pt,ILD_TRANSPARENT);
ReleaseDC(pDC);
}
//////////////////////////////////////////////////////////////////////////
//接收来自对方的数据
//////////////////////////////////////////////////////////////////////////
voidCBoard:
:
Receive()
{
CFiveChessDlg*pDlg=(CFiveChessDlg*)AfxGetMainWnd();
MSGSTRUCTmsg;
if(pDlg->m_sock.Receive((LPVOID)&msg,sizeof(MSGSTRUCT))==SOCKET_ERROR)
{
AfxGetMainWnd()->MessageBox(_T("接收数据时发生错误,请检查您的网络连接。
"),_T("错误"),MB_ICONSTOP);
return;
}
switch(msg.msgType)
{
caseMSG_PUTSTEP:
SetData(msg.x,msg.y,msg.color);
Over(msg.x,msg.y);
break;
caseMSG_DRAW:
if(IDYES==GetParent()->MessageBox(_T("对方请求和棋,接受这个请求吗?
"),
_T("和棋"),MB_ICONQUESTION|MB_YESNO))
{
//发送允许和棋消息
MSGSTRUCTmsg;
msg.msgType=MSG_AGREE_DRAW;
pDlg->m_sock.Send((LPCVOID)&msg,sizeof(MSGSTRUCT));
SetWait(TRUE);
//使“重玩”菜单生效
pDlg->SetMenuState(TRUE);
}
else
{
//发送拒绝和棋消息
MSGSTRUCTmsg;
msg.msgType=MSG_REFUSE_DRAW;
pDlg->m_sock.Send((LPCVOID)&msg,sizeof(MSGSTRUCT));
}
break;
caseMSG_AGREE_DRAW:
pDlg->MessageBox(_T("看来真是棋逢对手,对方接受了您的和棋请求。
"),_T("和棋"),MB_ICONINFORMATION);
//和棋后,使“重玩”菜单生效
pDlg->SetMenuState(TRUE);
break;
caseMSG_REFUSE_DRAW:
pDlg->MessageBox(_T("看来对方很有信心取得胜利,所以拒绝了您的和棋请求。
"),
_T("和棋"),MB_ICONINFORMATION);
Re
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 局域网 五子棋 游戏 设计