Let's try programming

自動販売機アプリ

  • HOME »
  • 自動販売機アプリ
今回は、Java言語で自動販売機のようなものを作りました。
アプリ名は『クイズ販売機くん』です。
普通の自販機を作っても面白くないので販売機がクイズ(おつかい)を出してその通りにジュースを買うとお礼を言ってもらえるアプリにしました。
完成画像がこちらになります。
 

hanbai2

 

 

 

 

hanbai1ファイル構成は、左図のとおり。
1,Mainファイル
2,Appearanceファイル
3,MyListenerファイル
4,Soundファイル
 
ライブラリーに使用したイメージ画像と音楽ファイルをインポートしてます。
今回素材を使わせて頂いた
・趣味イラ様
・ビジソザ様
・Music is VFR様
有難う御座いました。
 
それでは各ファイルのコード説明をしていきます。
 

Main.java

Mainファイルの中身は Appearanceクラスを new してるだけです。
new する事で Appearanceクラスのコンストラクタが呼び出されるので処理がそちらに移動させます。

package machine;

public class Main {
 public static void main(String[] args) {
  new Appearance();
  }
 }

 

Appearance.java

Appearanceクラスは主に自動販売機の外観を作るファイルになっています。
Mainファイルで new された AppearanceクラスのコンストラクタAppearance(){}の中身が自動販売機の外観を作りあげています。
そして各ボタンにActionListenerを設定してボタンが押されたら MyListenerクラスで押されたボタンの処理を行います。
new JLabelの引数にimageを生成すればもう少しコードがまとまりますが、今回は分けました。
 

package machine;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Appearance extends JFrame {
 private static final long serialVersionUID = 1L;
 // フィールドにボタン宣言
  static JButton B_mugicha;
  static JButton B_grape;
  static JButton B_orenge;
  static JButton B_yasai;
  static JButton B_coffee;
  static JButton B_water;
  static JButton B_houjicha;
  static JButton B_ryokucha;
  static JButton B_tea;
  static JButton B_remon;
  static JButton B_oshiruko;
  static JButton B_soup;
  // 硬貨と返却ボタン宣言
  static JButton hundred_btn;
  static JButton ten_btn;
  static JButton reverse;
  // 開始・終了・次へボタン宣言
  static JButton start_btn;
  static JButton end_btn;
  static JButton next_btn;
 // ラベル宣言
  static JLabel coin;
  static JLabel mission;
  static JLabel mission2;

 // コンストラクタ
 Appearance(){
 // ラベル生成
 coin  = new JLabel(“0“);
 mission = new JLabel(“ようこそ。クイズ販売機へ“);
 mission2 = new JLabel(“おつかいクイズをはじめますか?“);

 // ラベルの属性設定
 coin.setFont(new Font(“MS ゴシック“,Font.BOLD,15));
 coin.setOpaque(true);
 coin.setForeground(Color.ORANGE);
 coin.setBackground(Color.BLACK);
 coin.setHorizontalAlignment(JLabel.CENTER);
 coin.setPreferredSize(new Dimension(60, 30));
 mission.setFont(new Font(“メイリオ“, Font.BOLD, 16));
 mission.setForeground(Color.RED);
 mission2.setFont(new Font(“メイリオ“, Font.BOLD, 14));

 // レイアウト設定
 setLayout(new FlowLayout());

 // イメージアイコン設定
 ImageIcon mugicha = new ImageIcon(“mugicha.png“);
 ImageIcon  grape= new ImageIcon(“grape.png“);
 ImageIcon  orenge= new ImageIcon(“orenge.png“);
 ImageIcon  yasai= new ImageIcon(“yasai.png“);
 ImageIcon  coffee= new ImageIcon(“coffee.png“);
 ImageIcon  water= new ImageIcon(“water.png“);
 ImageIcon  houjicha= new ImageIcon(“houjicha.png“);
 ImageIcon  ryokucha= new ImageIcon(“ryokucha.png“);
 ImageIcon  tea= new ImageIcon(“tea.png“);
 ImageIcon  remon= new ImageIcon(“remon.png“);
 ImageIcon oshiruko = new ImageIcon(“oshiruko.png“);
 ImageIcon  soup= new ImageIcon(“soup.png“);

 ImageIcon hundred = new ImageIcon(“100en.png“);
 ImageIcon ten = new ImageIcon(“10en.png“);
 ImageIcon rever = new ImageIcon(“reverse.png“);

 // ラベルにイメージを設定
 JLabel L_mugicha = new JLabel(mugicha);
 JLabel L_grape = new JLabel(grape);
 JLabel L_orenge = new JLabel(orenge);
 JLabel L_yasai = new JLabel(yasai);
 JLabel L_coffee = new JLabel(coffee);
 JLabel L_water = new JLabel(water);
 JLabel L_houjicha = new JLabel(houjicha);
 JLabel L_ryokucha = new JLabel(ryokucha);
 JLabel L_tea = new JLabel(tea);
 JLabel L_remon = new JLabel(remon);
 JLabel L_oshiruko = new JLabel(oshiruko);
 JLabel L_soup = new JLabel(soup);

 // ボタン生成とアクションリスナーを設定
 B_mugicha  = new JButton(“ 110 “);
 B_mugicha.addActionListener(new MyListener());
 B_mugicha.setEnabled(false);
 B_grape   = new JButton(” 110 “);
 B_grape.addActionListener(new MyListener());
 B_grape.setEnabled(false);
 B_orenge  = new JButton(” 120 “);
 B_orenge.addActionListener(new MyListener());
 B_orenge.setEnabled(false);
 B_yasai  = new JButton(” 120 “);
 B_yasai.addActionListener(new MyListener());
 B_yasai.setEnabled(false);
 B_coffee   = new JButton(” 130 “);
 B_coffee.addActionListener(new MyListener());
 B_coffee.setEnabled(false);
 B_water   = new JButton(“ 130 “);
 B_water.addActionListener(new MyListener());
 B_water.setEnabled(false);
 B_houjicha   = new JButton(“ 110 “);
 B_houjicha.addActionListener(new MyListener());
 B_houjicha.setEnabled(false);
 B_ryokucha   = new JButton(“ 110 “);
 B_ryokucha.addActionListener(new MyListener());
 B_ryokucha.setEnabled(false);
 B_tea   = new JButton(” 120 “);
 B_tea.addActionListener(new MyListener());
 B_tea.setEnabled(false);
 B_remon   = new JButton(” 120 “);
 B_remon.addActionListener(new MyListener());
 B_remon.setEnabled(false);
 B_oshiruko   = new JButton(” 130 “);
 B_oshiruko.addActionListener(new MyListener());
 B_oshiruko.setEnabled(false);
 B_soup   = new JButton(” 130 “);
 B_soup.addActionListener(new MyListener());
 B_soup.setEnabled(false);

 start_btn = new JButton(“次へ“);
 start_btn.addActionListener(new MyListener());

 end_btn = new JButton(“帰る“);
 end_btn.addActionListener(new MyListener());

 next_btn = new JButton(“ok!“);
 next_btn.addActionListener(new MyListener());

 hundred_btn = new JButton(hundred);
 hundred_btn.addActionListener(new MyListener());
 hundred_btn.setPreferredSize(new Dimension(40, 25));

 ten_btn = new JButton(ten);
 ten_btn.addActionListener(new MyListener());
 ten_btn.setPreferredSize(new Dimension(40,25));

 reverse = new JButton(rever);
 reverse.addActionListener(new MyListener());
 reverse.setPreferredSize(new Dimension(75,25));

 // パネル生成
 JPanel panel0 = new JPanel();
 panel0.setPreferredSize(new Dimension(600, 33));
 JPanel panel1 = new JPanel();
 panel1.setBackground(Color.BLACK);
 JPanel panel2 = new JPanel();
 panel2.setBackground(Color.BLACK);
 JPanel panel3 = new JPanel();
 panel3.setBackground(Color.BLACK);
 JPanel panel4 = new JPanel();
 panel4.setBackground(Color.BLACK);
 JPanel panel5 = new JPanel();
 panel5.setPreferredSize(new Dimension(500, 50));
 JPanel panel6 = new JPanel();
 panel6.setPreferredSize(new Dimension(500, 50));
 JPanel panel7 = new JPanel();

 // オブジェクトを階層ごとにパネルに分ける
 panel0.add(coin);
 panel0.add(hundred_btn);
 panel0.add(ten_btn);
 panel0.add(reverse);

 panel1.add(L_mugicha);
 panel1.add(L_grape);
 panel1.add(L_orenge);
 panel1.add(L_yasai);
 panel1.add(L_coffee);
 panel1.add(L_water);

 panel2.add(L_houjicha);
 panel2.add(L_ryokucha);
 panel2.add(L_tea);
 panel2.add(L_remon);
 panel2.add(L_oshiruko);
 panel2.add(L_soup);

 panel3.add(B_mugicha);
 panel3.add(B_grape);
 panel3.add(B_orenge);
 panel3.add(B_yasai);
 panel3.add(B_coffee);
 panel3.add(B_water);

 panel4.add(B_houjicha);
 panel4.add(B_ryokucha);
 panel4.add(B_tea);
 panel4.add(B_remon);
 panel4.add(B_oshiruko);
 panel4.add(B_soup);

 panel5.add(mission);
 panel6.add(mission2,BorderLayout.CENTER);
 panel6.add(next_btn,BorderLayout.SOUTH);
 // 初期ボタンを無効に設定
 next_btn.setEnabled(false);

 panel7.add(start_btn);
 panel7.add(end_btn);
 //パネルをフレームにはめ込む
 add(panel0);
 add(panel1);
 add(panel3);    // レイアウト上の理由でpanel2,3を逆にしている
 add(panel2);
 add(panel4);
 add(panel5);
 add(panel6);
 add(panel7);

// ウィンドウ設定
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 this.setTitle(“クイズ販売機くん“);

 this.setBounds(300, 0, 410, 550);
 this.setResizable(false);
 this.setVisible(true);
 }
}

