Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

unity, generowanie planszy sudoku


Rekomendowane odpowiedzi

Opublikowano

Staram się napisać skrypt generujący planszę sudoku, jednak mam problem z działaniem jednej pętli, która ma sprawdzać, czy dana liczba wystąpiła już w danej linii. Powie mi ktoś, czemu zawiesza ona program?

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;

public class sudo : MonoBehaviour {

	public InputField[,] planszaSudoku;
	public InputField klocek; 
	public GameObject canvasUI;

	private const int wielkoscSudoku = 9;
	private bool planszawygenerowana = false;
	private int losowaliczba;
	private string losowaliczbaString;

	private List<int> losoweliczby = new List<int>{1,2,3,4,5,6,7,8,9};

	public void GenerujSudoku ()
	{
		if (planszawygenerowana == true) 
		{
			//zniszczyc jakos planszę
			planszawygenerowana = false;
			GenerujSudoku();
		}
		else if (planszawygenerowana == false) 
		{
			planszaSudoku = new InputField[wielkoscSudoku, wielkoscSudoku];

			for (int x = 0; x < wielkoscSudoku; x++) { //przemieszczenie się po planszy

				for (int y = 0; y < wielkoscSudoku; y++) 
				{

					InputField inputfieldklocek = (InputField)Instantiate (klocek, new Vector3 (x * 40 + 200, y * 40 + 50, 0), Quaternion.identity); //tworzenie klocków
					inputfieldklocek.transform.SetParent (canvasUI.transform); //podpięcie kocków do canvas
					planszaSudoku [x, y] = inputfieldklocek; //dodanie wygenerowanego klocka do tabeli
					while (true) //ta pętla źle działa, zawiesza działanie programu
					{
						LosowaLiczba (); //losuje liczbę z listy oraz zmienia ją na string
						bool unikalna = true;
						for (int k = 0; k < x; k++) 
						{
							if (losowaliczbaString == planszaSudoku [k, y].text) 
							{
								unikalna = false;
							}
						}
						if (unikalna == false)
							continue;
						planszaSudoku [x, y].text = losowaliczbaString;
						break;
					}
						
					losoweliczby.RemoveAt (losowaliczba);
					if (losoweliczby.Count == 0) 
					{
						losoweliczby.AddRange (new int[]{1,2,3,4,5,6,7,8,9});
					}		
					//dodać regóły sudoku przy generowaniu liczb
					//losowaliczba = Random.Range (1, wielkoscSudoku);//wygenerowanie losowej liczby, a następnie dodanie jej do klocka
					//losowaliczbaString = losowaliczba.ToString();
					//planszaSudoku[i,j].text = losowaliczbaString;

				} 	
			}		
		}
			planszawygenerowana = true;
	} 

	private void LosowaLiczba ()
	{
		losowaliczba = Random.Range (0, losoweliczby.Count);
		losowaliczbaString = losoweliczby [losowaliczba].ToString();
	}
}




Odwiedź mój profil aby zobaczyć adres mojego bloga o projektowaniu gier!

Opublikowano

masz true w pętli while, jest wykonywana cały czas bez przerwy. Skoro zawieszania ona działanie to nigdy się nie kończy a co za tym idzie nie dochodzi do break bo któryś warunek niezostal spelniony

Opublikowano

Dzięki.. ale to wiem. Nie wiem czemu nie dochodzi do break.

Odwiedź mój profil aby zobaczyć adres mojego bloga o projektowaniu gier!

Opublikowano

Nie pisz == true, == false. Nie pisz funkcji w stylu LosowaLiczba. Tekst porównuje się przez metodę Equals, nie ==. Pokaż jak wygląda planszaSudoku i losowaLiczbaString po kilku iteracjach.

Opublikowano

@pan Szymek

 

Plansza nie generuje się, gdy wprowadzę tą pętlę. Wcześniej udało mi się uzyskać brak powtarzalności liczb jedynie w kolumnach - dzięki losowaniu liczby z listy oraz jej usuwaniu. 

 

Czemu nie należy porównywać stringów przez == ? 

Metodę LosowaLiczba stworzyłem, aby nie bawić się w przepisywanie tych samych linijek przy sprawdzaniu różnych wersji kodu. Wygoda. 

 

Projekt wrzuciłem na google drive, jeśli jest ktoś chętny zerknąć, jednak nie ma w nim wiele więcej, niż tu wkleiłem.

https://drive.google.com/folderview?id=0B98lKxgc_jn6Yml3TnBjRUMyZEU&usp=sharing

 

zastąpiłęm pętlę whilę, pętlą for która kręci się 100 razy.

Okazało się, że kilka miejsc na planszy nie może się wygenerować, zapewne za sprawą niemożności dopasowania żadnej liczby. Czyli pętla while działała dobrze, okazało się, że to zasady sudoku przeszkadzają. Teraz trzeba rozwiązać ten problem :)

Odwiedź mój profil aby zobaczyć adres mojego bloga o projektowaniu gier!

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...