Initial check-in

This commit is contained in:
Isaac Shoebottom 2022-06-16 19:21:05 -03:00
commit 55e0908c78
19 changed files with 759 additions and 0 deletions

29
.gitignore vendored Normal file
View File

@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,11 @@
<component name="ArtifactManager">
<artifact type="jar" name="TextBasedGame">
<output-path>$PROJECT_DIR$/out/artifacts/TextBasedGame</output-path>
<root id="archive" name="TextBasedGame.jar">
<element id="module-output" name="Java-TextBasedGame" />
<element id="directory" name="META-INF">
<element id="file-copy" path="$PROJECT_DIR$/out/production/Java-TextBasedGame/META-INF/MANIFEST.MF" />
</element>
</root>
</artifact>
</component>

View File

@ -0,0 +1,7 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<ScalaCodeStyleSettings>
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
</ScalaCodeStyleSettings>
</code_scheme>
</component>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

6
.idea/misc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Java-TextBasedGame.iml" filepath="$PROJECT_DIR$/Java-TextBasedGame.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

150
.idea/workspace.xml Normal file
View File

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ArtifactsWorkspaceSettings">
<artifacts-to-build>
<artifact name="TextBasedGame" />
</artifacts-to-build>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="510d163a-8155-4aa6-b7f2-36b413e8f633" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/artifacts/TextBasedGame.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/codeStyles/Project.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/codeStyles/codeStyleConfig.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Java-TextBasedGame.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Armor.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Enemy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Game.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Item.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Location.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Person.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Player.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/Weapon.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/WeaponFactory.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CodeStyleSettingsInfer">
<option name="done" value="true" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$PROJECT_DIR$/src/Armor.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Game.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Item.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Location.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Person.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Player.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Weapon.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/WeaponFactory.java" root0="FORCE_HIGHLIGHTING" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectCodeStyleSettingsMigration">
<option name="version" value="2" />
</component>
<component name="ProjectId" id="2AUCe8CTyr1vGNX0VTmmJ0Emn3z" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
&quot;Downloaded.Files.Path.Enabled&quot;: &quot;false&quot;,
&quot;Repository.Attach.Annotations&quot;: &quot;false&quot;,
&quot;Repository.Attach.JavaDocs&quot;: &quot;false&quot;,
&quot;Repository.Attach.Sources&quot;: &quot;false&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/GitHub/Java-TextBasedGame/out/production/Java-TextBasedGame&quot;,
&quot;project.structure.last.edited&quot;: &quot;Artifacts&quot;,
&quot;project.structure.proportion&quot;: &quot;0.15&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.29177958&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;web.server&quot;
}
}</component>
<component name="RunManager" selected="Application.Load Save">
<configuration name="Default" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="Game" />
<module name="Java-TextBasedGame" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="Isaac" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="Game" />
<module name="Java-TextBasedGame" />
<option name="PROGRAM_PARAMETERS" value="Isaac 19 m" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="Load Save" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="Game" />
<module name="Java-TextBasedGame" />
<option name="PROGRAM_PARAMETERS" value="load Isaac" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="Jar Build" type="JarApplication">
<option name="JAR_PATH" value="$PROJECT_DIR$/out/artifacts/TextBasedGame/TextBasedGame.jar" />
<option name="ALTERNATIVE_JRE_PATH" />
<method v="2">
<option name="BuildArtifacts" enabled="true">
<artifact name="TextBasedGame" />
</option>
</method>
</configuration>
<list>
<item itemvalue="Application.Isaac" />
<item itemvalue="Application.Default" />
<item itemvalue="Application.Load Save" />
<item itemvalue="JAR Application.Jar Build" />
</list>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="510d163a-8155-4aa6-b7f2-36b413e8f633" name="Changes" comment="" />
<created>1655054868910</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1655054868910</updated>
<workItem from="1655054870567" duration="25215000" />
<workItem from="1655152578449" duration="2254000" />
<workItem from="1655170471117" duration="2590000" />
<workItem from="1655218678744" duration="506000" />
<workItem from="1655251289034" duration="4254000" />
<workItem from="1655337729211" duration="2834000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>

11
Java-TextBasedGame.iml Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

BIN
character/Isaac.dat Normal file

Binary file not shown.

11
src/Armor.java Normal file
View File

@ -0,0 +1,11 @@
import java.io.Serializable;
public class Armor extends Item implements Serializable {
double armor;
String armorClass;
Armor(String name, String description, long value, double armor, String armorClass){
super(name, description, value);
this.armor = armor;
this.armorClass = armorClass;
}
}

2
src/Enemy.java Normal file
View File

