有这样一个问题,我无法制定伤害计算公式。考虑到两个角色(互相争斗)的一些因素。你需要考虑敌人的护甲、我的伤害、伤害倍数和等级差异。重要的是,如果水平差异很大,那么击中的机会就会因差异因素而减少。
Alexey's questions
我的游戏里有N个时间后才能打开的礼物。大多是2到8小时。当我收到某个角色的礼物时,我会将Ticks
这些相同礼物的模型保存到一个特殊列表中。当玩家离开游戏时,相同的标记会保存到数据库中。进入游戏时,计算差值并显示剩余时间的结果。如果您在 1-3 小时后进入游戏,这个简单的算法就会起作用。但如果你第二天就开始比赛,时间就会变得疯狂。它可以显示还剩 120 小时。或者也许还剩下30分钟,尽管已经过去了10多个小时。我怎样才能摆脱这个错误?
添加礼物的代码:
PresentContract presentContract = new PresentContract();
presentContract.PresentType = battleResultSource.PresentType;
presentContract.ObjId = ObjId;
presentContract.Time = DateTime.Now.AddSeconds(HowManySecondsWillFirstLevelOpeningGift).Ticks;
presentContract.Slot = InternalDetermineFreeSlot(GameClientField.PresentContracts);
presentContract.CostOfOneSecondGift = CharacterConfig.CostOfOneSecondGift;
GameClientField.PresentContracts[presentContract.Slot] = presentContract;
计算当前时间与可能打开礼物的时间之间的差异的代码:
DateTime dateTime = new DateTime(presentContracts.Time);
_presentModels[presentContracts.Slot]._dateTime = dateTime;
TimeSpan timeSpan = _presentModels[presentContracts.Slot]._dateTime.Subtract(DateTime.Now);
默认情况下,我转储整个数据库并按获胜百分比对顶级玩家进行排序。但当数据库中有大量注册用户时,这是一个严重的错误。是否可以直接在 SQL 查询中按胜率选择前 100 名玩家?所以我只能上传它们。
服务器版本:8.0.31 MySQL 社区服务器 - GPL
版权所有 (c) 2000、2022,Oracle 和/或其附属公司。
要求:
public async Task<IEnumerable<PlayerRankData>> GetRankByWinRate()
{
try
{
return await Db.QueryAsync<PlayerRankData>("select charactername as CharacterName, objid as ObjId, level as Level, " +
"crank as PlayerRank, nw as NumberWinners, nl as NumberLosses from characters");
}
catch (Exception exception)
{
DebugException.Instance.Execute(exception);
Console.WriteLine($"Method: {nameof(GetRankByWinRate)}. Message: '{exception.Message}'");
return null;
}
}
合同:
public sealed class PlayerRankData
{
public string CharacterName { get; set; }
public long ObjId { get; set; }
public int Level { get; set; }
public int PlayerRank { get; set; }
public int NumberWinners { get; set; }
public int NumberLosses { get; set; }
public long TimeWinRate { get; set; }
public long TimeByLevel { get; set; }
public long TimeNumberFights { get; set; }
}
排序:
if (_gameClient.PlayerRankDatas == null)
{
data = await _rankTableRepository.GetRankByWinRate();
_gameClient.PlayerRankDatas = data.OrderByDescending(
rate => InternalWinRateCalculate(rate)).Take(_appConfiguration.RankMaxTakePlayers).ToList();
}
else
_gameClient.PlayerRankDatas = _gameClient.PlayerRankDatas.OrderByDescending(
rate => InternalWinRateCalculate(rate)).Take(_appConfiguration.RankMaxTakePlayers).ToList();
我为我的项目制定了一个评级表。其中有一个选项卡“按级别评级”。然后我陷入了严重的停滞,问自己一个问题:如何正确地实现多个或多个相同级别玩家的情况?你需要以某种方式了解一名玩家达到了该级别,例如,第一个达到了 20 级,而另一个玩家也达到了 20 级,但已经是第二名了,等等。
我找到了一个似乎适合我的解决方案,将int
字段保存在数据库中,该字段决定了同级别玩家的评级位置。
也许有人有更好的想法,请分享您的选择,谢谢!
任务:初始化一个只有2个玩家的房间时,会启动一个任务,方法如下。这是一个更新标记。有必要在两个玩家中调用更新,而其中一个不希望另一个玩家调用更新。更新中可能会有较长的操作,比如计算攻击速度等。
我正确地实施了这个方法吗?当有 10,000 个这样的房间时,在优化方面会听到什么?
private async Task InternalTick()
{
while (true)
{
for (int iterator = 0; iterator < _queueModels.Count; iterator++)
Task.Run(async () => await _queueModels[iterator].TickAsync());
await Task.Delay(_timeUpdateOneFrameInTheMap, _cancellationTokenSource.Token);
}
}
对一些问题的答案感兴趣:
- 如果你迭代一个简单的数字数组并通过索引获取它的元素,这是否比获取指向该数组的指针并迭代它忽略异常有点未优化
IndexOutOfRangeException
(也就是说,我们跳过一些检查)
例如:
int[] array = new int[3] { 1, 2, 3 };
fixed (int* ptrValue = &array[0])
{
for (int iterator = 0; iterator < array.Length; iterator++)
Console.Write($"{*(iterator + ptrValue)} ");
}
- 哪个代码更优化,为什么?
internal readonly struct ValueFirst<T>
{
internal readonly T[] _pointer;
public ValueFirst(T[] values)
{
_pointer = values;
}
public ref T this[int index]
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_pointer), (uint)index);
}
}
或者
internal readonly struct ValueSecond<T>
{
internal readonly T[] _pointer;
public ValueSecond(T[] values)
{
_pointer = values;
}
public T this[int index]
{
get => _pointer[index];
}
}