More work on gambling

This commit is contained in:
Kwoth
2022-07-13 02:21:32 +02:00
parent 0b122e8d3f
commit 5f7b030a66
25 changed files with 481 additions and 522 deletions

View File

@@ -0,0 +1,28 @@
namespace Nadeko.Econ.Gambling;
public sealed class BetflipGame
{
private readonly decimal _winMulti;
private readonly NadekoRandom _rng;
public BetflipGame(decimal winMulti)
{
_winMulti = winMulti;
_rng = new NadekoRandom();
}
public BetflipResult Flip(int guess, decimal amount)
{
var side = _rng.Next(0, 1);
decimal won = 0;
if (side == guess)
won = amount * _winMulti;
return new BetflipResult()
{
Side = side,
Won = won,
};
}
}

View File

@@ -0,0 +1,7 @@
namespace Nadeko.Econ.Gambling;
public readonly struct BetflipResult
{
public decimal Won { get; init; }
public int Side { get; init; }
}

View File

@@ -0,0 +1,42 @@
namespace Nadeko.Econ.Gambling;
public sealed class BetrollGame
{
private readonly (decimal WhenAbove, decimal MultiplyBy)[] _thresholdPairs;
private readonly Random _rng;
public BetrollGame(IReadOnlyList<(decimal WhenAbove, decimal MultiplyBy)> pairs)
{
_thresholdPairs = pairs.OrderByDescending(x => x.WhenAbove).ToArray();
_rng = new();
}
public BetrollResult Roll(decimal amount = 0)
{
var roll = _rng.Next(0, 101);
for (var i = 0; i < _thresholdPairs.Length; i++)
{
ref var pair = ref _thresholdPairs[i];
if (pair.WhenAbove < roll)
{
return new()
{
Multiplier = pair.MultiplyBy,
Roll = roll,
Threshold = pair.WhenAbove,
Won = amount * pair.MultiplyBy
};
}
}
return new()
{
Multiplier = 0,
Roll = roll,
Threshold = -1,
Won = 0,
};
}
}

View File

@@ -0,0 +1,9 @@
namespace Nadeko.Econ.Gambling;
public readonly struct BetrollResult
{
public int Roll { get; init; }
public decimal Multiplier { get; init; }
public decimal Threshold { get; init; }
public decimal Won { get; init; }
}

View File

@@ -0,0 +1,28 @@
namespace Nadeko.Econ.Gambling;
public class SlotGame
{
private static readonly Random _rng = new NadekoRandom();
public SlotResult Spin(decimal bet)
{
var rolls = new[] { _rng.Next(0, 6), _rng.Next(0, 6), _rng.Next(0, 6) };
var multi = 0;
if (rolls.All(x => x == 5))
multi = 30;
else if (rolls.All(x => x == rolls[0]))
multi = 10;
else if (rolls.Count(x => x == 5) == 2)
multi = 4;
else if (rolls.Any(x => x == 5))
multi = 1;
return new()
{
Won = bet * multi,
Multiplier = multi,
Rolls = rolls,
};
}
}

View File

@@ -0,0 +1,8 @@
namespace Nadeko.Econ.Gambling;
public readonly struct SlotResult
{
public decimal Multiplier { get; init; }
public int[] Rolls { get; init; }
public decimal Won { get; init; }
}

View File

@@ -0,0 +1,34 @@
namespace Nadeko.Econ.Gambling;
public sealed class WofGame
{
public static IReadOnlyList<decimal> DEFAULT_MULTIPLIERS = new[] { 1.7M, 1.5M, 0.2M, 0.1M, 0.3M, 0.5M, 1.2M, 2.4M };
private readonly IReadOnlyList<decimal> _multipliers;
private readonly NadekoRandom _rng;
public WofGame(IReadOnlyList<decimal> multipliers)
{
_multipliers = multipliers;
_rng = new();
}
public WofGame() : this(DEFAULT_MULTIPLIERS)
{
}
public WofResult Spin(long bet)
{
var result = _rng.Next(0, _multipliers.Count);
var multi = _multipliers[result];
var amount = bet * multi;
return new()
{
Index = result,
Multiplier = multi,
Won = amount
};
}
}

View File

@@ -0,0 +1,8 @@
namespace Nadeko.Econ.Gambling;
public readonly struct WofResult
{
public int Index { get; init; }
public decimal Multiplier { get; init; }
public decimal Won { get; init; }
}