新卒トレーニング

4月に入社する新卒がインターンに来ていて、エンジニア志望の彼に最近プログラミングを教えている。学部はプログラミングに関係のない文系学部で、プログラミング自体も未経験なので教えるほうもなかなか骨が折れる。

自分自身が商学部出身でプログラミングを独学で身につけたので、苦労も分かるし何が無駄でどう学べば力がつくのかなんとなく持論もある。本を読んだりオンライン講座で動画を見たりするだけで手を動かさない限りは身につかないので、文法をさらっと勉強してもらっていきなり問題を解いてもらっている。一進一退はあるが一ヶ月前とは見違えるくらい書けるようになったと感じる。

アドバイスしたり添削したりするのも下手なことは言えないし悪いお手本は見せられないので、解答を考えるのも少し神経をつかう。今まではプログラミングを教えるという立場になったことがなかったので、なんだかんだ自分の勉強にもなっている。

最近は以下のような問題を解いてもらった。ロジック自体は難しくないので、いかに良い設計をするかという視点で考えてみると自分にとってもトレーニングになる。

http://6nen3kumi.wiki.fc2.com/wiki/総合問題3

randomメソッドを使ってじゃんけんをするゲームを作成します。
   
 ルール1:
  プレーヤーは数値入力で「グー」「チョキ」「パー」を表現します。
  入力値は1~9の整数です。
  1,2,3が入力された場合は「グー」、
  4,5,6が入力された場合は「チョキ」、
  7,8,9が入力された場合は「パー」になります。
   
 ルール2:
  じゃんけん結果は、
  あいこのときは「あなたは「○」で、私は「△」です。あいこです」
  負けのときは「あなたは「○」で、私は「△」です。あなたの負けです」
  勝ちのときは「あなたは「○」で、私は「△」です。あなたの勝ちです」
  と出力して下さい。
  ※○、△はルール1に従って「グー」「チョキ」「パー」に変換し、表示して下さい。
   
 ルール3:
  10回繰り返しゲームをできるようにし、10回じゃんけん後勝率を計算して表示して下さい。

 ルール4:
  出力は以下の以下の通りになるようにしてください。

   最初はグー、じゃんけん
   1
   あなたは「グー」で、私は「パー」です。あなたの勝ちです
   最初はグー、じゃんけん
   9
   あなたは「パー」で、私は「パー」です。あいこです
     ・
     ・
     ・

   10回じゃんけんのあなたの勝率は○○%です。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 総合問題3 http://6nen3kumi.wiki.fc2.com/wiki/%E7%B7%8F%E5%90%88%E5%95%8F%E9%A1%8C%EF%BC%93
 */
class Question3 {

    public static void main(String[] args) {
        Game game = new Game(10);
        game.start();
    }
}

class Game {
    private int round;

    public Game(int round) {
        this.round = round;
    }

    public void showInstruction() {
        System.out.println("***じゃんけんゲーム***");
        System.out.println("あなたはこれからわたしとじゃんけんを" + round +"回します。");
        System.out.println("じゃんけんは数字で入力して下さい。");
        System.out.println("");
        System.out.println("・「1」「2」「3」は「グー」");
        System.out.println("・「4」「5」「6」は「チョキ」");
        System.out.println("・「7」「8」「9」は「パー」");
        System.out.println("");
        System.out.println("それでは開始します");
        System.out.println("");
    }

    public void start() {
        Player user = new User();
        Player cpu  = new Computer();
        int win = 0;
        showInstruction();
        for ( int i = 0; i < round; i++ ) {
            System.out.println("最初はグー、じゃんけん");
            Hand userHand = user.getNextHand();
            Hand cpuHand = cpu.getNextHand();
            if ( userHand.isSuperior(cpuHand.handtype) ) {
                System.out.println(String.format("あなたは「%s」で、私は「%s」です。あなたの勝ちです", userHand, cpuHand));
                win++;
            } else if ( cpuHand.isSuperior(userHand.handtype) ) {
                System.out.println(String.format("あなたは「%s」で、私は「%s」です。あなたの負けです", userHand, cpuHand));
            } else {
                System.out.println(String.format("あなたは「%s」で、私は「%s」です。あいこです", userHand, cpuHand));
            }
        }
        System.out.println(String.format("%d回じゃんけんのあなたの勝率は%.2f%です。", round, ( (double) win / round ) * 100));
    }

    public enum HandType {
        Rock,
        Paper,
        Scissors
    }

    public abstract class Hand {
        protected final String name;
        public final HandType handtype;
        protected final HandType inferior;

        protected Hand(String name, HandType handtype, HandType inferior) {
            this.name = name;
            this.handtype = handtype;
            this.inferior = inferior;
        }

        public String getName() {
            return name;
        }

        public boolean isSuperior(HandType handtype) {
            if ( handtype == inferior ) {
                return true;
            } else {
                return false;
            }
        };

        @Override
        public String toString() {
            return getName();
        }
    }

    public class RockHand extends Hand {
        public RockHand() {
            super("グー", HandType.Rock, HandType.Scissors);
        }
    }

    public class ScissorsHand extends Hand {
        public ScissorsHand() {
            super("チョキ", HandType.Scissors, HandType.Paper);
        }
    }

    public class PaperHand extends Hand {
        public PaperHand() {
            super("パー", HandType.Paper, HandType.Rock);
        }
    }

    public Hand createHand(HandType handtype) {
        Hand hand = null;
        switch ( handtype ) {
            case Rock:
                hand = new RockHand();
                break;
            case Paper:
                hand = new PaperHand();
                break;
            case Scissors:
                hand = new ScissorsHand();
                break;
            default:
                break;
        }
        return hand;
    }

    public interface Strategy {
        public abstract Hand getHand();
    }

    public abstract class Player {
        protected Strategy strategy;

        public Player(Strategy strategy) {
            this.strategy = strategy;
        }

        public Hand getNextHand() {
            return strategy.getHand();
        }
    }

    public class User extends Player {
        public User() {
            super(new Strategy() {
                @Override
                public Hand getHand() {
                    HandType handtype;
                    try {
                        String input = "";
                        while ( !input.matches("^[1-9]$") ) {
                            // System.out.println("じゃんけんの手を決めてください: [1,2,3: グー] / [4,5,6: チョキ] / [7,8,9: パー]");
                            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                            input = br.readLine();
                        }
                        int r = Integer.parseInt(input);
                        if ( r == 1 || r == 2 || r == 3 ) {
                            handtype = HandType.Rock;
                        } else if ( r == 4 || r == 5 || r == 6 ) {
                            handtype = HandType.Scissors;
                        } else {
                            handtype = HandType.Paper;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        // System.out.println("入力エラーが起きました。じゃんけんの手はグーになります。");
                        handtype = HandType.Rock;
                    }
                    return createHand(handtype);
                }
            });
        }
    }

    public class Computer extends Player {
        public Computer() {
            super(new Strategy() {
                @Override
                public Hand getHand() {
                    HandType handtype;
                    int random = ( (int) ( Math.random() * 10 ) ) % 3;
                    if ( random == 0 ) {
                        handtype = HandType.Rock;
                    } else if ( random == 1 ) {
                        handtype = HandType.Scissors;
                    } else {
                        handtype = HandType.Paper;
                    }
                    return createHand(handtype);
                }
            });
        }
    }
}

LINEで送る
Pocket

コメントを残す

*