游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8331|回复: 23

三国志姜维传设计思想(部分内政程序代码加注释)

[复制链接]

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-11-26 15:52:00 | 显示全部楼层 |阅读模式
三国志姜维传设计思想(部分内政程序代码加注释)
如果看不清楚请COPY到你的记事本上,有些语句长。

这里没有公布战争部分和8个TIMER是怎么工作的代码,因为这个是属于我自己的程序结构,
我只大概写一下内政程序是怎么工作的,我的V1.68版程序目前总长3600行。


'AGn=1 城市属于蜀国,AGn=2城市属于魏国  ,AGn=3 城市属于吴国

AG1 = 1                       '蜀国城市(游戏开始你只有一个城市)                     
AG6 = 2: AG7 = 2: AG8 = 2: AG9 = 2: AG10 = 2: AG11 = 2: AG12 = 2     '魏国城市        
AG2 = 3 AG3 = 3: AG4 = 3: AG5 = 3                                    '吴国城市

BZ = 0      '操作标志  =1:调动  =2:征兵  =3:施舍  =4:训练  =5:开垦  =6:奖赏  =7:交易   
UPDT=1      '你在哪个城市,如果=1,就是说你在成都,=2就是在江州...... 12个城市

YE1 = 234: YE2 = 5:  YE4 = 3       '游戏起始年月, 每月可以做3件事

--------------------------------------------------------------------------------

'//////开垦程序1 ////////
Private Sub CM1_Click()
If UPDT = 1 And AG1 <> 1 Then Call NOMYGG: GoTo XXX1   '不是自己的城市不能操作(12个判断)
If UPDT = 2 And AG2 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 3 And AG3 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 4 And AG4 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 5 And AG5 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 6 And AG6 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 7 And AG7 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 8 And AG8 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 9 And AG9 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 10 And AG10 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 11 And AG11 <> 1 Then Call NOMYGG: GoTo XXX1
If UPDT = 12 And AG12 <> 1 Then Call NOMYGG: GoTo XXX1

BZ = 5                '开垦按钮操作标志
BitBlt Me.hDC, 477, 4, 200, 164, SJ(2).hDC, 0, 0, SRCCOPY        '这是画图的
Call TONGYONG6        
XXX1:
End Sub
--------------------------------------------------------------------------------

'/////////////游戏者----征兵,开垦,训练,交易,奖赏,施舍 按钮公用子程序//////////////
Sub TONGYONG6()
Call ONE     ''重画和刷新城市
If YE4 <= 0 Then YE4 = 0: BitBlt Me.hDC, 477, 4, 200, 164, SJ(1).hDC, 0, 0, SRCCOPY: Call DCOMMAND
If UPDT = 1 And AG1 = 1 And YE4 > 0 Then Call XIANSHI12: CITY1.Visible = True      '游戏者在成都行使指令
If UPDT = 2 And AG2 = 1 And YE4 > 0 Then Call XIANSHI12: CITY2.Visible = True      '游戏者在江州行使指令
If UPDT = 3 And AG3 = 1 And YE4 > 0 Then Call XIANSHI12: CITY3.Visible = True      '游戏者在永安行使指令
If UPDT = 4 And AG4 = 1 And YE4 > 0 Then Call XIANSHI12: CITY4.Visible = True      '游戏者在长沙行使指令
If UPDT = 5 And AG5 = 1 And YE4 > 0 Then Call XIANSHI12: CITY5.Visible = True      '游戏者在江夏行使指令
If UPDT = 6 And AG6 = 1 And YE4 > 0 Then Call XIANSHI12: CITY6.Visible = True      '游戏者在建业行使指令
If UPDT = 7 And AG7 = 1 And YE4 > 0 Then Call XIANSHI12: CITY7.Visible = True      '游戏者在徐州行使指令
If UPDT = 8 And AG8 = 1 And YE4 > 0 Then Call XIANSHI12: CITY8.Visible = True      '游戏者在陈留行使指令
If UPDT = 9 And AG9 = 1 And YE4 > 0 Then Call XIANSHI12: CITY9.Visible = True      '游戏者在许昌行使指令
If UPDT = 10 And AG10 = 1 And YE4 > 0 Then Call XIANSHI12: CITY10.Visible = True   '游戏者在洛阳行使指令
If UPDT = 11 And AG11 = 1 And YE4 > 0 Then Call XIANSHI12: CITY11.Visible = True   '游戏者在长安行使指令
If UPDT = 12 And AG12 = 1 And YE4 > 0 Then Call XIANSHI12: CITY12.Visible = True   '游戏者在汉中行使指令
Me.Refresh
End Sub
Sub XIANSHI12()  '显示取消指令按钮和12个城市的名字
CM10.Visible = True: BitBlt Me.hDC, 681, 173, 118, 320, CITY12A.hDC, 0, 0, SRCCOPY
End Sub

