184 lines
4.6 KiB
C#
Raw Normal View History

2025-06-26 14:07:29 +08:00
using QFramework;
using QFramework.Example;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class AnLiKaoHe: MonoBehaviour
{
public GameObject JieXi;
// <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD> - <20><><EFBFBD><EFBFBD>Inspector<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
[SerializeField] private List<TMP_InputField> inputFields = new List<TMP_InputField>();
// [SerializeField] private GameObject explanationObject;
[SerializeField] private List<string> correctAnswers = new List<string>();
[SerializeField] private Text codeExplanationText;
[SerializeField] private string[] codeExplanations;
[SerializeField] private bool caseSensitive = false;
// ״̬<D7B4>ֶ<EFBFBD>
private const int MAX_ATTEMPTS = 3; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
private bool hasAnsweredCorrectly = false; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private List<int> fieldAttempts; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private List<bool> fieldCorrect; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ״̬<D7B4><CCAC><EFBFBD><EFBFBD>
public bool isFirist = true;
private void Start()
{
if (JieXi != null)
JieXi.SetActive(false);
InitializeTrackingLists();
RegisterInputEvents();
HideAllExplanations();
isFirist = true;
}
private void InitializeTrackingLists()
{
fieldAttempts = new List<int>(new int[inputFields.Count]);
fieldCorrect = new List<bool>(new bool[inputFields.Count]);
}
private void RegisterInputEvents()
{
for (int i = 0; i < inputFields.Count; i++)
{
int fieldIndex = i;
inputFields[i].onEndEdit.AddListener(delegate { CheckField(fieldIndex); });
}
}
private void CheckField(int fieldIndex)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɴ<EFBFBD><C9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (hasAnsweredCorrectly || fieldCorrect[fieldIndex])
return;
// <20><><EFBFBD><EFBFBD><E9B5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
if (fieldAttempts[fieldIndex] >= MAX_ATTEMPTS)
{
ShowAllAnswersAndExplanation();
return;
}
string currentValue = ProcessInput(inputFields[fieldIndex].text);
string correctValue = ProcessInput(correctAnswers[fieldIndex]);
fieldAttempts[fieldIndex]++;
if (currentValue == correctValue)
{
if (isFirist)
{
ScoreController.Instance.Add("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 10);
}
fieldCorrect[fieldIndex] = true;
inputFields[fieldIndex].interactable = false;
ShowFieldExplanation(fieldIndex);
CheckAllFieldsCompleted();
}
else
{
isFirist = false;
inputFields[fieldIndex].text = "";
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
ShowErrorTip(fieldIndex);
}
}
private string ProcessInput(string input)
{
return caseSensitive ? input : input.ToLower();
}
private void ShowErrorTip(int fieldIndex)
{
var data = new UIResultTipData();
data.label = $"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
data.isRight = false;
data.autoHideTime = 1.5f;
UIKit.OpenPanelAsync<UIResultTip>(uiData: data, canvasLevel: UILevel.PopUI).ToAction().Start(this);
}
private void CheckAllFieldsCompleted()
{
foreach (bool correct in fieldCorrect)
{
if (!correct) return;
}
hasAnsweredCorrectly = true;
ShowExplanation();
}
private void ShowAllAnswersAndExplanation()
{
hasAnsweredCorrectly = true;
for (int i = 0; i < inputFields.Count; i++)
{
if (!fieldCorrect[i])
{
inputFields[i].text = correctAnswers[i];
inputFields[i].interactable = false;
ShowFieldExplanation(i);
}
}
ShowExplanation();
}
private void ShowExplanation()
{
if (JieXi != null)
JieXi.SetActive(true);
}
private void HideAllExplanations()
{
if (codeExplanationText != null)
codeExplanationText.text = "";
}
private void ShowFieldExplanation(int fieldIndex)
{
if (codeExplanationText != null && codeExplanations.Length > fieldIndex)
{
codeExplanationText.text = codeExplanations[fieldIndex];
}
}
public void ResetAttempts()
{
hasAnsweredCorrectly = false;
InitializeTrackingLists();
if (JieXi != null)
JieXi.SetActive(false);
for (int i = 0; i < inputFields.Count; i++)
{
inputFields[i].text = "";
inputFields[i].interactable = true;
}
HideAllExplanations();
}
}