XNA викторина для проверки ответов - PullRequest
0 голосов
/ 18 ноября 2011

Прямо сейчас я создаю игру-викторину.вопрос, изображение для вопроса и ответ хранятся в текстовом файле.поэтому основная программа отображает только вопрос и изображения, направленные из этого текстового файла.и когда игрок вводит ответ, нажимая кнопку «Истина» или «Ложь», программа проверит его с ответом на этот вопрос в текстовом файле.

текстовый файл выглядит примерно так:

    question 1, TRUE, image1
    question 2, FALSE, image2
    question 3, FALSE, image3
    question 4, TRUE, image4
    question 5, TRUE, image5
    question 6, TRUE, image6
    question 7, FALSE, image7
    question 8, TRUE, image8
    question 9, FALSE, image9
    question 10, FALSE, image10

и вот как я читаю данные из текстового файла:

        StreamReader sr = new StreamReader("data.txt");
        string line;

       while ((line = sr.ReadLine()) != null)
        {
            string[] parts = line.Split(',');
            Soal datasoalnya = new Soal();
            datasoalnya.soal = parts[0];

            if (parts[1] == "TRUE")
            {
                datasoalnya.jawaban = true;
            }
            else if (parts[1] == "FALSE")
            {
                datasoalnya.jawaban = false;
            }

            datasoalnya.tempatImage = parts[2];
            soalList.Add(datasoalnya);

        }

и вот как я проверяю ответ:

        if ((mouseState.LeftButton == ButtonState.Pressed && prevMouseState.LeftButton == ButtonState.Released) &&
            (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(correctRectangle)))
        {
            ((Game1)Game).SoundBank.PlayCue("1_btn_click02");

            if (datasoalnya.jawaban = true)
            {
                score += 100;                   
                noSoal++;
                if (noSoal == 11)
                {
                    mouseDiBenar = true;
                    noSoal = 1;
                    score = 0;
                }

            }

            else if (datasoalnya.jawaban = false)
            {
                noSoal++;
                if (noSoal == 11)
                {
                    mouseDiBenar = true;
                    noSoal = 1;
                }

            }

        }

        else if ((mouseState.LeftButton == ButtonState.Pressed && prevMouseState.LeftButton == ButtonState.Released) &&
            (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(falseRectangle)))
        {
            ((Game1)Game).SoundBank.PlayCue("1_btn_click02");
            if (datasoalnya.jawaban = true)
            {                    
                noSoal++;
                if (noSoal == 11)
                {
                    mouseDiBenar = true;
                    noSoal = 1;
                    score = 0;
                }

            }

            else if (datasoalnya.jawaban = false)
            {
                score += 100;
                noSoal++;
                if (noSoal == 11)
                {
                    mouseDiBenar = true;
                    noSoal = 1;
                }

            }
        }

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

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

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

Вероятно, проблема в проверке вашего ответа тоже есть, но у вас определенно возникают проблемы с начальным / конечным интервалом, когда вы читаете файл.Вы должны Trim() разделить ваши части вверх.Так что это, вероятно, только половина ответа, который вам нужен.

Ваш массив частей в настоящее время выглядит следующим образом.

parts[0] = "question 1"
parts[1] = " TRUE"
parts[2] = " image1"

Поменять код на это поможет.

StreamReader sr = new StreamReader("data.txt");
string line;

while ((line = sr.ReadLine()) != null)
{
  string[] parts = line.Split(',');
  Soal datasoalnya = new Soal();
  datasoalnya.soal = parts[0].Trim();

  string correctAnswer = parts[1].Trim()
  if (correctAnswer  == "TRUE")
  {
    datasoalnya.jawaban = true;
  }
  else if (correctAnswer  == "FALSE")
  {
    datasoalnya.jawaban = false;
  }

  datasoalnya.tempatImage = parts[2].Trim();
  soalList.Add(datasoalnya);
}

В качестве примечания я бы рекомендовал использовать bool.TryParse() всякий раз, когда вы конвертируете строку в bool.Это сделает ваш код чище и будет меньше подвержен ошибкам.Вот как это будет выглядеть при попытке анализа.

StreamReader sr = new StreamReader("data.txt");
string line;

while ((line = sr.ReadLine()) != null)
{
  string[] parts = line.Split(',');
  Soal datasoalnya = new Soal();
  datasoalnya.soal = parts[0].Trim();

  bool isCorrectAnswer;
  if(bool.TryParse(parts[1], out isCorrectAnswer)
  {
    datasoalnya.jawaban = isCorrect;
  }
  else
  {
    // unable to parse, add logic to recover or error out
  }

  datasoalnya.tempatImage = parts[2].Trim();
  soalList.Add(datasoalnya);
}
1 голос
/ 18 ноября 2011
if (datasoalnya.jawaban = true)
...
else if (datasoalnya.jawaban = false)

Возможно, вы захотите изменить это = на ==, что также предлагается компилятором в качестве предупреждения и подчеркнуто зеленым в IDE.

0 голосов
/ 18 ноября 2011

Попробуйте это:

bool? button = null;
if (
   (mouseState.LeftButton == ButtonState.Pressed && 
    prevMouseState.LeftButton == ButtonState.Released) &&
    (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(correctRectangle)))
        button = true;
else
if (
   (mouseState.LeftButton == ButtonState.Pressed && 
    prevMouseState.LeftButton == ButtonState.Released) &&
    (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(falseRectangle)))
        button = false;
if (button != null)
{
    ((Game1)Game).SoundBank.PlayCue("1_btn_click02");
    if (datasoalnya.jawaban == button.Value) score += 100;
    noSoal++;
    if (noSoal == 11)
    {
        mouseDiBenar = true;
        noSoal = 1;
        if (datasoalnya.jawaban == button.Value) score = 0;
    }
}
...