大家好,我是老肉。梦想成为一名游戏策划的我,在上个月构想了一款Demo,而为了提升可行性和我的程序思维,我打算先使用纯程序的方式实现基础玩法,不在一开始就接入unity引擎。所以就先分享一下这次最基础的纯程序版本。但是说实话做的有很多问题,很抽象,然后有影响平衡性的bug存在...不过,作为一次不错的尝试,也是值得分享出来的。
希望我和GPT的配合也能越来越熟练吧,现在还是有沟通问题,我需要亲自修BUG。
P.S.我用的C#,因为这样子以后更好接入Unity。
关于即时对砍
直接上来介绍一下游戏循环:
-
进入战斗
玩家和史莱姆开始战斗,游戏将显示双方的状态信息(如生命值、攻击力等)。 -
时间流逝与操作
时间在游戏中以固定的步长流逝,玩家和史莱姆的时间流逝是同步的:- 玩家可以在史莱姆的攻击间隔内选择行为(如攻击、格挡、闪避)。
- 每次玩家执行一个行为时,消耗的时间会体现在整体的时间流逝上。
- 如果玩家在史莱姆攻击间隔尚未结束时执行行为,剩余的时间可以继续让玩家操作,直到攻击间隔结束。
-
史莱姆的攻击
- 当史莱姆的攻击间隔小于等于零时,史莱姆会立即执行攻击。
- 如果玩家的操作导致时间间隔小于零(即玩家的行为时间超过史莱姆攻击的剩余时间),史莱姆的攻击会即时触发。
- 史莱姆攻击后,重新计算下一次攻击的间隔时间。
-
史莱姆死亡的处理
- 如果史莱姆在玩家的行为中被击杀,即使当前的攻击间隔已经耗尽,史莱姆也不会行动。
- 在史莱姆死亡后,将刷新一只满血的新史莱姆,继续战斗。
-
玩家死亡的处理
- 如果玩家的生命值降至零,循环结束,游戏结束,输出玩家的得分(即击败的史莱姆数量)。
循环示例:
- 初始状态:史莱姆的攻击间隔为 3 秒。
- 玩家在第 2.5 秒时选择攻击,消耗 2 秒时间,时间流逝至第 4.5 秒。此时,史莱姆的攻击时间间隔已经小于零,因此史莱姆执行攻击后,进入下一次攻击循环。
- 如果史莱姆在这次攻击前被玩家击杀,则不会触发史莱姆的攻击行为。
谢谢GPT帮我做的总结,基本上就是要实现这个循环,我先写了Warrior和Slime两个类。
类的实现
类需要一些基本的属性,如 Health
(生命值)、ActionTime
(行为耗时)、CooldownTime
(冷却时间)、Name
(名称)、Damage(伤害)等。还有相对应的行为,也就是格挡、攻击、闪避等,每个行为对应其成员函数。
Warrior
public class Warrior
{
public string Name { get; set; }
public double Health { get; set; }
public double AttackPower { get; set; }
public double BaseCooldown { get; set; }
public double BaseActionTime { get; set; }
public Warrior(string name, double health, double attackPower, double baseCooldown, double baseActionTime)
{
Name = name;
Health = health;
AttackPower = attackPower;
BaseCooldown = baseCooldown;
BaseActionTime = baseActionTime;
}
// 攻击方法
public double Attack()
{
Console.WriteLine($"{Name} 执行挥砍攻击!");
return AttackPower; // 返回当前攻击力
}
// 格挡方法
public double Block(double incomingDamage)
{
double reducedDamage = incomingDamage / 2; // 格挡减少50%的伤害
Console.WriteLine($"{Name} 执行格挡,减少50%的伤害!");
return reducedDamage;
}
// 闪避方法
public double Dodge(double incomingDamage)
{
bool isDodged = new Random().NextDouble() <= 0.6; // 60%闪避成功率
Console.WriteLine($"{Name} 执行闪避!");
if (isDodged)
{
Console.WriteLine($"{Name} 成功闪避了攻击!");
return 0; // 闪避成功时伤害为0
}
else
{
Console.WriteLine($"{Name} 未能闪避,承受了攻击!");
return incomingDamage; // 闪避失败,伤害为正常值
}
}
// 承受伤害方法
public void TakeDamage(double damage)
{
Health -= damage;
Console.WriteLine($"{Name} 承受了 {damage} 点伤害,当前生命值:{Health}");
}
}
Slime
public class Slime
{
public string Name { get; set; }
public double Health { get; set; }
public double AttackPower { get; set; }
public double BaseActionTime { get; set; } // 基础动作时间
private Random random = new Random(); // 随机数生成器
public Slime(string name, double health, double attackPower, double b