Advertisement
prampec

C# Mastermind

Jun 21st, 2019
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.16 KB | None | 0 0
  1. using System;
  2.  
  3. namespace Oktatas
  4. {
  5.     /// Ebben a struktúrában tároljuk a tipp kiértékelt eredményét.
  6.     struct GuessResult
  7.     {
  8.         public int inPlace;
  9.         public int hasColor;
  10.     }
  11.  
  12.     /// Mesterlogika játék.
  13.     public class Mistermind
  14.     {
  15.         /// Lehetséges színek
  16.         char[] colors = { 'P', 'S', 'Z', 'K', 'F', 'R' };
  17.  
  18.         /// A játék oszlopainak száma (alapértelmezésben: 4)
  19.         static int COLUMN_COUNT = 4;
  20.  
  21.         Random rnd = new Random();
  22.  
  23.         /// Az aktuális játékban generált feladvány.
  24.         char[] code = new char[COLUMN_COUNT];
  25.  
  26.         public void run()
  27.         {
  28.             play();
  29.         }
  30.  
  31.         /// A játék menete
  32.         void play()
  33.         {
  34.             /// Generálunk egy kódot az aktuális játékhoz
  35.             generateCode();
  36.             int rounds = 0;
  37.             while(true)
  38.             {
  39.                 char[] userGuess = readUserGuess();
  40.                 GuessResult guessResult = processGuess(userGuess);
  41.                 displayGuessResult(guessResult);
  42.                 if (guessResult.inPlace == COLUMN_COUNT)
  43.                 {
  44.                     displayVictory(rounds);
  45.                     break;
  46.                 }
  47.                 rounds += 1;
  48.             }
  49.         }
  50.  
  51.         /// Az osztály `code` mezőjében eltátol 4 véletlenszerű színt.
  52.         /// Figyel arra, hogy egy szín ne szerepelhessen kétszer.
  53.         private void generateCode()
  54.         {
  55.             // Töröljük a korábbi kódot.
  56.             for(int i=0; i<COLUMN_COUNT; i++)
  57.             {
  58.                 code[i] = ' ';
  59.             }
  60.             // Feltöltjük a kód egyes színeit
  61.             for(int i=0; i<COLUMN_COUNT; i++)
  62.             {
  63.                 // Szín keresése
  64.                 while (true)
  65.                 {
  66.                     // Generálunk egy véletlenszerű színt.
  67.                     int index = rnd.Next(COLUMN_COUNT);
  68.                     char c = colors[index];
  69.  
  70.                     if (!isCodeContains(c))
  71.                     {
  72.                         // Ha még nem volt ilyen szín korábban, akkor megvan a keresett szín.
  73.                         code[i] = c;
  74.                         break; // Kilépünk a szín kereséséből.
  75.                     }
  76.                 }
  77.             }
  78.         }
  79.  
  80.         /// Bekérjük a felhasználótól a tippjét.
  81.         private char[] readUserGuess()
  82.         {
  83.             Console.Write("> ");
  84.             string line = Console.ReadLine();
  85.             return line.ToCharArray(); // Karakter tömbre alakítjuk át a string-et.
  86.         }
  87.  
  88.         /// Kiértékeljük a tippet.
  89.         private GuessResult processGuess(char[] userGuess)
  90.         {
  91.             GuessResult result = new GuessResult();
  92.            
  93.             // A tipp összes elemén végigmegyünk.
  94.             for(int i=0; i<COLUMN_COUNT; i++)
  95.             {
  96.                 if(code[i] == userGuess[i])
  97.                 {
  98.                     // Ha a tipp aktuális eleme megegyezik a kód megfelelő elemével, akkor pontos találatunk van.
  99.                     result.inPlace += 1;
  100.                 }
  101.                 else if (isCodeContains(userGuess[i]))
  102.                 {
  103.                     // Ha nincs pontos találatunk, de van ilyen szín, akkor ezt tároljuk le.
  104.                     result.hasColor += 1;
  105.                 }
  106.             }
  107.             return result; // Visszatérünk a kiértékelés eredményével.
  108.         }
  109.  
  110.         /// A tipp kiértékelt eredményét kiírjuk a képernyőre.
  111.         private void displayGuessResult(GuessResult guessResult)
  112.         {
  113.             Console.Write(new string(' ', COLUMN_COUNT+3)); // Hagyunk egy kis helyet.
  114.  
  115.             // Kírjuk, hogy hány elem van jó helyen.
  116.             for(int i=0; i<guessResult.inPlace; i++)
  117.             {
  118.                 Console.Write("!");
  119.             }
  120.  
  121.             // Kiírjuk, hogy hány további szín egyezik meg.
  122.             for(int i=0; i<guessResult.hasColor; i++)
  123.             {
  124.                 Console.Write("+");
  125.             }
  126.  
  127.             // Ha nincs találat, akkor ez külön kíírjuk.
  128.             if ((guessResult.inPlace == 0) && (guessResult.hasColor == 0))
  129.             {
  130.                 Console.Write("(No matches)");
  131.             }
  132.             Console.WriteLine();
  133.         }
  134.  
  135.         /// Győzelmet jelző kiírás.
  136.         private void displayVictory(int rounds)
  137.         {
  138.             Console.WriteLine("You WON! Done it in " + rounds + " round(s).");
  139.         }
  140.  
  141.         /// Segédfüggvény annak megállapítására, hogy az osztály `code` mezője tartalmazza-e az adott színt.
  142.         private bool isCodeContains(char c)
  143.         {
  144.             // Az összes karaktert megvizsgáljuk.
  145.             for(int i=0; i<COLUMN_COUNT; i++)
  146.             {
  147.                 if (code[i] == c)
  148.                 {
  149.                     // Ha találtunk ilyen színű mezőt, akkor `igaz`zal térünk vissza.
  150.                     return true;
  151.                 }
  152.             }
  153.             return false; // Ha nem tértünk vissza `igaz`zal, akkor nem talátunk ilyen színt, vagyis `hamis`sal kell visszatérni.
  154.         }
  155.     }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement