一个战棋类小游戏的Delphi源码剖析
前言
本次介绍的是一款轻量级的,适合闲暇时间来一局的战棋类小游戏的Delphi 源码,游戏的策略模式完全参考三国英杰传。程序采用Delphi7设计制作,后期转至Delphi2010平台。
一、游戏策划
1、角设定
拟采用比较有特的武将共计16名,每个武将可选择骑兵、步兵或弩兵。不同武将搭配不同兵种,可产生各种组合变化。以下基础数据需要在程序设计开始之前就做好设定。
2、玩法设定
武将的武力值决定攻击,统帅值决定防御,智力值决定策略攻防能力。兵种影响攻击、防御和敏捷,不同兵种的物理攻击相互克制,骑兵克步兵,步兵克弩
兵,弩兵克骑兵。敏捷影响闪避的成功率,闪避成功,则伤害减半,士气不减。士气对物理攻防有较大影响,士气低于10则混乱,混乱后不能物理攻击,但可以计谋攻击。休息可以恢复士气和策略值。
3、单机模式
考虑到战棋游戏的部队(棋子)数量太少则趣味性不足,数量太多则过于复杂,因此采用随机8V8的模式,我方武将和电脑方武将均不重复。战后会统计得分,评分方式为积分乘难度系数。
4、对战模式
对战模式可实现局域网联机对战,随机产生8名武将,双方武将相同,但可选择不同的兵种进行对战。游戏免费源码分享网站
二、程序构架
1、主窗体(战棋画面呈现)
2、武将选择窗体
3、公用单元(定义核心类)
4、范围和显示单元
5、动画线程单元
6、AI行动单元
7、得分统计窗体
8、资源文件(存储武将头像和动画图片)
9、数据库文件(存储武将数据和兵种数据)
三、程序设计流程
1、公共单元:此模块为整个程序的核心单元,因此最先制作。1)定义TArmy类,用于存放部队属性和方法
2.
3.THero = record
4. ID: Integer;
5. Name: string;
6. Strength: Integer;
7. Intelligence: Integer;
8. Leadership: Integer;
10.
11.T Race = record
12. ID: Integer;
13. Name: string;
14. Atkadd: Integer;
15. Defadd: Integer;
16. Spdadd: Integer;
17. Move: Integer;
18.e nd;
19.
20.T Army = class
21. Hero: THero;
22. Race: TRace;
23. Head: string;
24. ID: Integer;
25. Level: Integer;
26. Exp: Integer;
27. Volume: Integer;
28. Courage: Integer;
29. Attack: Integer;
30. Defence: Integer;
31. Speed: Integer;
32. PlanAtkdef: Integer;
33. Plan: Integer;
34. Done: Boolean;
35. InMyTeam: Boolean;
36.p rivate
37.function SetAtkdef(Value: Integer): Integer;
38.procedure SetArmy;
39.procedure Levelup;
40.p ublic
r);
42.function SetExp(expadd: Integer): Boolean;
43.function SetVolume(hurt: Integer): Boolean;
44.function SetCourage(courhurt: Integer): Boolean;
45.procedure SetPlan(planhurt: Integer);
46.e nd;
47.
48.c onst
49.{ 兵种相克 }
50. RACEVS: array[1..3,1..3] of Single = ((1.0,1.2,0.8),
51. (0.8,1.0,1.2),
52. (1.2,0.8,1.0));
53.
54.v ar
55. carmy, earmy: TArmy;
56. teamA, teamB: array[0..7] of TArmy;
{ 定义方法}
teger);
2.begin
3. Hero:=newHero;
4. Race:=newRace;
5. Head:='hero' + formatfloat('00', hero.ID);
6. Level:=1 + gdLevel;
7. Exp:=0;
8. Volume:=5000;
9. Courage:=100;
10. SetArmy;
11. Plan:=SetAtkdef(hero.Intelligence)-150;
12. Done:=false;
13.e nd;
14.
15.f unction TArmy.SetAtkdef(Value: Integer): Integer;
16.b egin
17.if value > 90then
18. result:=300-(100-value)*4
19.else if value > 70then
20. result:=260-(90-value)*2
21.else
22. result:=220-(70-value);
23.e nd;
24.
25.p rocedure TArmy.SetArmy; //最大值均为600, 降低士气对攻防的影响
26.b egin
27. Attack:=SetAtkdef(hero.Strength)+Race.Atkadd*5*(level+5)
28. +trunc(Courage/2)-50;
29. Defence:=SetAtkdef(hero.Leadership)+Race.Defadd*5*(level+5)
30. +trunc(Courage/2)-50;
31. Speed:=Race.Spdadd*5*(level+20);
32. PlanAtkdef:=SetAtkdef(hero.Intelligence)*2;
33.e nd;
34.
35.p rocedure TArmy.Levelup;
36.b egin
37. inc(level);
38. SetArmy;
39.e nd;
40.
41.f unction TArmy.SetExp(expadd: Integer): Boolean;
42.b egin
43. result:=false;
44. inc(exp, expadd);
45.if (exp >= 100) and (level < 10) then
46.begin
47. exp:=exp-100;
48. levelup;
49. result:=true;
51.if level = 10then
52. exp:=100;
53.e nd;
54.
55.f unction TArmy.SetVolume(hurt: Integer): Boolean;
56.b egin
57. dec(volume, hurt);
58. volume:=Min(volume, 5000);
59.if volume > 0then
60. result:=false
61.else
62.begin
63. volume:=0;
64. result:=true;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论