不多于两个的路径,就可以消去;如果没有,则不予处理。
游戏过程,任意一家(假设为A方)消去图片后必须同时向对家发送已消去两张图片的信息。这样对方(假设为B方)在获取信息后即显示A方剩余的图片数,当A方剩余图片数为0,而B方剩余图片数大于0,则提示A方胜利。B方失败的信息。
考虑到游戏娱乐性以及网络游戏的交互特性。加入聊天功能,这样交战双方可以在游戏之后或者过程中发表自己的看法与经验(这也是参考了当前网络游戏的潮流来设计的)。
2.2 方案选择
在概要设计阶段,只要有两中方案可供选择:
一、双方都有自己的游戏区域,互不干扰,谁先消完全部的图片方块则就为胜出的一方,同时不管另一方是否已经消完全部的图片方块,游戏仍然结束。
二、双方的游戏区域相同,即共用一个游戏区域,当一方消去两块图片,则其总共消去的方块数加2,并且对方的游戏区域中也少掉那两块图片。当所有的图片方块都消去后,则游戏结束,统计消去的图片块数多的一方为胜者。
在第二种方案中,双方共用一个游戏区域,任何一放的消去方块的动作都要在另一方中实时的反应出来,这容易产生一些问题,就比如甲方点下图片下标值为1的图片(姑且用甲),乙方点下另一张图片下标值也为1的图片,当乙方想再次点下另一张下标值为1的图片时,甲方已经先于乙方点下那张图片,则按规则就已经消去了,反应在乙方这边的好象是乙方做了一次空操作,如此反复的话,可能会引起玩家的厌烦心在网络上流行的连连看游戏或者其他的游戏都是以第一种方案为设计思想,对第二种方案设计的游戏的规则可能会不太习惯,玩起来就不能达到娱乐的目的了。所以我们放弃第二种方案的设计思想,参考网络上流行的连连看的游戏规则,设计出第一种方案。
2.3 数据流图
由于游戏包含网络功能,所以将程序分为服务端程序和客户端程序。两种程序既有自身模块之间数据传送,也有与对方程序之间的数据传送,所以就有了下面的这个数据流图:
3系统设计
针对上面的需求分析,我们把整个软件分成三个模块:1、整体界面的设计和图片的随机生成;2、图片路径判断函数;3、网络通信与对战。
以下就是系统结构图:(略)
3.1 基本思路
3.1.1 解决游戏区域问题
这个问题最简单,但是却是最花时间的。正所谓:万事开头难。刚开始想了好多控件来实现。比如Label,Panel等等,后来在参考文献中发现一个扫雷游戏可以通过image控件来画图。因此在几天之后才解决这个最早的最简单的也是最头疼的问题。
3.1.2 获取图片位置的思路
首先,最基本的就是关于程序图片的位置怎么获取,以及如何控制。这里采用最常用的方法--数组。考虑到图片是多行多列的格式。所以采用二维数组(数组名为flag[])的方式来控制比较直观,并且为了程序容易解读,统一在不同过程中用名为i和j的变量来分别表示行列。程序开始时给数组中的各个元素赋初值为0,即表示没有图片。
然后数组控制整个游戏区域,游戏区域最外围为空白区域,即相关元素的值为0。这样就可以保证游戏刚开始后,第二层显示的图片之间的相连路径处理时就没有阻碍了。
现在介绍flag[]数组具体控制图片的过程,首先,由于每张图片显示的宽度×高度为39×47,所以整个控件设置为468×376(包括外围空白的两行两列)。而每张图片可以用flag[i,j]来表示,它在image内部的位置为{x=i*39到(i+1)*39,y=j*47到(j+1)*47}这样image控件内的一点M(x,y)所对应的图片就可以转化为数组flag[i,j]的值来判断。这个思路的具体算法可以后面的3.2.2的第二个步骤中得以体现。
3.1.3 网络通信协议的思路
这里有一点非常需要解决,那就是对战双方发送的游戏状态信息、聊天信息、用户准备信息全部是同一个方法来发送出去的,这进接收方将无法判断收到的信息是哪个类型的,这时通过定义发送信息的协议来完成。即在每次发送不同信息前加入一个四字符长的字符串来说明是哪种类型,接收方通过提取接收到信息前四个字符来判断是哪种类型,然后进行进行相关的处理。详细处理过程见3.4.2的内容。
3.1.4 其它功能的思路
其它功能的思路基本上没有什么难度也没花多少时间去解决,因此将在后面的具体各个部分的设计过程当中分别进行介绍。
3.2 界面的设计和图片的随机生成
由于这个程序的界面并不是很复杂,所以用到的控件也不多,主要核心内容还是后台的代码设计。图片的随机生成主要是用到一个random()函数将随机数赋值给flag[]数组中的每个元素,然后根据数组元素值,来显示图片。(这个在3.1.2的思路中有详细的介绍)
3.2.1 界面的设计
将整体界面分为三个大的部分,左上部分为游戏图片显示区域,即主区域,用IMAGE控件;右上角为命令按钮、聊天信息框,双方游戏状态显示(用到了按钮、MEMO、EDIT、Label等控件)。下面部分则是状态栏,显示相关提示信息(如图3-1)。
图3-1 程序主体界面 3.2.2 图片的随机生成
实现这个功能要分很多个步骤:
1. 程序运行时即载入游戏需要的六张图片。通过一个循环,将命名为[1-6].bmp的位图载入到数组的各个元素。这个数组的下标也是相应的从标志为1-6.这样后面通过将flag标志的值置为1-6判断,该载入哪张图片。具体载入图片的代码如下:
for i:=1 to 6 do
begin
fk[i]:=TBitmap.Create;//生成一个数组分别存放六张图片
fk[i].loadfromfile('pic\'+inttostr(i)+'.bmp');
end;
2. 当确认游戏开始时,通过画图过程完成图片生成,画图的过程代码如下
procedure TForm1.drawmap();
var i,j,k:integer;
begin
image1.Canvas.Rectangle(0,0,468,376);
//初始化设置画出一片空白区域
for i:=1 to 6 do//将给二组数组相关元素赋1-6的值,以方便画出相应图
for j:=1 to 10 do
begin
randomize();
repeat
k:=random(6)+1; //将生成随机数加1(为了防止0生成)
flag[i,j]:=k;
上一篇:
毕设论文_基于WMI的WindoWs远程监控(VC++)7-8-23(2003doc)
下一篇:
酒店管理系统毕业论文