Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Mastermind_v2
- {
- class Backend
- {
- //skapar en stringarray med 4 olika färger utifrån 6 olika färger, en på varje plats i arrayen
- public static string[] Randomizer()
- {
- Random r = new Random();
- var randomizedNumbers = new int[4];
- for (int i = 0; i < 4; i++)
- {
- randomizedNumbers[i] = r.Next(0, 6);
- }
- string[] newRandom = randomizedNumbers.Select(x => x.ToString()).ToArray();
- for (int i = 0; i < 4; i++)
- {
- newRandom[i] = newRandom[i].Replace("0", "red");
- newRandom[i] = newRandom[i].Replace("1", "blue");
- newRandom[i] = newRandom[i].Replace("2", "green");
- newRandom[i] = newRandom[i].Replace("3", "pink");
- newRandom[i] = newRandom[i].Replace("4", "cyan");
- newRandom[i] = newRandom[i].Replace("5", "yellow");
- }
- return newRandom;
- }
- //formatterar rawInput, den själva strängen man skriver in och returnerar en stringArray
- static string[] Format(string rawInput)
- {
- //delar upp inputen i en ny array med varje färg på sin plats
- var newInput = rawInput.Split();
- //en liten "funktion" som fångar in fel
- var errorMessage = new string[] { "error", "", "", "" };
- if (newInput.Length != 4)
- {
- return errorMessage;
- }
- //är något av orden i inmatningen inte någon av dessa färger? return error
- foreach (string word in newInput)
- {
- switch (word)
- {
- case "red":
- case "blue":
- case "green":
- case "pink":
- case "cyan":
- case "yellow":
- break;
- default:
- return errorMessage;
- }
- }
- return newInput;
- }
- //funktion som räknar antalet av en viss färg i en array
- static int CountColors(string inputColor, string[] allColors)
- {
- int newAmount = allColors.Count(colors => colors == inputColor);
- return newAmount;
- }
- //"huvudfunktionen" i Backend, som kollar efter korrekta färger
- //returnerar en intarray, [0] är rätta platser, [1] är rätta färger, [2] är om det hittades något fel i inputen
- //[2] == 1 -> error hittades, [2] == 0 -> inget error hittades
- public static int[] CheckColors(string rawInput, string[] allRandomColors)
- {
- //formatterar inputen
- var input = Format(rawInput);
- //om något blivit fel i inmatningen kommer Format() att returnera en array med "error" på plats 0
- //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
- int foundError = 0;
- if (input[0] == "error")
- {
- foundError = 1;
- }
- //kolla efter korrekta färger
- int correctColors = 0;
- var inputDis = input.Distinct();
- foreach (string color in inputDis)
- {
- int[] numbers = { CountColors(color, allRandomColors), CountColors(color, input) };
- correctColors += numbers.Min();
- }
- //ok here we go
- //först skapas en Enumerable (typ en array fast inte riktigt) med startposition 0 och längd 4
- //så 0 1 2 3
- //color => allRandomColors[color] == input[color] är en lambdafunktion där color får värdet av platserna i Enumerablen
- //så det fungerar lite som en loop, fast där allt händer samtidigt istället för en efter en
- //.Count(x) räknar alltså alla ställen där allRandomColors[color] == input[color]
- //eller helt enkelt alla ställen där platserna matchar för inputarrayen och randomarrayen
- //och eftersom .Count(x) räknar saker kommer det lagras i en int
- int correctPositions = Enumerable.Range(0, 4).Count(color => allRandomColors[color] == input[color]);
- return new int[] { correctPositions, correctColors - correctPositions, foundError };
- }
- }
- class Interface
- {
- //ritar ut inputfärgerna i formatet [■] [■] [■] [■]
- static void InputColors(string input)
- {
- var inputColors = input.Split();
- foreach (string word in inputColors)
- {
- switch (word)
- {
- case "red":
- WriteColor("[■]", ConsoleColor.Red, " ");
- break;
- case "blue":
- WriteColor("[■]", ConsoleColor.Blue, " ");
- break;
- case "green":
- WriteColor("[■]", ConsoleColor.Green, " ");
- break;
- case "pink":
- WriteColor("[■]", ConsoleColor.Magenta, " ");
- break;
- case "cyan":
- WriteColor("[■]", ConsoleColor.Cyan, " ");
- break;
- case "yellow":
- WriteColor("[■]", ConsoleColor.Yellow, " ");
- break;
- }
- }
- }
- //ritar ut brädet
- static void Board(string input, int[] result)
- {
- //print # of correct positions
- Console.CursorLeft = 38;
- WriteColor(Convert.ToString(result[0]), ConsoleColor.Red, " ");
- Console.Write("│ ");
- //print the written pegs
- InputColors(input);
- //print # of correct colors
- Console.Write(" │ ");
- WriteColor(Convert.ToString(result[1]), ConsoleColor.White, "");
- }
- //skriver ut saker på en specifierad position
- static void WriteAt(string str, int left, int top)
- {
- Console.SetCursorPosition(left, top);
- Console.Write(str);
- }
- //skriver ut något med en specifierad färg
- static void WriteColor(string word, ConsoleColor consoleColor, string separator)
- {
- Console.ForegroundColor = consoleColor;
- Console.Write(word);
- Console.ForegroundColor = ConsoleColor.Gray;
- Console.Write(separator);
- }
- //skriver ut en animerad dialog, används när man vinner eller förlorar
- static void Dialogue()
- {
- WriteAt("┌───┴───────────────────┴───┐", 37, 8);
- for (int i = 0; i < 3; i++)
- {
- WriteAt("└───┬───────────────────┬───┘", 37, 9+i);
- System.Threading.Thread.Sleep(125);
- WriteAt("│" + new string(' ', 27) + "│", 37, 9+i);
- WriteAt("└───┬───────────────────┬───┘", 37, 10+i);
- }
- }
- //själva spelet
- static void NewGame()
- {
- //skapar en sträng som används om man behöver cleara en hel rad
- string clear = new string(' ', Console.WindowWidth);
- //Välj svårighetsgrad
- Console.Clear();
- WriteAt("Select difficulty", 46, 3);
- WriteAt("[", 43, 5);
- WriteColor("EASY", ConsoleColor.Green, "");
- Console.Write("] [");
- WriteColor("MEDIUM", ConsoleColor.Yellow, "");
- Console.Write("] [");
- WriteColor("HARD", ConsoleColor.Red, "");
- Console.Write("]");
- Console.SetCursorPosition(51, 6);
- bool diffLoop = true;
- int numberOfTurns = 0;
- string difficulty = "";
- //en loop som mäter vad man skrivit in och väljer en svårighetsgrad utifrån det
- while (diffLoop)
- {
- difficulty = Console.ReadLine().ToLower();
- switch (difficulty)
- {
- case "easy":
- numberOfTurns = 15;
- diffLoop = false;
- WriteAt(clear, 0, 8);
- WriteAt("Difficulty selected: [", 40, 8);
- WriteColor(difficulty.ToUpper(), ConsoleColor.Green, "");
- Console.Write("]");
- break;
- case "medium":
- numberOfTurns = 10;
- diffLoop = false;
- WriteAt(clear, 0, 8);
- WriteAt("Difficulty selected: [", 40, 8);
- WriteColor(difficulty.ToUpper(), ConsoleColor.Yellow, "");
- Console.Write("]");
- break;
- case "hard":
- numberOfTurns = 6;
- diffLoop = false;
- WriteAt(clear, 0, 8);
- WriteAt("Difficulty selected: [", 40, 8);
- WriteColor(difficulty.ToUpper(), ConsoleColor.Red, "");
- Console.Write("]");
- break;
- default:
- WriteAt(clear, 0, 6);
- WriteAt("Something went wrong, please select a valid difficulty", 27, 8);
- Console.SetCursorPosition(51, 6);
- break;
- }
- }
- System.Threading.Thread.Sleep(1500);
- Console.Clear();
- //deklarerar några variabler som används senare i programmet
- int turnsPlayed = 0;
- int turnsLeft = numberOfTurns - turnsPlayed;
- string input = "";
- var randomizedColors = Backend.Randomizer();
- //bygger ihop en ny sträng utifrån den slumpade färgkombinationen
- //skickas till Board() när man vinner eller förlorar för att visa den rätta färgkombinationen
- string concatRandom = String.Concat(
- randomizedColors[0],
- " ",
- randomizedColors[1],
- " ",
- randomizedColors[2],
- " ",
- randomizedColors[3]
- );
- //Börjar spelet genom att skriva ut alla möjliga färger
- WriteAt("Available colors: ", 24, 1);
- WriteColor("Red", ConsoleColor.Red, ", ");
- WriteColor("Blue", ConsoleColor.Blue, ", ");
- WriteColor("Green", ConsoleColor.Green, ", ");
- WriteColor("Pink", ConsoleColor.Magenta, ", ");
- WriteColor("Cyan", ConsoleColor.Cyan, ", ");
- WriteColor("Yellow", ConsoleColor.Yellow, "");
- //Skriver ut antalet turer som man har kvar
- //detta kommer ändras senare
- WriteAt("Difficulty: [", 20, 5);
- ConsoleColor diffColor = ConsoleColor.Gray;
- switch (difficulty)
- {
- case "easy":
- diffColor = ConsoleColor.Green;
- break;
- case "medium":
- diffColor = ConsoleColor.Yellow;
- break;
- case "hard":
- diffColor = ConsoleColor.Red;
- break;
- }
- WriteColor(difficulty.ToUpper(), diffColor, "");
- Console.Write("]");
- WriteAt("Turns left: " + turnsLeft, 20, 6);
- Console.SetCursorPosition(41, 7 + numberOfTurns);
- //Skriver ut det tomma brädet
- WriteAt("┌───────────────────┐", 41, 4);
- WriteAt("│ [?] [?] [?] [?] │", 41, 5);
- WriteAt("├───────────────────┤", 41, 6);
- WriteAt("└───────────────────┘", 41, numberOfTurns + 7);
- Console.CursorTop = 7;
- for (int i = 0; i < numberOfTurns; i++)
- {
- WriteAt("│ * * * * │", 41, 7 + i);
- }
- //startar själva spelet
- //så länge som man inte vunnit spelet eller fått slut på turer kan man köra en till tur
- bool wonGame = false;
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- for (turnsLeft = numberOfTurns; (turnsLeft > 0) && (wonGame == false); turnsLeft--)
- {
- turnsPlayed = numberOfTurns - turnsLeft;
- input = Console.ReadLine();
- int[] result = new int [3];
- //litet fusk, om man skriver in 2ez som input vinner man automatiskt
- string winCode = "neverlucky";
- if (input == winCode)
- {
- result = Backend.CheckColors(concatRandom, randomizedColors);
- wonGame = true;
- }
- else
- {
- //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
- //och lagrar det i result
- //och om något blev fel med inputen blir den sista platsen i result lika med 1, vilket kollas i nästa if-sats
- result = Backend.CheckColors(input, randomizedColors);
- }
- //om den inte hittat något fel i inmatningen skriver den ut resultatet och inputen i snygga färger genom att anropa Board();
- //dessutom skriver den ut den uppdaterade mängden turer som återstår
- if (result[2] == 0)
- {
- Console.CursorTop = 6 + turnsLeft;
- if (input == winCode)
- {
- Board(concatRandom, Backend.CheckColors(concatRandom, randomizedColors));
- wonGame = true;
- }
- else Board(input, result);
- WriteAt("Turns left: " + (turnsLeft - 1) + " ", 20, 6);
- WriteAt(clear, 0, 8 + numberOfTurns);
- WriteAt(clear, 0, 3);
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- }
- else
- {
- WriteAt("Something went wrong, please check your input.", 30, 3);
- WriteAt(clear, 0, 8 + numberOfTurns);
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- turnsLeft++;
- }
- //kollar om man vann
- if (result[0] == 4)
- {
- WriteAt(clear, 0, 3);
- Console.SetCursorPosition(42, 4);
- WriteColor("Correct combination", ConsoleColor.Green, "");
- Console.SetCursorPosition(44, 5);
- InputColors(concatRandom);
- System.Threading.Thread.Sleep(350);
- Dialogue();
- System.Threading.Thread.Sleep(150);
- Console.SetCursorPosition(48, 9);
- WriteColor("YOU WON", ConsoleColor.Green, "");
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- System.Threading.Thread.Sleep(750);
- if (turnsPlayed >= 10) WriteAt("TURNS PLAYED: " + ++turnsPlayed, 43, 11);
- else WriteAt("TURNS PLAYED: " + ++turnsPlayed, 44, 11);
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- System.Threading.Thread.Sleep(1500);
- for (int i = 0; i < 3; i++) WriteAt("│" + new string(' ', 27) + "│", 37, 9 + i);
- WriteAt("PLAY AGAIN? [Y/N]", 43, 10);
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- wonGame = true;
- }
- }
- //kollar om man förlorat
- if (!wonGame)
- {
- WriteAt(clear, 0, 3);
- Console.SetCursorPosition(42, 4);
- WriteColor("Correct combination", ConsoleColor.Red, "");
- Console.SetCursorPosition(44, 5);
- InputColors(concatRandom);
- System.Threading.Thread.Sleep(350);
- Dialogue();
- System.Threading.Thread.Sleep(150);
- Console.SetCursorPosition(47, 10);
- WriteColor("YOU LOST", ConsoleColor.Red, "");
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- System.Threading.Thread.Sleep(1000);
- WriteAt("PLAY AGAIN? [Y/N]", 43, 10);
- Console.SetCursorPosition(41, 8 + numberOfTurns);
- }
- }
- //splash screen och spela-igen-funktionaliteten
- static void Main(string[] args)
- {
- Console.SetWindowSize(103,40);
- Console.Write(
- "\n\n\n" +
- " __ __ _ __ __ _ _ \n" +
- " | \\/ | | | | \\/ (_) | |\n" +
- " | \\ / | __ _ ___| |_ ___ _ __| \\ / |_ _ __ __| |\n" +
- " | |\\/| |/ _` / __| __/ _ \\ '__| |\\/| | | '_ \\ / _` |\n" +
- " | | | | (_| \\__ \\ || __/ | | | | | | | | | (_| |\n" +
- " |_| |_|\\__,_|___/\\__\\___|_| |_| |_|_|_| |_|\\__,_|\n" +
- "\n By Dag\n\n" +
- " Press Any Key");
- Console.ReadKey();
- string clear = new string(' ', Console.WindowWidth);
- bool newGame = true;
- while (newGame)
- {
- bool didntPressYN = true;
- NewGame();
- while (didntPressYN)
- {
- switch (Console.ReadKey().Key)
- {
- case ConsoleKey.Y:
- didntPressYN = false;
- break;
- case ConsoleKey.N:
- newGame = false;
- didntPressYN = false;
- break;
- default:
- WriteAt(clear, 0, Console.CursorTop);
- Console.CursorLeft = 41;
- break;
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement