質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

4381閲覧

java 人狼ゲームの人数設定

adgjmpt852147

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/08/27 15:05

人狼ゲームを作ってみたのですがプレイヤー人数のところでなやんでいます。人数固定で作ってみたのですが、初めに人数を設定してゲームを始めるみたいな流れで作りたいです。自分で少し改良したりなどはしたんですが投票のほうまで反映されずなやんでいます。どのような形にすればいいでしょうか?
あとできればクラス分けなどもしてみたいのでアドバイスお願いします。

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

class jinro {

public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int[] side = {0,1,2,3,4,5,6};//初期役職。0:怪盗、1,2:人狼、3:占い師、4,5,6:村人 for(int r=0 ; r<side.length ; r++) {//ランダムに配列を変更 int rnd = (int)(Math.random()*(double)side.length); int z = side[r]; side[r] = side[rnd]; side[rnd] = z; } int[]sidek = {side[0],side[1],side[2],side[3],side[4],side[5],side[6]};//怪盗フェイズで使用

//夜の時間
System.out.println("夜になりました。");
for(int i=0; i<5 ; i++) {
System.out.print("番号を教えてください。:");
String str1 = br.readLine();
int num1 = Integer.parseInt(str1);
if(num1-1 == i) {
switch(side[i]) {
case 0://怪盗
System.out.println((i+1) + "番の役職は怪盗です。");

System.out.print("何番と交換しますか?(1~5):"); String str3 = br.readLine(); int num2 = Integer.parseInt(str3); if(0 < num2 && num2 < 6) { sidek[num2-1] = side[i]; sidek[i] = side[num2-1]; switch(sidek[i]) { case 0: System.out.println(num2 + "番と交換し、怪盗になりました。"); break; case 1: case 2: System.out.println(num2 + "番と交換し、人狼になりました。"); break; case 3: System.out.println(num2 + "番と交換し、占い師になりました。"); break; case 4: case 5: case 6: System.out.println(num2 + "番と交換し、村人になりました。"); break; } } else { System.out.println("1~5を入力してください。"); i--; } break; case 1://人狼 case 2: System.out.println((i+1) + "番の役職は人狼です。"); for(int j=0 ; j<5 ; j++) { if(i == j) continue; else if( side[j] == 1 || side[j] == 2 ) { System.out.println("あなたには" + (j+1) + "番の仲間がいます。"); } else { } } break; case 3://占い師 System.out.println((i+1) + "番の役職は占い師です。"); System.out.println("何番を占いますか?(1~5)。"); System.out.print("来ていない人2人を占う場合は(0):"); String str4 = br.readLine(); int num3 = Integer.parseInt(str4); if(num3 == 0) { for(int k=0 ; k<2 ; k++) { switch(side[num3+5]) { case 0: System.out.println("来ない人の役職は怪盗です。"); num3++; break; case 1: case 2: System.out.println("来ない人の役職は人狼です。"); num3++; break; case 3: System.out.println("来ない人の役職は占い師です。"); num3++; break; case 4: case 5: case 6: System.out.println("来ない人の役職は村人です。"); num3++; } } } else if(num3 < 6) { switch(side[num3-1]) { case 0: System.out.println((num3) + "番の役職は怪盗です。"); break; case 1: case 2: System.out.println((num3) + "番の役職は人狼です。"); break; case 3: System.out.println((num3) + "番の役職は占い師です。"); break; case 4: case 5: case 6: System.out.println((num3) + "番の役職は村人です。"); } } else { System.out.println("1~5を入力してください。"); i--; } break; case 4://村人 case 5: case 6: System.out.println((i+1) + "番の役職は村人です。"); System.out.println("特に能力はありません。"); System.out.println("頑張って人狼をあぶりだしてください。"); break; System.out.println("文字を飛ばします。");//画面遷移。入力待ちを利用し、疑似的に遷移。 String str3 = br.readLine(); System.out.println(str3 + "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"); } else { System.out.println("番号が違います。"); i--; } }

//日中の時間
System.out.println("朝になりました。誰に投票するか議論してください。");
System.out.println("終わったら1番から投票してください。");
System.out.println("------------------------------");

//投票行動
int [] vote = {0,0,0,0,0};//投票箱
int [] mem = {0,0,0,0,0};//投票先保持
int max = vote[0];//最大票
int [] win = {0,0,0,0,0};//処刑ルーチン
int w = 1;//勝利判定(2)
int y = 1;//勝利判定(1)

for(int l=0 ; l< vote.length ; l++) { System.out.print((l+1) + "番は投票してください。(1~5):"); String str4 = br.readLine(); int num4 = Integer.parseInt(str4); if(0 < num4 && num4 < 6) { vote[num4-1] += 1; mem[l] = num4; System.out.println(num4+"番に投票しました。"); System.out.println("文字を飛ばします。");//画面遷移。入力待ちを利用し、疑似的に遷移。 String str3 = br.readLine(); System.out.println(str3 + "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"); } else { System.out.println("1~5を入力してください。"); l--; } } for(int m=0 ; m< mem.length ; m++) { System.out.println((m+1) + "番は" + mem[m] + "番に投票しました。"); } System.out.println("------------------------------"); for(int n=0 ; n< vote.length ; n++) { switch(sidek[n]) { case 0: System.out.println((n+1) + "番の役職は怪盗で" + vote[n] + "票獲得しました。"); break; case 1: case 2: System.out.println((n+1) + "番の役職は人狼で"+ vote[n] + "票獲得しました。"); break; case 3: System.out.println((n+1) + "番の役職は占い師で"+ vote[n] + "票獲得しました。"); break; case 4: case 5: case 6: System.out.println((n+1) + "番の役職は村人で"+ vote[n] + "票獲得しました。"); break; case 7: System.out.println((n+1) + "番の役職は狂人で"+ vote[n] +"票獲得しました"); } } System.out.println("------------------------------"); for(int o=0 ; o< vote.length ; o++) {//配列から最大値を見つけ出し、maxに格納 int v = vote[o]; if(v > max) { max = v; } } if(max != 1) {//勝利判定1(全員同数) y--; } else { System.out.println("誰も処刑されませんでした。"); for(int s=0 ; s< vote.length ; s++) { if((sidek[s] == 1) || (sidek[s] == 2)) {//勝利判定1(人狼勝利) System.out.println("人狼の勝利です。"); s += 5; w--; y--; } } } if(y == 1) { System.out.println("村人の勝利です。");//勝利判定1(村人勝利) w--; } if(w == 1) {//勝利判定2(処刑ルーチン) for(int p=0 ; p < vote.length ; p++) {//maxとvote[]が一致した場合、処刑 if(vote[p] == max) { System.out.println((p+1) + "番は処刑されました。"); win[p] += 1; } } } if(w == 1) {//勝利判定2(票数が異なる場合) for(int q=0 ; q< win.length ; q++) {//勝利判定2(村人勝利) if((win[q] == 1 && sidek[q] == 1) || (win[q] ==1 && sidek[q] == 2)) { System.out.println("村人の勝利です。"); q += 5; w--; break; } } } if(w == 1) { System.out.println("人狼の勝利です。");//勝利判定2(人狼勝利) }

}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/08/27 16:02

クラス分けの前にメソッド分けをされた方が良いようにも思います.
guest

回答1

0

既存ロジックはコメントに書いたとおり読む気がしないので

あとできればクラス分けなどもしてみたいのでアドバイスお願いします。

の部分だけ。

とりあえずプレイヤー(名前や役職)と、ゲームの状態(プレイヤーのリストとか、盤面(誰が吊られたとかか噛まれたとか)、何日目のどのアクションを実行中かなど)を管理するクラスにざっくり分けるぐらいから手を付けると思います。

ゲーム開始時にゲームの状態を初期化し、指定された人数分のプレイヤーの登録を行い、初日の夜(お告げとか)のアクションを開始できるようにして、ゲームの進行に合わせて投票などの行動(ユーザーから入力)を行いながらゲームの状態を変化させ、次のアクションへ進むかゲームオーバーか、などの判定をしながらループする感じだと思います。

その中で別クラスに切り出した方が良さそうなものを見つけたら随時クラスを分割していく感じですかね。

高度なゲームにしたいなら、細かいルールなんかもクラスわけしたりするかもしれません。(ゲームの大枠のロジックと、ルールによって変化する細かい処理を実装するクラスを分ける)

投稿2019/08/27 15:23

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問