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

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

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

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

Q&A

解決済

1回答

3294閲覧

Java言語による簡易スロットゲーム

Chandler_Bing

総合スコア673

Java

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

0グッド

0クリップ

投稿2019/01/15 12:31

編集2019/01/16 09:19

以下のコードい対する私の理解の確認と疑問点への回答をお願いします。

理解確認❶(実行しスタートボタンのみ押した場合の一番は初めの変化)
ArrayListのslotに入っている画像とintの配列変数iCountは以下のように変化する

slot(インデックス0)slot.jpg1→slot3.jpg
slot(インデックス1)slot.jpg3→slot5.jpg
slot(インデックス2)slot.jpg5→slot7.jpg

iCount{1,3,5}→iCount{2,4,6}

理解確認❷(❶のあとストップボタンを押さなかった場合)
slotの画像、iCount共に1づつ増えていく。

自分でも確認しましたが、理解はあっておりますでしょうか。

疑問点❶
switch文の中の

case THREE:
timer.stop();
if (iCount[0] == iCount[1] && iCount[1] == iCount[2]) {
if (iCount[0] == MAX - 1)
lbel.setText("やった!!最高得点だ");
else
lbel.setText("やった!!おめでとう");
} else

ですがなぜif (iCount[0] == MAX - 1)をするのでしょうか。
7が三つ揃えばlbel.setText("やった!!最高得点だ");表示されますが、なぜ配列の1番目が6であれば良いのでしょうか。

Java

1package week11; 2 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5import java.util.ArrayList; 6 7import javax.swing.ImageIcon; 8import javax.swing.JButton; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JPanel; 12import javax.swing.Timer; 13 14enum Stop { 15 ONE, TWO, THREE 16} 17 18public class ThreeSlot extends JFrame implements ActionListener { 19 20 private static final long serialVersionUID = 1L; 21 22 final int MAX = 7; 23 Stop iStopCount = Stop.ONE; 24 int[] iCount = { 1, 3, 5 }; 25 ArrayList<ImageIcon> SlotImage = new ArrayList<ImageIcon>(); 26 ArrayList<JLabel> slot = new ArrayList<JLabel>(); 27 Timer timer; 28 JButton[] bt; 29 JLabel lbel = new JLabel("スタートで始まるよ", JLabel.CENTER); 30 31 JPanel init_Button(String... args) { 32 JPanel p = new JPanel(); 33 bt = new JButton[args.length]; 34 for (int i = 0; i < args.length; i++) { 35 bt[i] = new JButton(args[i]); 36 bt[i].setEnabled(false); 37 bt[i].addActionListener(this); 38 p.add(bt[i]); 39 } 40 return p; 41 } 42 43 ThreeSlot(String title) { 44 super(title); 45 timer = new Timer(300, this); 46 timer.setActionCommand("timer"); 47 setBounds(200, 200, 230, 150); 48 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 49 add("North", lbel); 50 for (int k = 1; k <= MAX; k++) 51 SlotImage.add(new ImageIcon("src/" + "Slot" + k + ".jpg")); 52 slot.add(new JLabel(SlotImage.get(0))); 53 slot.add(new JLabel(SlotImage.get(2))); 54 slot.add(new JLabel(SlotImage.get(4))); 55 JPanel p = new JPanel(); 56 for (JLabel l : slot) 57 p.add(l); 58 add("Center", p); 59 add("South", init_Button("スタート", "ストップ")); 60 bt[0].setEnabled(true); 61 setVisible(true); 62 } 63 64 public static void main(String[] args) { 65 new ThreeSlot("スロットマシン"); 66 } 67 68 public void actionPerformed(ActionEvent e) { 69 String cmd = e.getActionCommand(); 70 if (cmd.equals("timer")) { 71 int i = 0; 72 if (iStopCount == Stop.TWO) 73 i = 1; 74 else if (iStopCount == Stop.THREE) 75 i = 2; 76 for (; i < iCount.length; i++) { 77 if (++iCount[i] == MAX) 78 iCount[i] = 0; 79 slot.get(i).setIcon(SlotImage.get(iCount[i])); 80 } 81 } 82 if (e.getSource() == bt[0]) { 83 timer.start(); 84 lbel.setText("ストップで数字を揃えよう"); 85 bt[0].setEnabled(false); 86 bt[1].setEnabled(true); 87 } else if (e.getSource() == bt[1]) { 88 switch (iStopCount) { 89 case ONE: 90 lbel.setText("2つ目も" + (iCount[0] + 1) + "で止めよう"); 91 iStopCount = Stop.TWO; 92 break; 93 case TWO: 94 lbel.setText("ストップで全部止まるよ"); 95 if (iCount[0] == iCount[1]) 96 lbel.setText("リーチだ"); 97 iStopCount = Stop.THREE; 98 break; 99 case THREE: 100 timer.stop(); 101 if (iCount[0] == iCount[1] && iCount[1] == iCount[2]) { 102 if (iCount[0] == MAX - 1) 103 lbel.setText("やった!!最高得点だ"); 104 else 105 lbel.setText("やった!!おめでとう"); 106 } else 107 lbel.setText("残念でした"); 108 iStopCount = Stop.ONE; 109 bt[0].setEnabled(true); 110 bt[1].setEnabled(false); 111 } 112 } 113 } 114}

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

各リールのインデックスはここで初期化されています。

Java

1int[] iCount = { 1, 3, 5 };

1番目、3番目、5番目ですね。

最初の画像はここで設定されています。

Java

1slot.add(new JLabel(SlotImage.get(0))); 2slot.add(new JLabel(SlotImage.get(2))); 3slot.add(new JLabel(SlotImage.get(4)));

0番目、2番目、4番目ですね。

画像が変わる処理はここで設定されているように

Java

1for (; i < iCount.length; i++) { 2 if (++iCount[i] == MAX) 3 iCount[i] = 0; 4 slot.get(i).setIcon(SlotImage.get(iCount[i]));//質問です 5}

各リール毎にインデックスが+1されてから画像を設定し直しています。

一番左の画像は0番目が設定されていました。
一番左のインデックスは 1 から 2 に変わります。
一番左の画像は0番目から2番目に設定されます。

なので、最初だけ0番目から2番目の画像に一気に変わります。


理解確認❶(実行しスタートボタンのみ押した場合の一番は初めの変化)

ArrayListのslotに入っている画像とintの配列変数iCountは以下のように変化する

slot(インデックス0)slot.jpg1→slot3.jpg

slot(インデックス1)slot.jpg3→slot5.jpg
slot(インデックス2)slot.jpg5→slot7.jpg

iCount{1,3,5}→iCount{2,4,6}

理解確認❷(❶のあとストップボタンを押さなかった場合)

slotの画像、iCount共に1づつ増えていく。

自分でも確認しましたが、理解はあっておりますでしょうか。

どちらも動きの理解は合っているかと思います。

疑問点❶

switch文の中の

case THREE:

timer.stop();
if (iCount[0] == iCount[1] && iCount[1] == iCount[2]) {
if (iCount[0] == MAX - 1)
lbel.setText("やった!!最高得点だ");
else
lbel.setText("やった!!おめでとう");
} else

ですがなぜif (iCount[0] == MAX - 1)をするのでしょうか。

7が三つ揃えばlbel.setText("やった!!最高得点だ");表示されますが、なぜ配列の1番目が6であれば良いのでしょうか。

iCountの各要素はインデックスを表します。
インデックスは0から始まりますので、最大値は6です。
対してMAXはインデックスではなく数え値を表しているので、それをインデックスに合わせたということかと思います。

投稿2019/01/15 13:18

編集2019/01/16 09:29
dice142

総合スコア5158

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

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

Chandler_Bing

2019/01/16 09:19 編集

お疲れ様です。大分クリアになりましたが、まだ少し疑問がありますので回答よろしくお願いします。
dice142

2019/01/16 09:29

回答に追記しました。
Chandler_Bing

2019/01/16 09:35

大変為になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問