Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaのswitch-case文の構文や使い方を紹介+UFOキャッチャーの座標移動プログラムも紹介

投稿日:2020年9月25日 更新日:

<目次>

(1) Javaのswitch-case文の構文や使い方を紹介
 (1-1) switch-caseの構文
 (1-2) else-if文との比較
(2) サンプルプログラムの紹介
 (2-1) サンプルプログラムの概要
 (2-2) サンプルプログラム(main文側)
 (2-3) サンプルプログラム(RobotArm側)
 (2-4) 操作動画

(1) Javaのswitch-case文の構文や使い方を紹介

通常は、多数の分岐があってその中から1つを通る場合は「else if」文を使って分岐のパターンを記述していきます。
しかし、もし分岐の数が多い場合は「else if」を繰り返し記述するよりは「switch-case」文を使う方がプログラムがスマートになったり、該当条件に直接飛ぶ事で「else if」の条件判定を繰り返すよりも処理が効率化できるケースがあります。

(1-1) switch-caseの構文

switch-case文の構文は次の通りです。
(構文)

//①評価式の値チェック
switch (評価式) {
  //②該当caseに飛ぶ
  case 定数1:
   文
   break;
  case 定数2:
   文
   break;
   …
  //③defaltラベル
  default:
   文
} 
①評価式の値チェック
評価式に使える型はint型/short型/byte型/char型/enum型/String型です。String型が使えるのはJavaSE7以降で、nullの場合はNullPointerExceptionが発生するため、事前のチェックが必要です。

 

②該当caseに飛ぶ
評価式の結果とcaseの定数を比較して、一致するcaseに飛びます。

 

③defaltラベル

もし一致するcaseがないケースは「default」ラベルがあればdefault文に飛びます。

目次にもどる

(1-2) else-if文との比較

冒頭で「switch-case」文を使うと「else-if」文を使う方がプログラムがスマートになると書いていますが、実際にどのように違うのか?を視覚的に捉えるために、同じ内容のプログラムを両方の書き方で書いたものをそれぞれ紹介します。
①「else-if」文の例

char grade = 'pass';
if( grade == 'pass' ){
  System.out.println( "合格!" );
}
else if(grade == 'fail'){
  System.out.println( "不合格・・orz" );
}

//...(続く)

else{
  System.out.println( "不明・・orz" );
}

②「switch-case」文の例

char grade = 'pass';
switch ( grade )
{
case 'pass':
  System.out.println( " 合格! " );
  break ;
case 'fail':
  System.out.println( " 不合格・・orz " );
  break ;

//...(続く)

default :
  System.out.println( " 不明・・orz " );
}

目次にもどる

(2) サンプルプログラムの紹介

(2-1) サンプルプログラムの概要

今回紹介するプログラムはUFOキャッチャーのアームの座標の制御を模したプログラムを紹介します。プログラムの構造は次のようになっています。
(図211)

まずプログラムを実行すると、コンソールから指示を入力します(※上、下、右、左の4種類の指示が出せます)。

指示を入力するとUFO_Catcherクラスのmain文に入り、そこからRobotArmクラスのmoveArm()メソッドが実行されて、座標の再計算などが実行されます。

目次にもどる

(2-2) サンプルプログラム(main文側)

main文側のプログラムです。「2」で次に紹介するRobotArmクラスのインスタンスを作り、アーム座標の管理や座標移動を行っています。

import java.util.Scanner;