Sub NOMYGG()      '显示不是自己的国家
BitBlt Me.hDC, 477, 4, 200, 164, SJ(23).hDC, 0, 0, SRCCOPY: Me.Refresh
sndPlaySound "MUS\OVER.wav", SND_ASYNC
End Sub

-----------------------------------------------------------------------------------------

'单一城市举例(实际上这些程序还要和很多SUB子程序挂接)
Private Sub CITY1_Click()

If BZ = 8 Then                                         '进攻成都
IX = 60: IY = 256: PX = 1
Call BCOMMAND: Timer5.Enabled = True
If UPDT = 12 Then WARLB1.Caption = L3: ZZK1 = 1        '由汉中出发
If UPDT = 2 Then WARLB1.Caption = B3: ZZK2 = 1         '由江州出发
  WARLB2.Caption = A3
End If

If BZ = 1 Then          '调动物资
Form1.Hide: WINDD.Show: IX = 60: IY = 256
If UPDT = 2 Then       '江州到成都
  WINDD.HScroll1.Max = 0: WINDD.HScroll2.Max = 0: WINDD.HScroll3.Max = 0
  WINDD.Label1 = WINDD.HScroll1.Value: WINDD.HScroll1.Max = B3
  WINDD.Label2 = WINDD.HScroll2.Value: WINDD.HScroll2.Max = B9
  WINDD.Label3 = WINDD.HScroll3.Value: WINDD.HScroll3.Max = B10
DDA = 1                 '识别城市的指针
  End If
  If UPDT = 12 Then    '汉中到成都
  WINDD.HScroll1.Max = 0: WINDD.HScroll2.Max = 0: WINDD.HScroll3.Max = 0
  WINDD.Label1 = WINDD.HScroll1.Value: WINDD.HScroll1.Max = L3
  WINDD.Label2 = WINDD.HScroll2.Value: WINDD.HScroll2.Max = L9
  WINDD.Label3 = WINDD.HScroll3.Value: WINDD.HScroll3.Max = L10
DDB = 1                 '识别城市的指针
  End If
End If
'征兵
If BZ = 2 And A10 >= 1500 Then A10 = A10 - 1500: A3 = A3 + 500: SU1 = 0: sndPlaySound "MUS\HAPPY.wav", SND_ASYNC
If BZ = 3 And A6 < 100 And A9 >= 1000 Then A9 = A9 - 1000: A6 = A6 + 1: sndPlaySound "MUS\BELL2.wav", SND_ASYNC
'训练
If BZ = 4 And A11 < 100 Then
If A9 >= 100 Then A9 = A9 - 100          '训练每次扣粮100(12个城同)
A11 = A11 + Int(Rnd * 2): sndPlaySound "MUS\HORSE03.wav", SND_ASYNC
End If
'开垦
If BZ = 5 And A7 < 1000 Then
If A10 >= 50 Then A10 = A10 - 50         '开垦每次扣钱50(12个城同)
A7 = A7 + Int(Rnd * 3): sndPlaySound "MUS\COW01.wav", SND_ASYNC
End If
'奖赏
If BZ = 6 And A10 >= 200 Then A10 = A10 - 200: sndPlaySound "MUS\HAPPY.wav", SND_ASYNC
If BZ = 7 And A8 < 1000 Then A8 = A8 + Int(Rnd * 3): sndPlaySound "MUS\HAPPY.wav", SND_ASYNC
Call CMD1DATA
If YE4 > 0 Then YE4 = YE4 - 1        '每个月做一件事减1     
If YE4 <= 0 Then YE4 = 0             '=0就要到下个月才可以做事
End Sub

