Dateien nach "main" hochladen

main
Michel Joris Hombrecher 2024-01-09 02:11:06 +01:00
commit 204f0548cd
5 changed files with 743 additions and 0 deletions

View File

@ -0,0 +1,284 @@
package minigame;
import java.io.BufferedReader;
import java.io.IOException;
public class GameControls {
private int raceCount;
private boolean hire;
private static Player player;
public GameControls() {
this.raceCount = 0;
}
public String toString() {
return "Races: "+this.raceCount;
}
public static void startInto(GameControls game, BufferedReader ter) throws InterruptedException, IOException {
String intro = "Welcome to Hoof-Hustle\n\nGet CREDITS by having your HORSE win RACES.\nBuy UPGRADES as well as new RACES with the CREDITS Earned.\n\nBut be careful.\nDont lose all your CREDITS!!!\n";
Tools.printSlow30(intro);
while (true) {
System.out.print("\nSYSTEM | Choose a Username: ");
String uname = ter.readLine();
if (uname.toCharArray().length > 15) {
System.out.println("\nSYSTEM | Please Choose a Shorter Username");
} else {
player = new Player(uname);
String info1 = "\nSTRANGER | Welcome to Hoof-Hustle " + player.username + "!";
Tools.printSlow30(info1);
break;
}
}
startGame(game, ter);
}
private static void startGame(GameControls game, BufferedReader ter) {
Tools.printSlow30("\nSTRANGER | Im Jones btw, I sell horses and train riders for a living! I will guide you through the first few steps of Horse Racing.");
while (true) {
Tools.printSlow30("\n\nSYSTEM | Hire Jones for free? y/n: ");
String choice;
try {
choice = String.valueOf(ter.readLine());
if (choice.equalsIgnoreCase("y")) {
game.hire = true;
Tools.printSlow30("\nJONES | Thanks for Hiring me!\n");
break;
} else if (choice.equalsIgnoreCase("n")){
game.hire = false;
break;
} else {
Tools.printSlow30("\nPossible options: y/n");
}
} catch (Exception e) {
Tools.printSlow30("\nPossible options: y/n");
}
}
if (game.hire) {
Tools.printSlow30("JONES | Lets put your racing Skills to the test! But first we need to choose you a horse. How many credits do you have right now?\n");
Tools.waitT(1, "s");
Tools.printSlow30("\nSYSTEM | Check your current CREDITS with \"/p cr\"\nSYSTEM | Try it out: ");
while (true) {
try {
if (ter.readLine().equalsIgnoreCase("/p cr")) {
Tools.printSlow30("SYSTEM | ");
player.showBalance();
break;
} else {
Tools.printSlow30("\nSYSTEM | Tipp: use \"/p cr\": ");
}
} catch (IOException e) {
e.printStackTrace();
}
}
Tools.printSlow30("\nJONES | With that little money you won't really be able to buy a good horse.\nJONES | I can give you a friends-deal on one of my cheaper horses though.\n\n");
Shop.showHorses();
} else {
Tools.printSlow30("\nJONES | No problem mate. See you around!\n\nSYSTEM | Choose a Horse from Jones Store to get started...\n\n");
Shop.showHorses();
}
Tools.printSlow30("\nChoose a horse with \"/buy <ID>\": ");
while (true) {
try {
String [] full_com = ter.readLine().split(" ");
String com = full_com[0];
System.out.println();
if (com.equalsIgnoreCase("/buy")) {
if (!(Integer.valueOf(full_com[1])>4)) {
player.buyHorse(Integer.valueOf(full_com[1]));
break;
} else {
Tools.printSlow30("SYSTEM | Use one of the IDs in range: ");
}
} else {
Tools.printSlow30("SYSTEM | Use one of the IDs in range: ");
}
} catch (Exception e) {
Tools.printSlow30("SYSTEM | Use one of the IDs in range: ");
}
}
Tools.printSlow30("\nJONES | Excelent Choice " + player.username + ".\nJONES | Alright let's see how you do on the track!\nJONES | Your first Race will take place here in Mannheim, but if you do well you can work your way up to known tracks like those in Tokyo and New York!\n\n");
Race.firstRace(player,ter, Player.player_horses.get(1));
runMenu(0, ter);
}
static void runMenu(int status, BufferedReader ter) {
if (status == 0) {
//get help
Tools.printSlow30("\n------------------------------------------------------------------------------------------------------\nSYSTEM | Welcome to the Hoof-Hustle Main Menu " +player.username+"!");
help();
takeInput(ter);
} else if (status == 1){
//no help
takeInput(ter);
}
}
private static void takeInput(BufferedReader ter) {
Tools.printSlow30("\n\nMENU | Player Input: ");
try {
String input = ter.readLine();
String [] full_com = input.split(" ");
String com = full_com[0];
switch (com) {
case "/p":
//info cr name
switch (full_com[1]) {
case "info":
Tools.printSlow30("\nSYSTEM | "+player.toString()+"\n------------------------------------------------------------------------------------------------------");
player.visLevelProgress();
runMenu(1,ter);
break;
case "cr":
Tools.printSlow30("PLAYER | "+String.valueOf(player.getCred()));
runMenu(1,ter);
break;
case "name":
String newName;
if ((newName = player.changeName(ter))!=null) {
player.username = newName;
Tools.printSlow30("SYSTEM | "+player.toString());
} else {
Tools.printSlow30("\nSYSTEM | Canceled \"Name change\"");
runMenu(1,ter);
}
break;
default:
Tools.printSlow30("\nSYSTEM | Unknown Command. Use \"/g help\"");
runMenu(1,ter);
break;
}
break;
case "/h":
//all show <name> sell <name>
switch (full_com[1]) {
case "all":
System.out.println();
player.showHorses();
runMenu(1,ter);
break;
case "show":
try {
player.showOneHorse(Integer.valueOf(full_com[2]));
} catch (Exception e) {
Tools.printSlow30("\nSYSTEM | That didnt seem to work. Use \"/g help\"");
}
runMenu(1,ter);
break;
case "sell":
try {
System.out.println();
player.sellHorse(Integer.valueOf(full_com[2]));
runMenu(1,ter);
break;
} catch (Exception e) {
Tools.printSlow30("\nSYSTEM | That didnt seem to work. Use \"/g help\"");
runMenu(1,ter);
break;
}
default:
Tools.printSlow30("\nSYSTEM | Unknown Command. Use \"/g help\"");
runMenu(1,ter);
break;
}
break;
case "/s":
//open
switch (full_com[1]) {
case "open":
Shop.openShop(player, ter);
break;
default:
Tools.printSlow30("\nSYSTEM | Unknown Command. Use \"/g help\"");
runMenu(1,ter);
break;
}
break;
case "/r":
//hs next start end
switch (full_com[1]) {
case "hs":
Race.showHistory();
runMenu(1,ter);
break;
case "next":
Race.genNextRace(player, ter);
break;
default:
Tools.printSlow30("\nSYSTEM | Unknown Command. Use \"/g help\"");
runMenu(1,ter);
break;
}
break;
case "/g":
//help quit
switch (full_com[1]) {
case "help":
help();
runMenu(1,ter);
break;
case "quit":
Tools.printSlow30("SYSTEM | Saving Progress...");
saveProgress();
Tools.printSlow80("\n\n::::::::::::::::::::::::::::::::::::::::::::::::: | ");
Tools.printSlow15("Save complete!");
Tools.waitT(1, "s");
Tools.printSlow30("\n\nSYSTEM | Quitting the game");
Tools.waitT(800, "m");
Tools.printSlow800("...");
System.exit(0);
break;
}
break;
default:
Tools.printSlow30("\nSYSTEM | Please use a command from the list above or use \"g help\"");
runMenu(0, ter);
}
} catch (Exception e) {
e.printStackTrace();;
}
}
public static void help() {
//Player commands
Tools.printSlow15("\n------------------------------------------------------------------------------------------------------\n\nSYSTEM | Player commands\n");
Tools.explainCommand("p info","Displays all important information about the player");
Tools.explainCommand("p cr","Shows your current Balance");
Tools.explainCommand("p name","Lets you change your current Username");
//HorseCommands
Tools.printSlow15("\n\n------------------------------------------------------------------------------------------------------\n\nSYSTEM | Horse commands\n");
Tools.explainCommand("h all","Shows all the horses you own");
Tools.explainCommand("h show <Name>","Shows the horse with that name");
Tools.explainCommand("h sell <Name>","Sell one of your horses for 80% Original Value");
//Shop commands
Tools.printSlow15("\n\n------------------------------------------------------------------------------------------------------\n\nSYSTEM | Shop commands\n");
Tools.explainCommand("s open","Enter the shop");
//Race commands
Tools.printSlow15("\n\n------------------------------------------------------------------------------------------------------\n\nSYSTEM | Race commands\n");
Tools.explainCommand("r hs","Shows your Race History");
Tools.explainCommand("r next","Starts the next Race");
Tools.explainCommand("r start","Starts the Race");
Tools.explainCommand("r end","Ends the Race");
//Game commands
Tools.printSlow15("\n\n------------------------------------------------------------------------------------------------------\n\nSYSTEM | Game commands\n");
Tools.explainCommand("g quit","Ends the current Game");
Tools.explainCommand("g help","Shows the list of available commands");
}
private static void saveProgress() {
//save mechanism
}
}

