游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4582|回复: 8

计算部队可移动范围的方法

[复制链接]

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2005-12-7 12:13:00 | 显示全部楼层 |阅读模式
计算部队可移动范围的方法:
我们先看一下部队移动的需求(有点类似霸王大陆)。
1.        每个将领都有一个行动力
2.        每当将领移动一格的时候,会根据移动的地形扣除部队的行动力。
3.        每个部队都有一个行动力的基准值,每个回合行动力都可以恢复到该基准值
4.        行动力的基准值跟将领的属性有关
5.        部队在上个回合如果没有进行任何行动就直接待机,则下个回合行动力可以增加50%

Ok需求确定后我们看看如何通过计算机程序来实现这些东西。部队的移动力属是要增加的,根据地形的不同,移动时扣除的移动力也不同,这个也很好解决,基准值也就是一个简单的函数而已。现在关键的问题是如何在地图上搜索出部队可以移动到的位置?
如果大家有学习过算法的,一定会很容易的想到,这个问题和填色问题(给一个封闭的区域内填入颜色)类似,所不同的是,我们填色的范围有限,必须跟行动力关联起来,同时填色的起点是我们将领当前所处的位置。让我们先看一下填色问题的流程:
1.        把起点坐标放入队列A
2.        判断队列是否为空,为空则退出
3.        从队列A里取出一个坐标,并判断它周围的四个点是否可以被填色(Map[][] = 0)
4.        如果可以填色,则把该点加入队列A,并给该点填色(Map[][] = 1)
5.        重复2~4步,直到队列为空退出

我们的部队移动算法的描述:
1.        把部队的起点坐标放入队列A
2.        判断队列是否为空,为空则退出
3.        从队列A里取出个坐标,并判断四周是否可以移动
a)        可以移动,根据地形减去行动力
b)        如果新坐标不在队列B里,则队列B中加入坐标以及新行动力
4.        重复2~3,直到队列A为空退出
队列B就是我们需要的部队可以移动到的地方。今后的寻找对方部队可以攻击、可用计谋的时候,都可以使用上面的寻找算法

让我们看一下具体的程序:
                public ArrayList 移动列表(C部队 部队)
                {
                        ArrayList 返回列表 = new ArrayList();
                        Queue 搜索队列 = new Queue();
                        Point [] Four_point = {new Point(1, 0), new Point(0, 1), new Point(-1, -1), new Point(0, -1)};

                        搜索队列.Enqueue(new 移动位置属性(部队.x, 部队.y, 部队.行动力));
                        移动位置属性 point = (移动位置属性)搜索队列.Dequeue();
                        while(point != null)
                        {
                                foreach(Point pt in Four_point)        //        判断四个方向是否可以移动
                                {
                                        int new_x = point.x + pt.x;
                                        int new_y = point.y + pt.y;
                                        if (this.战场.是否可以移动(new_x, new_y, point.行动力))
                                        {
                                                Point pt_new = new Point(new_x, new_y);
                                                bool flag = false;
                                                foreach(Point pt_list in 返回列表)
                                                        if (pt_list.Equals(pt_new))
                                                        {
                                                                flag = true;
                                                                break;
                                                        }
                                                if (!flag)
                                                {
                                                        返回列表.Add(pt_new);
                                                        int 新行动力 = point.行动力 - 战场.地图[new_x, new_y].类型.行动力;
                                                        搜索队列.Enqueue(new 移动位置属性(new_x, new_y, 新行动力));
                                                }

                                        }
                                }
                                point = (移动位置属性)搜索队列.Dequeue();
                        }

                        return 返回列表;
                }

2

主题

523

帖子

523

积分

高级会员

Rank: 4

积分
523
发表于 2005-12-8 08:54:00 | 显示全部楼层

Re:计算部队可移动范围的方法

为什么这样的纯技术贴没人讨论?
反而那些没意义的争论贴很火?

22

主题

209

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2005-12-8 10:01:00 | 显示全部楼层

Re:计算部队可移动范围的方法

我的部下全都是美女 26----50

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-12-8 12:24:00 | 显示全部楼层

Re:计算部队可移动范围的方法

fix a bug:
在 point = (移动位置属性)搜索队列.Dequeue();
前面加一个判断
if (搜索队列.Count < 1)
    break;
不然程序会抛出一个异常

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-12-9 12:22:00 | 显示全部楼层

Re:计算部队可移动范围的方法

还是得fix一个bug,在Four_point 的初始化错误了一个数据,并且重新调整了一下程序的结构.
                public ArrayList 移动列表(C部队 部队)
                {
                        ArrayList 返回列表 = new ArrayList();
                        Queue 搜索队列 = new Queue();
                        Point [] Four_point = {new Point(1, 0), new Point(0, 1), new Point(-1, 0), new Point(0, -1)};

                        搜索队列.Enqueue(new 移动位置属性(部队.x, 部队.y, 部队.行动力));
                        while(搜索队列.Count > 0)
                        {
                                移动位置属性 当前位置 = (移动位置属性)搜索队列.Dequeue();
                                foreach(Point pt in Four_point)        //        判断四个方向是否可以移动
                                {
                                        int new_x = 当前位置.x + pt.x;
                                        int new_y = 当前位置.y + pt.y;
                                        if (this.战场.是否可以移动(new_x, new_y, 当前位置.行动力))
                                        {
                                                Point pt_new = new Point(new_x, new_y);
                                                bool flag = false;
                                                foreach(Point pt_list in 返回列表)
                                                        if (pt_list.Equals(pt_new))
                                                        {
                                                                flag = true;
                                                                break;
                                                        }
                                                if (!flag)
                                                {
                                                        返回列表.Add(pt_new);
                                                        int 新行动力 = 当前位置.行动力 - 战场.地图[new_x, new_y].类型.行动力;
                                                        搜索队列.Enqueue(new 移动位置属性(new_x, new_y, 新行动力));
                                                }

                                        }
                                }
                        }

                        return 返回列表;
                }

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-12-9 14:04:00 | 显示全部楼层

Re:计算部队可移动范围的方法

Private Sub DDKEY1_Click()
Call Form1.BCOMMAND               '调动前关闭屏幕上的可操作按钮.
Form1.Show                  
Form1.Timer7.Enabled = True    '开启调动动画子程序
End Sub

Private Sub DDKEY2_Click()
YE4 = YE4 + 1                            '如果不调动,被扣掉的做事加回去
WINDD.Visible = False                   '关闭调动窗口
Form1.Show                                '显示主窗口
End Sub

Private Sub Timer7_Timer()
Call DIAODONG                             '调动动画子程序
If AX = IX And BX = IY Then          ' AX,BX城市A的坐标 , IX,IY城市B的坐标
If DDA = 1 Then    '江州调动到成都完毕
A3 = A3 + WINDD.HScroll1.Value: A9 = A9 + WINDD.HScroll2.Value: A10 = A10 + WINDD.HScroll3.Value
B3 = B3 - WINDD.HScroll1.Value: B9 = B9 - WINDD.HScroll2.Value: B10 = B10 - WINDD.HScroll3.Value
UPDT = 1:  KA(0).Caption = "成都": Call BCOMMAND
End If
If DDB = 1 Then    '汉中调动到成都完毕
A3 = A3 + WINDD.HScroll1.Value: A9 = A9 + WINDD.HScroll2.Value: A10 = A10 + WINDD.HScroll3.Value
L3 = L3 - WINDD.HScroll1.Value: L9 = L9 - WINDD.HScroll2.Value: L10 = L10 - WINDD.HScroll3.Value
UPDT = 1:  KA(0).Caption = "成都": Call BCOMMAND
End If
............................

Public Sub DIAODONG()
If BZ = 1 Then sndPlaySound "MUS\HORSE01.wav", SND_ASYNC: BZ = 10       '调动用
If BZ = 8 Then sndPlaySound "MUS\HORSE01.wav", SND_ASYNC: BZ = 11       '进攻用
If AX < IX Then AX = AX + M: FX = 1        调动的动画动作
If BX < IY Then BX = BX + M: FX = 1
If AX > IX Then AX = AX - M: FX = 2
If BX > IY Then BX = BX - M: FX = 2
Call JIJIE                                                    '季节变化
'FX1=调动的动画,  FX2等于进攻的动画
If BZ = 10 And FX = 1 Then                       '画动画
If BZ = 10 And FX = 2 Then                       '画动画
If BZ = 11 And FX = 1 Then                       '画动画
If BZ = 11 And FX = 2 Then                       '画动画
.............................

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-12-9 18:10:00 | 显示全部楼层

Re:计算部队可移动范围的方法

请问你调动12个城市用了多少行代码?

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-12-9 21:03:00 | 显示全部楼层

Re:计算部队可移动范围的方法

很少,平均一个城市10-13行, 应当说是300行不到包含调动和进攻的过程操作和动画。

不过
IF  THEN
A=1
B=1
END IF
我当4行算的,别人说是一行。

87

主题

790

帖子

806

积分

高级会员

Rank: 4

积分
806
QQ
发表于 2005-12-9 22:17:00 | 显示全部楼层

Re: 计算部队可移动范围的方法

希望夜荷能早点把整个游戏做出来,部分简单毕竟不代表整体简单的.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 21:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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