--------------------------------------------------------------------------------

'/////// 本月结束 /////////
Private Sub CM11_Click()
YE2 = YE2 + 1                                   '月加1
BZ = 0                                          '指针归零
SU1 = 1                                         '可以征兵
SU3 = 1                                         '可以打仗
MUS = 1                                         '打仗换音乐的开关
SND = 1                                         '声音开关
X1 = 240: Y1 = 320: XA = 1: XB = 1              '部队回到出发地
DDA = 0: DDB = 0
'季节变化
If YE2 = 1 Or YE2 = 2 Or YE2 = 3 Or YE2 = 4 Or YE2 = 5 Or YE2 = 6 Then BitBlt Me.hDC, 0, 0, 680, 493, CHUNTIAN.hDC, 0, 0, SRCCOPY   '切换春天背景
If YE2 = 7 Or YE2 = 8 Or YE2 = 9 Then BitBlt Me.hDC, 0, 0, 680, 493, XIATIAN.hDC, 0, 0, SRCCOPY                                     '切换夏天背景
If YE2 = 10 Or YE2 = 11 Or YE2 = 12 Then BitBlt Me.hDC, 0, 0, 680, 493, DONGTIAN.hDC, 0, 0, SRCCOPY
                                                                  
Call ONE    '重画和刷新城市
If YE2 = 12 Then sndPlaySound "MUS\BIRDS.wav", SND_ASYNC         '下一年开始  鸟叫

If YE2 = 4 Then                                 '台风(每年4月)
'////////////灾害概率1////////
YEON = 1     '区别灾害的指针
Call SUIJIZH     ‘灾害概率随机数发生子程序
sndPlaySound "MUS\WIND.wav", SND_ASYNC
End If

If YE2 = 10 Then                                 '水灾(每年10月)
'////////////灾害概率2////////
YEON = 2       '区别灾害的指针
Call SUIJIZH       ‘灾害概率随机数发生子程序
sndPlaySound "MUS\WATER.wav", SND_ASYNC
End If

If YE2 = 7 Then                                 '丰收和欠收(每年7月)
'////////////灾害概率3////////
YEON = 3       '区别灾害的指针
Call SUIJIZH        ‘灾害概率随机数发生子程序
sndPlaySound "MUS\HAPPY.wav", SND_ASYNC
End If

'-------------------敌国征兵(不是自己的国家)---------
If AG1 <> 1 Then A3 = A3 + Int(Rnd * 300)
If AG2 <> 1 Then B3 = B3 + Int(Rnd * 300)
If AG3 <> 1 Then C3 = C3 + Int(Rnd * 300)
If AG4 <> 1 Then D3 = D3 + Int(Rnd * 300)
If AG5 <> 1 Then E3 = E3 + Int(Rnd * 300)
If AG6 <> 1 Then F3 = F3 + Int(Rnd * 300)
If AG7 <> 1 Then G3 = G3 + Int(Rnd * 300)
If AG8 <> 1 Then H3 = H3 + Int(Rnd * 300)
If AG9 <> 1 Then I3 = I3 + Int(Rnd * 300)
If AG10 <> 1 Then J3 = J3 + Int(Rnd * 300)
If AG11 <> 1 Then K3 = K3 + Int(Rnd * 300)
If AG12 <> 1 Then L3 = L3 + Int(Rnd * 300)

