💭 概要

👀 課題

随時追加



🛫 計画

チェックリスト**:**

🚀 以上!

... ほかの詳細資料など、自由にリンクやコンテンツを追加しましょう。 ヒット&ブローです

上の三個は、CLI

import java.util.*;

/**
 * ヒット&ブローゲームのロジックを管理するクラス
 */
public class HitAndBlowGame {
    private int[] answer;

    /**
     * コンストラクタ:ゲーム開始時に答えを生成する
     */
    public HitAndBlowGame() {
        this.answer = generateAnswer();
    }

    /**
     * 0から5までの数字を使って、4桁のランダムな答えを生成する
     * 
     * @return 生成された4桁の答え
     */
    private int[] generateAnswer() {
        List<Integer> numbers = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5));
        Collections.shuffle(numbers);
        int[] answer = new int[4];
        for (int i = 0; i < 4; i++) {
            answer[i] = numbers.get(i);
        }
        return answer;
    }

    /**
     * 予想された数字と答えを比較し、ヒットとブローの数を計算する
     * 
     * @param guess 予想された4桁の数字
     * @return ヒットとブローの数を含む配列 [hit, blow]
     */
    public int[] calculateHitAndBlow(int[] guess) {
        int hit = 0, blow = 0;
        for (int i = 0; i < 4; i++) {
            if (guess[i] == answer[i]) {
                hit++;
            } else {
                for (int j = 0; j < 4; j++) {
                    if (guess[i] == answer[j]) {
                        blow++;
                        break;
                    }
                }
            }
        }
        return new int[] { hit, blow };
    }

    /**
     * 文字列を整数配列に変換する
     * 
     * @param s 変換する文字列
     * @return 変換された整数配列
     */
    public static int[] stringToIntArray(String s) {
        int[] result = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            result[i] = Character.getNumericValue(s.charAt(i));
        }
        return result;
    }

    /**
     * 入力された予想が有効かどうかをチェックする
     * 
     * @param guess チェックする予想
     * @return 有効な予想の場合はtrue、そうでない場合はfalse
     */
    public static boolean isValidGuess(String guess) {
        if (guess.length() != 4)
            return false;
        Set<Character> set = new HashSet<>();
        for (char c : guess.toCharArray()) {
            if (c < '0' || c > '5' || !set.add(c))
                return false;
        }
        return true;
    }
}

import java.io.*;
import java.net.*;

public class HitAndBlowServer2 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(5000);
            System.out.println("サーバーが起動しました。ポート5000で待機中...");

            while (true) {
                Socket clientSocket1 = null;
                Socket clientSocket2 = null;
                PrintWriter out1 = null;
                PrintWriter out2 = null;
                BufferedReader in1 = null;
                BufferedReader in2 = null;
                try {
                    // 2つのクライアント接続を待機
                    System.out.println("プレイヤー1の接続を待っています...");
                    clientSocket1 = serverSocket.accept();
                    out1 = new PrintWriter(clientSocket1.getOutputStream(), true);
                    in1 = new BufferedReader(new InputStreamReader(clientSocket1.getInputStream()));
                    System.out.println("プレイヤー1が接続しました。");

                    System.out.println("プレイヤー2の接続を待っています...");
                    clientSocket2 = serverSocket.accept();
                    out2 = new PrintWriter(clientSocket2.getOutputStream(), true);
                    in2 = new BufferedReader(new InputStreamReader(clientSocket2.getInputStream()));
                    System.out.println("プレイヤー2が接続しました。");

                    // 新しいゲームを開始
                    HitAndBlowGame game = new HitAndBlowGame();

                    // プレイヤーに役割を通知
                    out1.println("YOU_ARE_PLAYER1");
                    out2.println("YOU_ARE_PLAYER2");

                    System.out.println("ゲームを開始します。");

                    String guess;
                    boolean isPlayer1Turn = true;
                    while (true) {
                        if (isPlayer1Turn) {
                            out1.println("YOUR_TURN");
                            guess = in1.readLine();
                            System.out.println("プレイヤー1の予想: " + guess);
                            if (guess.equals("QUIT")) break;
                            processGuess(game, guess, out1, out2);
                        } else {
                            out2.println("YOUR_TURN");
                            guess = in2.readLine();
                            System.out.println("プレイヤー2の予想: " + guess);
                            if (guess.equals("QUIT")) break;
                            processGuess(game, guess, out2, out1);
                        }
                        isPlayer1Turn = !isPlayer1Turn;
                    }
                } catch (IOException e) {
                    System.out.println("クライアント接続でエラーが発生しました: " + e.getMessage());
                } finally {
                    // 接続をクローズ
                    try {
                        if (out1 != null) out1.close();
                        if (out2 != null) out2.close();
                        if (in1 != null) in1.close();
                        if (in2 != null) in2.close();
                        if (clientSocket1 != null) clientSocket1.close();
                        if (clientSocket2 != null) clientSocket2.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        } catch (IOException e) {
            System.out.println("サーバーの起動に失敗しました: " + e.getMessage());
        } finally {
            try {
                if (serverSocket != null) serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void processGuess(HitAndBlowGame game, String guessStr, PrintWriter currentPlayer, PrintWriter otherPlayer) {
        int[] guess = HitAndBlowGame.stringToIntArray(guessStr);
        int[] result = game.calculateHitAndBlow(guess);
        String resultStr = result[0] + "," + result[1];
        currentPlayer.println(resultStr);
        otherPlayer.println("OTHER_PLAYER_GUESSED," + guessStr + "," + resultStr);
        if (result[0] == 4) {
            currentPlayer.println("YOU_WIN");
            otherPlayer.println("YOU_LOSE");
        }
    }
}