回合制Word下载.docx
- 文档编号:17211186
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:13
- 大小:366.99KB
回合制Word下载.docx
《回合制Word下载.docx》由会员分享,可在线阅读,更多相关《回合制Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
首先我们创建一个简单的游戏场景,如图所示:
在这个游戏场景中,我们的Samuzai将作为我们的游戏主角,而Gorilla将作为我们的敌人。
我们分别为它们创建对应的脚本文件Player.cs、EnemyAI.cs以及用于全局控制的TurnGame.cs。
Player.cs脚本负责玩家相关逻辑的实现,EnemyAI脚本负责敌人AI的相关逻辑,TurnGame脚本负责回合制游戏的核心部分。
好了。
我们下面来一起来看这三部分的脚本代码:
首先在Player脚本中,我们需要做三件事情:
(1)显示和隐藏玩家的操作界面、
(2)玩家攻击招式的设定、(3)玩家生命值的设计。
我们来一起看代码:
[csharp]
viewplaincopy
1.using
UnityEngine;
2.using
System.Collections;
3.
4.public
class
Player
:
MonoBehaviour
{
5.
6.
//定义玩家最大生命值为100
7.
public
int
HP=100;
8.
//是否等待玩家输入
9.
bool
isWaitPlayer=true;
10.
11.
//当前回合数
12.
private
index=1;
13.
//动画组件
14.
Animation
mAnimation;
15.
16.
void
Start
()
17.
18.
mAnimation=GetComponent<
Animation>
();
19.
}
20.
21.
//受到伤害
22.
OnDamage(int
mValue)
23.
24.
HP-=mValue;
25.
26.
27.
OnGUI()
28.
29.
//如果处于等待玩家输入状态,则显示操作窗口
30.
if(isWaitPlayer)
31.
32.
GUI.Window(0,new
Rect(Screen.width/2+150,Screen.height/2-150,200,200),InitWindow,"
请选择技能或仙术"
);
33.
34.
35.
36.
InitWindow(int
ID)
37.
38.
39.
if(GUI.Button(new
Rect(0,20,200,30),"
御剑术"
))
40.
41.
mAnimation.Play("
Attack"
42.
//将操作权交给敌人
43.
isWaitPlayer=false;
44.
Debug.Log("
在第"
+index+"
回合:
主角使用了御剑术"
45.
index+=1;
46.
47.
48.
Rect(0,50,200,30),"
万剑诀"
49.
50.
51.
52.
53.
主角使用了万剑诀"
54.
55.
56.
Rect(0,80,200,30),"
仙风云体"
57.
58.
59.
60.
61.
主角使用了仙风云体"
62.
63.
64.
Rect(0,110,200,30),"
化相真如"
65.
66.
67.
68.
69.
主角使用了化相真如"
70.
71.
72.
Rect(0,140,200,30),"
酒神"
73.
74.
75.
76.
77.
主角使用了酒神"
78.
79.
80.
81.}
在该脚本中,我们设定角色的最大生命值为100,然后通过一个bool类型的isWaitPlayer来判断是否处于等待玩家执行下一步行动的状态,如果处于改状态则显示操作界面,这样玩家就可以施展不同的技能,这里我们使用了系统的GUI系统。
最终实现的效果是类似于仙剑奇侠传游戏的效果,如图:
接下里我们来讲解敌人AI的脚本,敌人需要在玩家执行结束后随机进行一个操作,所以这里需要用到概率,我们一起来看脚本:
EnemyAI
//定义敌人最大生命值为100
Start()
mAnimation=GetComponentInChildren<
///
<
summary>
执行敌人的AI算法
/summary>
StartAI()
if(!
isWaitPlayer)
if(HP>
20)
//80%的攻击招式一
if(Random.Range(1,5)%5!
=1)
敌人使用了攻击招式一"
Howl"
//在这里加上特效和伤害
//20%的攻击招式二
else
敌人使用了攻击招式二"
}else
switch(Random.Range(1,5)%5)
case
0:
敌人使用了攻击招式三"
break;
1:
敌人使用了攻击招式四"
2:
敌人使用了攻击招式五"
78.}
类似地,我们在这里使用一个bool类型的变量isWaitPlayer来表示敌人是否处于等待玩家执行操作的状态,如果该值为false,则表明玩家已经执行完操作,此时敌人应该按照AI算法来实现随机的攻击,其中概率部分的代码如下:
1.Random.Range(1,5)%5!
=1
这一句代码表示80%的概率,因为只有Random.Range(1,5)返回值为5时结果才会为1。
如果我们以后希望在游戏中为敌人增加概率,我们都可以使用这种方法。
游戏中使用概率的地方还是比较多的,比如在仙剑奇侠传游戏中的逃跑率、暴击率、避让率都是通过这种方式来实现的。
大家可能注意到了我在这两个脚本中所有技能或者招式都是使用了一个动画,这当然是为了简化程序,让我们专注于游戏的核心实现,这一点希望大家谅解啊,而在两个脚本中的回合数index主要是为了调试程序的方便,具体应用中可以不用这个变量。
好了,在介绍完玩家和敌人的脚本后,我们一起来看今天的核心脚本——TurnGame脚本:
TurnGame
回合制游戏战斗模式原型
说明:
本程序以最简单一对一回合制游戏为例,基于Unity3D游戏实现回合制游戏算法
如果需要实现多人对多人的回合制游戏算法,需要设计行动条算法
基本的思路是将游戏状态划分为三种状态:
1、我方角色生命值为0,游戏结束,玩家输
2、敌方角色生命值为0,游戏结束,玩家赢
3、双方生命值均不为0,则循环执行下列过程:
当当前操作状态为AI时,敌人根据AI算法逻辑行动
当当前操作状态为玩家时,根据玩家操作执行行动
//定义玩家及敌人
Transform
mPlayer;
mEnemy;
//定义玩家及敌人脚本类
playerScript;
enemyScript;
//默认操作状态为玩家操作
OperatorState
mState=OperatorState.Player;
//定义操作状态枚举
enum
Quit,//游戏结束
EnemyAI,//AI逻辑
Player//玩家逻辑
//获取玩家及敌人脚本类
playerScript=mPlayer.GetComponent<
Player>
enemyScript=mEnemy.GetComponent<
EnemyAI>
//延迟等待显示操作界面
IEnumerator
WaitUI()
yield
return
new
WaitForSeconds
(1);
enemyScript.isWaitPlayer=true;
//延迟等待
WaitAI()
WaitForSeconds(2.5F);
enemyScript.isWaitPlayer=false;
//为AI设计延迟时间,使其在我方行动结束后2.5F秒的时间内发起攻击
UpdateLater()
//敌人停止等待
//敌人执行AI
enemyScript.StartAI();
Update
//如果敌我双方有一方生命值为0,则游戏结束
if(playerScript.HP==0)
mState=OperatorState.Quit;
玩家输"
if(enemyScript.HP==0)
玩家赢"
81.
82.
switch(mState)
83.
84.
OperatorState.Player:
85.
//如果玩家操作结束,则立即隐藏操作界面,等待2秒钟后敌人AI操作开始
86.
playerScript.isWaitPlayer)
87.
88.
//让敌人等待2秒钟再发起攻击
89.
StartCoroutine("
UpdateLater"
90.
//执行完后等待玩家,5秒钟后显示操作界面,玩家可以继续操作
91.
WaitUI"
92.
mState=OperatorState.EnemyAI;
93.
94.
95.
OperatorState.EnemyAI:
96.
//如果敌人AI操作结束,则玩家开始操作
97.
if(enemyScript.isWaitPlayer)
98.
99.
//玩家操作
100.
playerScript.isWaitPlayer=true;
101.
102.
//操作完后执行AI
103.
Start
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 回合