From 7d1f38e19c79d44d20256bb02c30d602093b1cca Mon Sep 17 00:00:00 2001 From: L3o15 Date: Tue, 13 May 2025 17:02:45 +0200 Subject: [PATCH] Game class updates --- .../unibs/tamagolem/WorldBuilder.class | Bin 5950 -> 5972 bytes src/ElementGraph.java | 10 +++++ src/ElementLink.java | 4 ++ src/Game.java | 20 ++++++--- src/GraphElement.java | 8 ++++ src/LinearSystem.java | 2 +- src/Pair.java | 1 - src/TamaGolemMain.java | 4 +- src/WorldBuilder.java | 42 +++++++++++------- 9 files changed, 68 insertions(+), 23 deletions(-) diff --git a/out/production/TamaGolem/it/arnaldo/unibs/tamagolem/WorldBuilder.class b/out/production/TamaGolem/it/arnaldo/unibs/tamagolem/WorldBuilder.class index 2744635b0d4bd9ac8379e09628f7c86404bd6eac..03fcd4222262fc6f8e283ebdf61a6d4dc9abbe92 100644 GIT binary patch literal 5972 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 L%FvIj>e_z*ElhaI diff --git a/src/ElementGraph.java b/src/ElementGraph.java index d8f145e..1680423 100644 --- a/src/ElementGraph.java +++ b/src/ElementGraph.java @@ -40,5 +40,15 @@ public class ElementGraph { } } + public int getTotalStrength(){ + int totalStrength = 0; + + for (GraphElement element : elements) { + totalStrength += element.getTotalStrength(); + } + + return totalStrength; + } + } diff --git a/src/ElementLink.java b/src/ElementLink.java index f547e7c..f95ff4e 100644 --- a/src/ElementLink.java +++ b/src/ElementLink.java @@ -16,4 +16,8 @@ public class ElementLink { public Element getElement() { return element; } + + public int getTotalStrength() { + return value >= 0 ? value : 0; + } } diff --git a/src/Game.java b/src/Game.java index dce248c..c67b84e 100644 --- a/src/Game.java +++ b/src/Game.java @@ -25,15 +25,25 @@ public class Game { public void start() { int numberOfElements = worldBalance.getElements().size(); - int numberOfStones = Math.round((float) ((numberOfElements + 1)/3.0)) + 1; - int numberOfTamaGolems = Math.round((float) ((numberOfElements - 1) * (numberOfElements - 2) / (2 * numberOfStones))); - int totalNumberOfStones = Math.round((float) ((2 * numberOfTamaGolems * numberOfStones) / numberOfElements)) * numberOfElements; + int numberOfStones = (int) Math.ceil((numberOfElements + 1) / 3.0); + numberOfStones += 1; + int numberOfTamaGolems = (int) Math.ceil(((numberOfElements - 1) * (numberOfElements - 2)) / (2.0 * numberOfStones)); + int totalNumberOfStones = (int) Math.ceil((2.0 * numberOfTamaGolems * numberOfStones) / numberOfElements) * numberOfElements; int numberOfStonesPerElement = totalNumberOfStones / numberOfElements; + // deve essere uguale alla somma della potenza di tutti gli elementi - int totalPower = 0; - int lifePoints = (int)(Math.random() * 11) + 5; + int totalPower = worldBalance.getTotalStrength(); + int lifePoints = totalPower; + System.out.println("Game started between " + player1.getName() + " and " + player2.getName()); + System.out.println("Number of stones: " + numberOfStones); + System.out.println("Number of elements: " + numberOfElements); + System.out.println("Number of TamaGolems: " + numberOfTamaGolems); + System.out.println("Total number of stones: " + totalNumberOfStones); + System.out.println("Total number of stones for each element: " + numberOfStonesPerElement); + System.out.println("Total power: " + totalPower); + System.out.println("Life points: " + lifePoints); } } diff --git a/src/GraphElement.java b/src/GraphElement.java index 8053775..f9444ab 100644 --- a/src/GraphElement.java +++ b/src/GraphElement.java @@ -32,4 +32,12 @@ public class GraphElement { } return 0; } + + public int getTotalStrength(){ + int strength = 0; + for (ElementLink link : links) { + strength += link.getTotalStrength(); + } + return strength; + } } diff --git a/src/LinearSystem.java b/src/LinearSystem.java index 386c750..a510a9e 100644 --- a/src/LinearSystem.java +++ b/src/LinearSystem.java @@ -30,7 +30,7 @@ public class LinearSystem { int[] solutions; Random rand = new Random(); - int tries = 100000000; + int tries = 1000000; while (tries-- > 0) { int[] lambdaValues = new int[indipendentVariables]; for (int i = 0; i < indipendentVariables; i++) { diff --git a/src/Pair.java b/src/Pair.java index 3f4ede0..3de127b 100644 --- a/src/Pair.java +++ b/src/Pair.java @@ -1,6 +1,5 @@ package it.arnaldo.unibs.tamagolem; -// Utility pair class public class Pair { private final Element first; private final Element second; diff --git a/src/TamaGolemMain.java b/src/TamaGolemMain.java index 8df206c..cda8342 100644 --- a/src/TamaGolemMain.java +++ b/src/TamaGolemMain.java @@ -5,7 +5,9 @@ import java.util.*; public class TamaGolemMain { public static void main(String[] args) { System.out.println("TamaGolem"); - WorldBuilder.buildWorld(); + Game game = new Game(new Player("Zazz"), new Player("zazz2"), WorldBuilder.buildWorld()); + + game.start(); } } \ No newline at end of file diff --git a/src/WorldBuilder.java b/src/WorldBuilder.java index 70b10b0..ed324b7 100644 --- a/src/WorldBuilder.java +++ b/src/WorldBuilder.java @@ -6,15 +6,18 @@ public class WorldBuilder { public static ElementGraph buildWorld() { Element[] allElements = Element.values(); - int numElements = (int)(Math.random() * 10); + int numElements = (int)(Math.random() * 8) + 3; List selectedElements = new ArrayList<>(Arrays.asList(allElements)); Collections.shuffle(selectedElements); selectedElements = selectedElements.subList(0, numElements); + // Mappa delle direzioni tra elementi (1 = attacca, -1 = subisce) Map> linkDirections = generateValidDirections(selectedElements); + + // Mappa indice per ogni coppia (non ordinata) di elementi Map, Integer> pairIndex = new HashMap<>(); int index = 0; @@ -42,24 +45,33 @@ public class WorldBuilder { } // sistema lineare per trovare le soluzioni che verificano l'equilibrio - LinearSystem system = new LinearSystem(numElements, A, b); - int[] solution = system.resolve(); - // dalle soluzioni del sistema popolo il grafo - ElementGraph world = new ElementGraph(); - for (Element e1 : selectedElements) { - GraphElement graphElement = new GraphElement(e1); - for (Element e2 : selectedElements) { - if (e1 == e2) continue; - int dir = linkDirections.get(e1).get(e2); - int val = solution[pairIndex.get(Set.of(e1, e2))]; - graphElement.addLink(new ElementLink(dir * val, e2)); + try{ + LinearSystem system = new LinearSystem(numElements, A, b); + int[] solution = system.resolve(); + + // dalle soluzioni del sistema popolo il grafo + ElementGraph world = new ElementGraph(); + for (Element e1 : selectedElements) { + GraphElement graphElement = new GraphElement(e1); + for (Element e2 : selectedElements) { + if (e1 == e2) continue; + int dir = linkDirections.get(e1).get(e2); + int val = solution[pairIndex.get(Set.of(e1, e2))]; + graphElement.addLink(new ElementLink(dir * val, e2)); + } + world.addElement(graphElement); } - world.addElement(graphElement); + + world.printGraph(); + return world; + }catch (Exception e){ + buildWorld(); } - world.printGraph(); - return world; + + return null; + } private static Map> generateValidDirections(List elements) {