SHARE
TWEET

Homework game

a guest Apr 21st, 2017 53 in 3 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Кравцов Павел
  2.  
  3. // ** Существует алгоритмическая игра “Удвоитель”. В этой игре человеку предлагается какое-то
  4. // число, а человек должен, управляя роботом “Удвоитель”, достичь этого числа за минимальное
  5. // число шагов. Робот умеет выполнять несколько команд: увеличить число на 1, умножить число на 2
  6. // и сбросить число до 1. Начальное значение удвоителя равно 1.
  7. // Реализовать класс “Удвоитель”. Класс хранит в себе поле current - текущее значение, finish -
  8. // число, которого нужно достичь, конструктор, в котором задается конечное число.Методы:
  9. // увеличить число на 1, увеличить число в два раза, сброс текущего до 1, свойство Current, которое
  10. // возвращает текущее значение, свойство Finish, которое возвращает конечное значение.Создать с
  11. // помощью этого класса игру, в которой компьютер загадывает число, а человек.выбирая из меню на
  12. // экране, отдает команды удвоителю и старается получить это число за наименьшее число ходов.
  13. // Если человек получает число больше положенного, игра прекращается.
  14.  
  15.  
  16. using System;
  17.  
  18. namespace Task5
  19. {
  20.     class Program
  21.     {
  22.         static void Main()
  23.         {
  24.             bool continueSwitch = true;
  25.             do
  26.             {
  27.                 DedoublerGame game = new DedoublerGame();
  28.                 game.StartGame();
  29.                 continueSwitch = ContinueSwitch();
  30.             }
  31.             while (continueSwitch);
  32.             Console.ReadKey();
  33.         }
  34.  
  35.         private static bool ContinueSwitch()
  36.         {
  37.             Console.WriteLine("\nPress Enter to play again. Press any other key to exit.");
  38.             if (Console.ReadKey().Key == ConsoleKey.Enter)
  39.                 return true;
  40.             else return false;
  41.         }
  42.     }
  43.  
  44.     class DedoublerGame
  45.     {
  46.         public int FinishScore { get; private set; }
  47.         public int CurrentScore { get; private set; }
  48.         public int Steps { get; private set; }
  49.  
  50.         public event EventHandler<PlayerWonEventArgs> PlayerWon;
  51.         public event EventHandler<PlayerLostEventArgs> PlayerLost;
  52.  
  53.         public DedoublerGame()
  54.         {
  55.             Random rand = new Random();
  56.             int goalScore = rand.Next(500) + 100;
  57.             FinishScore = goalScore;
  58.             CurrentScore = 1;
  59.             Steps = 0;
  60.             PlayerWon += HandlePlayerWon;
  61.             PlayerLost += HandlePlayerLost;
  62.         }
  63.  
  64.         public DedoublerGame(int goalScore)
  65.         {
  66.             if (goalScore < 2)
  67.                 goalScore = 2;
  68.             FinishScore = goalScore;
  69.             CurrentScore = 1;
  70.             Steps = 0;
  71.             PlayerWon += HandlePlayerWon;
  72.             PlayerLost += HandlePlayerLost;
  73.         }
  74.  
  75.         public void StartGame()
  76.         {
  77.             while (true)
  78.             {
  79.                 Menu();
  80.  
  81.                 try
  82.                 {
  83.                     ConsoleKey key = Console.ReadKey().Key;
  84.                     switch (key)
  85.                     {
  86.                         default:
  87.                             throw new Exception();
  88.                         case ConsoleKey.D1:
  89.                             PlusOne();
  90.                             break;
  91.                         case ConsoleKey.D2:
  92.                             Double();
  93.                             break;
  94.                         case ConsoleKey.D3:
  95.                             Reset();
  96.                             break;
  97.                         case ConsoleKey.N:
  98.                             Random rand = new Random();
  99.                             int goalScore = rand.Next(500) + 100;
  100.                             FinishScore = goalScore;
  101.                             CurrentScore = 1;
  102.                             Steps = 0;
  103.                             break;
  104.                     }
  105.                 }
  106.                 catch (Exception) { }
  107.  
  108.                 if (CurrentScore > FinishScore)
  109.                 {
  110.                     PlayerLost(this, new PlayerLostEventArgs(CurrentScore, FinishScore));
  111.                     break;
  112.                 }
  113.                 if (CurrentScore == FinishScore)
  114.                 {
  115.                     PlayerWon(this, new PlayerWonEventArgs(Steps, OptimalSteps()));
  116.                     break;
  117.                 }
  118.             }
  119.         }
  120.  
  121.         private void Menu()
  122.         {
  123.             Console.Clear();
  124.             Console.ForegroundColor = ConsoleColor.DarkGreen;
  125.             Console.WriteLine($"You reached {CurrentScore}/{FinishScore} | Step {Steps + 1}\n");
  126.             Console.ResetColor();
  127.             Console.WriteLine("1 - Incrementation by 1");
  128.             Console.WriteLine("2 - Multiplication by 2");
  129.             Console.WriteLine("3 - Reset to 1");
  130.             Console.ForegroundColor = ConsoleColor.DarkRed;
  131.             Console.WriteLine("\nPress \"N\" for new game\n");
  132.             Console.ResetColor();
  133.         }
  134.  
  135.         private void PlusOne()
  136.         {
  137.             CurrentScore++;
  138.             Steps++;
  139.         }
  140.  
  141.         private void Double()
  142.         {
  143.             CurrentScore *= 2;
  144.             Steps++;
  145.         }
  146.  
  147.         private void Reset()
  148.         {
  149.             CurrentScore = 1;
  150.             Steps++;
  151.         }
  152.  
  153.         private int OptimalSteps()
  154.         {
  155.             int score = FinishScore;
  156.             int steps = 0;
  157.             while (score != 1)
  158.             {
  159.                 if (IsOdd(score))
  160.                 {
  161.                     score--;
  162.                 }
  163.                 else
  164.                 {
  165.                     score /= 2;
  166.                 }
  167.                 steps++;
  168.             }
  169.             return steps;
  170.         }
  171.  
  172.         private bool IsOdd(int number)
  173.         {
  174.             return number % 2 == 1;
  175.         }
  176.  
  177.         private void HandlePlayerWon(object sender, PlayerWonEventArgs e)
  178.         {
  179.             Console.Clear();
  180.             Console.ForegroundColor = ConsoleColor.DarkGreen;
  181.             if (e.steps != e.optimal)
  182.                 Console.WriteLine($"Congratulations! You won in {e.steps} steps.\nOptimal solution contains {e.optimal} steps.");
  183.             else
  184.                 Console.WriteLine($"Congratulations! You won in {e.steps} steps. This solution is optimal!");
  185.             Console.ResetColor();
  186.         }
  187.  
  188.         private void HandlePlayerLost(object sender, PlayerLostEventArgs e)
  189.         {
  190.             Console.Clear();
  191.             Console.ForegroundColor = ConsoleColor.DarkRed;
  192.             Console.WriteLine($"You lost! You reached {e.score} and overscored the cap of {e.cap}.");
  193.             Console.ResetColor();
  194.         }
  195.     }
  196.  
  197.     public class PlayerWonEventArgs : EventArgs
  198.     {
  199.         public int steps;
  200.         public int optimal;
  201.         public PlayerWonEventArgs(int steps, int optimal)
  202.         {
  203.             this.steps = steps;
  204.             this.optimal = optimal;
  205.         }
  206.     }
  207.  
  208.     public class PlayerLostEventArgs : EventArgs
  209.     {
  210.         public int score;
  211.         public int cap;
  212.         public PlayerLostEventArgs(int score, int cap)
  213.         {
  214.             this.score = score;
  215.             this.cap = cap;
  216.         }
  217.     }
  218. }
RAW Paste Data
Top