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

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

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

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

Q&A

解決済

1回答

1659閲覧

条件式が長くなってしまうため短くしたい

lop000p

総合スコア29

Java

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

0グッド

1クリップ

投稿2021/11/02 11:30

java

1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.Scanner; 4 5public class main { 6 public static void main(String[] args) { 7 ArrayList<String> fruitsPictorialPatternString = new ArrayList<String>(); 8 fruitsPictorialPatternString = new ArrayList<>(Arrays.asList("スイカ", "バナナ", "ブドウ", "ミカン", "イチゴ", "パイナップル", "リンゴ", 9 "トマト", "ピーチ", "かぼちゃ", "チェリー", "セブン", "スターバー", "ベル", "コイン", "おばけ")); 10 ArrayList<String> fruitsPictorialPatternPic = new ArrayList<String>(); 11 fruitsPictorialPatternPic = new ArrayList<>(Arrays.asList("????", "????", "????", "????", "????", "????", "????", "????", "????", 12 "????", "????", "➐", "★", "????", "????", "????")); 13 System.out.println("メダルを入れて下さい。<所有メダル数 30枚>"); 14 15 int numberOfMedalsOwned = 30; 16 while (true) { 17 System.out.println("Press Enter."); 18 Scanner scanner = new Scanner(System.in); 19 scanner.nextLine(); 20 int targetIndex01 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 21 int targetIndex02 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 22 int targetIndex03 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 23 System.out.println(fruitsPictorialPatternPic.get(targetIndex01) + "" + "" + "" + "" + "|" 24 + fruitsPictorialPatternPic.get(targetIndex02) + "" + "" + "" + "" + "|" 25 + fruitsPictorialPatternPic.get(targetIndex03)); 26 int targetIndex04 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 27 int targetIndex05 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 28 int targetIndex06 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 29 System.out.println(fruitsPictorialPatternPic.get(targetIndex04) + "" + "" + "" + "|" 30 + fruitsPictorialPatternPic.get(targetIndex05) + "" + "" + "" + "" + "|" 31 + fruitsPictorialPatternPic.get(targetIndex06)); 32 int targetIndex07 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 33 int targetIndex08 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 34 int targetIndex09 = (int) (Math.random() * fruitsPictorialPatternPic.size()); 35 System.out.println(fruitsPictorialPatternPic.get(targetIndex07) + "" + "" + "" + "" + "|" 36 + fruitsPictorialPatternPic.get(targetIndex08) + "" + "" + "" + "" + "|" 37 + fruitsPictorialPatternPic.get(targetIndex09)); 38 if (targetIndex04 == 15 && targetIndex05 == 15 && targetIndex06 == 15) { 39 System.out.println(fruitsPictorialPatternString.get(15) + "が3つ並びました。10枚出てきました。"); 40 numberOfMedalsOwned += 10; 41 System.out.println("<所有メダル数" + numberOfMedalsOwned + "枚>"); 42 } else if (targetIndex04 == 10) { 43 System.out.println(fruitsPictorialPatternString.get(targetIndex09) + "が出ました。3枚出てきました。"); 44 numberOfMedalsOwned += 3; 45 System.out.println("<所有メダル数" + numberOfMedalsOwned + "枚>"); 46 //当たりを上段・真ん中・下段・右斜め・左斜めで判定したい 47 } else if(targetIndex01 == 1 && targetIndex02 == 1 && targetIndex03 == 1){ 48 System.out.println("外れです。"); 49 numberOfMedalsOwned --; 50 System.out.println("<所有メダル数" + numberOfMedalsOwned + "枚>"); 51 }else { 52 System.out.println("外れです。"); 53 numberOfMedalsOwned --; 54 System.out.println("<所有メダル数" + numberOfMedalsOwned + "枚>"); 55 56 if (numberOfMedalsOwned == 0) { 57 System.out.println("終了です。"); 58 System.exit(0); 59 } else if (numberOfMedalsOwned == 100) { 60 System.out.println("<所有メダル数" + numberOfMedalsOwned + "枚>"); 61 System.out.println("おめでとうございます!景品がもらえます。"); 62 System.exit(0); 63 } 64 } 65 66 } 67 } 68} 69

実装したいこと
当たりを上段・下段・右斜め・左斜めで判定する。
123
456
789
パターンは123・789.159・357が上段・下段・右斜め・左斜めに該当する。
絵柄がfruitsPictorialPatternPic 分条件式を書くとかなり長い条件式になってしまうため、
パターンの上段・下段・右斜め・左斜めが同じ柄だった場合としたい。
targetIndex01 == 0 && targetIndex02 == 0 && targetIndex03 == 0
targetIndex01 == 1 && targetIndex02 == 1 && targetIndex03 == 1




targetIndex01 == 9 && targetIndex02 == 9 && targetIndex03 == 9
もしtargetIndexが1つしかない場合、それを指定できるが今回targetIndex09 まであるため01から09まで指定するとコードが
ながくなってしまうので、この方法を避けて
コードを簡潔に書く方法を考えているのですが、わからず教えていただきたいです。

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

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

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

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

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

int32_t

2021/11/02 13:08

10番目から15番目までの柄が揃っても当たりにはしないのですか?
jimbe

2021/11/02 15:14

kazuma-s さんが回答されていますが、変数名に番号を付けた時点で「これは配列に出来るのでは…」と気付いて頂きたい所です。
lop000p

2021/11/03 04:57

10番目から15番目まで>すみません、条件見落としてました。。。 追加いたします。 そうなのですね、、配列とリストがほぼ同じとしか認識できておりませんでした。。。
guest

回答1

0

ベストアンサー

new Scanner(System.in) をループの中で実行してはいけません。

変数を配列にすればよいのではありませんか?

java

1import java.util.Scanner; 2 3class main { 4 public static void main(String[] args) { 5 String[] name = { 6 "スイカ", "バナナ", "ブドウ", "ミカン", "イチゴ", "パイナップル", 7 "リンゴ", "トマト", "ピーチ", "かぼちゃ", "チェリー", "セブン", 8 "スターバー", "ベル", "コイン", "おばけ" 9 }; 10 String[] pic = { 11 "WM", "BA", "GR", "OR", "SB", "PA", "AP", "TO", 12 "PE", "PK", "CH", "SE", "★", "BL", "CO", "GS" 13 }; 14 int nm = 30; // number of medals owned 15 Scanner scanner = new Scanner(System.in); 16 17 System.out.println("メダルを入れて下さい。<所有メダル数 " + nm + "枚>"); 18 while (true) { 19 System.out.println("Press Enter."); 20 scanner.nextLine(); 21 int[] ti = new int[9]; // target index 22 for (int i = 0; i < 9; i++) 23 ti[i] = (int) (Math.random() * pic.length); 24 for (int i = 0; i < 9; i += 3) 25 System.out.println(pic[ti[i]] + "|" 26 + pic[ti[i+1]] + "|" + pic[ti[i+2]]); 27 if (ti[3] == 15 && ti[4] == 15 && ti[5] == 15) { 28 System.out.println(name[15] + "が3つ並びました。10枚出てきました。"); 29 nm += 10; 30 System.out.println("<所有メダル数" + nm + "枚>"); 31 } else if (ti[0] == ti[1] && ti[1] == ti[2] || // 上段 32 ti[6] == ti[7] && ti[7] == ti[8] || // 下段 33 ti[0] == ti[4] && ti[4] == ti[8] || // 右斜め 34 ti[2] == ti[4] && ti[4] == ti[6]) { // 左斜め 35 System.out.println("上段、下段、斜めが揃いました。3枚出てきました。"); 36 nm += 3; 37 System.out.println("<所有メダル数" + nm + "枚>"); 38 } else { 39 System.out.println("外れです。"); 40 nm --; 41 System.out.println("<所有メダル数" + nm + "枚>"); 42 } 43 if (nm == 0) { 44 System.out.println("終了です。"); 45 break; 46 } else if (nm >= 100) { 47 System.out.println("<所有メダル数" + nm + "枚>"); 48 System.out.println("おめでとうございます!景品がもらえます。"); 49 break; 50 } 51 } 52 } 53}

投稿2021/11/02 14:06

kazuma-s

総合スコア8224

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

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

lop000p

2021/11/03 04:29 編集

ご教授頂きありがとうございます。配列とリストはほぼできることは同じと考えていたのですが、配列でこんなやり方ができるとは思いませんでした。 1点配列の動きで不明点がありまして、おききしたいのですが、 for (int i = 0; i < 9; i += 3) iに+= 3をされておりますが、この+= 3とした場合、 for (int i = 0; i < 9;+= 3) ti[i] = (int) (Math.random() * pic.length); Math.random()で生成されたインデックスとコンソールに出力された 文字は一致が確認できました。 値の一致は確認できたのですが、なぜ+= 3とした場合、値がforでループさせた値と一致できたのかわかりません。 for (int i = 0; i < 9; i ++) i ++とした場合、コンソールに出力された値は for (int i = 0; i < 9; i++) ti[i] = (int) (Math.random() * pic.length); で生成されたインデックス番号  [0][1][2][3][4][5][6][7][8] [7][5][2][1][2][0][6][0][1] i ++としてコンソール出力された値 [7][5][2][5][2][1][2][1][2][1][2][0][2][0][5][0][5][0][5][0][1]Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9 at main.main(furupara_hairetsu.java:26) 752|521|212 120❘205❘050 501|.... i++とした場合一部一致して一部一致が確認できなく、配列の動きが不明なのですが、 どうして  +=3 とされたのか教えていただけないでしょうか?
jimbe

2021/11/03 04:49 編集

ご本人で無くてすいません。 その for ループは、ti を 3 つずつ 3 段表示するためのループです。 ですのでループ自体は 3 回でなければなりません。 一方、 ループのカウンタ i は、ループ内での処理の関係上、 0・3・6 と変化する必要があります。 その為に "i を 0 から 9 まで 3 ずつ加算する" ループとなっています。
lop000p

2021/11/03 04:55

>ti を 3 つずつ 3 段表示するためのループ jimbeさん、ご教授頂きましてありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問