Advertisement
Guest User

Mastermind Final Version

a guest
Nov 17th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 19.27 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Mastermind_v2
  8. {
  9.     class Backend
  10.     {
  11.         //skapar en stringarray med 4 olika färger utifrån 6 olika färger, en på varje plats i arrayen
  12.         public static string[] Randomizer()
  13.         {
  14.             Random r = new Random();
  15.             var randomizedNumbers = new int[4];
  16.             for (int i = 0; i < 4; i++)
  17.             {
  18.                 randomizedNumbers[i] = r.Next(0, 6);
  19.             }
  20.             string[] newRandom = randomizedNumbers.Select(x => x.ToString()).ToArray();
  21.             for (int i = 0; i < 4; i++)
  22.             {
  23.                 newRandom[i] = newRandom[i].Replace("0", "red");
  24.                 newRandom[i] = newRandom[i].Replace("1", "blue");
  25.                 newRandom[i] = newRandom[i].Replace("2", "green");
  26.                 newRandom[i] = newRandom[i].Replace("3", "pink");
  27.                 newRandom[i] = newRandom[i].Replace("4", "cyan");
  28.                 newRandom[i] = newRandom[i].Replace("5", "yellow");
  29.             }
  30.             return newRandom;
  31.         }
  32.  
  33.         //formatterar rawInput, den själva strängen man skriver in och returnerar en stringArray
  34.         static string[] Format(string rawInput)
  35.         {
  36.             //delar upp inputen i en ny array med varje färg på sin plats
  37.             var newInput = rawInput.Split();
  38.  
  39.             //en liten "funktion" som fångar in fel
  40.             var errorMessage = new string[] { "error", "", "", "" };
  41.  
  42.             if (newInput.Length != 4)
  43.             {
  44.                 return errorMessage;
  45.             }
  46.  
  47.             //är något av orden i inmatningen inte någon av dessa färger? return error
  48.             foreach (string word in newInput)
  49.             {
  50.                 switch (word)
  51.                 {
  52.                     case "red":
  53.                     case "blue":
  54.                     case "green":
  55.                     case "pink":
  56.                     case "cyan":
  57.                     case "yellow":
  58.                         break;
  59.                     default:
  60.                         return errorMessage;
  61.                 }
  62.             }
  63.  
  64.             return newInput;
  65.         }
  66.  
  67.         //funktion som räknar antalet av en viss färg i en array
  68.         static int CountColors(string inputColor, string[] allColors)
  69.         {
  70.             int newAmount = allColors.Count(colors => colors == inputColor);
  71.             return newAmount;
  72.         }
  73.  
  74.         //"huvudfunktionen" i Backend, som kollar efter korrekta färger
  75.         //returnerar en intarray, [0] är rätta platser, [1] är rätta färger, [2] är om det hittades något fel i inputen
  76.         //[2] == 1 -> error hittades, [2] == 0 -> inget error hittades
  77.         public static int[] CheckColors(string rawInput, string[] allRandomColors)
  78.         {
  79.             //formatterar inputen
  80.             var input = Format(rawInput);
  81.  
  82.             //om något blivit fel i inmatningen kommer Format() att returnera en array med "error" på plats 0
  83.             //foundError används senare när den returnerar ett resultat, 1 betyder att något gått fel och 0 betyder att allt funkar som det ska
  84.             int foundError = 0;
  85.             if (input[0] == "error")
  86.             {
  87.                 foundError = 1;
  88.             }
  89.  
  90.             //kolla efter korrekta färger
  91.             int correctColors = 0;
  92.             var inputDis = input.Distinct();
  93.             foreach (string color in inputDis)
  94.             {
  95.                 int[] numbers = { CountColors(color, allRandomColors), CountColors(color, input) };
  96.                 correctColors += numbers.Min();
  97.             }
  98.  
  99.             //ok here we go
  100.             //först skapas en Enumerable (typ en array fast inte riktigt) med startposition 0 och längd 4
  101.             //så 0 1 2 3
  102.             //color => allRandomColors[color] == input[color] är en lambdafunktion där color får värdet av platserna i Enumerablen
  103.             //så det fungerar lite som en loop, fast där allt händer samtidigt istället för en efter en
  104.             //.Count(x) räknar alltså alla ställen där allRandomColors[color] == input[color]
  105.             //eller helt enkelt alla ställen där platserna matchar för inputarrayen och randomarrayen
  106.             //och eftersom .Count(x) räknar saker kommer det lagras i en int
  107.             int correctPositions = Enumerable.Range(0, 4).Count(color => allRandomColors[color] == input[color]);
  108.  
  109.             return new int[] { correctPositions, correctColors - correctPositions, foundError };
  110.         }
  111.     }
  112.  
  113.     class Interface
  114.     {        
  115.         //ritar ut inputfärgerna i formatet [■] [■] [■] [■]
  116.         static void InputColors(string input)
  117.         {
  118.             var inputColors = input.Split();
  119.             foreach (string word in inputColors)
  120.             {
  121.                 switch (word)
  122.                 {
  123.                     case "red":
  124.                         WriteColor("[■]", ConsoleColor.Red, " ");
  125.                         break;
  126.                     case "blue":
  127.                         WriteColor("[■]", ConsoleColor.Blue, " ");
  128.                         break;
  129.                     case "green":
  130.                         WriteColor("[■]", ConsoleColor.Green, " ");
  131.                         break;
  132.                     case "pink":
  133.                         WriteColor("[■]", ConsoleColor.Magenta, " ");
  134.                         break;
  135.                     case "cyan":
  136.                         WriteColor("[■]", ConsoleColor.Cyan, " ");
  137.                         break;
  138.                     case "yellow":
  139.                         WriteColor("[■]", ConsoleColor.Yellow, " ");
  140.                         break;
  141.                 }
  142.             }
  143.         }
  144.        
  145.         //ritar ut brädet
  146.         static void Board(string input, int[] result)
  147.         {
  148.             //print # of correct positions
  149.             Console.CursorLeft = 38;
  150.             WriteColor(Convert.ToString(result[0]), ConsoleColor.Red, "  ");
  151.             Console.Write("│  ");
  152.  
  153.             //print the written pegs
  154.             InputColors(input);
  155.  
  156.             //print # of correct colors
  157.             Console.Write(" │  ");
  158.             WriteColor(Convert.ToString(result[1]), ConsoleColor.White, "");
  159.         }
  160.  
  161.         //skriver ut saker på en specifierad position
  162.         static void WriteAt(string str, int left, int top)
  163.         {
  164.             Console.SetCursorPosition(left, top);
  165.             Console.Write(str);
  166.         }
  167.  
  168.         //skriver ut något med en specifierad färg  
  169.         static void WriteColor(string word, ConsoleColor consoleColor, string separator)
  170.         {
  171.             Console.ForegroundColor = consoleColor;
  172.             Console.Write(word);
  173.             Console.ForegroundColor = ConsoleColor.Gray;
  174.             Console.Write(separator);
  175.         }
  176.  
  177.         //skriver ut en animerad dialog, används när man vinner eller förlorar
  178.         static void Dialogue()
  179.         {
  180.             WriteAt("┌───┴───────────────────┴───┐", 37, 8);
  181.             for (int i = 0; i < 3; i++)
  182.             {
  183.                 WriteAt("└───┬───────────────────┬───┘", 37, 9+i);
  184.                 System.Threading.Thread.Sleep(125);
  185.                 WriteAt("│" + new string(' ', 27) + "│", 37, 9+i);
  186.                 WriteAt("└───┬───────────────────┬───┘", 37, 10+i);
  187.             }
  188.         }
  189.  
  190.         //själva spelet
  191.         static void NewGame()
  192.         {
  193.             //skapar en sträng som används om man behöver cleara en hel rad
  194.             string clear = new string(' ', Console.WindowWidth);
  195.  
  196.             //Välj svårighetsgrad
  197.             Console.Clear();
  198.             WriteAt("Select difficulty", 46, 3);
  199.             WriteAt("[", 43, 5);
  200.             WriteColor("EASY", ConsoleColor.Green, "");
  201.             Console.Write("] [");
  202.             WriteColor("MEDIUM", ConsoleColor.Yellow, "");
  203.             Console.Write("] [");
  204.             WriteColor("HARD", ConsoleColor.Red, "");
  205.             Console.Write("]");
  206.             Console.SetCursorPosition(51, 6);
  207.             bool diffLoop = true;
  208.             int numberOfTurns = 0;
  209.             string difficulty = "";
  210.  
  211.             //en loop som mäter vad man skrivit in och väljer en svårighetsgrad utifrån det
  212.             while (diffLoop)
  213.             {
  214.                 difficulty = Console.ReadLine().ToLower();
  215.                 switch (difficulty)
  216.                 {
  217.                     case "easy":
  218.                         numberOfTurns = 15;
  219.                         diffLoop = false;
  220.                         WriteAt(clear, 0, 8);
  221.                         WriteAt("Difficulty selected: [", 40, 8);
  222.                         WriteColor(difficulty.ToUpper(), ConsoleColor.Green, "");
  223.                         Console.Write("]");
  224.                         break;
  225.                     case "medium":
  226.                         numberOfTurns = 10;
  227.                         diffLoop = false;
  228.                         WriteAt(clear, 0, 8);
  229.                         WriteAt("Difficulty selected: [", 40, 8);
  230.                         WriteColor(difficulty.ToUpper(), ConsoleColor.Yellow, "");
  231.                         Console.Write("]");
  232.                         break;
  233.                     case "hard":
  234.                         numberOfTurns = 6;
  235.                         diffLoop = false;
  236.                         WriteAt(clear, 0, 8);
  237.                         WriteAt("Difficulty selected: [", 40, 8);
  238.                         WriteColor(difficulty.ToUpper(), ConsoleColor.Red, "");
  239.                         Console.Write("]");
  240.                         break;
  241.                     default:
  242.                         WriteAt(clear, 0, 6);
  243.                         WriteAt("Something went wrong, please select a valid difficulty", 27, 8);
  244.                         Console.SetCursorPosition(51, 6);
  245.                         break;
  246.                 }
  247.             }
  248.             System.Threading.Thread.Sleep(1500);
  249.             Console.Clear();
  250.  
  251.             //deklarerar några variabler som används senare i programmet
  252.             int turnsPlayed = 0;
  253.             int turnsLeft = numberOfTurns - turnsPlayed;
  254.             string input = "";
  255.             var randomizedColors = Backend.Randomizer();
  256.  
  257.             //bygger ihop en ny sträng utifrån den slumpade färgkombinationen
  258.             //skickas till Board() när man vinner eller förlorar för att visa den rätta färgkombinationen
  259.             string concatRandom = String.Concat(
  260.                 randomizedColors[0],
  261.                 " ",
  262.                 randomizedColors[1],
  263.                 " ",
  264.                 randomizedColors[2],
  265.                 " ",
  266.                 randomizedColors[3]
  267.                 );
  268.  
  269.             //Börjar spelet genom att skriva ut alla möjliga färger
  270.             WriteAt("Available colors: ", 24, 1);
  271.             WriteColor("Red", ConsoleColor.Red, ", ");
  272.             WriteColor("Blue", ConsoleColor.Blue, ", ");
  273.             WriteColor("Green", ConsoleColor.Green, ", ");
  274.             WriteColor("Pink", ConsoleColor.Magenta, ", ");
  275.             WriteColor("Cyan", ConsoleColor.Cyan, ", ");
  276.             WriteColor("Yellow", ConsoleColor.Yellow, "");
  277.            
  278.             //Skriver ut antalet turer som man har kvar
  279.             //detta kommer ändras senare
  280.             WriteAt("Difficulty: [", 20, 5);
  281.             ConsoleColor diffColor = ConsoleColor.Gray;
  282.             switch (difficulty)
  283.             {
  284.                 case "easy":
  285.                     diffColor = ConsoleColor.Green;
  286.                     break;
  287.                 case "medium":
  288.                     diffColor = ConsoleColor.Yellow;
  289.                     break;
  290.                 case "hard":
  291.                     diffColor = ConsoleColor.Red;
  292.                     break;
  293.             }
  294.             WriteColor(difficulty.ToUpper(), diffColor, "");
  295.             Console.Write("]");
  296.             WriteAt("Turns left: " + turnsLeft, 20, 6);
  297.             Console.SetCursorPosition(41, 7 + numberOfTurns);
  298.  
  299.             //Skriver ut det tomma brädet
  300.             WriteAt("┌───────────────────┐", 41, 4);
  301.             WriteAt("│  [?] [?] [?] [?]  │", 41, 5);
  302.             WriteAt("├───────────────────┤", 41, 6);
  303.             WriteAt("└───────────────────┘", 41, numberOfTurns + 7);
  304.             Console.CursorTop = 7;
  305.             for (int i = 0; i < numberOfTurns; i++)
  306.             {
  307.                 WriteAt("│   *   *   *   *   │", 41, 7 + i);
  308.             }
  309.  
  310.             //startar själva spelet
  311.             //så länge som man inte vunnit spelet eller fått slut på turer kan man köra en till tur
  312.             bool wonGame = false;
  313.             Console.SetCursorPosition(41, 8 + numberOfTurns);
  314.             for (turnsLeft = numberOfTurns; (turnsLeft > 0) && (wonGame == false); turnsLeft--)
  315.             {
  316.                 turnsPlayed = numberOfTurns - turnsLeft;
  317.                 input = Console.ReadLine();
  318.  
  319.                 int[] result = new int [3];
  320.  
  321.                 //litet fusk, om man skriver in 2ez som input vinner man automatiskt
  322.                 string winCode = "neverlucky";
  323.                 if (input == winCode)
  324.                 {
  325.                     result = Backend.CheckColors(concatRandom, randomizedColors);
  326.                     wonGame = true;
  327.                 }
  328.                 else
  329.                 {
  330.                     //jämför inputen med den slumpmässigt utvalda färgkombinationen i Backend.CheckColors() och får tillbaka antalet rätta platser och antalet rätta färger
  331.                     //och lagrar det i result
  332.                     //och om något blev fel med inputen blir den sista platsen i result lika med 1, vilket kollas i nästa if-sats
  333.                     result = Backend.CheckColors(input, randomizedColors);
  334.                 }
  335.  
  336.                 //om den inte hittat något fel i inmatningen skriver den ut resultatet och inputen i snygga färger genom att anropa Board();
  337.                 //dessutom skriver den ut den uppdaterade mängden turer som återstår
  338.                 if (result[2] == 0)
  339.                 {
  340.                     Console.CursorTop = 6 + turnsLeft;
  341.                     if (input == winCode)
  342.                     {
  343.                         Board(concatRandom, Backend.CheckColors(concatRandom, randomizedColors));
  344.                         wonGame = true;
  345.                     }
  346.                     else Board(input, result);
  347.  
  348.                     WriteAt("Turns left: " + (turnsLeft - 1) + " ", 20, 6);
  349.                     WriteAt(clear, 0, 8 + numberOfTurns);
  350.                     WriteAt(clear, 0, 3);
  351.                     Console.SetCursorPosition(41, 8 + numberOfTurns);
  352.                 }
  353.                 else
  354.                 {
  355.                     WriteAt("Something went wrong, please check your input.", 30, 3);
  356.                     WriteAt(clear, 0, 8 + numberOfTurns);
  357.                     Console.SetCursorPosition(41, 8 + numberOfTurns);
  358.                     turnsLeft++;
  359.                 }
  360.  
  361.                 //kollar om man vann
  362.                 if (result[0] == 4)
  363.                 {
  364.                     WriteAt(clear, 0, 3);
  365.                     Console.SetCursorPosition(42, 4);
  366.                     WriteColor("Correct combination", ConsoleColor.Green, "");
  367.                     Console.SetCursorPosition(44, 5);
  368.                     InputColors(concatRandom);
  369.                     System.Threading.Thread.Sleep(350);
  370.                     Dialogue();
  371.                     System.Threading.Thread.Sleep(150);
  372.                     Console.SetCursorPosition(48, 9);
  373.                     WriteColor("YOU WON", ConsoleColor.Green, "");
  374.                     Console.SetCursorPosition(41, 8 + numberOfTurns);
  375.                     System.Threading.Thread.Sleep(750);
  376.                     if (turnsPlayed >= 10) WriteAt("TURNS PLAYED: " + ++turnsPlayed, 43, 11);
  377.                     else WriteAt("TURNS PLAYED: " + ++turnsPlayed, 44, 11);
  378.                     Console.SetCursorPosition(41, 8 + numberOfTurns);
  379.                     System.Threading.Thread.Sleep(1500);
  380.                     for (int i = 0; i < 3; i++) WriteAt("│" + new string(' ', 27) + "│", 37, 9 + i);
  381.                     WriteAt("PLAY AGAIN? [Y/N]", 43, 10);
  382.                     Console.SetCursorPosition(41, 8 + numberOfTurns);
  383.                     wonGame = true;
  384.                 }
  385.             }
  386.            
  387.             //kollar om man förlorat
  388.             if (!wonGame)
  389.             {
  390.                 WriteAt(clear, 0, 3);
  391.                 Console.SetCursorPosition(42, 4);
  392.                 WriteColor("Correct combination", ConsoleColor.Red, "");
  393.                 Console.SetCursorPosition(44, 5);
  394.                 InputColors(concatRandom);
  395.                 System.Threading.Thread.Sleep(350);
  396.                 Dialogue();
  397.                 System.Threading.Thread.Sleep(150);
  398.                 Console.SetCursorPosition(47, 10);
  399.                 WriteColor("YOU LOST", ConsoleColor.Red, "");
  400.                 Console.SetCursorPosition(41, 8 + numberOfTurns);
  401.                 System.Threading.Thread.Sleep(1000);
  402.                 WriteAt("PLAY AGAIN? [Y/N]", 43, 10);
  403.                 Console.SetCursorPosition(41, 8 + numberOfTurns);
  404.             }
  405.         }
  406.  
  407.         //splash screen och spela-igen-funktionaliteten
  408.         static void Main(string[] args)
  409.         {
  410.             Console.SetWindowSize(103,40);
  411.             Console.Write(
  412.                 "\n\n\n" +
  413.                 "                           __  __           _            __  __ _           _ \n" +
  414.                 "                          |  \\/  |         | |          |  \\/  (_)         | |\n" +
  415.                 "                          | \\  / | __ _ ___| |_ ___ _ __| \\  / |_ _ __   __| |\n" +
  416.                 "                          | |\\/| |/ _` / __| __/ _ \\ '__| |\\/| | | '_ \\ / _` |\n" +
  417.                 "                          | |  | | (_| \\__ \\ ||  __/ |  | |  | | | | | | (_| |\n" +
  418.                 "                          |_|  |_|\\__,_|___/\\__\\___|_|  |_|  |_|_|_| |_|\\__,_|\n" +
  419.                 "\n                                                 By Dag\n\n" +
  420.                 "                                             Press Any Key");
  421.             Console.ReadKey();
  422.             string clear = new string(' ', Console.WindowWidth);
  423.             bool newGame = true;
  424.             while (newGame)
  425.             {
  426.                 bool didntPressYN = true;
  427.                 NewGame();
  428.                 while (didntPressYN)
  429.                 {
  430.                     switch (Console.ReadKey().Key)
  431.                     {
  432.                         case ConsoleKey.Y:
  433.                             didntPressYN = false;
  434.                             break;
  435.                         case ConsoleKey.N:
  436.                             newGame = false;
  437.                             didntPressYN = false;
  438.                             break;
  439.                         default:
  440.                             WriteAt(clear, 0, Console.CursorTop);
  441.                             Console.CursorLeft = 41;
  442.                             break;
  443.                     }
  444.                 }
  445.             }
  446.         }
  447.     }
  448. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement