5Y5T3M/Assets/Scripts/Node.cs

158 lines
4.4 KiB
C#
Raw Normal View History

2025-09-17 17:26:16 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
2025-09-15 23:01:07 +02:00
using UnityEngine;
2025-09-17 17:05:48 +02:00
using System.Collections.Generic;
2025-09-15 23:01:07 +02:00
2025-09-16 00:08:50 +02:00
[ExecuteAlways]
2025-09-15 23:01:07 +02:00
public class Node : MonoBehaviour
{
2025-09-16 14:20:19 +02:00
[Range(-1, 1)]
[SerializeField]
2025-09-17 10:12:15 +02:00
public int Owner = -1;
2025-09-17 17:26:16 +02:00
public Material materialOwnerSelf, materialOwnerOther, materialOwnerNone, materialHover;
2025-09-17 17:26:16 +02:00
public List<Node> connected;
public bool hovered;
void Awake()
{
UpdateColor();
}
2025-09-16 14:20:19 +02:00
2025-09-15 23:01:07 +02:00
// 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()
{
2025-09-17 17:26:16 +02:00
if (Input.GetMouseButtonDown(0) && hovered)
{
var count = CycleFinder.FindLargestCycleAmongNeighbors(this);
Debug.Log($"Largest Nacho: {count.Count}");
}
UpdateColor();
UpdateTransform();
}
private void OnValidate()
{
UpdateColor();
UpdateTransform();
}
2025-09-17 17:05:48 +02:00
private void OnDestroy()
{
GameManager gm = FindFirstObjectByType<GameManager>();
2025-09-17 17:26:16 +02:00
2025-09-17 17:05:48 +02:00
List<GameManager.Connection> looseConnections = gm.connections.FindAll(c => c.nodeA == this || c.nodeB == this);
2025-09-17 17:26:16 +02:00
foreach (GameManager.Connection c in looseConnections)
2025-09-17 17:05:48 +02:00
{
DestroyImmediate(c.lineRenderer.gameObject);
gm.connections.Remove(c);
}
2025-09-17 17:26:16 +02:00
2025-09-17 17:05:48 +02:00
gm.FetchAllNodes();
}
public void UpdateTransform()
{
transform.localPosition = transform.localPosition.normalized * 20f;
2025-09-17 17:26:16 +02:00
if (transform.position != Vector3.zero)
2025-09-17 17:05:48 +02:00
transform.forward = transform.position;
}
public void UpdateColor()
{
2025-09-17 17:26:16 +02:00
if (hovered)
2025-09-16 14:20:19 +02:00
{
2025-09-17 17:26:16 +02:00
transform.GetChild(0).GetComponent<Renderer>().sharedMaterial = materialHover;
}
2025-09-17 17:26:16 +02:00
else
{
switch (Owner)
{
case -1: transform.GetChild(0).GetComponent<Renderer>().sharedMaterial = materialOwnerNone; break;
case 0: transform.GetChild(0).GetComponent<Renderer>().sharedMaterial = materialOwnerSelf; break;
case 1: transform.GetChild(0).GetComponent<Renderer>().sharedMaterial = materialOwnerOther; break;
}
}
hovered = false;
}
}
public class CycleFinder
{
private HashSet<Node> allowedNodes;
private List<Node> bestCycle;
private Node centerNode;
public CycleFinder(Node center)
{
centerNode = center;
allowedNodes = new HashSet<Node>(center.connected);
bestCycle = new List<Node>();
}
public static List<Node> FindLargestCycleAmongNeighbors(Node center)
{
var finder = new CycleFinder(center);
return finder.FindBestCycle();
}
private List<Node> FindBestCycle()
{
// Versuche von jedem Nachbarknoten aus einen Zyklus zu finden
foreach (var startNode in allowedNodes)
{
var visited = new HashSet<Node>();
var currentPath = new List<Node>();
SearchForCycles(startNode, startNode, visited, currentPath);
}
return bestCycle;
}
2025-09-16 17:40:34 +02:00
2025-09-17 17:26:16 +02:00
private void SearchForCycles(Node startNode, Node currentNode, HashSet<Node> visited, List<Node> path)
{
// Aktuellen Knoten zum Pfad hinzufugen
path.Add(currentNode);
visited.Add(currentNode);
// Durchsuche alle Verbindungen des aktuellen Knotens
foreach (var neighbor in currentNode.connected)
{
// Nur Nachbarn des Zentralknotens sind erlaubt
if (!allowedNodes.Contains(neighbor))
continue;
// Wenn wir zum Startknoten zuruckgekehrt sind und mindestens 3 Knoten im Pfad haben
if (neighbor == startNode && path.Count >= 3)
{
// Geschlossenen Zyklus gefunden - prufe ob er besser ist
if (path.Count > bestCycle.Count)
{
bestCycle = new List<Node>(path);
}
}
// Wenn der Knoten noch nicht besucht wurde, setze die Suche fort
else if (!visited.Contains(neighbor))
{
SearchForCycles(startNode, neighbor, new HashSet<Node>(visited), new List<Node>(path));
}
}
}
}