'-------------------每过一年加粮食---------------
If YE2 > 12 Then             '过了12月才才可以
YE2 = 1: YE1 = YE1 + 1
A9 = A9 + Int(Rnd * 500): If A9 > 10000 Then A9 = 10000
B9 = B9 + Int(Rnd * 500): If B9 > 10000 Then B9 = 10000
C9 = C9 + Int(Rnd * 500): If C9 > 10000 Then C9 = 10000
D9 = D9 + Int(Rnd * 500): If D9 > 10000 Then D9 = 10000
E9 = E9 + Int(Rnd * 500): If E9 > 10000 Then E9 = 10000
F9 = F9 + Int(Rnd * 500): If F9 > 10000 Then F9 = 10000
G9 = G9 + Int(Rnd * 500): If G9 > 10000 Then G9 = 10000
H9 = H9 + Int(Rnd * 500): If H9 > 10000 Then H9 = 10000
I9 = I9 + Int(Rnd * 500): If I9 > 10000 Then I9 = 10000
J9 = J9 + Int(Rnd * 500): If J9 > 10000 Then J9 = 10000
K9 = K9 + Int(Rnd * 500): If K9 > 10000 Then K9 = 10000
L9 = L9 + Int(Rnd * 500): If L9 > 10000 Then L9 = 10000
End If

'后面的与此同类推
.........................
................

END SUB

7

主题

299

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2005-11-26 16:32:00 | 显示全部楼层

Re: 三国志姜维传设计思想(部分内政程序代码加注释)

好象在定义汇编变量

53

主题

419

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2005-11-26 19:00:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

难道如果100个城市你就用100个IF?
如果要编写射击游戏,子弹NPC满屏幕,你的就不能方便实现了

用楼上的方法你的程序不可能用3600行,精简一下吧
用数组还要少的多的多,效率也高得多,维护再开发也方便的多

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-11-26 19:07:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

'季节变化
'------------------------------------------------------------------------------------   
'If YE2 = 1 Or YE2 = 2 Or YE2 = 3 Or YE2 = 4 Or YE2 = 5 Or YE2 = 6 Then BitBlt Me.hDC, 0, 0, 680, 493, CHUNTIAN.hDC, 0, 0, SRCCOPY   '切换春天背景
'If YE2 = 7 Or YE2 = 8 Or YE2 = 9 Then BitBlt Me.hDC, 0, 0, 680, 493, XIATIAN.hDC, 0, 0, SRCCOPY                                     '切换夏天背景
'If YE2 = 10 Or YE2 = 11 Or YE2 = 12 Then BitBlt Me.hDC, 0, 0, 680, 493, DONGTIAN.hDC, 0, 0, SRCCOPY
'--------------------------------
if ye2 <= 6 then
        BitBlt Me.hDC, 0, 0, 680, 493, CHUNTIAN.hDC, 0, 0, SRCCOPY   '切换春天背景
If YE2 >= 7 and yE2 <= 9 Then
        BitBlt Me.hDC, 0, 0, 680, 493, XIATIAN.hDC, 0, 0, SRCCOPY                                     '切换夏天背景
If YE2 >= 10 Then
        BitBlt Me.hDC, 0, 0, 680, 493, DONGTIAN.hDC, 0, 0, SRCCOPY
                                                              
Call ONE    '重画和刷新城市
If YE2 = 12 Then sndPlaySound "MUS\BIRDS.wav", SND_ASYNC         '下一年开始  鸟叫
'-------------------------------------------------------------------
'If YE2 = 4 Then                                 '台风(每年4月)
'////////////灾害概率1////////
'YEON = 1     '区别灾害的指针             '作为系统的统一声明变量放到一起,方便调整
'Call SUIJIZH     ‘灾害概率随机数发生子程序
'sndPlaySound "MUS\WIND.wav", SND_ASYNC
'End If
'--------------------------------------------------------------------
If YE2 = 4 Then                                 '台风(每年4月)
Call SUIJIZH(YEON_TAIFENG)     ‘灾害概率随机数发生子程序  YEON_TAIFENG作为系统的统一声明变量放到一起,方便调整
sndPlaySound "MUS\WIND.wav", SND_ASYNC
End If

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2005-11-26 19:41:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

