随時追加
チェックリスト**:**
- Q1. ゲーム設計
- Q2. 通信設計
- Q3. GUI設計
🚀 以上!
... ほかの詳細資料など、自由にリンクやコンテンツを追加しましょう。 ヒット&ブローです
上の三個は、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");
}
}
}