public class IT0131_UFO_Catcher {
    public static void main(String[] args) {
        //1:コンソールからの入力を受ける「Scanner」クラスのインスタンス化
        Scanner sc = new Scanner(System.in);

        //2:ロボットアームの座標管理やアーム移動をするための
        //  「RobotArm」クラスをインスタンス化
        IT0131_RobotArm rb = new IT0131_RobotArm();

        //3:while(true)は無限ループなので、内部でbreakするまで処理を続ける
        while(true) {
            //4:コンソールからコマンド(UP/DOWN/LEFT/RIGHT)入力を求める文言表示
            System.out.print("Enter Command : ");

            //5:コンソールから入力された内容(コマンド)を受け取る
            String in = sc.next();

            //6:moveArmメソッドを実行して、結果がtrueかfalseかで分岐します
            //  falseの場合は「if(!rb.moveArm(in))」の部分を通ります
            // 
            //   moveArm()メソッド内部の処理は、
            //   次の「サンプルプログラム(座標操作側)」を参照ください
            if(!rb.moveArm(in)) {
                //7:[A]再計算された座標が(5×5)マスの範囲外 OR
                //    [B]コマンドがnullの場合は「Error」を返します
                //  ※エラーとなっても、次の操作で範囲内に復活できればOK
                System.out.println("("+rb.Xpos+","+rb.Ypos+")\r\nError\r\n");
            } else {
                //8:移動後の座標がOKなら、マス目(5×5)の文字列を生成
                String out = "";
                for(int i=0; i<5 ; i++) {
                    for(int j=0; j<5; j++) {
                        if(i==rb.Ypos && j==rb.Xpos) {
                            out = out + "○";
                        }else {
                            out = out + "ー";
                        }
                    }
                    out = out + "\r\n";
                }
                //9:座標とマス目(5×5)をコンソールに表示
                System.out.println("("+rb.Xpos+","+rb.Ypos+")\r\n"+out+"\r\n");
            }
        }
    }
}

目次にもどる

(2-3) サンプルプログラム(RobotArm側)

こちらはアームの座標(Xpos,Ypos)の管理や、座標の移動(上下左右)を行い、再計算後の座標を評価(範囲内チェック)します。

public class IT0131_RobotArm {
    int Xpos = 0;
    int Ypos = 0;
    boolean moveArm(String dir) {
        //①最初に入力されたコマンドを使い、座標を再計算します(switch文)
        switch(dir) {
            case "UP":
                --Ypos;
                break;
            case "DOWN":
                ++Ypos;
                break;
            case "RIGHT":
                ++Xpos;
                break;
            case "LEFT":
                --Xpos;
                break;
            default:
                return false;
        }
        //②次の条件に該当する場合はfalseを返します(OR条件)
        //  [A]再計算された座標が範囲外(5×5のマス目外になってしまった場合)
        //  [B]コマンドがnullの場合
        if(dir==null || Xpos < 0 || Ypos < 0 || Xpos > 4 || Ypos > 4) {
            return false;
        }
        return true;
    }
}

目次にもどる

(2-4) 操作動画

上記プログラムを実際に操作した動画です。コンソールに値を入力すると文字が「緑色」になっています。アームの座標が5×5のマス目を外れると「Error」が返ってきます。しかし、次の移動で再び5×5に収まれば、再びマス目が描画されます。

(動画)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Javaのabstractとは?抽象クラスの概要やサンプルPGをご紹介

<目次> (1) Javaのabstractとは?抽象クラスの概要やサンプルPGをご紹介  (1-1) 抽象クラス(abstract)とは  (1-2) 抽象クラスの目的や用途  (1-3) 抽象クラ …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)

(1) 仕様について (2) ソースコード  (2-1) AccessCounter2.java   (2-1-1) サンプルPG   (2-1-2) サンプルPG解説  (2-2) DbConnec …

TwitterのAPIライブラリ(Twitter4j)でフォローを行う方法

<目次> (1) TwitterのAPIライブラリ(Twitter4j)でフォローを行う方法  (1-1) 構文  (1-2) サンプルプログラム (1) TwitterのAPIライブラリ(Twitt …

Failed to execute goal org.apache.mavenエラーの原因と対処(Spring BootのMavenプロジェクトで発生)

  <目次> (1) Failed to execute goal org.apache.mavenエラーの原因と対処(Spring BootのMavenプロジェクトで発生)  (1-1) …

WARファイルの作成方法について(Eclipse利用あり、なしの2パターン)

  <目次> (1) WARファイルの作成方法について(Eclipse利用あり、なしの2パターン)  (1-1) 方法①:Eclipseを使ってWARファイルを作る方法  (1-2) 方法② …

  • English (United States)
  • 日本語
Top