Заставить консоль пропускать уже угаданные символы в случайно циклически угаданном коде - PullRequest
0 голосов
/ 05 января 2019

Код начинается с вопроса, сколько цифр в коде. Затем он создает случайную строку букв до тех пор, пока ответ, и начинает циклически перебирать символы, пока не найдет код. Каждый соответствующий символ хранится в одном и том же месте, пока не будет сопоставлен каждый символ.

Проблема в том, что консоль постоянно угадывает неправильный символ, что приводит к ситуациям, когда консоль продолжает угадывать неправильный символ и никогда не решает его.

Итак, я хочу, чтобы консоль не пробовала неправильные символы после их угадывания.

Кстати, если у кого-то есть идеи о том, как я мог бы изменить код, чтобы вместо этого угадывать один символ за раз, то переходите к следующему, скажите, пожалуйста, спасибо.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApp3
{
    class Program
    {
        private static Random random = new Random();
        public static string RandomString(int length)
        {
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Repeat(chars, length)
              .Select(s => s[random.Next(s.Length)]).ToArray());
        }



        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Green;


            string intro6 = "How many characters in the password? (USE INTEGERS)";
            foreach (char c in intro6)
            {
                Console.Write(c);
                Thread.Sleep(50);
            }
            Console.WriteLine("");
            string delta = Console.ReadLine();

            try
            {


                int passwordlength = Convert.ToInt32(delta);

                // BARRIER

                string password = RandomString(passwordlength);

                Random r = new Random();
                string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                List<string> dictionary = new List<string>(new string[] {
            password
        });

                string word = dictionary[r.Next(dictionary.Count)];
                List<int> indexes = new List<int>();
                Console.ForegroundColor = ConsoleColor.Red;
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < word.Length; i++)
                {
                    sb.Append(letters[r.Next(letters.Length)]);
                    if (sb[i] != word[i])
                    {
                        indexes.Add(i);

                    }
                }
                Console.WriteLine(sb.ToString());

                while (indexes.Count > 0)
                {
                    int index;

                    Thread.Sleep(10);
                    Console.Clear();

                    for (int i = indexes.Count - 1; i >= 0; i--)
                    {
                        index = indexes[i];
                        sb[index] = letters[r.Next(letters.Length)];
                        if (sb[index] == word[index])
                        {

                            indexes.RemoveAt(i);




                        }


                    }
                    var output = sb.ToString();

                    for (int i = 0; i < output.Length; i++)
                    {
                        if (indexes.Contains(i))
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                        }
                        else
                        {
                            Console.ForegroundColor = ConsoleColor.Cyan;
                        }

                        Console.Write(output[i]);
                    }

                    Console.WriteLine();



                }

                Console.ForegroundColor = ConsoleColor.Green;

                string outro1 = "Password successfully breached. Have a nice day.";
                foreach (char c in outro1)
                {
                    Console.Write(c);
                    Thread.Sleep(20);
                }
                Console.WriteLine("");
                Thread.Sleep(100);


                Console.ReadLine();

            }

            catch
            {


                if (delta is string)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Clear();
                    Console.WriteLine("FATAL ERROR PRESS ENTER TO EXIT");


                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("welp, it was worth a try.");
                    Console.ReadLine();
                }




            }


        }
    }
}

1 Ответ

0 голосов
/ 05 января 2019

Как упомянул в своем комментарии Вабблер, похоже, что у вас есть несоответствие между символами, используемыми для создания случайного пароля, и символами, которые затем используются для угадывания пароля.

Для создания:

const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

Догадаться:

string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Это приводит к тому, что программа не может угадать пароль, если случайно сгенерированный пароль содержит какие-либо числа. Добавляя числа к угадываемым символам, программа затем добивается большего успеха.

А что касается запроса:

Я хочу, чтобы консоль не пробовала неправильные символы после их угадывания уже

Этого можно добиться, сохранив набор предполагаемых символов для каждого индекса, а затем удалив символ из его коллекции для данного индекса, как только он угадает. Следующий код удовлетворяет этому:

static void Main(string[] args)
{
    Console.ForegroundColor = ConsoleColor.Green;

    string intro6 = "How many characters in the password? (USE INTEGERS)";
    foreach (char c in intro6)
    {
        Console.Write(c);
        Thread.Sleep(50);
    }
    Console.WriteLine("");
    string delta = Console.ReadLine();

    try
    {
        int passwordlength = Convert.ToInt32(delta);

        // BARRIER

        string password = RandomString(passwordlength);

        Random r = new Random();
        string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        List<string> dictionary = new List<string>(new string[] { password });

        string word = dictionary[r.Next(dictionary.Count)];
        List<int> indexes = new List<int>();
        Console.ForegroundColor = ConsoleColor.Red;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < word.Length; i++)
        {
            sb.Append(letters[r.Next(letters.Length)]);
            if (sb[i] != word[i])
            {
                indexes.Add(i);

            }
        }
        Console.WriteLine(sb.ToString());

        var charsToGuessByIndex = indexes.ToDictionary(k => k, v => letters);

        while (indexes.Count > 0)
        {
            int index;

            Thread.Sleep(10);
            Console.Clear();

            for (int i = indexes.Count - 1; i >= 0; i--)
            {
                index = indexes[i];

                var charsToGuess = charsToGuessByIndex[index];
                sb[index] = charsToGuess[r.Next(charsToGuess.Length)];
                charsToGuessByIndex[index] = charsToGuess.Remove(charsToGuess.IndexOf(sb[index]), 1);
                if (sb[index] == word[index])
                {
                    indexes.RemoveAt(i);
                }
            }
            var output = sb.ToString();

            for (int i = 0; i < output.Length; i++)
            {
                if (indexes.Contains(i))
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Cyan;
                }

                Console.Write(output[i]);
            }

            Console.WriteLine();
        }

        Console.ForegroundColor = ConsoleColor.Green;

        string outro1 = "Password successfully breached. Have a nice day.";
        foreach (char c in outro1)
        {
            Console.Write(c);
            Thread.Sleep(20);
        }
        Console.WriteLine("");
        Thread.Sleep(100);

        Console.ReadLine();
    }
    catch
    {
        if (delta is string)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Clear();
            Console.WriteLine("FATAL ERROR PRESS ENTER TO EXIT");


            Console.ReadLine();
        }
        else
        {
            Console.WriteLine("welp, it was worth a try.");
            Console.ReadLine();
        }
    }
}

charsToGuessByIndex отслеживает, какие символы могут быть угаданы по индексу, и обновляется соответствующим образом в цикле for, где символы угадываются в:

charsToGuessByIndex[index] = charsToGuess.Remove(charsToGuess.IndexOf(sb[index]), 1);
...