标题: 第一章 部队, 战略三国的编程阶段性总结一
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-3-2 18:38 资料 个人空间 短消息 只看该作者
目录
1.1 格子
1.2 格位
1.3 部队的移动


顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-3-2 18:39 资料 个人空间 短消息 只看该作者
1.1 格子
在讲之前,先讲下有关的背景。
开发游戏名:战略三国
本章所讨论游戏类型:战棋
开发语言:VB6
分辨率:800*600
虽然说这是用VB开发的,但是游戏制作的思想是相通的。VB可以,其它语言同样是可以的。
在战棋模式下,格子无疑是个非常关键的要素。那么格子是怎么规定出来的呢?

图1.1
如图1.1,我们可以看出,格子就是由全部或部分窗体界面进行横纵向分割而成的。
在VB中窗体有两个属性,height和width,height在本章中称为窗高,用Fh表示,width称为窗宽,用Fw表示。在800*600分辩率下,Fh和Fw的值分别为9000、12000。在本游戏中为了方便研究,将进行战棋战斗的界面范围的长宽(以VB的Fh和Fw为标准)规定分别为9000、9000。
我们知道格子是分割而成的。我们把横向分割战棋战斗的界面范围的线称为横割线。纵向分割战棋战斗的界面范围的线称为纵割线。因为在战棋游戏中格子的大小需要一致,所以横割线和纵割线具有周期性。我们把从第二条的割线开始,这个割线与上一个割线的差称为格差。纵向的格差称为格高,横向的格差称为格宽。
我们用g表示格子,gw、gh分别表示格宽和格高,由于格子的大小是一定的,所以gw、gh是个常量。(在程序中在前面加C表示常量,在本章中不加C)
既然gw、gh、Fw、Fh的值都是个常量,那么横向和纵向的格数也就确定了。横向的格数叫做横格数(即横格最大值)用gxmax表示,纵向的格数叫做纵格数(即纵格最大值)用gymax表示,因此我们得到
gxmax=Fw/gw
gymax=Fh/gh
思考:
一个640*480分辨率情况下的窗体,75%Fw,100%Fh,如果要使gxmax和gymax相等,需满足什么条件?


顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-3-5 10:45 资料 个人空间 短消息 只看该作者
1.2 格位
一、格位
上一节我们引入了gxmax和gymax。这样一来我们就组成了一个战斗场面的坐标系统。
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
如上图,X表示一个格子。从中我们可以看出gxmax=12,gymax=12。像上图这样表示格的分布情况的,叫做格图
在格图中每个格子都有一个相应的坐标位置。因此我们规定,格纵(gy)就是格子从上往下依次递增(1,2,3...gymax)的值。格横(gx)就是格子从左往右依次递增(1,2,3...gxmax)的值。下图一个下划线里的值表示一个格子。
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
如上就是格图中各格子所对应的格横。
1  1  1  1  1  1  1  1  1  1  1  1
2  2  2  2  2  2  2  2  2  2  2  2
3  3  3  3  3  3  3  3  3  3  3  3
4  4  4  4  4  4  4  4  4  4  4  4
5  5  5  5  5  5  5  5  5  5  5  5
6  6  6  6  6  6  6  6  6  6  6  6
7  7  7  7  7  7  7  7  7  7  7  7
8  8  8  8  8  8  8  8  8  8  8  8
9  9  9  9  9  9  9  9  9  9  9  9
10 10 10 10 10 10 10 10 10 10 10 10
11 11 11 11 11 11 11 11 11 11 11 11
12 12 12 12 12 12 12 12 12 12 12 12
如上就是格图中各格子所对应的格纵。
由格横和格纵组成用来表示格的位置就是格位(gp)。格位的表示法如下:
(gx,gy)
二、位码
XXXXXaXXXXXX
XXXXXbXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXc
XXXXXXXXXXXX
XXXXXXXXXXXX
由前面所讲的可知,a的格位是(1,6),b的格位是(2,6),c的格位是(12,10)。表示格位以后可以简单表示为:
a(1,6) b(2,6) c(12,10)
为了在程序中更好的传输格位信息,因此规定了位码(pc),其格式是
"x" + 两位的gx字符 + "y" + 两位的gy字符,如果gx或gy不满两个字符,则在其前面添"0"。上面的a,b,c用位码表示如下:
a:x01y06
b:x02y06
c:x12y10
三、格位的属性
在战棋游戏中有的格子可以走,有的格子不能走,而不能走有被我方占据,被敌方占据,由于某种原因(比如:地形)而不能走三种。这样一来格子是否能走就有四种属性,用符号表示如下:
格子可以走:0
格子被我方占据:w
格子被敌方占据:d
由于某种原因不能走:1
这样程序中利用格位的属性就可以判定这个格子是否能走,从而解决了几个部队重叠在一格格子里的问题。
格位的属性通常可以和格图结合来表示整个战斗场面每个格子是否能走的情况,如下图:
000000000000
000000000000
000000000000
000000000000
00000w000000
0000wdw00000
00000w000000
000000000000
000000000000
000000000000
000000000000
000000000000
这个图表示我们四个部队围攻一个敌方部队的场景。也就说明了:
x06y06格子的属性是d
x06y05格子的属性是w
x05y06格子的属性是w
x07y06格子的属性是w
x06y07格子的属性是w
关于上述格子的属性可以简单表示为:
gv(6,6)="d"
gv(6,5)="w"
gv(5,6)="w"
gv(7,6)="w"
gv(6,7)="w"
思考:
000000001000
000000001000
000000001000
000000001000
000000001000
000000001000
000000001000
000000001000
000000001000
000000001000
000000000000
000000001000
以上格图表明了什么?
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-3-5 14:40 资料 个人空间 短消息 只看该作者
总结
格子就是由全部或部分窗体界面进行横纵向分割而成的。横向分割战棋战斗的界面范围的线称为横割线。纵向分割战棋战斗的界面范围的线称为纵割线。
纵向的格差称为格高,横向的格差称为格宽。横向的格数叫做横格数(即横格最大值),纵向的格数叫做纵格数(即纵格最大值)。
gxmax=Fw/gw
gymax=Fh/gh
表示格的分布情况的叫做格图。格纵(gy)就是格子从上往下依次递增的值。格横(gx)就是格子从左往右依次递增的值。由格横和格纵组成用来表示格的位置就是格位。
"x" + 两位的gx字符 + "y" + 两位的gy字符,如果gx或gy不满两个字符,则在其前面添"0"。上述所说的字符串构成方式就是位码
四种格位的属性:格子可以走:0;格子被我方占据:w;格子被敌方占据:d;由于某种原因不能走:1;
部队在格子中的格横叫做部横(bx),部队在格子中的格纵叫做部纵(by)。部队将来的部横与部队的现在部横之差为部横对位(bxm),部队将来的部纵与部队现在的部纵之差为部纵对位(bym)。部横对位和部纵对位统称部对位(bm)。
"x" + 三个字符的bxm + "y" + 三个字符的bym,如果bxm或bym是正数则在其前面加“+”,bxm或bym不足三位则在其绝对值前加"0"。上述所说的字符串构成方式就是部码。
对于gx来说,gx加上一个小于0的数,则表示部队在敌方左面。gx加上一个大于0的数,则表示敌方右面。gx加上一个等于0的数,则表示格横不变。对于gy来说,gy加上一个小于0的数,则表示部队在敌方上面。gy加上一个大于0的数,则表示敌方下面。gy加上一个等于0的数,则表示格纵不变。
一个部码指示着部队移动的大小和方向。一个部码指示部对的将来位置有且只有一个。反过来将来位置所对应的部码也是有且只有一个。
将所有能移动位置转化成部码。依次储存在一个数据库中,一个数字对应一个部码,这样能方便调取。这个数字我们称为部序。部序与部码的对应关系叫做部应。把储存部码数据库当中的部序称为部码部序。储存部序数据库当中的部序称为调用部序。
一种兵种就会有一组的调用部序,由于是依次存入的,又有可移动的格子数,这样我们就可以从1到可移动的格子数作为调用兵序,从储存该兵种部序的数据库取出部码部序,再从部码数据库取出部码,游戏中再根据部队的位置和部码显示出相应的移动范围。当我们鼠标单击可移动格子当中的一个格子,程序就能立刻得到部码,根据部码就能很容易的实现部队移动。
顶部
性别:男-离线 十年一剑

Rank: 7Rank: 7Rank: 7Rank: 7
组别 校尉
级别 右将军
功绩 11
帖子 1123
编号 28462
注册 2004-12-21
来自 福建晋江市


发表于 2005-3-5 18:06 资料 主页 文集 短消息 只看该作者 ICQ 状态
顶部
性别:未知-离线 三杯倒

Rank: 8Rank: 8
组别 校尉
级别 平南将军
功绩 20
帖子 2020
编号 28845
注册 2004-12-26


发表于 2005-3-5 21:59 资料 主页 文集 短消息 只看该作者
老大,请问一下,你是在教我们做游戏还是什么?
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-2-5 16:40
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.013962 second(s), 8 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP