반응형
DataManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class DataManager : MonoBehaviour
{
public static DataManager instance;
[Header(" Data ")]
private int coins;
private int score;
private int bestScore;
[Header(" Events ")]
public static Action onCoinsUpdated;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
LoadData();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void AddCoins(int amount)
{
coins += amount;
SaveData();
onCoinsUpdated?.Invoke();
}
public void RemoveCoins(int amount)
{
coins -= amount;
coins = Mathf.Max(coins, 0); // Ensure coins don't go negative
SaveData();
onCoinsUpdated?.Invoke();
}
public void IncreaseScore(int amount)
{
score += amount;
if (score > bestScore)
bestScore = score;
SaveData();
}
public void ResetScore()
{
score = 0;
SaveData();
}
public int GetCoins()
{
return coins;
}
public int GetScore()
{
return score;
}
public int GetBestScore()
{
return bestScore;
}
private void LoadData()
{
coins = PlayerPrefs.GetInt("coins", 150);
score = PlayerPrefs.GetInt("score");
bestScore = PlayerPrefs.GetInt("bestScore");
}
private void SaveData()
{
PlayerPrefs.SetInt("coins", coins);
PlayerPrefs.SetInt("score", score);
PlayerPrefs.SetInt("bestScore", bestScore);
}
}
GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public enum GameState { Menu, Game, LevelComplete, Gameover, Idle }
public class GameManager : MonoBehaviour
{
public static GameManager instance;
[Header(" Settings ")]
private GameState gameState;
[Header(" Events ")]
public static Action<GameState> onGameStateChanged;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
public void SetGameState(GameState gameState)
{
this.gameState = gameState;
onGameStateChanged?.Invoke(gameState);
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void NextButtonCallback()
{
SetGameState(GameState.Game);
}
public void PlayButtonCallback()
{
SetGameState(GameState.Game);
}
public void BackButtonCallback()
{
SetGameState(GameState.Menu);
}
public bool IsGameState() // 8 차
{
return gameState == GameState.Game;
}
}
HintManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HintManager : MonoBehaviour
{
[Header(" Elements ")]
[SerializeField] private GameObject keyboard;
private KeyboardKey[] keys;
[Header(" Text Elements ")]
[SerializeField] private TextMeshProUGUI keyboardPriceText;
[SerializeField] private TextMeshProUGUI letterPriceText;
[Header(" Settings ")]
[SerializeField] private int keyboardHintPrice;
[SerializeField] private int letterHintPrice;
private bool shouldReset;
private void Awake()
{
keys = keyboard.GetComponentsInChildren<KeyboardKey>();
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
GameManager.onGameStateChanged += GameStateChangedCallback;
}
private void OnDestroy()
{
keyboardPriceText.text = keyboardHintPrice.ToString();
letterPriceText.text = letterHintPrice.ToString();
GameManager.onGameStateChanged -= GameStateChangedCallback; // 5차 코드 추가
}
private void GameStateChangedCallback(GameState gameState)
{
switch (gameState)
{
case GameState.Menu:
break;
case GameState.Game:
if(shouldReset)
{
letterHintGivenIndices.Clear();
shouldReset = false;
}
break;
case GameState.LevelComplete:
shouldReset = true;
break;
case GameState.Gameover:
shouldReset = true;
break;
}
} // 5차 코드 추가
// Update is called once per frame
void Update()
{
}
public void KeyboardHint()
{
if (DataManager.instance.GetCoins() < keyboardHintPrice)
return;
string secretWord = WordManager.instance.GetSecretWord();
List<KeyboardKey> untouchedKeys = new List<KeyboardKey>();
for (int i = 0; i < keys.Length; i++)
if (keys[i].IsUntouched())
untouchedKeys.Add(keys[i]);
List<KeyboardKey> t_untouchedKeys = new List<KeyboardKey>(untouchedKeys);
for (int i = 0; i < untouchedKeys.Count; i++)
if (secretWord.Contains(untouchedKeys[i].GetLetter()))
t_untouchedKeys.Remove(untouchedKeys[i]);
if (t_untouchedKeys.Count <= 0)
return;
int randomKeyIndex = Random.Range(0, t_untouchedKeys.Count);
t_untouchedKeys[randomKeyIndex].SetInvalid();
DataManager.instance.RemoveCoins(keyboardHintPrice);
}
List<int> letterHintGivenIndices = new List<int>();
public void LetterHint()
{
if (DataManager.instance.GetCoins() < letterHintPrice)
return;
if (letterHintGivenIndices.Count >= 5)
{
Debug.Log("All hints");
return;
}
List<int> letterHintNotGivenIndices = new List<int>();
for (int i = 0; i < 5; i++)
if (!letterHintGivenIndices.Contains(i))
letterHintNotGivenIndices.Add(i);
WordContainer currentWordContainer = InputManager.instance.GetCurrentWordContainer();
string secretWord = WordManager.instance.GetSecretWord();
int randomIndex = letterHintNotGivenIndices[Random.Range(0, letterHintNotGivenIndices.Count)];
letterHintGivenIndices.Add(randomIndex);
currentWordContainer.AddAsHint(randomIndex, secretWord[randomIndex]);
DataManager.instance.RemoveCoins(letterHintPrice);
}
}
InputManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using System;
public class InputManager : MonoBehaviour
{
public static InputManager instance;
[Header(" Elements ")]
[SerializeField] private WordContainer[] wordContainers;
[SerializeField] private Button tryButton;
[SerializeField] private KeyboardColorizer keyboardColorizer;
[Header(" Settings ")]
private int currentWordContainerIndex;
private bool canAddLetter = true;
private bool shouldReset;
[Header(" Events ")]
public static Action onLetterAdded;
public static Action onLetterRemoved;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Initialize();
KeyboardKey.onKeyPressed += KeyPressedCallback;
GameManager.onGameStateChanged += GameStateChangedCallback; // 5차 코드 추가
}
private void OnDestroy()
{
KeyboardKey.onKeyPressed -= KeyPressedCallback;
GameManager.onGameStateChanged -= GameStateChangedCallback; // 5차 코드 추가
}
private void GameStateChangedCallback(GameState gameState)
{
switch (gameState)
{
case GameState.Game:
Initialize();
break;
case GameState.LevelComplete:
shouldReset = true;
break;
case GameState.Gameover:
shouldReset = true;
break;
}
} // 5차 코드 추가
// Update is called once per frame
void Update()
{
}
private void Initialize()
{
currentWordContainerIndex = 0; // 5차 추가 코드
canAddLetter = true; // 5차 추가 코드
DisableTryButton(); // 5차 추가 코드
for (int i = 0; i < wordContainers.Length; i++)
wordContainers[i].Initialize();
shouldReset = false;
}
private void KeyPressedCallback(char letter)
{
if (!canAddLetter)
return;
wordContainers[currentWordContainerIndex].Add(letter);
if (wordContainers[currentWordContainerIndex].IsComplete())
{
canAddLetter = false;
EnableTryButton();
}
onLetterAdded?.Invoke();
}
public void CheckWord()
{
string wordToCheck = wordContainers[currentWordContainerIndex].GetWord();
string secretWord = WordManager.instance.GetSecretWord();
wordContainers[currentWordContainerIndex].Colorize(secretWord);
keyboardColorizer.Colorize(secretWord, wordToCheck);
if (wordToCheck == secretWord)
{
SetLevelComplete();
}
else
{ // 7차 수정작업
//Debug.Log("Wrong word");
currentWordContainerIndex++;
DisableTryButton();
if(currentWordContainerIndex >= wordContainers.Length)
{
//Debug.Log("Gameover");
DataManager.instance.ResetScore(); // 8차
GameManager.instance.SetGameState(GameState.Gameover);
}
else
{
canAddLetter = true;
} // 여기까지
}
}
private void SetLevelComplete()
{
UpdateData();
GameManager.instance.SetGameState(GameState.LevelComplete);
}
private void UpdateData()
{
int scoreToAdd = 6 - currentWordContainerIndex;
DataManager.instance.IncreaseScore(scoreToAdd);
DataManager.instance.AddCoins(scoreToAdd * 3);
}
public void BackspacePressedCallback()
{
if (!GameManager.instance.IsGameState()) // 8차
return;
bool removedLetter = wordContainers[currentWordContainerIndex].RemoveLetter();
if (removedLetter)
DisableTryButton();
canAddLetter = true;
onLetterRemoved?.Invoke();
}
private void EnableTryButton()
{
tryButton.interactable = true;
}
private void DisableTryButton()
{
tryButton.interactable = false;
}
public WordContainer GetCurrentWordContainer()
{
return wordContainers[currentWordContainerIndex];
}
}
KeyboardColorizer
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KeyboardColorizer : MonoBehaviour
{
[Header(" Elements ")]
private KeyboardKey[] keys;
[Header(" Settings ")]
private bool shouldReset;
private void Awake()
{
keys = GetComponentsInChildren<KeyboardKey>();
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
GameManager.onGameStateChanged += GameStateChangedCallback; // 5차 코드 추가
}
private void OnDestroy()
{
GameManager.onGameStateChanged -= GameStateChangedCallback; // 5차 코드 추가
}
private void GameStateChangedCallback(GameState gameState) // 5차 코드 추가
{
switch (gameState)
{
case GameState.Game:
if(shouldReset)
Initialize();
break;
case GameState.LevelComplete: // 5차 코드 추가
shouldReset = true;
break;
case GameState.Gameover:
shouldReset = true;
break;
}
}
private void Initialize()
{
for (int i = 0; i < keys.Length; i++)
keys[i].Initialize();
shouldReset = false;
} // 여기끼지 5차 코드 추가
// Update is called once per frame
void Update()
{
}
public void Colorize(string secretWord, string wordToCheck)
{
for (int i = 0; i < keys.Length; i++)
{
char keyLetter = keys[i].GetLetter();
for (int j = 0; j < wordToCheck.Length; j++)
{
if (keyLetter != wordToCheck[j])
continue;
// the key letter we've pressed is equals to the current wordToCheck letter
if(keyLetter == secretWord[j])
{
// Valid
keys[i].SetValid();
}
else if(secretWord.Contains(keyLetter))
{
// Potential
keys[i].SetPotential();
}
else
{
// InValid
keys[i].SetInvalid();
}
}
}
}
}
KeyboardKey.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System;
enum Validity { None, Valid, Potential, Invalid }
public class KeyboardKey : MonoBehaviour
{
[Header(" Elements ")]
[SerializeField] private new Image renderer;
[SerializeField] private TextMeshProUGUI letterText;
[Header(" Settings ")]
private Validity validity;
[Header(" Events ")]
public static Action<char> onKeyPressed;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
GetComponent<Button>().onClick.AddListener(SendKeyPressedEvent);
Initialize();
}
// Update is called once per frame
void Update()
{
}
private void SendKeyPressedEvent()
{
onKeyPressed?.Invoke(letterText.text[0]);
}
public char GetLetter()
{
return letterText.text[0];
}
public void Initialize()
{
renderer.color = Color.white;
validity = Validity.None;
}
public void SetValid()
{
renderer.color = Color.green;
validity = Validity.Valid;
}
public void SetPotential()
{
if (validity == Validity.Valid)
return;
renderer.color = Color.yellow;
validity = Validity.Potential;
}
public void SetInvalid()
{
if (validity == Validity.Valid || validity == Validity.Potential)
return;
renderer.color = Color.gray;
validity = Validity.Invalid;
}
public bool IsUntouched()
{
return validity == Validity.None;
}
}
LetterContainer.cs
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class LetterContainer : MonoBehaviour
{
[Header(" Elements ")]
[SerializeField] private SpriteRenderer letterContainer;
[SerializeField] private TextMeshPro letter;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void Initialize()
{
letter.text = "";
letterContainer.color = Color.white;
}
public void SetLetter(char letter, bool isHint = false)
{
if (isHint)
this.letter.color = Color.gray;
else
this.letter.color = Color.black;
this.letter.text = letter.ToString();
}
public void SetValid()
{
letterContainer.color = Color.green;
}
public void SetPotential()
{
letterContainer.color = Color.yellow;
}
public void SetInvalid()
{
letterContainer.color = Color.gray;
}
public char GetLetter()
{
return letter.text[0];
}
}
SettingsManager.cs
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class SettingsManager : MonoBehaviour
{
[Header(" Elements ")]
[SerializeField] private Image soundsImage;
[SerializeField] private Image hapticsImage;
[Header(" Settings ")]
private bool soundsState;
private bool hapticsState;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
LoadStates();
}
// Update is called once per frame
void Update()
{
}
public void SoundsButtonCallback()
{
soundsState = !soundsState;
UpdateSoundsState();
SaveStates();
}
private void UpdateSoundsState()
{
if (soundsState)
EnableSounds();
else
DisableSounds();
}
private void EnableSounds()
{
SoundsManager.instance.EnableSounds();
soundsImage.color = Color.white;
}
private void DisableSounds()
{
SoundsManager.instance.DisableSounds();
soundsImage.color = Color.gray;
}
public void HapticsButtonCallback()
{
hapticsState = !hapticsState;
UpdateSoundsState();
SaveStates();
}
private void UpdateHapticsState()
{
if (hapticsState)
EnableHaptics();
else
DisableHaptics();
}
private void EnableHaptics()
{
//HapticsManager.instance.EnableHaptics();
hapticsImage.color = Color.white;
}
private void DisableHaptics()
{
//HapticsManager.instance.DisableHaptics();
hapticsImage.color = Color.gray;
}
private void LoadStates()
{
soundsState = PlayerPrefs.GetInt("sounds", 1) == 1;
hapticsState = PlayerPrefs.GetInt("haptics", 1) == 1;
UpdateSoundsState();
UpdateHapticsState();
}
private void SaveStates()
{
PlayerPrefs.GetInt("sounds", soundsState ? 1 : 0);
PlayerPrefs.GetInt("haptics", hapticsState ? 1 : 0);
}
}
SoundsManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundsManager : MonoBehaviour
{
public static SoundsManager instance;
[Header(" Sounds ")]
[SerializeField] private AudioSource buttonSound;
[SerializeField] private AudioSource letterAddedSound;
[SerializeField] private AudioSource letterRemovedSound;
[SerializeField] private AudioSource levelCompleteSound;
[SerializeField] private AudioSource gameoverSound;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
InputManager.onLetterAdded += PlayLetterAddedSound;
InputManager.onLetterRemoved += PlayLetterRemovedSound;
GameManager.onGameStateChanged += GameStateChangedCallback;
}
private void OnDestroy()
{
InputManager.onLetterAdded -= PlayLetterAddedSound;
InputManager.onLetterRemoved -= PlayLetterRemovedSound;
GameManager.onGameStateChanged -= GameStateChangedCallback;
}
private void GameStateChangedCallback(GameState gameState)
{
switch (gameState)
{
case GameState.LevelComplete:
levelCompleteSound.Play();
break;
case GameState.Gameover:
gameoverSound.Play();
break;
}
}
// Update is called once per frame
void Update()
{
}
public void PlayButtonSound()
{
buttonSound.Play();
}
private void PlayLetterAddedSound()
{
letterAddedSound.Play();
}
private void PlayLetterRemovedSound()
{
letterRemovedSound.Play();
}
public void EnableSounds()
{
buttonSound.volume = 1;
letterAddedSound.volume = 1;
letterRemovedSound.volume = 1;
levelCompleteSound.volume = 1;
gameoverSound.volume = 1;
}
public void DisableSounds()
{
buttonSound.volume = 0;
letterAddedSound.volume = 0;
letterRemovedSound.volume = 0;
levelCompleteSound.volume = 0;
gameoverSound.volume = 0;
}
}

UIManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class UIManager : MonoBehaviour
{
public static UIManager instance;
[Header(" Elements ")]
[SerializeField] private CanvasGroup menuCG;
[SerializeField] private CanvasGroup gameCG;
[SerializeField] private CanvasGroup levelCompleteCG;
[SerializeField] private CanvasGroup gameoverCG; // 1 line 6차 코드
[SerializeField] private CanvasGroup settingsCG;
[Header(" Menu Elements ")]
[SerializeField] private TextMeshProUGUI menuCoins;
[SerializeField] private TextMeshProUGUI menuBestScore;
[Header(" Level Complete Elements ")]
[SerializeField] private TextMeshProUGUI levelCompleteCoins;
[SerializeField] private TextMeshProUGUI levelCompleteSecretWord;
[SerializeField] private TextMeshProUGUI levelCompleteScore;
[SerializeField] private TextMeshProUGUI levelCompleteBestScore;
[Header(" Gameover Elements ")] // 3 line 6차 코드
[SerializeField] private TextMeshProUGUI gameoverCoins;
[SerializeField] private TextMeshProUGUI gameoverSecretWord;
[SerializeField] private TextMeshProUGUI gameoverBestScore;
[Header(" Game Elements ")]
[SerializeField] private TextMeshProUGUI gameScore; //3차 코드
[SerializeField] private TextMeshProUGUI gameCoins; //3차 코드
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
//ShowGame();
ShowMenu();
HideGame();
HideLevelComplete();
HideGameover();
GameManager.onGameStateChanged += GameStateChangedCallback;
}
private void OnDestroy()
{
GameManager.onGameStateChanged -= GameStateChangedCallback;
}
private void GameStateChangedCallback(GameState gameState)
{
switch (gameState)
{
case GameState.Menu:
ShowMenu();
HideGame();
break;
case GameState.Game:
ShowGame();
HideMenu();
HideLevelComplete();
HideGameover();
break;
case GameState.LevelComplete:
ShowLevelComplete();
HideGame();
break;
case GameState.Gameover:
ShowGameover();
HideGame();
break;
}
}
// Update is called once per frame
void Update()
{
}
private void ShowMenu()
{
menuCoins.text = DataManager.instance.GetCoins().ToString();
menuBestScore.text = DataManager.instance.GetBestScore().ToString();
ShowCG(menuCG);
}
private void HideMenu()
{
HideCG(menuCG);
}
private void ShowGame()
{
gameCoins.text = DataManager.instance.GetCoins().ToString();
gameScore.text = DataManager.instance.GetScore().ToString();
ShowCG(gameCG);
}
private void HideGame()
{
HideCG(gameCG);
}
private void ShowLevelComplete()
{
levelCompleteCoins.text = DataManager.instance.GetCoins().ToString();
levelCompleteSecretWord.text = WordManager.instance.GetSecretWord();
levelCompleteScore.text = DataManager.instance.GetScore().ToString();
levelCompleteBestScore.text = DataManager.instance.GetBestScore().ToString();
ShowCG(levelCompleteCG);
}
private void HideLevelComplete()
{
HideCG(levelCompleteCG);
}
private void ShowGameover()
{
gameoverCoins.text = DataManager.instance.GetCoins().ToString();
gameoverSecretWord.text = WordManager.instance.GetSecretWord();
gameoverBestScore.text = DataManager.instance.GetBestScore().ToString();
ShowCG(gameoverCG);
}
private void HideGameover()
{
HideCG(gameoverCG);
}
public void ShowSettings()
{
ShowCG(settingsCG);
}
public void HideSettings()
{
HideCG(settingsCG);
}
private void ShowCG(CanvasGroup cg)
{
cg.alpha = 1f;
cg.interactable = true;
cg.blocksRaycasts = true;
}
private void HideCG(CanvasGroup cg)
{
cg.alpha = 0f;
cg.interactable = false;
cg.blocksRaycasts = false;
}
}
WordContainer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class WordContainer : MonoBehaviour
{
[Header(" Elements ")]
private LetterContainer[] letterContainers;
[Header(" Settings ")]
private int currentLetterIndex;
private void Awake()
{
letterContainers = GetComponentsInChildren<LetterContainer>();
//Initialize();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void Initialize()
{
currentLetterIndex = 0; // 5차 코드 추가
for (int i = 0; i < letterContainers.Length; i++)
letterContainers[i].Initialize();
}
public void Add(char letter)
{
letterContainers[currentLetterIndex].SetLetter(letter);
currentLetterIndex++;
}
public void AddAsHint(int letterIndex, char letter)
{
letterContainers[letterIndex].SetLetter(letter, true);
}
public bool RemoveLetter()
{
if (currentLetterIndex <= 0)
return false;
currentLetterIndex--;
letterContainers[currentLetterIndex].Initialize();
return true;
}
public string GetWord()
{
string word = "";
for (int i = 0; i < letterContainers.Length; i++)
word += letterContainers[i].GetLetter().ToString();
return word;
}
public void Colorize(string secretWord)
{
List<char> chars = new List<char>(secretWord.ToCharArray());
for (int i = 0; i < letterContainers.Length; i++)
{
char letterToCheck = letterContainers[i].GetLetter();
if(letterToCheck == secretWord[i])
{
//Valid
letterContainers[i].SetValid();
chars.Remove(letterToCheck);
}
else if(chars.Contains(letterToCheck))
{
// Pontential
letterContainers[i].SetPotential();
chars.Remove(letterToCheck);
}
else
{
// Invalid
letterContainers[i].SetInvalid();
}
}
}
public bool IsComplete()
{
return currentLetterIndex >= 5;
}
}
WordManager.cs
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using UnityEngine;
public class WordManager : MonoBehaviour
{
public static WordManager instance;
[Header(" Elements ")]
[SerializeField] private string secretWord;
[SerializeField] private TextAsset wordsText;
private string words;
[Header(" Settings ")]
private bool shouldReset;
private void Awake()
{
if (instance == null)
instance = this;
else
Destroy(gameObject);
words = wordsText.text;
}
// Start is called before the first frame update
void Start()
{
SetNewSecretWord();
GameManager.onGameStateChanged += GameStateChangedCallback;
}
private void OnDestroy()
{
GameManager.onGameStateChanged -= GameStateChangedCallback;
}
private void GameStateChangedCallback(GameState gameState)
{
switch (gameState)
{
case GameState.Menu:
break;
case GameState.Game:
if (shouldReset)
SetNewSecretWord();
break;
case GameState.LevelComplete:
shouldReset = true;
break;
case GameState.Gameover:
shouldReset = true;
break;
}
}
// Update is called once per frame
void Update()
{
}
public string GetSecretWord()
{
return secretWord.ToUpper();
}
private void SetNewSecretWord()
{
Debug.Log("String length : " + words.Length);
int wordCount = (words.Length + 2) / 7;
int wordIndex = Random.Range(0, wordCount);
int wordStartIndex = wordIndex * 7;
secretWord = words.Substring(wordStartIndex, 5).ToUpper();
shouldReset = false;
}
}반응형
'IT > programming' 카테고리의 다른 글
| UIManager.cs & NEXT 까지 2차 코드 정리 (0) | 2025.07.03 |
|---|---|
| Letter & KeyboardKey Colorize All C# Code (0) | 2025.07.03 |
| 대장동 사업의 진실 (1) | 2025.06.28 |
| 이재명 일기장 (3) | 2025.06.23 |
| 내란의 힘이 이재명을 두려워하는 이유 (0) | 2025.06.23 |