Получение необработанного исключения: System.FormatException: строка должна быть ровно один символ, если символ не содержится в массиве - PullRequest
0 голосов
/ 13 октября 2018

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

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        if(game.CheckAnswer())
        {
            Console.WriteLine("true");
        }
        else if(!game.CheckAnswer())
        {
            Console.WriteLine("false");
        }
    }   
}

class Word
{
    public static string GetWord()
    {
        string[] words = new string[5]{"alpha", "bravo", "charlie", "delta", "echo"};
        Random random = new Random();
        return words[random.Next(5)];
    }
    public char[] correctAnswer = GetWord().ToCharArray();
}

class Game
{
    static char guessLetter;
    static List<char> correctGuesses = new List<char>();
    static List<char> incorrectGuesses = new List<char>();
    Word word = new Word();

    public bool CheckAnswer()
    {
        guessLetter = Convert.ToChar(Console.ReadLine());
        if (word.correctAnswer.Contains(guessLetter))
        {
            return true;
        }
        else if (!word.correctAnswer.Contains(guessLetter))
        {
            return false;
        }
        else
        {
            return false;
        }
    }

}

Да, я проверил другие ответы, и нет, у них не было решения моей проблемы.

Ответы [ 3 ]

0 голосов
/ 13 октября 2018
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Game game = new Game();
            if (game.CheckAnswer())
            {
                Console.WriteLine("true");
            }
            else 
            {
                Console.WriteLine("false");
            }                
        }            
    }
}

class Word
{
    public static string GetWord()
    {
        string[] words = new string[5] { "alpha", "bravo", "charlie", "delta", "echo" };
        Random random = new Random();
        return words[random.Next(5)];
    }

    public char[] correctAnswer = GetWord().ToCharArray();
}

class Game
{
    static char guessLetter;
    static List<char> correctGuesses = new List<char>();
    static List<char> incorrectGuesses = new List<char>();
    Word word = new Word();

    public bool CheckAnswer()
    {
        guessLetter = Console.ReadKey().KeyChar;

        if (word.correctAnswer.Contains(guessLetter))
        {
            Console.WriteLine();
            return true;
        }
        Console.WriteLine();
        return false;
    }    
}
0 голосов
/ 13 октября 2018

Ваша проблема, вероятно, в вашей функции Main.Если вводимый символ отсутствует в слове, вы на самом деле в конечном итоге запрашиваете ввод с консоли второй раз.

Попробуйте изменить его на:

static void Main(string[] args)
{
    Game game = new Game();

    bool answer = game.CheckAnswer(); // now you are only asking for input once

    if(answer) Console.WriteLine("true");
    else Console.WriteLine("false");
}   

и посмотрите, что произойдет.

0 голосов
/ 13 октября 2018

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

Если введенная вами буква неверна, она будет проверена как в том, так и в другом случае, когда она вызывается дважды.

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        //dont call the method in if else save the result in a var first maybe
        Console.WriteLine(game.CheckAnswer());
    }   
}

class Word
{
    public static string GetWord()
    {
        string[] words = new string[5]{"alpha", "bravo", "charlie", "delta", "echo"};
        Random random = new Random();
        return words[random.Next(5)];
    }
    public char[] correctAnswer = GetWord().ToCharArray();
}

class Game
{
    static char guessLetter;
    static List<char> correctGuesses = new List<char>();
    static List<char> incorrectGuesses = new List<char>();
    Word word = new Word();

    public bool CheckAnswer()
    {
        guessLetter = Convert.ToChar(Console.ReadLine());

        //you can return the result directly
        return word.correctAnswer.Contains(guessLetter);
    }
}
...