@ -0,0 +1,2 @@
public class Enemy extends Person {
}

341
src/Game.java Normal file
View File

@ -0,0 +1,341 @@
import java.io.*;
import java.util.*;
/*
TODO: Implement move
TODO: Implement armor
TODO: Implement NPCs
TODO: Implement Fights (Implement armor and attack formula)
TODO: Implement enemy looting
TODO: Implement game over
TODO: Implement armor factory
TODO: Implement map
TODO: Implement player equipment
TODO: Add key to left map
TODO: Add gate to right of map
TODO: Make inventory more robust with damage/armor/value display
TODO: Save and load object //Test if can be broken
TODO: Save visited locations in player
TODO: Rewrite switch case to use either .startWith/.endsWith to .split input string and then able to use positional arguments
Maybe:
TODO: Make factory that can take locations as arguments
TODO: Town after gate
TODO: Interiors
TODO: Dungeons
TODO: Implement vendors
*/
public class Game {
public static void main(String[] args) throws IOException {
boolean exit = false;
String input;
Player player;
if (args.length > 0 && Objects.equals(args[0], "load")) {
try {
FileInputStream saveFile = new FileInputStream("./character/" + args[1] + ".dat");
ObjectInputStream save = new ObjectInputStream(saveFile);
player = (Player) save.readObject();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
else {
player = createPlayer(args);
System.out.println("You wake up feeling groggy, you feel like praying for help might provide you with direction.");
}
while (!exit) {
input = reader.readLine();
input = input.toLowerCase(Locale.ROOT);
switch (input) {
case "help":
System.out.println("help: describes all given commands");
System.out.println("inspect area/{direction}: gives you the name of the area you are in");
System.out.println("describe area/{direction}: gives a description of the area along with the presence of items");
System.out.println("move {direction}: moves in the specified cardinal direction");
System.out.println("take: shows a list of all items on the ground");
System.out.println("inspect items: shows a list of all items on the ground");
System.out.println("save: saves player to file in directory \"character\" with the given character name. " + "load from the command line with load {character name}");
System.out.println("inventory: shows which items are in player inventory");
System.out.println("exit: close game");
break;
case "inventory":
System.out.println(player.inventory);
break;
case "save":
try {
FileOutputStream saveFile = new FileOutputStream("./character/" + player.name + ".dat");
ObjectOutputStream save = new ObjectOutputStream(saveFile);
save.writeObject(player);
save.close();
saveFile.close();
System.out.println("Data saved");
} catch (IOException e) {
throw new RuntimeException(e);
}
break;
case "inspect items":
if (player.current.items.length == 0) {
System.out.println("There are no items here");
}
for(Item item: player.current.items) {
System.out.print(item.name + ": " + item.description + " Worth: " + item.value);
// if type is weapon show damage
if (item instanceof Weapon) {
System.out.println(". Damage: " + ((Weapon) item).damage);
}
}
break;
case "take":
// section which lists the name of the items
if (player.current.items.length == 0) {
System.out.println("There are no items to take.");
break;
}
if (player.current.items.length == 1) {
System.out.println("There appears to be an item around. It is a " +
Arrays.deepToString(player.current.items)
.replace(",", "") //remove the commas
.replace("[", "") //remove the right bracket
.replace("]", "") //remove the left bracket
.trim());
}
if (player.current.items.length > 1) {
System.out.println(" There appears to be some items around. They are " +
Arrays.deepToString(player.current.items)
.replace(",", ", or") //remove the commas
.replace("[", "") //remove the right bracket
.replace("]", "") //remove the left bracket
.trim());
}
//section asking which item
System.out.println("Which item do you take?: ");
input = reader.readLine();
input = input.toLowerCase(Locale.ROOT);
int duplicateNameCount = 0;
Item itemToRemove;
ArrayList<Item> duplicateItems = new ArrayList<>();
for(Item item: player.current.items) {
if (item.name.toLowerCase(Locale.ROOT).contains(input)) {
duplicateItems.add(item);
duplicateNameCount++;
}
}
// if there are no duplicates
if (duplicateNameCount == 1) {
itemToRemove = duplicateItems.get(0);
player.inventory.add(itemToRemove);
}
// if there are items with the same name, check for duplicates
// else because duplicateItemCount is always greater than 1, does not need to be else if
else {
// convert arraylist to array for the purpose of the for loop
Item[] duplicateItemsArray = new Item[duplicateItems.size()];
duplicateItems.toArray(duplicateItemsArray);
// print duplicate items
int count = 1;
for(Item item: duplicateItemsArray) {
System.out.print("Item " + count + ": " + item.name + ": " + item.description + " Worth:" + item.value);
// if type is weapon show damage
if (item instanceof Weapon) {
System.out.println(". Damage: " + ((Weapon) item).damage);
}
}
// make sure choice is numeric
String choiceStr;
do {
System.out.print("Which " + duplicateItems.get(0).name + " do you take?: ");
choiceStr = reader.readLine();
} while (isNotNumericString(choiceStr));
//add item to player inventory
int choice = Integer.parseInt(choiceStr);
itemToRemove = duplicateItems.get(choice);
player.inventory.add(duplicateItems.get(choice));
}
//search for index by object and remove item from location
int index = 0;
for (int i = 0; i < player.current.items.length; i++) {
if (itemToRemove == player.current.items[i]) {
index = i;
}
}
System.out.println("You took the " + itemToRemove.name + ".");
player.current.items = Item.removeElement(player.current.items, index);
break;
//inspect area
case "inspect area":
System.out.println("You appear to be in a " + player.current.name);
break;
case "inspect north":
System.out.println("This area appears to be a " + player.current.north.name);
break;
case "inspect east":
System.out.println("This area appears to be a " + player.current.east.name);
break;
case "inspect south":
System.out.println("This area appears to be a " + player.current.south.name);
break;
case "inspect west":
System.out.println("This area appears to be a " + player.current.west.name);
break;
case "move":
System.out.println("Please provide a direction");
case "move north":
if (player.current.north.canWalk) {
player.current = player.current.north;
System.out.println("You move north");
//begin enemy encounter
enemyEncounter(player);
}
else {
System.out.println("This area seems too difficult to navigate");
}
case "move east":
case "move south":
case "move west":
//describe
case "describe area":
System.out.print("The area appears to be a " + player.current.description);
if (player.current.items.length == 1) {
System.out.println(" There appears to be an item around. It is a " +
Arrays.deepToString(player.current.items)
.replace(",", "") //remove the commas
.replace("[", "") //remove the right bracket
.replace("]", "") //remove the left bracket
.trim());
}
else if (player.current.items.length > 1) {
System.out.println(" There appears to be some items around. They are " +
Arrays.deepToString(player.current.items)
.replace(",", ", and") //remove the commas
.replace("[", "") //remove the right bracket
.replace("]", "") //remove the left bracket
.trim());
}
else {
System.out.println();
}
break;
case "describe north":
System.out.println("The area appears to be a " + player.current.north.description);
break;
case "describe east":
System.out.println("The area appears to be a " + player.current.east.description);
break;
case "describe south":
System.out.println("The area appears to be a " + player.current.south.description);
break;
case "describe west":
System.out.println("The area appears to be a " + player.current.west.description);
break;
case "exit":
exit = true;
break;
default:
System.out.println("Command not recognized");
break;
}
}
}
static void enemyEncounter(Player player) {
Random random = new Random();
double doesEncounter = random.nextDouble() * 100;
if (doesEncounter <= player.current.enemyChance) {
}
}
static Player createPlayer(String[] args) throws IOException {
String name;
int age;
String gender;
if (args.length > 0) {
name = args[0];
System.out.println("What is your name?: " + name);
age = Integer.parseInt(args[1]);
System.out.println("What is your age?: " + age);
gender = args[2];
System.out.println("Are you male (m), female (f), gender-fluid (g), or androgynous (a)?: " + gender);
}
else {
System.out.print("What is your name?: ");
name = reader.readLine();
String ageString;
do {
System.out.print("What is your age?: ");
ageString = reader.readLine();
} while (isNotNumericString(ageString));
age = Integer.parseInt(ageString);
System.out.print("Are you male (m), female (f), gender-fluid (g), or androgynous (a)?: ");
gender = reader.readLine();
}
boolean isMale = false;
boolean isFemale = false;
switch (gender){
case "m":
case "M":
//male case
isMale = true;
break;
case "f":
case "F":
//female case
isFemale = true;
break;
case "g":
case "G":
//gender-fluid case
isMale = true;
isFemale = true;
break;
case "a":
case "A":
default:
//androgynous case
break;
}
return new Player(name, age, isMale, isFemale, startArea);
}
public static boolean isNotNumericString(String str) {
try {
Double.parseDouble(str);
return false;
} catch (NumberFormatException e) {
return true;
}
}
/*
---------------------------------
| $ % % % % % x x x x x x x x # |
---------------- % -------------
| x |
| ! |
-----
*/
//factories
static WeaponFactory weaponFactory = new WeaponFactory();
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//item lists
static Item[] startAreaItems = {weaponFactory.getWeapon("stick")};
//locations
static Location impassibleShrubs = new Location("thick shrubs", "this location looks impossible to move through.",
false);
static Location startArea = new Location("forest clearing", "small clearing the the forest, light shines through from above.",
true, 0,
startAreaItems,
null, impassibleShrubs, impassibleShrubs, impassibleShrubs);
}

23
src/Item.java Normal file
View File

@ -0,0 +1,23 @@
import java.io.Serializable;
public class Item implements Serializable {
String name;
String description;
long value;
Item(String name, String description, long value) {
this.name = name;
this.description = description;
this.value = value;
}
public String toString() {
return name;
}
public static Item[] removeElement(Item[] original, int element){
Item[] n = new Item[original.length - 1];
System.arraycopy(original, 0, n, 0, element );
System.arraycopy(original, element+1, n, element, original.length - element-1);
return n;
}
}

41
src/Location.java Normal file
View File

@ -0,0 +1,41 @@
import java.io.Serializable;
public class Location implements Serializable {
//locations
//end locations
String name;
String description;
Item[] items;
boolean canWalk;
Location north;
Location east;
Location south;
Location west;
double enemyChance;
Location(String name, String description, boolean canWalk) {
this.name = name;
this.description = description;
this.canWalk = false;
this.north = null;
this.east = null;
this.south = null;
this.west = null;
}
Location(String name, String description, boolean canWalk, double enemyChance, Item[] items, Location north, Location east, Location south, Location west) {
this.name = name;
this.description = description;
this.canWalk = canWalk;
this.enemyChance = enemyChance;
this.items = items;
this.north = north;
this.east = east;
this.south = south;
this.west = west;
}
}

58
src/Person.java Normal file
View File

@ -0,0 +1,58 @@
import java.io.Serializable;
import java.util.ArrayList;
public class Person implements Serializable {
String name;
int age;
double heath;
boolean isMale;
boolean isFemale;
Weapon hands;
Armor head;
Armor chest;
Armor leftArm;
Armor rightArm;
Armor leftLeg;
Armor rightLeg;
ArrayList<Item> inventory;
public Person() {
this.inventory = new ArrayList<>();
}
Person(String name, int age, double heath, boolean isMale, boolean isFemale,
Weapon hands,
Armor head, Armor chest, Armor leftArm, Armor rightArm, Armor leftLeg, Armor rightLeg,
ArrayList<Item> inventory) {
this.name = name;
this.age = age;
this.heath = heath;
this.isMale = isMale;
this.isFemale = isFemale;
this.hands = hands;
this.head = head;
this.chest = chest;
this.leftArm = leftArm;
this.rightArm = rightArm;
this.leftLeg = leftLeg;
this.rightLeg = rightLeg;
this.inventory = inventory;
addEquipmentToInventory();
}
public double getDamage(){
return hands.damage;
}
public double getArmor(){
return head.armor + chest.armor + leftArm.armor + rightArm.armor + leftLeg.armor + rightLeg.armor;
}
private void addEquipmentToInventory() {
inventory.add(head);
inventory.add(chest);
inventory.add(leftArm);
inventory.add(rightArm);
inventory.add(leftLeg);
inventory.add(rightLeg);
}
}

16
src/Player.java Normal file
View File

@ -0,0 +1,16 @@
import java.io.Serializable;
public class Player extends Person implements Serializable {
boolean isPlayer = true;
Location current;
Player(String name, int age, boolean isMale, boolean isFemale, Location current) {
super();
this.name = name;
this.age = age;
this.isMale = isMale;
this.isFemale = isFemale;
this.heath = 100;
this.current = current;
}
}

10
src/Weapon.java Normal file
View File

@ -0,0 +1,10 @@
import java.io.Serializable;
public class Weapon extends Item implements Serializable {
double damage;
Weapon(String name, String description, long value, double damage){
super(name, description, value);
this.damage = damage;
}
}

24
src/WeaponFactory.java Normal file
View File

@ -0,0 +1,24 @@
import java.text.DecimalFormat;
import java.util.Random;
public class WeaponFactory {
private double getRandomDouble(double min, double max) {
Random random = new Random();
double randomValue = min + (max - min) * random.nextDouble();
DecimalFormat df = new DecimalFormat("#.#");
randomValue = Double.parseDouble(df.format(randomValue));
return randomValue;
}
public Weapon getWeapon(String weaponType) {
if (weaponType.equalsIgnoreCase("stick")) {
return new Weapon("Stick", "a pointed stick.", 1, getRandomDouble(1, 2));
}
if (weaponType.equalsIgnoreCase("sword")) {
return new Weapon("Sword", "a shiny sword", 35, getRandomDouble(14, 16));
}
else {
return null;
}
}
}