Как перебирать вопросы с данными JSON после получения правильного ответа? - PullRequest
0 голосов
/ 24 сентября 2018

Я строю простую загадку-вопрос-ответ с Python и Flask.Мои вопросы и ответы хранятся в файле JSON.

[
  {
    "name": "riddle_0",
    "description": "The more you take, the more you leave behind, what am i?",
    "answer": "footsteps"
  },
  {
    "name": "riddle_1",
    "description": "what has a head, a tail, is brown but has no legs?",
    "answer": "penny"
  },
  {
    "name": "riddle_2",
    "description": "what has many keys, but can't even open a single door?",
    "answer": "piano"
  }

Я представляю вопросы через h1 в шаблоне Game.html.

<div class="row">
          <div class="col-xl-9 mx-auto">
            <h1 class="mb-5">{{ username }}</h1>
            <h1 class="mb-5">{{ company_data[0]["description"] }}</h1>
          </div>
          <div class="col-md-10 col-lg-8 col-xl-7 mx-auto">
            <form method="POST" class="form-inline">
                        <input type="text" class="form-control" placeholder="answer" name="message" id="message" autofocus>
                        <input type="hidden" name="riddle_index" id="riddle_index" value={{riddle_index}}>
                        <button class="btn btn-danger">Submit Answer</button>

, доступ к которому осуществляется по маршруту

@app.route('/game', methods=["GET", "POST"])
def game_questions():
    data = []
    with open("data/company.json", "r") as json_data:
        data = json.load(json_data)
        return render_template("game.html", page_title="riddle_me_this", company_data=data)

Как правильно структурировать цикл for, чтобы он перешел к следующему вопросу после получения правильного ответа?

Ответы [ 3 ]

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

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

from flask import render_template, request

@app.route('/game', methods=["GET", "POST"])
def game_questions():

    req = request.form.to_dict()
    user_answer = req.get('answer')

    with open("data/company.json", "r") as json_data:
        data = json.load(json_data)

    questions = [
      {
        "name": "riddle_0",
        "description": "The more you take, the more you leave behind, what am i?",
        "answer": "footsteps"
      },
      {
        "name": "riddle_1",
        "description": "what has a head, a tail, is brown but has no legs?",
        "answer": "penny"
      },
      {
        "name": "riddle_2",
        "description": "what has many keys, but can't even open a single door?",
        "answer": "piano"
      }]

    new_question = None        

    for i, question in enumerate(questions):
        if question['answer'] == user_answer:
            try:
                new_question = questions[i + 1]['description']
                question_index = int(questions[i + 1]['name'].split('_')[1])

            except IndexError:
                new_question = 'No more questions left'
                question_index = None
            break

    context = {'question': new_question, 'riddle_index': question_index}

    return render_template("game.html", page_title="riddle_me_this", 
                           company_data=data, context=context)
0 голосов
/ 24 сентября 2018

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

from flask import Flask, render_template_string, request
import json

with open("riddle.json", "r") as json_data:
    riddles = json.load(json_data)

app = Flask(__name__)

TEMPLATE_STRING = """
{{riddle['description']}}<br>
<form method="POST" class="form-inline">
    <input type="text" class="form-control" placeholder="answer" name="answer" id="message" autofocus>
    <input type="hidden" name="riddle_id" value="{{riddle_index}}">
    <button class="btn btn-danger">Submit Answer</button>
</form>
"""


@app.route('/game', methods=["GET", "POST"])
def game_questions():
    if request.method == 'GET':
        riddle_index = 0
    else:
        riddle_index = int(request.form['riddle_id'])
        if riddles[riddle_index]['answer'] == request.form['answer']:
            riddle_index += 1
            if riddle_index >= len(riddles):
                riddle_index = 0
    return render_template_string(TEMPLATE_STRING, riddle_index=riddle_index, riddle=riddles[riddle_index])

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

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

Вы можете json перебрать json (в этом случае список dicts) и проверить, верен ли ответ.Если ответ неверный, просто разорвать петлю.Пример

import json
for i in json.loads(your_json_string):
    print('Your Question is: '+i['description'])
    #take answer
    # if ans == i['answer'] #continue for loop
    # else
    # break

Если вы хотите сохранить номер загадки, сначала отсортируйте список.Пример

a='''[
  {
    "name": "riddle_0",
    "description": "The more you take, the more you leave behind, what am i?",
    "answer": "footsteps"
  },
  {
    "name": "riddle_3",
    "description": "what has a head, a tail, is brown but has no legs?",
    "answer": "penny"
  },
  {
    "name": "riddle_2",
    "description": "what has many keys, but can't even open a single door?",
    "answer": "piano"
  }]
  '''
newlist = sorted(json.loads(a), key=lambda k: k['name']) # riddle_0,riddle_2,riddle_3
for i in newlist:
    print('Your Question is: '+i['description'])
    print('Your riddle '+i['name'])
    #take answer
    # if ans == i['answer'] #continue for loop
    # else
    # break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...