76
main/Horse.java 100644
View File

@ -0,0 +1,76 @@
package minigame;
import java.util.ArrayList;
import java.util.stream.IntStream;
public class Horse {
public int price;
public double speedx;
public int stamina;
public String name;
public String tag = "None";
public double current_pos;
public Horse(int price, double speed, int stamina, String name, String tag){
this.price = price;
this.speedx = speed;
this.stamina = stamina;
this.name = name;
this.tag = tag;
this.current_pos = 0;
}
public String toString() {
return String.format("Price: %d, Name: %s, Speed: %.1f, Stamina: %d", this.price, this.name, this.speedx * 10, this.stamina);
}
public String toOwnedString() {
return String.format("Name: %s, Speed: %.1f, Stamina: %d", this.name, this.speedx * 10, this.stamina);
}
public String toBotString() {
return String.format("%s, Sp: %.1f, St: %d", this.name, this.speedx * 10, this.stamina);
}
public String toRacePosString() {
return String.format("%s, Distance: %.1f", this.name, this.current_pos);
}
public static ArrayList<Horse> genHorses(int max, int level, String tag){
ArrayList<Horse> horses = new ArrayList<>();
IntStream.rangeClosed(1, max).forEach(x-> horses.add(new Horse((int)((Math.random()*(level*5*level))+3),(Math.random()*level/5)+0.1,(int)(Math.random()*5*(level*2)),genName(),tag)));
return horses;
}
public double getCurrentPos() {
return current_pos;
}
private static String genName() {
String [] names = {
"Maverick",
"Luna",
"Shadow",
"Echo",
"Willow",
"Blaze",
"Atlas",
"Harmony",
"Dakota",
"Nova",
"Titan",
"Luna",
"Diesel",
"Indie",
"Bella",
"Jasper",
"Zoe",
"Titan",
"Misty",
"Ace"
};
int x = (int)(Math.random()*names.length);
return names[x];
}
}