好强悍的代码~~~

1

主题

69

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2005-11-26 19:44:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

我是菜鸟
但是我晓得一个叫数组的东西和一个叫循环的方法

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
 楼主| 发表于 2005-11-26 21:24:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

回答各位的问题和疑问:

每个城市的资料和数据都不同,用A(N)=1的方法不可取,难道每个城市都一样数据吗?
A(1)=300,或A(2)=400,用循环和数组是不可能的,因为还有个城市协调关系,
我的每个城市独立的,况且我只公布的部分代码,核心部分要和这些变量配合,
这是我的写法,如果那么简单1000行那不是谁都可以写三国了,我现在为什么号称
VB三国策略第一,因为一般没写过大游戏的理论是不适合三国的,或者这里的高手
写个两三个城市的例子就可以证明了,我3600行程序里包含很多长语句,要是独立开写,
要5000以上,写三国没有几万行是不行的,不过我这个游戏5000行结束。
我可以说写这种游戏不但需要好的美工和策划,程序的核心也是最重要的。

回答6楼的问题:你并不了解我的程序,我的子程序是很短的。
Call SUIJIZH (这个子程序只有12行,12个随机数是完全不同)

Sub SUIJIZH()                   '随机灾害
ZH=10
ARD1 = Int(Rnd * ZH)
ARD2 = Int(Rnd * ZH)
ARD3 = Int(Rnd * ZH)
ARD4 = Int(Rnd * ZH)
ARD5 = Int(Rnd * ZH)
ARD6 = Int(Rnd * ZH)
ARD7 = Int(Rnd * ZH)
ARD8 = Int(Rnd * ZH)
ARD9 = Int(Rnd * ZH)
ARD10 = Int(Rnd * ZH)
ARD11 = Int(Rnd * ZH)
ARD12 = Int(Rnd * ZH)
Timer2.Enabled = True   '没办法只能把TIMER用法放出来了,这里是CALL 真正的主程序
End Sub

另外季节的切换只用3句,这不能再少了,除非RND季节用一句(假)?
我看过楼上有人的提那种写法,要1万行以上,我是3600行,三国游戏不是一个城市,
是一个多城市工作的程序,我目前的程序无论在扩充还是精简上都很方便,有清晰的结构,
虽然看起来变量有点乱,只需要改变某个变量的值就可以改变游戏的功能,
比如BZ可以=1也可以等于100,这是我程序的扩充性,
游戏里你可以当任何国家的君主,也可以开始选择任何城市做领土,只需要改动一个数字,
AG10=1那长安就是我的城市了,如果AG10=3那就是别人的城市,我游戏开始可以设置选择游戏难度和选择君主,城市等,因为我做的是姜维传,所以开始肯定是蜀国在成都,
还有诸如打仗扣兵,城市防御,攻城难度等等等都是活动变量,在游戏开头可以自由更改,
一些朋友提的建议很好,但在不了解我程序结构的同时用你们的方法套肯定是不行的。

我的程序并不长,另外很多是动画和画图用的程序。

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2005-11-26 23:34:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

至少楼主贴出来的代码部分是完全可以通过使用数组大大简化的。

另:一看到那么多的Goto语句,我就想起了当年在文曲星上编程的经历……

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
 楼主| 发表于 2005-11-26 23:44:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

程序不想改了,运行起来没问题就好了。

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2005-11-29 12:16:00 | 显示全部楼层

Re:三国志姜维传设计思想(部分内政程序代码加注释)

我不对代码的质量表示意见,只是感觉你的代码行数计算方法有点不一样
例如:
If UPDT = 9 And AG9 <> 1 Then Call NOMYGG: GoTo XXX1
这样的程序,通常的做法是折行编辑如:
If UPDT = 9 And AG9 <> 1 Then
Call NOMYGG: GoTo XXX1
所以你的3600行程序,可能在计算上有误吧.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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