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

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

ただいまの
回答率

88.10%

java 人狼ゲームの人数設定

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,314

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

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(人狼勝利)
}
}
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • gentaro

    2019/08/28 00:07

    これだけ長いコードで表示が崩れていると読む気が失せるんで
    https://teratail.com/help/question-tips#questionTips3-5-1
    これを参考にして質問文を編集し、コードを見やすくされては。

    キャンセル

  • jimbe

    2019/08/28 01:02

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

    キャンセル

回答 1

-1

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

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

の部分だけ。

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る