19
main/Main.java 100644
View File

@ -0,0 +1,19 @@
package minigame;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader ter = new BufferedReader(new InputStreamReader(System.in));
// Race.readLocations("minigame/locations2.txt");
GameControls game1 = new GameControls();
try {GameControls.startInto(game1, ter);}
catch (Exception e) {e.printStackTrace();}
}
}

135
main/Player.java 100644
View File

@ -0,0 +1,135 @@
package minigame;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.TreeMap;
public class Player {
public static TreeMap<Integer,Horse> player_horses = new TreeMap<>();
private static int maxMapId = 0;
public int credits;
public String username;
public int level;
public int lvlpg;
public Player(String uname) {
this.username = uname;
this.credits = 50;
this.level = 1;
this.lvlpg = 0;
}
public String toString() {
return this.username + ", Credits: " + this.credits + ", Lvl: " + this.level + ", Lvl Progress: " + this.lvlpg + "%.";
}
public int getCred() {
return this.credits;
}
public void showBalance() {
System.out.println("Credits: " + this.credits);
}
public void levelUp() {
this.lvlpg-=100;
this.level+=1;
}
public void visLevelProgress() {
System.out.println("\nSYSTEM | Level Progress:");
String header = "0%[";
String ending = "]100%";
String con10 = "::::";
String pas10 = " ";
StringBuilder out1 = new StringBuilder();
int con10am = lvlpg/10;
out1.append(header);
for (int i = 0; i<con10am;i++) {
out1.append(con10);
}
for (int y = 0; y<10-con10am;y++) {
out1.append(pas10);
}
out1.append(ending);
System.out.print(out1.toString());
}
public String changeName(BufferedReader ter) {
while (true) {
Tools.printSlow30("\nSYSTEM | Choose a new Username or cancel this action with \"/p c\" : ");
try {
String uname = ter.readLine();
if (uname.equalsIgnoreCase("/p c")) {
return null;
} else {
if (uname.toCharArray().length > 15) {
System.out.println("\nSYSTEM | Please Choose a Shorter Username");
} else {
return uname;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void buyHorse(int id) {
int price = Shop.shop_horses.get(id).price;
if ((credits-price)>=0) {
credits-=price;
System.out.println();
Horse h = Shop.shop_horses.get(id);
h.tag = "Player";
maxMapId++;
player_horses.put(maxMapId, h);
Shop.shop_horses.remove(id);
Tools.printSlow30("SYSTEM | Bought " + player_horses.get(maxMapId).name+". ");
System.out.println(player_horses.get(1));
} else {
Tools.printSlow30("\nSYSTEM | You dont have enough credits for that right now!\n");
}
}
public void sellHorse(int id) {
if (player_horses.size()==1) {
Tools.printSlow30("SYSTEM | You cant sell your only horse.");
} else {
try {
int price = calcSellPrice(player_horses.get(id));
String name = player_horses.get(id).name;
player_horses.remove(id);
credits+=price;
Tools.printSlow30("SYSTEM | You sold " + name + " for " + price + " credits.");
} catch (Exception e) {
Tools.printSlow30("SYSTEM | ID: "+id+" didnt seem to work. Please try again.");
}
}
}
private int calcSellPrice(Horse horse) {
return (int)(horse.price * 0.8);
}
public void showHorses() {
for (Integer key : player_horses.keySet()) {
System.out.print("PLAYER | ID: " + key + ", " + player_horses.get(key)+"\n");
}
}
public void showOneHorse(int id) {
try {
Tools.printSlow30("\n"+player_horses.get(id));
} catch (Exception e) {
Tools.printSlow30("SYSTEM | Couldnt find: "+id+".\n");
}
}
}

229
main/Race.java 100644
View File

@ -0,0 +1,229 @@
package minigame;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.TreeMap;
public class Race {
private static ArrayList<Race> past_races = new ArrayList<Race>();
public ArrayList <Horse> end = new ArrayList<>();
public ArrayList<Horse> cur_horses = new ArrayList<>();
public static TreeMap<Integer,Race> races = new TreeMap<>();
public static int curmaxRace = 0;
private int rlen;
private String rname;
private int max_horses;
private int status;
public int placement;
public int reward;
public Horse ch_horse;
public Race(Player player, String name) {
this.rlen = player.level * 10 + (2*player.level);
this.rname = name;
this.max_horses = Player.player_horses.values().size() * ((int)(Math.random()*4))+4;
this.cur_horses = Horse.genHorses(max_horses, player.level, "Race");
this.status = 0;
this.reward = 0;
}
public String toStartString() {
return "Get ready for " + this.rname + ". Race length: " + this.rlen + ". Horses: " + (this.max_horses+1);
}
public String toString() {
return String.format("Location: %s, Length: %d, FINISH POSITION: %d, Horses: %d, Reward: %d",this.rname,this.rlen,this.placement,(this.max_horses+1),this.reward);
}
public static void showHistory() {
System.out.println();
past_races.forEach(race -> Tools.printSlow30("RACE | " + race));
}
public static void firstRace(Player player,BufferedReader ter, Horse c_horse) {
Race firstRace = new Race(player, "Mannheim");
past_races.add(firstRace);
curmaxRace++;
races.put(curmaxRace,firstRace);
firstRace.getParts(player, 1);
Tools.printSlow30("\nSYSTEM | Type \"/r start\" to start the Race: ");
while(true) {
try {
String input = ter.readLine();
String [] full_com = input.split(" ");
String com = full_com[0];
if (com.equalsIgnoreCase("/r")) {
if (full_com[1].equalsIgnoreCase("start")) {
break;
} else {
Tools.printSlow30("\nSYSTEM | Use \"/r start\" to start the Race: ");
}
} else {
Tools.printSlow30("\nSYSTEM | Use \"/r start\" to start the Race: ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
firstRace.doRace(player, c_horse);
firstRace.finishRace(player, c_horse, ter);
}
public static void genNextRace(Player player, BufferedReader ter) throws IOException {
Tools.printSlow30("\n"+Tools.lineGap()+"\n");
curmaxRace++;
races.put(curmaxRace, new Race(player,getNextName()));
Tools.printSlow30("INFO | Prepare for the Race and choose your horse!\n");
Tools.printSlow30(Tools.lineGap()+"\n");
Tools.waitT(1, "s");
while (true) {
Tools.printSlow30("\nSYSTEM | Choose a horses with \"/c <ID>\"\n\n");
player.showHorses();
Tools.printSlow30("\nSYSTEM | Player Input:");
String input = ter.readLine();
String [] parts = input.split(" ");
String com = parts[0];
if (com.equalsIgnoreCase("/c")) {
try {
if (Player.player_horses.containsKey(Integer.valueOf(parts[1]))) {
Tools.printSlow30("\n\n"+Tools.lineGap()+"\n\n");
races.get(curmaxRace).getParts(player, Integer.valueOf(parts[1]));
Tools.printSlow30("\nSYSTEM | Type \"/r start\" to start the Race: ");
while(true) {
try {
String input1 = ter.readLine();
String [] full_com = input1.split(" ");
String com1 = full_com[0];
if (com1.equalsIgnoreCase("/r")) {
if (full_com[1].equalsIgnoreCase("start")) {
break;
} else {
Tools.printSlow30("\nSYSTEM | Use \"/r start\" to start the Race: ");
}
} else {
Tools.printSlow30("\nSYSTEM | Use \"/r start\" to start the Race: ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
races.get(curmaxRace).doRace(player, Player.player_horses.get(Integer.valueOf(parts[1])));
races.get(curmaxRace).finishRace(player,Player.player_horses.get(Integer.valueOf(parts[1])) ,ter);
break;
} else {
Tools.printSlow30("\nSYSTEM | Couldnt find a Horse with the ID: "+parts[1]+"\n\n------------------------------------------------------------------------------------------------------\n");
}
} catch (Exception e) {
Tools.printSlow30("\nChoose one of your horses with \"/c <ID>\"\n");
}
} else {
Tools.printSlow30("\nChoose one of your horses with \"/c <ID>\"\n");
}
}
}
private void finishRace(Player player, Horse c_horse, BufferedReader ter) {
try (BufferedReader ter2 = new BufferedReader(new InputStreamReader(System.in))){
c_horse.current_pos = 0; //Resest for next Race
System.out.println(Tools.lineGap()+"\n\nRACE | Rew: "+this.reward+" crd. Pos: "+this.placement+"");
player.visLevelProgress();
while (true) {
Tools.printSlow30("\n\nSYSTEM | Type \"/r end\" to leave the end screen: ");
String input = ter2.readLine();
if (input.equalsIgnoreCase("/r end")) {
Tools.printSlow30("SYSTEM | Updating Data");
Shop.updateShop(player);
Tools.printSlow800("...");
break;
}
}
GameControls.runMenu(0, ter);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String getNextName() {
return String.format("Race %d",curmaxRace);
}
public void getParts(Player player, int c_horse) {
cur_horses.add(Player.player_horses.get(c_horse));
Tools.printSlow30("INFO | Contestants:\n\n");
cur_horses.forEach(horse -> System.out.println((horse.tag.equalsIgnoreCase("Race") ? "RACE | " : player.username + " | ") + horse.toBotString()));
}
private void doRace(Player player, Horse c_horse) {
Tools.printSlow30("\n"+toStartString()+"\n\n");
Tools.waitT(1, "s");
int cyc_count = 0;
while(status==0) {
cyc_count++;
doCycle(player, cyc_count);
Tools.waitT(1000, "m");
}
}
private void doCycle(Player player, int cyc_count) {
System.out.println("---------------------------------------------------\nRACE | Time from start: "+cyc_count+"\n");
Collections.sort(cur_horses, Comparator.comparingDouble(Horse::getCurrentPos).reversed());
for (Horse horse : cur_horses) {
if (end.contains(horse)) {
continue;
} else {
horse.current_pos += calcStep(horse, cyc_count);
if (horse.current_pos >= this.rlen) {
horse.current_pos = this.rlen;
System.out.println("FINISH | "+(horse.tag.equalsIgnoreCase("Race") ? "BOT | " : player.username + " | ") + horse.toRacePosString());
end.add(horse);
if (horse.tag.equalsIgnoreCase("Player")) {
status = 1;
this.placement = end.size();
calcRaceRewards(horse, player);
System.out.println();
break; // exit the loop when status is 1
}
} else {
System.out.println((cur_horses.indexOf(horse)+1)+" | " + (horse.tag.equalsIgnoreCase("Race") ? "OPP | " : player.username + " | ") + horse.toRacePosString());
}
}
}
}
private double calcStep(Horse horse,int cyc_count) {
double speed = (((Math.random()*10)+5)*horse.speedx);
double bonus = horse.stamina/10 - cyc_count/10;
return (bonus>=0) ? speed + bonus : speed;
}
private void calcRaceRewards(Horse horse, Player player) {
int reward = (int) (player.level*(Math.random()+2))+((10/this.placement)*3);
this.reward = reward;
player.credits += reward;
player.lvlpg+=(100/this.placement)-(player.level<90 ? player.level : 0);
if (player.lvlpg >= 100) {
player.levelUp();
}
}
// public static void readLocations(String filename) throws IOException {
// try (BufferedReader file1 = new BufferedReader(new FileReader(filename))) {
// String line;
// while ((line = file1.readLine()) != null) {
// raceId++;
// races.put(raceId, line);
// } races.values().forEach(x -> System.out.println(x));
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }
}