MyListener.java

こちらは主にボタン押下時の処理とクイズ処理を制御しています。
メインプログラムですね。
ボタンに関してAppearanceファイルで設定したボタンが押されるとこちらに呼び出されて処理されます。
クイズの正誤判別法に関しては、他のジュースとCODEがかぶらないように 各ジュースに素数をコードに設定し掛け算の合計値で正誤判定を行っています。
もっと良い方法があれば教えて下さい(*´ェ`*)

package machine;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JButton;

public class MyListener implements ActionListener {
 static int money = 0;               // 初期金額
 static int CODE = 1;               // 問題の正誤に使用
 int ques_count = 0;                // 問題の配列添字として利用
 int total_count = 4;                 // 全問題数
 int count = 1;                          // 現在の問題数
 String MONEY;                      // マネー表示
 String[] q;                               // ファイルの問題を格納する変数

 @Override
 public void actionPerformed(ActionEvent e) {
  // **************************自動販売機ボタン処理**************************************
  JButton btn = (JButton) e.getSource();
  if (btn == Appearance.hundred_btn) {
   money += 100;
   MONEY = String.valueOf(money);
   Appearance.coin.setText(MONEY);
   Sound.playSound2();
  }
  if (btn == Appearance.ten_btn) {
   money += 10;
   MONEY = String.valueOf(money);
   Appearance.coin.setText(MONEY);
   Sound.playSound2();
  }
  if (btn == Appearance.reverse) {
   money = 0;
   MONEY = String.valueOf(money);
   Appearance.coin.setText(MONEY);
   Sound.playSound3();

  }
  if (btn == Appearance.B_mugicha) {
   B_mugicha();
  }
  if (btn == Appearance.B_grape) {
   B_grape();
  }
  if (btn == Appearance.B_orenge) {
   B_orenge();
  }
  if (btn == Appearance.B_yasai) {
   B_yasai();
  }
  if (btn == Appearance.B_coffee) {
   B_coffee();
  }
  if (btn == Appearance.B_water) {
   B_water();
  }
  if (btn == Appearance.B_houjicha) {
   B_houjicha();
  }
  if (btn == Appearance.B_ryokucha) {
   B_ryokucha();
  }
  if (btn == Appearance.B_remon) {
   B_remon();
  }
  if (btn == Appearance.B_tea) {
   B_tea();
  }
  if (btn == Appearance.B_remon) {
   B_remon();
  }
  if (btn == Appearance.B_oshiruko) {
   B_oshiruko();
  }
  if (btn == Appearance.B_soup) {
   B_soup();
  }
  // *******************************開始ボタン処理*********************************
  if (btn == Appearance.start_btn) {
   Sound.playSound7();
   Appearance.start_btn.setEnabled(false);
   buttonOn();
   CODE = 1;
   Appearance.next_btn.setEnabled(true);
   Appearance.mission.setText(“おつかい“);
   // テキスト問題の読み込み処理
   try {
    File question = new File(
      “C:\\Program Files\\pleiades\\workspace\\VendingMachine\\src\\machine\\question.txt“);
    BufferedReader br = new BufferedReader(new FileReader(question));
    String str;
    while ((str = br.readLine()) != null) {
     // “,”で区切り問題を分割して配列型Stringの q に格納する
     this.q = str.split(“,”, 0);
     // 格納した配列順にラベルに表示添字は ques_count を使用
     Appearance.mission2.setText(q[ques_count]);
     Appearance.mission2.setForeground(Color.BLACK);
     Appearance.start_btn.setEnabled(false);
     Appearance.next_btn.setEnabled(true);
     this.ques_count += 1;
     // BufferedReader を閉じる処理
     br.close();
    }
    // 例外処理。ファイルを扱う場合、例外処理をしないとエラーになり実行できない
   } catch (FileNotFoundException e1) {
    System.out.println(“ファイルが見つかりません”);
   } catch (IOException e1) {
    System.out.println(“ファイルがありません”);
   }
   // アプリ終了処理
  } else if (btn == Appearance.end_btn) {
   System.exit(0);
  }
  // ******************************次へボタン処理******************************
  if (btn == Appearance.next_btn) {
   buttonOff();
   Appearance.start_btn.setEnabled(true);
   switch (count) {
   case 1:
    if (CODE == 2) {
     correct();
    } else {
     incorrect();
    }
    break;
   case 2:
    if (CODE == 121) {
     correct();
 } else {
    incorrect();
    }
    break;
   case 3:
    if (CODE == 589) {
     correct();
    } else {
     incorrect();
    }
    break;
   }
   // *****************************おつかい終了処理****************************************
   if (count == total_count) {
    Appearance.mission2.setText(“おつかい終わりです。お疲れ様“);
    Appearance.mission2.setForeground(Color.BLACK);
    Appearance.start_btn.setEnabled(false);
    Appearance.next_btn.setEnabled(false);
   }
  }
 }
 // **************************各ジュースが押された時の処理*********************************
 public void B_mugicha() {
  if (110 <= money) {
   CODE *= 2;
   Appearance.mission2.setText(“麦茶を購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 110;
   management();
  } else {
   noMoney();
  }
 }
 public void B_grape() {
  if (110 <= money) {
   CODE *= 3;
   Appearance.mission2.setText(“グレープジュースを購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 110;
   management();
  } else {
   noMoney();
  }
 }
 public void B_orenge() {
  if (110 <= money) {
   CODE *= 5;
   Appearance.mission2.setText(“オレンジジュースを購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 120;
   management();
  } else {
   noMoney();
  }
 }
 public void B_yasai() {
  if (110 <= money) {
   CODE *= 7;
   Appearance.mission2.setText(“野菜ジュースを購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 120;
   management();
  } else {
   noMoney();
  }
 }
 public void B_coffee() {
  if (110 <= money) {
   CODE *= 11;
   Appearance.mission2.setText(“コーヒーを購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 130;
   management();
  } else {
   noMoney();
  }
 }
 public void B_water() {
  if (110 <= money) {
   CODE *= 13;
   Appearance.mission2.setText(“天然水を購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 130;
   management();
  } else {
   noMoney();
  }
 }
 public void B_houjicha() {
  if (110 <= money) {
   CODE *= 17;
   Appearance.mission2.setText(“ほうじ茶を購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 110;
   management();
  } else {
   noMoney();
  }
 }
 public void B_ryokucha() {
  if (110 <= money) {
   CODE *= 19;
   Appearance.mission2.setText(“緑茶を購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 110;
   management();
  } else {
   noMoney();
  }
 }
 public void B_tea() {
  if (110 <= money) {
   CODE *= 23;
   Appearance.mission2.setText(“紅茶を購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 120;
   management();
  } else {
   noMoney();
  }
 }
 public void B_remon() {
  if (110 <= money) {
   CODE *= 29;
   Appearance.mission2.setText(“レモンジュースを購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 120;
   management();
  } else {
   noMoney();
  }
 }
 public void B_oshiruko() {
  if (110 <= money) {
   CODE *= 31;
   Appearance.mission2.setText(“おしるこを購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 130;
   management();
  } else {
   noMoney();
  }
 }
 public void B_soup() {
  if (110 <= money) {
   CODE *= 37;
   Appearance.mission2.setText(“コーンスープを購入しました“);
   Appearance.mission2.setForeground(Color.BLACK);
   money -= 130;
   management();
  } else {
   noManey();
  }
 }
 // ******************************重複処理をまとめる**********************************
 // お金が足りない場合
 private void noMoney() {
  Appearance.mission2.setText(“お金が足りません。硬貨を入れてください“);
  Appearance.mission2.setForeground(Color.RED);
  Sound.playSound4();
 }
 //答えが正解だった場合
 private void correct(){
  Appearance.mission.setText(“Thank you!“);
  Appearance.start_btn.setEnabled(true);
  Appearance.next_btn.setEnabled(false);
  Sound.playSound5();
  count++;
 }
 //答えが不正解だった場合
 private void incorrect(){
  Appearance.mission.setText(“違います!“);
  Appearance.start_btn.setEnabled(true);
  Appearance.next_btn.setEnabled(false);
  count++;
  Sound.playSound6();
 }
 //ジュース購入時の処理
 private void management(){
  MONEY = String.valueOf(money);
  Appearance.coin.setText(MONEY);
  Sound.playSound();
 }
 //ボタンの一括ON
  private void buttonOn() {
   Appearance.B_mugicha.setEnabled(true);
   Appearance.B_grape.setEnabled(true);
   Appearance.B_orenge.setEnabled(true);
   Appearance.B_yasai.setEnabled(true);
   Appearance.B_coffee.setEnabled(true);
   Appearance.B_water.setEnabled(true);
   Appearance.B_houjicha.setEnabled(true);
   Appearance.B_ryokucha.setEnabled(true);
   Appearance.B_tea.setEnabled(true);
   Appearance.B_remon.setEnabled(true);
   Appearance.B_oshiruko.setEnabled(true);
   Appearance.B_soup.setEnabled(true);
  }
 //ボタンの一括OFF
 private void buttonOff() {
  Appearance.B_mugicha.setEnabled(false);
  Appearance.B_grape.setEnabled(false);
  Appearance.B_orenge.setEnabled(false);
  Appearance.B_yasai.setEnabled(false);
  Appearance.B_coffee.setEnabled(false);
  Appearance.B_water.setEnabled(false);
  Appearance.B_houjicha.setEnabled(false);
  Appearance.B_ryokucha.setEnabled(false);
  Appearance.B_tea.setEnabled(false);
  Appearance.B_remon.setEnabled(false);
  Appearance.B_oshiruko.setEnabled(false);
  Appearance.B_soup.setEnabled(false);
 }
}

Sound.java

こちらは音を制御しているファイルです。
ジュースの落下音。
硬貨を投入、返却音。
クイズの問題、正解、不正解の音を登録して MyListenerファイルの各ボタンに設定しています。

package machine;

import java.io.File;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

// *****************************音設定*******************************************
public  class Sound {
  static void playSound() {
  try {
   AudioInputStream audioInputStream = AudioSystem
     .getAudioInputStream(new File(“oto1.wav”));
   Clip clip = AudioSystem.getClip();
   clip.open(audioInputStream);
   clip.start();
  } catch (Exception ex) {
   System.out.println(“Error with playing soune.”);
   ex.printStackTrace();
  }
 }

 static void playSound2() {
  try {
   AudioInputStream audioInputStream = AudioSystem
     .getAudioInputStream(new File(“coin.wav“));
   Clip clip = AudioSystem.getClip();
   clip.open(audioInputStream);
   clip.start();
  } catch (Exception ex) {
   System.out.println(“Error with playing soune.”);
   ex.printStackTrace();
  }
 }

 static void playSound3() {
  try {
   AudioInputStream audioInputStream = AudioSystem
     .getAudioInputStream(new File(“coin_fall.wav“));
   Clip clip = AudioSystem.getClip();
   clip.open(audioInputStream);
   clip.start();
  } catch (Exception ex) {
   System.out.println(“Error with playing soune.”);
   ex.printStackTrace();
  }
 }
 static void playSound4() {
  try {
   AudioInputStream audioInputStream = AudioSystem
     .getAudioInputStream(new File(“error.wav“));
   Clip clip = AudioSystem.getClip();
   clip.open(audioInputStream);
   clip.start();
  } catch (Exception ex) {
   System.out.println(“Error with playing soune.”);
   ex.printStackTrace();
  }
 }
 static void playSound5() {
  try {
   AudioInputStream audioInputStream = AudioSystem
     .getAudioInputStream(new File(“pinpon.wav”));
   Clip clip = AudioSystem.getClip();
   clip.open(audioInputStream);
   clip.start();
  } catch (Exception ex) {
   System.out.println(“Error with playing soune.”);
   ex.printStackTrace();
  }
 }
 static void playSound6() {
  try {
   AudioInputStream audioInputStream = AudioSystem
     .getAudioInputStream(new File(“boo.wav“));
   Clip clip = AudioSystem.getClip();
   clip.open(audioInputStream);
   clip.start();
  } catch (Exception ex) {
   System.out.println(“Error with playing soune.”);
   ex.printStackTrace();
  }
 }
 static void playSound7() {
  try {
   AudioInputStream audioInputStream = AudioSystem
     .getAudioInputStream(new File(“question.wav“));
   Clip clip = AudioSystem.getClip();
   clip.open(audioInputStream);
   clip.start();
  } catch (Exception ex) {
   System.out.println(“Error with playing soune.”);
   ex.printStackTrace();
  }
 }
}

question.txt

最後は、テキストファイルになります。
今回の問題は3問しか登録していませんが、必要に応じて ,(コンマ) で区切って問題を増やせていけます。
その場合は、MyListenerファイル**次へのボタン処理**内のswitch文も拡張して問題文に合わせて判別と変数 total_count の数値の変更を調整して下さい。

麦茶を1本買ってください。,コーヒーを2本買ってください。,緑茶とおしるこを1本ずつ買ってください。

 
以上が VendingMachine  の全コードです。
Javaの学習や課題で参考にされる方は使ってもらっても大丈夫ですが、筆者も勉強不足でコードとしては不十分な所が多々あります。
その点はご了承下さい。

PAGETOP
Copyright © Goran All Rights Reserved.
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.