В настоящее время я создаю консольную программу Java для текстовой игры «Монополия» в качестве личного проекта. Поскольку это мой первый проект, над которым я работал, я хотел бы знать, какие принципы и конструкции объектно-ориентированного программирования я не использую. В частности, мне интересно, не создаю ли я достаточно классов для разделения функций программы.
Классов довольно много, поэтому я покажу здесь самые важные, а также приведу ссылку на страницу GitHub.
import java.util.ArrayList;
import java.util.Collections;
public class Player {
private final String name;
public boolean inJail = false;
public int turnsInJail = 0;
private int position;
private int money = 1500;
private int numUtilities = 0;
private int numRailroads = 0;
private ArrayList<Property> properties = new ArrayList<Property>();
public Player(String name){
this.name = name;
position = 0;
}
public int getPosition() { return position; }
public String getName() { return name; }
public int getMoney() { return money; }
public void addMoney(int addMoney){
this.money += addMoney;
}
public void pay(Player receiving, int amount){
receiving.addMoney(amount);
addMoney(-amount);
}
public void move(int numSquares, Board board){
position += numSquares;
//if pass GO
if(position >= 40){
System.out.println(name + " passed GO and collected $200");
money += 200;
position %= 40;
}
System.out.println("Landed on " + board.getCurrentSquare(this));
board.getCurrentSquare(this).doAction(this);
}
public void moveTo(int position){
this.position = position;
}
//add property to Player's properties
public void buy(Property property){
addMoney(-property.getPrice());
properties.add(property);
sortPropertiesByGroup(properties);
}
private void sortPropertiesByGroup(ArrayList<Property> properties){
ArrayList<Utility> utilities = new ArrayList<>();
ArrayList<Railroad> railroads = new ArrayList<>();
ArrayList<Property> sorted = new ArrayList<>();
for(Property property : properties){
if(property instanceof Utility){
utilities.add((Utility) property);
} else if(property instanceof Railroad){
railroads.add((Railroad) property);
} else {
sorted.add(property);
}
}
Collections.sort(utilities);
Collections.sort(railroads);
Collections.sort(sorted);
sorted.addAll(railroads);
sorted.addAll(utilities);
}
public void listProperties(){
if(properties.isEmpty()){
System.out.println("You do not own any properties");
}
for(Property property : properties){
System.out.println(property);
}
}
public int getNumRailroads(){
int numRailroads = 0;
for(Property p : properties){
if(p instanceof Railroad){
numRailroads++;
}
}
return numRailroads;
}
public int getNumUtilities(){
int numUtilities = 0;
for(Property p : properties){
if(p instanceof Utility){
numUtilities++;
}
}
return numUtilities;
}
//returns list of all properties that Player owns color group
public ArrayList<ColorProperty> getOwnColorGroupList(){
ArrayList<ColorProperty> list = new ArrayList<>();
for(Property property: properties){
if(property instanceof ColorProperty && ownsGroup(((ColorProperty) property).getGroup())){
list.add((ColorProperty) property);
}
}
return list;
}
//return list of all properties that Player can place house
public ArrayList<ColorProperty> getHouseableProperties(){
ArrayList<ColorProperty> houseable = new ArrayList<>();
for(ColorProperty i : getOwnColorGroupList()){
boolean lowestHouses = true;
for(ColorProperty j : getOwnColorGroupList()){
if(i.getGroup() == j.getGroup() && i.getNumHouses() > j.getNumHouses()){
lowestHouses = false;
}
}
if(lowestHouses && i.getNumHouses() != 5){
houseable.add(i);
}
}
return houseable;
}
//check if property is in Player's properties
private boolean owns(Property property){
return properties.contains(property);
}
//check if Player owns all of a certain color group
public boolean ownsGroup(ColorProperty.Group group){
int count = 0;
for(Property property : properties){
if(property instanceof ColorProperty && ((ColorProperty) property).getGroup() == group){
count++;
}
}
return (count == group.maxInGroup);
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Game {
private Jail jail = new Jail(this);
private Dice dice = new Dice();
private final Board board = new Board(jail, dice);
private ArrayList<Player> players = new ArrayList<Player>();
public void startGame(int numPlayers){
for(int i = 1; i <= numPlayers; i++){
System.out.print("Player " + i + " name: ");
players.add(new Player(Input.read()));
}
turn(players.get(0));
}
//pass turn to next Player
public void turn(Player currentPlayer){
System.out.println("n" + currentPlayer.getName() + "'s turn!nMoney: $" + currentPlayer.getMoney());
if(currentPlayer.inJail){ //if player doesn't escape jail on turn, skips to showOptions
if(!jail.jailTurn(currentPlayer, dice, board)) {
showOptions(currentPlayer);
}
} else { //if player is not in jail
System.out.println("Position: " + board.getCurrentSquare(currentPlayer));
int numDoubles = 0;
do{
currentPlayer.move(dice.roll(), board);
numDoubles++;
if(numDoubles == 3){
jail.sendToJail(currentPlayer);
}
} while (numDoubles < 3 && dice.isDouble());
}
showOptions(currentPlayer);
}
public void endTurn(Player currentPlayer){
int currentIndex = players.indexOf(currentPlayer);
if(currentIndex + 1 == players.size()){
turn(players.get(0));
} else {
turn(players.get(currentIndex + 1));
}
}
//player options after roll and land on a square
private void showOptions(Player currentPlayer){
List<PlayerOption> options = Arrays.asList(
new ListPropertiesOption(currentPlayer),
new BuyHouseOption(currentPlayer),
new EndTurnOption(this, currentPlayer)
);
PlayerOption selectedOption = (PlayerOption) Input.selectOptions(options, "Additional Actions:");
selectedOption.action();
showOptions(currentPlayer); //when player does not select end turn
}
}
public abstract class Property extends Square {
private final int price;
private final int rent;
protected Player owner = null;
public Property(String name, int price, int rent){
super(name);
this.price = price;
this.rent = rent;
}
public Player getOwner() {
return owner;
}
public int getPrice(){
return price;
}
public int getRent(){
return rent;
}
public void offerBuy(Player currentPlayer){
System.out.println("Would you like to buy " + name + " for $" + price + "?");
String response = Input.read().toLowerCase();
if(response.contains("y")){
currentPlayer.buy(this);
owner = currentPlayer;
}
}
@Override
public void doAction(Player currentPlayer) {
if(currentPlayer == owner);
//square is owned by the currentPlayer
else if(owner != null) {
//square is owned by someone else
System.out.println(currentPlayer.getName() + " paid " + owner.getName() + " $" + getRent() + " in rent");
currentPlayer.pay(owner, getRent());
} else {
//square can be bought
offerBuy(currentPlayer);
}
}
}