diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index 76272c6..84f4ae4 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -760,88 +760,76 @@ public class Game implements Serializable { @Override public String toString() { - var table = new AsciiTable(BorderStyle.UNICODE, slotMap.size()); - List stringUp=new ArrayList<>(); - List stringEmpty=new ArrayList<>(); - List stringDown=new ArrayList<>(); + return PlayersStamp()+"\n"+BoardStamp()+"\n"; + } + public String PlayersStamp() + { + StringBuilder stringBuilder=new StringBuilder(); + for(int i=0;i stringUpOffer=new ArrayList<>(); + List stringDownOffer=new ArrayList<>(); + for(Map.Entry entry:slotMap.entrySet()) { - stringEmpty.add(" "); - stringDown.add(entry.getKey().toStringTUI()); + stringDownOffer.add(entry.getKey().toStringTUI()); if(entry.getValue()!=null) - stringUp.add(entry.getValue().getUserName()); + stringUpOffer.add(entry.getValue().getUserName()); else - stringUp.add(" "); + stringUpOffer.add(" "); } - table.addRow(stringUp); - table.addRow(stringEmpty); - table.addRow(stringDown); - Listlines=List.of(orderLogicCard.toString().split("\n")); - List lines2=new ArrayList<>(); - lines2.add("OFFER TRACK"); - lines2.addAll(List.of(table.build().split("\n"))); + var TribeTableUpper = new AsciiTable(BorderStyle.UNICODE,1); + var TribeTableLower = new AsciiTable(BorderStyle.UNICODE,1); - String boardToString=AsciiTable.sideBySide(lines,lines2,1); - - - - var table2 = new AsciiTable(BorderStyle.UNICODE, Math.max(getUpperListTribeCards().size(),getLowerListTribeCards().size())); - List stringUp2=new ArrayList<>(); - List stringDown2=new ArrayList<>(); + List stringUpperListTribe=new ArrayList<>(); + List stringLowerListTribe=new ArrayList<>(); + stringUpperListTribe.add("Char/Events"); + stringLowerListTribe.add("Char/Events"); for(int i=0;i stringUp3=new ArrayList<>(); - List stringDown3=new ArrayList<>(); for(int i=0;iTribeTableUpper.addRow(x)); + stringLowerListTribe.forEach(x->TribeTableLower.addRow(x)); + offerTrack.addRow(stringUpOffer); + offerTrack.addRow(stringDownOffer); + return "CURRENT STATE\n"+getCurrentState()+"\n"+orderLogicCard.toString()+"\n"+ AsciiTable.sideBySide(Arrays.stream((TribeTableUpper.build().split("\n"))).toList(), Arrays.stream(BuildTableUpper.build().split("\n")).toList(),2)+"\n"+offerTrack.build()+"\n"+AsciiTable.sideBySide(List.of(TribeTableLower.build().split("\n")), Arrays.stream(BuildTableLower.build().split("\n")).toList(),2); } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java b/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java index b2489b8..f464e02 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/GamePackage/CurrentState.java @@ -3,7 +3,12 @@ package it.polimi.ingsw.gc14.Model.GamePackage; import it.polimi.ingsw.gc14.Model.Player; import it.polimi.ingsw.gc14.Model.Slot; import it.polimi.ingsw.gc14.Model.GamePackage.GameStages; +import it.polimi.ingsw.gc14.View.TUI.AsciiTable; +import it.polimi.ingsw.gc14.View.TUI.BorderStyle; + import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; /** * Represents the current state of the game. @@ -194,5 +199,27 @@ public class CurrentState implements Serializable { } } + @Override + public String toString(){ + var table= new AsciiTable(BorderStyle.UNICODE,6); + Listheader= new ArrayList<>(); + header.add("Player"); + header.add("NUpper"); + header.add("NLower"); + header.add("Round"); + header.add("Era"); + header.add("GameStage"); + table.addRow(header); + table.addSeparator(); + Listvalues= new ArrayList<>(); + values.add(player.getUserName()); + values.add(Integer.toString(NUpper)); + values.add(Integer.toString(NLower)); + values.add(Integer.toString(round)); + values.add(Integer.toString(Era)); + values.add(GameStage.toString()); + table.addRow(values); + return table.build(); + } // endregion functions } diff --git a/src/main/java/it/polimi/ingsw/gc14/View/IView.java b/src/main/java/it/polimi/ingsw/gc14/View/IView.java index 80c7616..9ffaa16 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/IView.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/IView.java @@ -5,8 +5,8 @@ import it.polimi.ingsw.gc14.Network.NetworkEvent; public interface IView { - void render(Game model); - void showMessage(String message); - void showError(String message); + public void render(Game model); + public void showMessage(String message); + public void showError(String message); } diff --git a/src/main/java/it/polimi/ingsw/gc14/View/TUI/AsciiTable.java b/src/main/java/it/polimi/ingsw/gc14/View/TUI/AsciiTable.java index 33e93ad..8fad4eb 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/TUI/AsciiTable.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/TUI/AsciiTable.java @@ -15,7 +15,7 @@ public class AsciiTable { public void addRow(String... cells) { rows.add(Arrays.asList(cells)); } public void addRow(List cells) { rows.add(cells); } public void addHeader(String... cells) { rows.add(0, Arrays.asList(cells)); separators.add(0); } - public void addSeparator() { separators.add(rows.size()); } + public void addSeparator() { separators.add(rows.size()-1); } public String build() { var sb = new StringBuilder(); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java index 8d25fa3..911ef66 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java @@ -1,93 +1,91 @@ -//package it.polimi.ingsw.gc14.View.TUI; -//import it.polimi.ingsw.gc14.Model.Game; -// -//public class TUI { -// -// // ── dati di stato ─────────────────────────────────────────── -// private BorderStyle style = BorderStyle.UNICODE; -// private Game model; -// // ── punto di ingresso ─────────────────────────────────────── -// public String render() { -// var sb = new StringBuilder(); -// sb.append(renderHeader()); -// sb.append(renderTurnOrder()); -// sb.append(renderOfferTrack()); -// sb.append(renderCardRows()); -// sb.append(renderTableaux()); -// sb.append(renderFooter()); -// return sb.toString(); -// } -// -// // ── sezioni ───────────────────────────────────────────────── -// private String renderTurnOrder() { -// var table = new AsciiTable(style, 4, 10); // 4 colonne, largh 10 -// table.addRow(model.getPlayers().stream() -// .map(p -> + ". " + p.getUserName()) -// .toList()); -// table.addRow(state.getPlayers().stream() -// .map(p -> p.getTotemPosition() != null -// ? "totem: " + p.getTotemPosition() -// : "(da piaz)") -// .toList()); -// return " TURN ORDER\n" + table.build() + "\n"; -// } -// -// private String renderOfferTrack() { -// var table = new AsciiTable(style, 5, 14); -// table.addRow(state.getOfferTiles().stream() -// .map(t -> t.getId() + ": " + t.getLabel()).toList()); -// table.addRow(state.getOfferTiles().stream() -// .map(OfferTile::getRowsLabel).toList()); -// table.addRow(state.getOfferTiles().stream() -// .map(t -> state.getTotemOnTile(t.getId())).toList()); -// return " OFFER TRACK\n" + table.build() + "\n"; -// } -// -// private String renderCardRows() { -// int cols = state.getTopRow().size(); -// var table = new AsciiTable(style, cols, 13); -// table.addRow(state.getTopRow().stream() -// .map(c -> "[" + c.getTypeLabel() + "]").toList()); -// table.addRow(state.getTopRow().stream() -// .map(Card::getName).toList()); -// table.addSeparator(); -// table.addRow(state.getBotRow().stream() -// .map(c -> "[" + c.getTypeLabel() + "]").toList()); -// table.addRow(state.getBotRow().stream() -// .map(Card::getName).toList()); -// return " CARTE IN GIOCO\n" + prefix("TOP ", "BOT ", table.build()) + "\n"; -// } -// -// private String renderTableaux() { -// var sb = new StringBuilder(" TABLEAU GIOCATORI\n\n"); -// for (Player p : state.getPlayers()) { -// String marker = p.isActive() ? ">>>" : " "; -// sb.append(String.format(" %s %s%s Food:%d PP:%d%n", -// marker, p.getName(), -// p.isActive() ? " [TUO TURNO]" : "", -// p.getFood(), p.getPP())); -// sb.append(renderPlayerTableau(p)); -// sb.append("\n"); -// } -// return sb.toString(); -// } -// -// private String renderPlayerTableau(Player p) { -// var table = new AsciiTable(style, 3, 14); -// table.addHeader("PERSONAGGI", "EDIFICI", "RISORSE"); -// int rows = Math.max(p.getChars().size(), -// Math.max(p.getBuildings().size(), 3)); -// for (int i = 0; i < rows; i++) { -// String ch = i < p.getChars().size() ? p.getChars().get(i) : ""; -// String bd = i < p.getBuildings().size() ? p.getBuildings().get(i) : ""; -// String rs = switch (i) { -// case 0 -> "Food: " + "O".repeat(p.getFood()); -// case 1 -> "PP: " + p.getPP(); -// case 2 -> "Chars:" + p.getChars().size() + " Edif:" + p.getBuildings().size(); -// default -> ""; -// }; -// table.addRow(ch, bd, rs); -// } -// return " " + table.build().replace("\n", "\n "); -// } -//} +package it.polimi.ingsw.gc14.View.TUI; +import it.polimi.ingsw.gc14.Model.Game; +import it.polimi.ingsw.gc14.View.IView; + +public class TUI implements IView { + + // ── dati di stato ─────────────────────────────────────────── + private BorderStyle style = BorderStyle.UNICODE; + private Game model; + public TUI(Game model) { + this.model = model; + } + // ── punto di ingresso ─────────────────────────────────────── + public void render(Game model) + { + try{ + String os = System.getProperty("os.name").toLowerCase(); + ProcessBuilder pb; + if (os.contains("win")) { + pb = new ProcessBuilder("cmd", "/c", "cls"); + } else { + pb = new ProcessBuilder("clear"); + } + pb.inheritIO().start().waitFor(); + } + catch(Exception e){ + } + System.out.println(model.toString()); + } + + public void renderBoard(Game model) + { + try{ + String os = System.getProperty("os.name").toLowerCase(); + ProcessBuilder pb; + if (os.contains("win")) { + pb = new ProcessBuilder("cmd", "/c", "cls"); + } else { + pb = new ProcessBuilder("clear"); + } + pb.inheritIO().start().waitFor(); + } + catch(Exception e){ + } + System.out.println(model.BoardStamp()); + } + public void renderPlayer(Game model) + { + try{ + String os = System.getProperty("os.name").toLowerCase(); + ProcessBuilder pb; + if (os.contains("win")) { + pb = new ProcessBuilder("cmd", "/c", "cls"); + } else { + pb = new ProcessBuilder("clear"); + } + pb.inheritIO().start().waitFor(); + } + catch(Exception e){ + } + System.out.println(model.BoardStamp()); + } + public void renderMyHand(Game model,String username) + { + try{ + String os = System.getProperty("os.name").toLowerCase(); + ProcessBuilder pb; + if (os.contains("win")) { + pb = new ProcessBuilder("cmd", "/c", "cls"); + } else { + pb = new ProcessBuilder("clear"); + } + pb.inheritIO().start().waitFor(); + } + catch(Exception e){ + } + System.out.println(model.getPlayerByUsername(username)); + } + + public void showMessage(String message) + { + System.out.println(message); + } + + + public void showError(String message) + { + System.out.println(message); + } + +} diff --git a/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java b/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java index eb71ceb..959dd13 100644 --- a/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java +++ b/src/test/java/it/polimi/ingsw/gc14/Model/GameTest.java @@ -8,6 +8,7 @@ import it.polimi.ingsw.gc14.Model.GamePackage.GameStages; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; +import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; @@ -807,22 +808,26 @@ class GameTest { assertFalse(game.PickOptionalBuildingCard(current, 0)); } @Test - void toStringModel() - { - Game game=new Game(3); + void toStringModel() throws IOException, InterruptedException { + Game game=new Game(5); Player p1=new Player("p1"); Player p2=new Player("p2"); Player p3=new Player("p3"); + Player p4=new Player("p4"); + Player p5=new Player("p5"); assertTrue(game.addPlayer(p1)); assertTrue(game.addPlayer(p2)); assertTrue(game.addPlayer(p3)); + assertTrue(game.addPlayer(p4)); + assertTrue(game.addPlayer(p5)); Queueplayers=new LinkedList<>(); for(int i=0;i<3;i++) { players.add( game.getCurrentState().getCurrentPlayer()); assertTrue(game.SlotChoiceByIndex(game.getCurrentState().getCurrentPlayer(), i)); } - System.out.println(game); + + System.out.println(game.toString()); } } \ No newline at end of file diff --git a/src/test/java/it/polimi/ingsw/gc14/Model/PlayerTest.java b/src/test/java/it/polimi/ingsw/gc14/Model/PlayerTest.java index 31cd1b0..1a30d9b 100644 --- a/src/test/java/it/polimi/ingsw/gc14/Model/PlayerTest.java +++ b/src/test/java/it/polimi/ingsw/gc14/Model/PlayerTest.java @@ -220,7 +220,7 @@ class PlayerTest { p.buildingCards.add(new Building1(2, 5, 5, CharacterType.INVENTOR)); p.buildingCards.add(new Building1(2, 5, 5, CharacterType.SHAMAN)); p.buildingCards.add(new Building11(1, 5, 7, CharacterType.ARTIST , 3)); - //System.out.println(p.toString()); + System.out.println(p.toString()); assertEquals(""+ "╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗\n" + "║ test_usr ║\n" +