diff --git a/.gitignore b/.gitignore
index 97c70f2..add57be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,418 +1,5 @@
-# ---> VisualStudio
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
-
-# User-specific files
-*.rsuser
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Mono auto generated files
-mono_crash.*
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-[Ww][Ii][Nn]32/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
-bld/
-[Bb]in/
-[Oo]bj/
-[Ll]og/
-[Ll]ogs/
-
-# Visual Studio 2015/2017 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# Visual Studio 2017 auto generated files
-Generated\ Files/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-# NUnit
-*.VisualState.xml
-TestResult.xml
-nunit-*.xml
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-# ASP.NET Scaffolding
-ScaffoldingReadMe.txt
-
-# StyleCop
-StyleCopReport.xml
-
-# Files built by Visual Studio
-*_i.c
-*_p.c
-*_h.h
-*.ilk
-*.meta
-*.obj
-*.iobj
-*.pch
-*.pdb
-*.ipdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*_wpftmp.csproj
-*.log
-*.tlog
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# Visual Studio Trace Files
-*.e2e
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Coverlet is a free, cross platform Code Coverage Tool
-coverage*.json
-coverage*.xml
-coverage*.info
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# NuGet Symbol Packages
-*.snupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Nuget personal access tokens and Credentials
-nuget.config
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-*.appxbundle
-*.appxupload
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!?*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-*.rptproj.rsuser
-*- [Bb]ackup.rdl
-*- [Bb]ackup ([0-9]).rdl
-*- [Bb]ackup ([0-9][0-9]).rdl
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-node_modules/
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# CodeRush personal settings
-.cr/personal
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
-
-# Azure Stream Analytics local run output
-ASALocalRun/
-
-# MSBuild Binary and Structured Log
-*.binlog
-
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
-
-# MFractors (Xamarin productivity tool) working folder
-.mfractor/
-
-# Local History for Visual Studio
-.localhistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
-
-# Ionide (cross platform F# VS Code tools) working folder
-.ionide/
-
-# Fody - auto-generated XML schema
-FodyWeavers.xsd
-
-# VS Code files for those working on multiple tools
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-*.code-workspace
-
-# Local History for Visual Studio Code
-.history/
-
-# Windows Installer files from build outputs
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# JetBrains Rider
-.idea/
-*.sln.iml
-
-# ---> macOS
-# General
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two \r
-Icon
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-.com.apple.timemachine.donotpresent
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
+bin/
+obj/
+/packages/
+riderModule.iml
+/_ReSharper.Caches/
\ No newline at end of file
diff --git a/.idea/.idea.ooya.ga_api/.idea/encodings.xml b/.idea/.idea.ooya.ga_api/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/.idea/.idea.ooya.ga_api/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.ooya.ga_api/.idea/indexLayout.xml b/.idea/.idea.ooya.ga_api/.idea/indexLayout.xml
new file mode 100644
index 0000000..7b08163
--- /dev/null
+++ b/.idea/.idea.ooya.ga_api/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.ooya.ga_api/.idea/projectSettingsUpdater.xml b/.idea/.idea.ooya.ga_api/.idea/projectSettingsUpdater.xml
new file mode 100644
index 0000000..4bb9f4d
--- /dev/null
+++ b/.idea/.idea.ooya.ga_api/.idea/projectSettingsUpdater.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.ooya.ga_api/.idea/vcs.xml b/.idea/.idea.ooya.ga_api/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/.idea.ooya.ga_api/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.ooya.ga_api/.idea/workspace.xml b/.idea/.idea.ooya.ga_api/.idea/workspace.xml
new file mode 100644
index 0000000..580a097
--- /dev/null
+++ b/.idea/.idea.ooya.ga_api/.idea/workspace.xml
@@ -0,0 +1,123 @@
+
+
+
+ ooya.ga_api.csproj
+ ooya.ga_api.csproj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1644119899867
+
+
+ 1644119899867
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Controllers/ApiController.cs b/Controllers/ApiController.cs
new file mode 100644
index 0000000..88830c1
--- /dev/null
+++ b/Controllers/ApiController.cs
@@ -0,0 +1,81 @@
+using Microsoft.AspNetCore.Mvc;
+
+namespace ooya.ga_api.Controllers;
+
+[ApiController]
+[Microsoft.AspNetCore.Mvc.Route("/api/v1")]
+public class ApiController : ControllerBase
+{
+ private static readonly Random Random = new Random();
+ private static readonly List GameList = new List();
+
+ private readonly ILogger _logger;
+
+ public ApiController(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ [HttpGet("version", Name = "version", Order = 1)]
+ public string Version()
+ {
+ return "1.0.0";
+ }
+
+ [HttpGet("game", Name = "game", Order = 2)]
+ public GameDto NewGame()
+ {
+ Game pGame = h_NewGame(0);
+ GameList.Add(pGame);
+ return Mapper.ToGameDto(pGame);
+ }
+
+ [HttpGet("turn", Name = "turn", Order = 3)]
+ public GameDto? Turn(
+ string gameGuid,
+ string witchGuid
+ )
+ {
+ Game pGame = GameList.FirstOrDefault(p => p.Guid == gameGuid);
+ if (pGame == null) return null;
+ Witch pWitch = pGame.Witches.FirstOrDefault(p => p.Guid == witchGuid);
+ if (pWitch == null) return null;
+ if (pWitch.FlagReal)
+ {
+ Game pNewGame = h_NewGame(pGame.Score + pGame.Witches.Count());
+ GameList.Add(pNewGame);
+ return Mapper.ToGameDto(pNewGame);
+ }
+ else
+ {
+ pGame.Score--;
+ return Mapper.ToGameDto(pGame);
+ }
+ }
+
+ #region private methods
+
+ private Game h_NewGame(int iScore)
+ {
+ Game pGame = new Game(iScore)
+ {
+ Witches = h_CreateWitches(Random.Next(2, 5))
+ };
+ return pGame;
+ }
+
+ private IEnumerable h_CreateWitches(int count)
+ {
+ List witches = new List();
+ for (int ii = 0; ii < count; ii++)
+ {
+ witches.Add(new Witch(ii));
+ }
+
+ int iIndex = Random.Next(0, count);
+ witches[iIndex].FlagReal = true;
+ return witches;
+ }
+
+ #endregion
+}
\ No newline at end of file
diff --git a/Model/Game.cs b/Model/Game.cs
new file mode 100644
index 0000000..f5cff0d
--- /dev/null
+++ b/Model/Game.cs
@@ -0,0 +1,41 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace ooya.ga_api;
+
+public class Game
+{
+ ///
+ /// Текущая дата и время
+ ///
+ [Required]
+ public DateTime Date { get; set; }
+
+ ///
+ /// Идентификатор игры
+ ///
+ [Required]
+ public string Guid { get; set; }
+
+ ///
+ /// Количество очков
+ ///
+ [Required]
+ public int Score { get; set; }
+
+ ///
+ /// Ведьмы раунда
+ ///
+ [Required]
+ public IEnumerable Witches { get; set; }
+
+ ///
+ /// Конструктор
+ ///
+ /// первоначальное количество очков
+ public Game(int score = 0)
+ {
+ Date = DateTime.Now;
+ Score = score;
+ Witches = new List();
+ }
+}
\ No newline at end of file
diff --git a/Model/GameDto.cs b/Model/GameDto.cs
new file mode 100644
index 0000000..cfb2f94
--- /dev/null
+++ b/Model/GameDto.cs
@@ -0,0 +1,24 @@
+namespace ooya.ga_api;
+
+public class GameDto
+{
+ ///
+ /// Текущая дата и время
+ ///
+ public DateTime Date { get; set; }
+
+ ///
+ /// Идентификатор игры
+ ///
+ public string Guid { get; set; }
+
+ ///
+ /// Количество очков
+ ///
+ public int Score { get; set; }
+
+ ///
+ /// Ведьмы раунда
+ ///
+ public IEnumerable Witches { get; set; }
+}
\ No newline at end of file
diff --git a/Model/Mapper.cs b/Model/Mapper.cs
new file mode 100644
index 0000000..7fd324f
--- /dev/null
+++ b/Model/Mapper.cs
@@ -0,0 +1,32 @@
+namespace ooya.ga_api;
+
+public static class Mapper
+{
+ ///
+ /// Для передачи в сторону пользователя
+ ///
+ ///
+ ///
+ public static GameDto ToGameDto(Game pGame)
+ {
+ GameDto pGameDto = new GameDto();
+ pGameDto.Guid = pGame.Guid;
+ pGameDto.Date = pGame.Date;
+ pGameDto.Score = pGame.Score;
+ pGameDto.Witches = pGame.Witches.Select(p => ToWitchDto(p));
+ return pGameDto;
+ }
+ ///
+ /// Для передачи в сторону пользователя
+ ///
+ ///
+ ///
+ public static WitchDto ToWitchDto(Witch pWitch)
+ {
+ WitchDto pWitchDto = new WitchDto();
+ pWitchDto.Guid = pWitch.Guid;
+ pWitchDto.Position = pWitch.Position;
+ return pWitchDto;
+ }
+
+}
\ No newline at end of file
diff --git a/Model/Witch.cs b/Model/Witch.cs
new file mode 100644
index 0000000..ac8dbdf
--- /dev/null
+++ b/Model/Witch.cs
@@ -0,0 +1,36 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace ooya.ga_api;
+
+public class Witch
+{
+ ///
+ /// Идентификатор ведьмы
+ ///
+ [Required]
+ public string Guid { get; set; }
+
+ ///
+ /// Является ли настоящей
+ ///
+ [Required]
+ public bool FlagReal { get; set; }
+
+ ///
+ /// Позиция ведьмы
+ ///
+ [Required]
+ public int Position { get; set; }
+
+
+ ///
+ /// Конструктор
+ ///
+ ///
+ public Witch(int position)
+ {
+ Guid = (new Guid()).ToString("N");
+ Position = position;
+ FlagReal = false;
+ }
+}
\ No newline at end of file
diff --git a/Model/WitchDto.cs b/Model/WitchDto.cs
new file mode 100644
index 0000000..9c4840a
--- /dev/null
+++ b/Model/WitchDto.cs
@@ -0,0 +1,14 @@
+namespace ooya.ga_api;
+
+public class WitchDto
+{
+ ///
+ /// Идентификатор ведьмы
+ ///
+ public string Guid { get; set; }
+
+ ///
+ /// Позиция ведьмы
+ ///
+ public int Position { get; set; }
+}
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..8264bac
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,25 @@
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen();
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+ app.UseSwagger();
+ app.UseSwaggerUI();
+}
+
+app.UseHttpsRedirection();
+
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.Run();
\ No newline at end of file
diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json
new file mode 100644
index 0000000..de8c836
--- /dev/null
+++ b/Properties/launchSettings.json
@@ -0,0 +1,31 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:24043",
+ "sslPort": 44355
+ }
+ },
+ "profiles": {
+ "ooya.ga_api": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "https://localhost:7115;http://localhost:5001",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/appsettings.Development.json b/appsettings.Development.json
new file mode 100644
index 0000000..0c208ae
--- /dev/null
+++ b/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/appsettings.json b/appsettings.json
new file mode 100644
index 0000000..10f68b8
--- /dev/null
+++ b/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/ooya.ga_api.csproj b/ooya.ga_api.csproj
new file mode 100644
index 0000000..b9baca3
--- /dev/null
+++ b/ooya.ga_api.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/ooya.ga_api.sln b/ooya.ga_api.sln
new file mode 100644
index 0000000..196a9d6
--- /dev/null
+++ b/ooya.ga_api.sln
@@ -0,0 +1,16 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ooya.ga_api", "ooya.ga_api.csproj", "{8046F827-FD8E-4F3A-9921-ADC42F935B12}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8046F827-FD8E-4F3A-9921-ADC42F935B12}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal