diff --git a/module/module.iml b/module/module.iml new file mode 100644 index 00000000..c90834f2 --- /dev/null +++ b/module/module.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/module/src/snakesAndLadders/Main.java b/module/src/snakesAndLadders/Main.java new file mode 100644 index 00000000..a0569654 --- /dev/null +++ b/module/src/snakesAndLadders/Main.java @@ -0,0 +1,42 @@ +package snakesAndLadders; + +import snakesAndLadders.game.Game; +import snakesAndLadders.model.Player; + +import java.util.*; + +//TIP To Run code, press or +// click the icon in the gutter. +public class Main { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.println("Please enter number of snakes: "); + int snakeCount = sc.nextInt(); + Map snakes = new HashMap<>(); + for(int i = 0; i < snakeCount; i++){ + System.out.println("Enter snake head and tail: "); + int head = sc.nextInt(); + int tail = sc.nextInt(); + snakes.put(head, tail); + } + System.out.println("Please enter number of ladders: "); + int ladderCount = sc.nextInt(); + Map ladders = new HashMap<>(); + for(int i = 0; i < ladderCount; i++){ + System.out.println("Enter ladder base and top: "); + int base = sc.nextInt(); + int top = sc.nextInt(); + ladders.put(base, top); + } + System.out.println("Please enter number of players: "); + int playerCount = sc.nextInt(); + List players = new ArrayList<>(); + for(int i = 0; i < playerCount; i++){ + System.out.println("Enter player name: "); + String name = sc.next(); + players.add(new Player(name)); + } + Game game = new Game(players, snakes, ladders); + game.start(); + } +} \ No newline at end of file diff --git a/module/src/snakesAndLadders/board/Board.java b/module/src/snakesAndLadders/board/Board.java new file mode 100644 index 00000000..c697adff --- /dev/null +++ b/module/src/snakesAndLadders/board/Board.java @@ -0,0 +1,22 @@ +package snakesAndLadders.board; + +import java.util.Map; + +public class Board { + int size = 100; + Map snakes; + Map ladders; + public Board(Map snakes, Map ladders){ + this.snakes = snakes; + this.ladders = ladders; + } + public int getNextPosition(int position){ + if(snakes.containsKey(position)){ + return snakes.get(position); + } + if(ladders.containsKey(position)){ + return ladders.get(position); + } + return position; + } +} diff --git a/module/src/snakesAndLadders/game/Game.java b/module/src/snakesAndLadders/game/Game.java new file mode 100644 index 00000000..3e8590fe --- /dev/null +++ b/module/src/snakesAndLadders/game/Game.java @@ -0,0 +1,41 @@ +package snakesAndLadders.game; + +import snakesAndLadders.board.Board; +import snakesAndLadders.model.Dice; +import snakesAndLadders.model.Player; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; + +public class Game { + Queue players; + Board board; + Dice dice; + public Game(List players, Map snakes, Map ladders){ + this.players = new LinkedList(players); + this.board = new Board(snakes,ladders); + this.dice = new Dice(); + } + public void start(){ + while(!players.isEmpty()){ + Player current = players.peek(); + players.remove(); + int roll = dice.roll(); + System.out.println("Player "+current.getName()+" rolled: "+roll); + int newPosition = current.getPosition() + roll; + if(newPosition > 100){ + newPosition = current.getPosition(); + } else{ + newPosition = board.getNextPosition(newPosition); + } + current.setPosition(newPosition); + if(newPosition == 100){ + System.out.println("Player " + current.getName() + " won!"); + break; + } + players.add(current); + } + } +} diff --git a/module/src/snakesAndLadders/model/Dice.java b/module/src/snakesAndLadders/model/Dice.java new file mode 100644 index 00000000..51aaf3be --- /dev/null +++ b/module/src/snakesAndLadders/model/Dice.java @@ -0,0 +1,7 @@ +package snakesAndLadders.model; + +public class Dice { + public int roll(){ + return 1 + (int)(Math.random()*6); + } +} diff --git a/module/src/snakesAndLadders/model/Player.java b/module/src/snakesAndLadders/model/Player.java new file mode 100644 index 00000000..e76e210c --- /dev/null +++ b/module/src/snakesAndLadders/model/Player.java @@ -0,0 +1,20 @@ +package snakesAndLadders.model; + +public class Player { + String name; + int position; + + public Player(String name) { + this.name = name; + this.position = 0; + } + public String getName() { + return name; + } + public int getPosition() { + return position; + } + public void setPosition(int position) { + this.position = position; + } +} diff --git a/module/src/splitwise/Main.java b/module/src/splitwise/Main.java new file mode 100644 index 00000000..34c3c395 --- /dev/null +++ b/module/src/splitwise/Main.java @@ -0,0 +1,80 @@ +package splitwise; + +import snakesAndLadders.game.Game; +import snakesAndLadders.model.Player; +import splitwise.model.Expense; +import splitwise.model.Splitwise; +import splitwise.model.User; + +import java.util.*; + +//TIP To Run code, press or +// click the icon in the gutter. +public class Main { + public static void main(String[] args) { + System.out.println("Welcome to Splitwise."); + Scanner sc = new Scanner(System.in); + + User user1 = new User("Charu", "charu@sweet.com", 12345); + User user2 = new User("Rathi", "rathi@cute.com", 23456); + User user3 = new User("Ishita", "ishita@logic.com", 34567); + User user4 = new User("Kareena", "kareena@bitch.com", 45678); + List users = new ArrayList<>(Arrays.asList(user1, user2, user3, user4)); + Splitwise splitwise = new Splitwise(users); + Map map = new HashMap<>(); + for ( User u : users ) { + map.put(u.getName().toUpperCase(), u); + } + System.out.println("Commands: SHOW, SHOW , EXPENSE ..., EXIT"); + while(true) { + System.out.println("> "); + String input = sc.nextLine().trim(); + if (input.equalsIgnoreCase("EXIT")) { + System.out.println("Bye bye!"); + break; + } + String[] commands = input.split(" "); + if (commands[0].equalsIgnoreCase("SHOW")) { + if (commands.length == 1) { + splitwise.showBalances(); + } else if (commands.length == 2) { + User user = map.get(commands[1].toUpperCase()); + if (user == null) { + System.out.println("User " + commands[1].toUpperCase() + " not found!"); + continue; + } + splitwise.showBalances(user); + } else { + System.out.println("Wrong command!"); + continue; + } + } + if (commands[0].equalsIgnoreCase("EXPENSE")) { + User payer = map.get(commands[1].toUpperCase()); + if (payer == null) { + System.out.println("User " + commands[1].toUpperCase() + " not found!"); + continue; + } + double totalExpense = Double.parseDouble(commands[2]); + int size = Integer.parseInt(commands[3]); + List payees = new ArrayList<>(); + for (int i = 0; i < size; i++) { + payees.add(map.get(commands[i+4].toUpperCase())); + } + Expense.ExpenseType type = Expense.ExpenseType.valueOf(commands[4+size]); + List expenses = new ArrayList<>(); + for(int i=5+size;i users; + List expenses; + + public Expense(User payer, double totalExpense, ExpenseType type, List users, List expenses) { + this.payer = payer; + this.totalExpense = totalExpense; + this.type = type; + this.users = users; + this.size = users.size(); + this.expenses = expenses; + } + + public Expense(User payer, double totalExpense, ExpenseType type, List users) { + this(payer, totalExpense, type, users, null); + } +} diff --git a/module/src/splitwise/model/Splitwise.java b/module/src/splitwise/model/Splitwise.java new file mode 100644 index 00000000..a4646f70 --- /dev/null +++ b/module/src/splitwise/model/Splitwise.java @@ -0,0 +1,113 @@ +package splitwise.model; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Splitwise { + List users; + double [][] Balances; + + public Splitwise(List users) { + this.users = users; + this.Balances = new double[users.size()][users.size()]; + for (int i = 0; i < users.size(); i++) { + for (int j = 0; j < users.size(); j++) { + Balances[i][j] = 0; + } + } + } + + boolean showBalances(User user1, boolean showOnlyNegative) { + int pos = users.indexOf(user1); + boolean nobalance = true; + for (int i = 0; i < Balances[pos].length; i++) { + if (Balances[pos][i] > 0) { + nobalance = false; + if (showOnlyNegative) continue; + System.out.println(user1.getName() + " owes " + users.get(i).getName() + ": " + Balances[pos][i]); + } else if(Balances[pos][i] < 0) { + nobalance = false; + System.out.println(users.get(i).getName() + " owes " + user1.getName() + ": " + Balances[i][pos]); + } + } + return nobalance; + } + + public void showBalances(User user1) { + boolean nobalance = showBalances(user1, false); + if(nobalance){ + System.out.println("No balances"); + } + } + + public void showBalances() { + boolean nobalance = true; + for (int i = 0; i < users.size(); i++) { + boolean val = showBalances(users.get(i), true); + if(!val){ + nobalance = false; + } + } + if(nobalance){ + System.out.println("No balances"); + } + } + + void setBalances(User user1, User user2, double expense) { + int pos1 = users.indexOf(user1); + int pos2 = users.indexOf(user2); + Balances[pos1][pos2] -= expense; + Balances[pos2][pos1] += expense; + addPersonalExpense(user2, expense); + } + + void addPersonalExpense(User user2, double expense) { + user2.expenses += expense; + } + + private double roundToTwoDecimals(double amount) { + return Math.round(amount * 100.0) / 100.0; + } + + public void addExpense(Expense expense) { + User payer = expense.payer; + Expense.ExpenseType type = expense.type; + double totalExpense = expense.totalExpense; + int size = expense.size; + List users = expense.users; + List expenses = expense.expenses; + switch (expense.type) { + case EQUAL -> { + double base = Math.floor((totalExpense / size) * 100) / 100.0; + double remainder = totalExpense - (base * size); + int extra = (int)Math.round(remainder * 100); + for (int i = 0; i < size; i++) { + double amount = i < extra ? base + 0.01 : base; + setBalances(payer, users.get(i), roundToTwoDecimals(amount)); + } + } + case EXACT -> { + for (int i = 0; i < size; i++) { + double amount = expenses.get(i); + setBalances(payer, users.get(i), roundToTwoDecimals(amount)); + } + } + case PERCENT -> { + int sum = 0; + for (int i = 0; i < size; i++) { + sum += expenses.get(i); + } + if (sum != 100) { + System.out.println("ERROR! Percentages don't add up to 100"); + } else { + for (int i = 0; i < size; i++) { + double amount = (expenses.get(i) * totalExpense) / 100; + setBalances(payer, users.get(i), roundToTwoDecimals(amount)); + } + } + } + default -> System.out.println("Invalid Expense"); + } + } +} \ No newline at end of file diff --git a/module/src/splitwise/model/User.java b/module/src/splitwise/model/User.java new file mode 100644 index 00000000..7b75fce5 --- /dev/null +++ b/module/src/splitwise/model/User.java @@ -0,0 +1,39 @@ +package splitwise.model; + +import java.util.UUID; + +public class User { + String name; + String email; + int phoneNumber; + int id; + double expenses; + + public User(String name, String email, int phoneNumber){ + this.name = name; + this.email = email; + this.phoneNumber = phoneNumber; + this.id = UUID.randomUUID().hashCode(); + this.expenses = 0; + } + + public String getName(){ + return this.name; + } + + public String getEmail(){ + return this.email; + } + + public int getPhone(){ + return this.phoneNumber; + } + + public int getId(){ + return this.id; + } + + public double getExpenses(){ + return this.expenses; + } +}