Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Викторина в юнити

chupakabra ) Ученик (114), на голосовании 1 неделю назад
короче, делаю викторину в юнити, скрипт писала по видео, но кое что меняла под себя. у меня есть текст с вопросом и 3 кнопки с ответами, которым я потом присваивала ответы. под 0 индексом у меня правильный ответ. у меня 2 проблемы:
1) если я правильно понимаю, то
метод RemoveAt удаляет вопрос, который уже был задан во время игры из списка. я хочу удалить его, чтобы вопросы не удалялись и могли повторяться, но если удалить эту строку, то кнопки с ответами работают неправильно и один ответ присваивается к двум кнопкам.
2) иногда, даже если я нажимаю на правильный ответ, он считывает его как неправильный. и несмотря на то, что я еще не удалила метод answers.RemoveAt(rand) вопросы все равно повторяются
если кто нибудь поможет хоть с чем то, буду очень благодарна
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
public class GameScript : MonoBehaviour
{
public QuestionList[] questions;
public Text[] answersText;
public Text qText;
public Button[] answerBttns = new Button[3];
List<object> qList;
QuestionList crntQ;
int randQ;
public void OnClickPlay()
{
qList = new List<object>(questions);
questionGenerate();
}
void questionGenerate()
{
randQ = Random.Range(0, qList.Count);
crntQ = qList[randQ] as QuestionList;
qText.text = crntQ.question;
List<string> answers = new List<string>(crntQ.answers);
for (int i = 0; i < crntQ.answers.Length; i++)
{
int rand = Random.Range(0, answers.Count);
answersText[i].text = answers[rand];
answers.RemoveAt(rand);
}
}
public void AnswerBttns(int index)
{
if (answersText[index].text.ToString() != crntQ.answers[0]) {
print("Неправильный ответ");
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 3);
}
if (answersText[index].text.ToString() == crntQ.answers[0])
{
print("Правильный ответ");
questionGenerate();
}
else { questionGenerate(); }
}
}
[System.Serializable]
public class QuestionList
{
public string question;
public string[] answers = new string[3];
}
Голосование за лучший ответ
speexz Мыслитель (7474) 1 месяц назад
### **1) Проблема с удалением вопросов (`RemoveAt`)**
Ты правильно поняла: метод `RemoveAt` удаляет элемент из списка, и если его убрать, то вопросы не будут удаляться и смогут повторяться. Однако проблема с неправильным присвоением ответа к нескольким кнопкам вызвана тем, как работает твой цикл в методе `questionGenerate`.

**Проблема:**
Когда ты удаляешь ответы с помощью `answers.RemoveAt(rand)`, это предотвращает повторение одного и того же ответа на разных кнопках. Если убрать `RemoveAt`, то тот же ответ может попасть на две кнопки, что выглядит как ошибка.

**Решение:**
Вместо удаления элемента из списка (с помощью `RemoveAt`), можно создать новый список для случайной перестановки ответов (без удаления из исходного массива). Например, перемешать список `answers`.

Пример исправленного кода:
 void questionGenerate() 
{
randQ = Random.Range(0, qList.Count);
crntQ = qList[randQ] as QuestionList;
qText.text = crntQ.question;

// Перемешиваем список ответов
List<string> shuffledAnswers = new List<string>(crntQ.answers);
for (int i = 0; i < shuffledAnswers.Count; i++)
{
string temp = shuffledAnswers[i];
int randomIndex = Random.Range(0, shuffledAnswers.Count);
shuffledAnswers[i] = shuffledAnswers[randomIndex];
shuffledAnswers[randomIndex] = temp;
}

// Назначаем перемешанные ответы кнопкам
for (int i = 0; i < shuffledAnswers.Count; i++)
{
answersText[i].text = shuffledAnswers[i];
}
}

Теперь ответы будут перемешиваться без удаления, и дублирования на кнопках не будет.

---

### **2) Проблема с определением правильного ответа**

Эта ошибка связана с тем, что ты проверяешь текст кнопки (`answersText[index].text`) на совпадение с первым элементом в массиве `answers` (`crntQ.answers[0]`). Но если ты перемешала ответы, то их порядок на кнопках больше не соответствует изначальному порядку в массиве `answers`.

**Решение:**
Тебе нужно добавить проверку не на текст кнопки, а на индекс правильного ответа. Например, можно заранее сохранить индекс правильного ответа из перемешанного списка.

Исправленный код проверки ответа:
 int correctIndex;

void questionGenerate()
{
randQ = Random.Range(0, qList.Count);
crntQ = qList[randQ] as QuestionList;
qText.text = crntQ.question;

List<string> shuffledAnswers = new List<string>(crntQ.answers);
for (int i = 0; i < shuffledAnswers.Count; i++)
{
string temp = shuffledAnswers[i];
int randomIndex = Random.Range(0, shuffledAnswers.Count);
shuffledAnswers[i] = shuffledAnswers[randomIndex];
shuffledAnswers[randomIndex] = temp;
}

for (int i = 0; i < shuffledAnswers.Count; i++)
{
answersText[i].text = shuffledAnswers[i];
if (shuffledAnswers[i] == crntQ.answers[0])
{
correctIndex = i; // Запоминаем индекс правильного ответа
}
}
}

public void AnswerBttns(int index)
{
if (index == correctIndex)
{
print("Правильный ответ");
questionGenerate();
}
else
{
print("Неправильный ответ");
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 3);
}
}

### **Почему вопросы всё равно повторяются?**

Если ты не удаляешь вопрос из `qList`, то вопросы могут повторяться. Чтобы они шли без повторений, можно удалить текущий вопрос из списка после генерации. Если тебе нужно, чтобы вопросы не удалялись, но повторялись в случайном порядке, то оставить как есть.
chupakabra )Ученик (114) 1 месяц назад
спасибо огромное) очень помог!
Похожие вопросы