Без рекурсии и с системой оценки:
from random import randint as ri
score_mapping = {
0 : None,
1 : [(1, 4),],
2 : [(1, 6),],
3 : [(1, 8),],
4 : [(1,10),],
5 : [(1, 6), (1, 6)],
6 : [(1, 8), (1, 8)],
7 : [(1, 10), (1, 10)],
8 : [(1, 8), (1, 8), (1, 8)],
9 : [(1, 10), (1, 10), (1, 10)],
10 : [(1, 8), (1, 10), (1, 10), (1, 10)],
}
def action_roll_script(score, roll_again_at=20):
return_value = 0
while True:
value = ri(1, 20)
print(f'score={score} rolled value={value}')
if score == 0:
return_value += value
else:
return_value += sum(ri(vf, vt) for (vf, vt) in score_mapping[score])
if value != roll_again_at:
break
return return_value
print(action_roll_script(0))
Возможный выход:
score=10 rolled value=20
score=10 rolled value=5
38
Я чувствую, что вы просто упускаете название объекта.
Попробуйте добавить имя для объекта в config.json следующим образом:
{"beep":{"beep":"bopp"}}
Тогда вы можете сделать string beep =config.GetSection("beep").Value
Убедитесь, что файл json настроен на копирование в каталог, как описано в этого блога . В противном случае при сборке или отладке файл конфигурации не будет включен. Убедитесь, что вы изменили его в свойствах.
Причина, по которой вы не можете получить доступ к вашей конфигурации, заключается в том, что IConfigurationRoot
не ссылается на зависимость для ConfigurationBuilder
. Чтобы убедиться, что ваш контент конфигурации будет загружен, нужно будет сделать что-то вроде этого:
public static class ConfigurationProvider
{
public static IConfiguration BuildConfiguration => new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
}
Выше будет построена наша конфигурация, теперь мы должны использовать конфигурацию.
public static class ServiceProvider
{
public static IServiceProvider BuildServiceProvider(IServiceCollection services) => services
.BuildDependencies()
.BuildServiceProvider();
}
Как только мы определили нашего провайдера, мы можем сделать следующее, чтобы мы могли передать наш IConfiguration
вокруг приложения для доступа к объектам.
var serviceCollection = new ServiceCollection()
.AddSingleton(configuration => ConfigurationProvider.BuildConfiguration());
var serviceProvider = ServiceProvider.BuildServiceProvider(serviceCollection);
Тогда внутри другого класса у вас будет следующее:
public class SampleContext : ISampleRepository
{
private readonly string dbConection;
public SampleContext(IConfiguration configuration) => configuration.GetConnectionString("dbConnection");
...
}
Тогда наш appsettings.json
будет выглядеть так:
{
"ConnectionStrings": {
"dbConnection": "..."
}
}
Выше приведено правильный формат для объекта JSON. Если у вас есть вложенный объект вдоль этих линий:
{
"Sample" : {
"Api" : {
"SampleGet" : "..."
}
}
}
Тогда ваш C # будет:
configuration.GetSection("Sample:Api")["SampleGet"];
Вышеуказанное основано на предположении, что ваша конфигурация и использование не совпадают последовательная область, т. е. непосредственно в вашей главной. Также вы должны использовать appsettings.json
, так как это по умолчанию, меньше дополнительной проводки, если я правильно помню. Ваш JSON также должен быть правильно отформатирован.
Но это определенно сработает, если вам понадобится дополнительная помощь, дайте мне знать, и я могу выслать вам несколько примеров приложений ядра консоли, чтобы продемонстрировать их использование.