[JAVA] Object-oriented rock-paper-scissors

Introduction

I recently started studying Java, so I wanted to make something object-oriented.

flow

① Enter your name. (The name of the other party is decided randomly.) ② Choose a hand to put out. (The opponent's hand is randomly determined.) ③ Output the result. ④ The end. (This is a one-time match.)

Classes

①Janken.java This is the main function.

Janken.java


public class Janken {
    public static void main(String[] args) {
        Player you   = new You();
        Player enemy = new Enemy();

        System.out.print("Please enter your name. :> ");
        you.setName();
        enemy.setName();
        String yourName  = you.getName();
        String enemyName = enemy.getName();
        System.out.println("Your name is" + yourName);
        System.out.println("The name of the other party is" + enemyName);

        Hand yourHand  = you.nextHand();
        Hand enemyHand = enemy.nextHand();

        System.out.println(yourName   + "Is" + yourHand  +  "Was issued.");
        System.out.println(enemyName  + "Is" + enemyHand +  "Was issued.");

        if (yourHand.winTo(enemyHand)) {
            System.out.println(yourName + "Nokachi!");
        } else if (yourHand.loseTo(enemyHand)) {
            System.out.println(yourName + "Bonus ...");
        } else {
            System.out.println("This is Aiko.");
        }
    }
}

②Player.java An abstract class with rough information about the player. Inherit this class and create a class for you and your opponent.

Player.java


public abstract class Player {
    protected String name;

    public String getName(){
        return this.name;
    }

    public abstract void setName();

    public abstract Hand nextHand();
}

③you.java

You.java


import java.util.*;
public class You extends Player {
    @Override
    public void setName() {
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        this.name = name;
    }

    @Override
    public Hand nextHand() {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.print("What to put out?Goo:0 choki:1 par:2  > ");
            try {
                int hand_number = Integer.parseInt(scanner.nextLine());
                if (0 <= hand_number && hand_number <= 2) {
                    return Hand.fromInt(hand_number);
                } else {
                    System.err.println("A number outside the range has been entered.");
                }
            } catch (NumberFormatException e) {
                System.err.println("Other than numbers have been entered");
            }
        }
    }
}

④Enemy.java

Enemy.java


public class Enemy extends Player {
    private final String[] names = {"Abe", "Koizumi", "Aso", "Suga"};

    @Override
    public void setName() {
        String enemyName = names[(int) (Math.random() * names.length)];
        this.name = enemyName;
    }

    @Override
    public Hand nextHand() {
        return Hand.fromInt((int) (Math.random() * 3));
    }
}

⑤Hand.java I used an enum class.

Hand.java


public enum Hand {
    Rock,
    Scissors,
    Paper;

    @Override
    public String toString() {
        switch (this) {
            case Rock     : return "Goo";
            case Scissors : return "Choki";
            case Paper    : return "Par";
        }
        throw new IllegalStateException();
    }

    public static Hand fromInt(int n) {
        switch (n) {
            case 0 : return Rock;
            case 1 : return Scissors;
            case 2 : return Paper;
        }
        throw new IllegalArgumentException(Integer.toString(n));
    }

    public boolean winTo(Hand hand) {
        switch (this) {
            case Rock     : return hand == Scissors;
            case Scissors : return hand == Paper;
            case Paper    : return hand == Rock;
        }
        throw new IllegalStateException();
    }

    public boolean loseTo(Hand hand) {
        return this != hand && !this.winTo(hand); 
    }
    
}

that's all. It seems interesting to make a lot of enemies and play tournament battles, or make a strategy class. I would appreciate any improvements.

Recommended Posts

Object-oriented rock-paper-scissors
Object-oriented summary
Object-oriented programming
Simple rock-paper-scissors
Rock-paper-scissors game
[Java] Object-oriented
java rock-paper-scissors
Object-oriented FizzBuzz (Java)
Rock-paper-scissors in Java
Object-oriented programming terminology
[Java] Object-oriented syntax-Constructor
Object-oriented (Java) basics
Object-oriented numerical calculation
[Java] Object-oriented summary_Part 2
[Java] Object-oriented syntax-Package