Проверка нескольких значений словаря для проверки ответа - PullRequest
0 голосов
/ 02 сентября 2018

Мне удалось создать поле ввода, которое можно проверять и проверять по вопросу, создавая другое текстовое поле и связывая его с указанным вопросом, поэтому, например, если значение вопроса равно «1», ответ будет быть '1'. Затем я сделал сравнение текста, так что если то, что пользователь написал = это текстовое поле, ответ будет правильным. Однако я понимаю, что иногда кто-то может написать что-то еще. Например, в вопросе «Что вы думаете о тиграх» нет единственно возможного ответа. И, следовательно, способ, которым я это сделал для поля ввода, точно не работает (не так ли?).

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

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

Если то, что я только что сказал, не имело смысла, вот пример:

Текущее поведение:

ОПРОС: Тебе нравятся кошки?

ПОЛЕ ВВОДА: Да, я делаю

СКРЫТОЕ ТЕКСТОВОЕ ПОЛЕ: Да, я делаю

поле ввода = скрытое текстовое поле и, следовательно, правильное значение

Идеальное поведение:

ОБЗОР: Вы любите кошек?

ВХОДНОЕ ПОЛЕ: Я люблю кошек

ВОЗМОЖНЫЕ ОТВЕТЫ: ​​я люблю кошек, да, я делаю и т.д.

INPUT FIELD содержит ответ в списке, который соответствует вопросу и, следовательно, правильный.

Я думал, что вы могли бы использовать функцию .Contains, но я не знал, как связать все это вместе.

EDIT:

Я пытался решить эту проблему путем создания словаря и поиска ключа (который, я считаю, был правильным способом сделать это), но по какой-то причине этот код даже не работает при его проверке? (похоже, что функция .containsKey не работает?)

public string questions = "hi;weird;by";
Dictionary<int, string> tester = new Dictionary<int, string>();

// Use this for initialization
void Start () 
{     
    tester.Add(1, questions);
    tester.Add(2, "hello");
    tester.Add(3, "by");
    tester.Add(4, "hi");
    tester.Add(5, "bye");
}

// Update is called once per frame
void Update () 
{       
}

public void hello ()
{
    if(tester.ContainsKey(2))
    {
        string value = tester[2];
        Debug.Log("Correct");
    }
}

РЕДАКТИРОВАТЬ 1:

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

СПИСОК

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;

public class Listpractice : MonoBehaviour 
{
    Dictionary<int, List<string>> tester = new Dictionary<int, List<string>>();
    List<string> possibleAnswersToQuestionZero = new List<string>(); 

    // Use this for initialization
    void Start () {

        possibleAnswersToQuestionZero.Add("Hello");
        possibleAnswersToQuestionZero.Add("By");
        tester.Add(0, possibleAnswersToQuestionZero);     
    }

    // Update is called once per frame
    void Update ()
    {       
    }

    public void hello ()
    {
        var toCheck = tester[0].FirstOrDefault(x => x == GameController.hello);

        if (toCheck != null)
        {
            Debug.Log("Hi!");
        }
    } 

}

ПОЛЕ ВВОДА

public class QAClass07
{
    public string Answer = "";
    public string Question = "";
    QAClass07 result = new QAClass07();        
}

public static string hello;   

void Start()
{
  GameObject a = gameObject;   
  hello = a.transform.Find("Text").GetComponent<Text>().text;
}

// registers what the user writes 
public void getInput(string guess)
{        
    // Does something assuming someone enters something
    if (GetComponent<InputField>() != null)
    {
        hello = GetComponentInChildren<Text>().text;
    }              
}

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

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

Да, Dictionary<TKey, TValue> состоит из пар ключ-значение определенного типа каждая; вы можете объявить тип его ключа int (соответствующий индексу задаваемого в данный момент вопроса) и объявить тип его значения List<string>, чтобы сохранить возможные ответы на этот вопрос.

// key is question index, value is a list of possible answers for that question
var dictionary = new Dictionary<int, List<string>>();

// list of possible answers for question 0 (random question number chosen for the example)
var possibleAnswersToQuestionZero = new List<string>(); 
possibleAnswersToQuestionZero.Add("Possible Answer to question 0");
possibleAnswersToQuestionZero.Add("Another possible answer to question 0");

// add that list to the dictionary at key 0.
// you should be also checking if the key exists before trying to access it's value, 
// and what happens if the list returned for that key is null or empty.
dictionary.Add(0, possibleAnswersToQuestionZero);

Чтобы проверить, находится ли ответ, предоставленный пользователем (предположим, что он сохранен в переменной с именем userInput) на вопрос 0, в списке возможных ответов для этого ключа, мы должны сделать:

// check if the list at dictionary[0] has at least one instance of userInput,
// otherwise return null
var toCheck = dictionary[0].FirstOrDefault(x => x == userInput);

// if the result is not null, the answer was found 
if (toCheck != null)
{
    // answer found
}
0 голосов
/ 03 сентября 2018

Просто используйте Dictionary<int, List<string>>, а затем добавьте все ответы к соответствующему идентификатору вопроса.

var questions = new List<string> { "hi", "weird", "by" };
var tester = new Dictionary<int, List<string>>();

// Use this for initialization
void Start () 
{     
    tester.Add(1, questions);
    tester.Add(2, new List<string> { "hello" });
    tester.Add(3, new List<string> { "by" });
    tester.Add(4, new List<string> { "hi" });
    tester.Add(5, new List<string> { "bye" });
}


public void hello ()
{
    if(tester.ContainsKey(2))
    {
        var answers = tester[2] ?? new List<string>();
        // now you have all answers linked to question with id 2 in answers variable
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...