局域网对战五子棋游戏设计.docx

上传人:b****3 文档编号:5533342 上传时间:2022-12-18 格式:DOCX 页数:46 大小:462.17KB
下载 相关 举报
局域网对战五子棋游戏设计.docx_第1页
第1页 / 共46页
局域网对战五子棋游戏设计.docx_第2页
第2页 / 共46页
局域网对战五子棋游戏设计.docx_第3页
第3页 / 共46页
局域网对战五子棋游戏设计.docx_第4页
第4页 / 共46页
局域网对战五子棋游戏设计.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

局域网对战五子棋游戏设计.docx

《局域网对战五子棋游戏设计.docx》由会员分享,可在线阅读,更多相关《局域网对战五子棋游戏设计.docx(46页珍藏版)》请在冰豆网上搜索。

局域网对战五子棋游戏设计.docx

局域网对战五子棋游戏设计

一、需求分析

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1