Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- namespace Oktatas
- {
- /// Ebben a struktúrában tároljuk a tipp kiértékelt eredményét.
- struct GuessResult
- {
- public int inPlace;
- public int hasColor;
- }
- /// Mesterlogika játék.
- public class Mistermind
- {
- /// Lehetséges színek
- char[] colors = { 'P', 'S', 'Z', 'K', 'F', 'R' };
- /// A játék oszlopainak száma (alapértelmezésben: 4)
- static int COLUMN_COUNT = 4;
- Random rnd = new Random();
- /// Az aktuális játékban generált feladvány.
- char[] code = new char[COLUMN_COUNT];
- public void run()
- {
- play();
- }
- /// A játék menete
- void play()
- {
- /// Generálunk egy kódot az aktuális játékhoz
- generateCode();
- int rounds = 0;
- while(true)
- {
- char[] userGuess = readUserGuess();
- GuessResult guessResult = processGuess(userGuess);
- displayGuessResult(guessResult);
- if (guessResult.inPlace == COLUMN_COUNT)
- {
- displayVictory(rounds);
- break;
- }
- rounds += 1;
- }
- }
- /// Az osztály `code` mezőjében eltátol 4 véletlenszerű színt.
- /// Figyel arra, hogy egy szín ne szerepelhessen kétszer.
- private void generateCode()
- {
- // Töröljük a korábbi kódot.
- for(int i=0; i<COLUMN_COUNT; i++)
- {
- code[i] = ' ';
- }
- // Feltöltjük a kód egyes színeit
- for(int i=0; i<COLUMN_COUNT; i++)
- {
- // Szín keresése
- while (true)
- {
- // Generálunk egy véletlenszerű színt.
- int index = rnd.Next(COLUMN_COUNT);
- char c = colors[index];
- if (!isCodeContains(c))
- {
- // Ha még nem volt ilyen szín korábban, akkor megvan a keresett szín.
- code[i] = c;
- break; // Kilépünk a szín kereséséből.
- }
- }
- }
- }
- /// Bekérjük a felhasználótól a tippjét.
- private char[] readUserGuess()
- {
- Console.Write("> ");
- string line = Console.ReadLine();
- return line.ToCharArray(); // Karakter tömbre alakítjuk át a string-et.
- }
- /// Kiértékeljük a tippet.
- private GuessResult processGuess(char[] userGuess)
- {
- GuessResult result = new GuessResult();
- // A tipp összes elemén végigmegyünk.
- for(int i=0; i<COLUMN_COUNT; i++)
- {
- if(code[i] == userGuess[i])
- {
- // Ha a tipp aktuális eleme megegyezik a kód megfelelő elemével, akkor pontos találatunk van.
- result.inPlace += 1;
- }
- else if (isCodeContains(userGuess[i]))
- {
- // Ha nincs pontos találatunk, de van ilyen szín, akkor ezt tároljuk le.
- result.hasColor += 1;
- }
- }
- return result; // Visszatérünk a kiértékelés eredményével.
- }
- /// A tipp kiértékelt eredményét kiírjuk a képernyőre.
- private void displayGuessResult(GuessResult guessResult)
- {
- Console.Write(new string(' ', COLUMN_COUNT+3)); // Hagyunk egy kis helyet.
- // Kírjuk, hogy hány elem van jó helyen.
- for(int i=0; i<guessResult.inPlace; i++)
- {
- Console.Write("!");
- }
- // Kiírjuk, hogy hány további szín egyezik meg.
- for(int i=0; i<guessResult.hasColor; i++)
- {
- Console.Write("+");
- }
- // Ha nincs találat, akkor ez külön kíírjuk.
- if ((guessResult.inPlace == 0) && (guessResult.hasColor == 0))
- {
- Console.Write("(No matches)");
- }
- Console.WriteLine();
- }
- /// Győzelmet jelző kiírás.
- private void displayVictory(int rounds)
- {
- Console.WriteLine("You WON! Done it in " + rounds + " round(s).");
- }
- /// Segédfüggvény annak megállapítására, hogy az osztály `code` mezője tartalmazza-e az adott színt.
- private bool isCodeContains(char c)
- {
- // Az összes karaktert megvizsgáljuk.
- for(int i=0; i<COLUMN_COUNT; i++)
- {
- if (code[i] == c)
- {
- // Ha találtunk ilyen színű mezőt, akkor `igaz`zal térünk vissza.
- return true;
- }
- }
- return false; // Ha nem tértünk vissza `igaz`zal, akkor nem talátunk ilyen színt, vagyis `hamis`sal kell visszatérni.
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement