すずろぐ

人生大逆転を目指す、鈴木俊吾の成長日記

Java JavaFXで簡単なGUI版じゃんけんゲームを作成してみた!

JavaFX - じゃんけんゲームの実行結果

おはようございます、すずしんです。

最近あまりプログラミングをしていませんでしたので…。
久しぶりにJavaのプログラミングをしてみました。

何のプログラムを作成しようかと悩んだのですが…。
どうせなら、GUI付きのプログラム(JavaFX)で作成してみようと思い立ちました。
そして、あまり難しくなさそうなテーマを扱おうということで…。
今回は、簡単な「じゃんけんゲームを作成してみることにしました。

じゃんけんゲームの仕様

今回作成することにしたじゃんけんゲームの仕様は以下のような感じです。

  • コンピュータの手・自分の手・じゃんけんの結果を表示するラベルと、自分の手を選ぶためのボタン(グー・チョキ・パー)から構成される。
  • いずれかの手のボタンを押すと、コンピュータがランダムな手を選びじゃんけんをする。
  • じゃんけんをした時、コンピュータの手・自分の手・じゃんけんの結果を表示する。

じゃんけんゲームのプログラム作成

それでは、ここから実際にじゃんけんゲームを作成していきます。
今回のじゃんけんゲームでは、「Janken.fxml」「janken.css」「JankenController.java」「Janken.java」の4つのファイルを作ります。

Janken.fxmlの作成

Janken.fxmlでは、じゃんけんゲームの画面(GUI)を作成します。
SceneBuilderを使いながら、仕様に沿ってラベルとボタンを配置していきます。
ラベルとボタンの細かい部分は特に指定していませんので、自由に決めてもらって構いませんよ。
自分にとって分かりやすい画面になっていれば問題無いです。

とりあえず、私の場合は以下のような画面構成にしてあります。

JavaFX - じゃんけんゲーム

参考までに、私が作成したJanken.fxmlのコードを載せておきますので…。
もし同じ画面にしたい場合には利用してくださいね。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>

<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0" prefWidth="360.0" stylesheets="@janken.css" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="jp.suzushin7.sample.janken.JankenController">
  <columnConstraints>
      <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" />
      <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" />
      <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" />
  </columnConstraints>
  <rowConstraints>
    <RowConstraints vgrow="SOMETIMES" />
    <RowConstraints vgrow="SOMETIMES" />
    <RowConstraints vgrow="SOMETIMES" />
    <RowConstraints vgrow="SOMETIMES" />
  </rowConstraints>
   <children>
      <Label fx:id="cpuHandLabel" text="コンピュータの手: -" GridPane.columnSpan="3" />
      <Label fx:id="myHandLabel" text="あなたの手: -" GridPane.columnSpan="3" GridPane.rowIndex="1" />
      <Label fx:id="resultLabel" text="結果: -" GridPane.columnSpan="3" GridPane.rowIndex="2" />
      <Button onAction="#putOutRockHand" text="グー" GridPane.rowIndex="3" />
      <Button onAction="#putOutScissorsHand" text="チョキ" GridPane.columnIndex="1" GridPane.rowIndex="3" />
      <Button onAction="#putOutPaperHand" text="パー" GridPane.columnIndex="2" GridPane.rowIndex="3" />
   </children>
</GridPane>

janken.cssの作成

janken.cssでは、画面に表示するGUI部品の基本的な設定を行います。
ここでは、フォントサイズを20px、ボタンの推奨幅を100pxにしています。

.button, .label {
    -fx-font-size: 20px;
}

.button {
    -fx-pref-width: 100px;
}

JankenController.javaの作成

続いて、コントローラークラスとして「JankenController.java」を作成します。

cpuHandLabel・myHandLabel・resultLabelは、それぞれコンピュータの手・自分の手・じゃんけんの結果を表示するためのラベルです。
putOutRockHand()・putOutScissorsHand()・putOutPaperHand()は、それぞれ自分の手をグー・チョキ・パーとしてじゃんけんをするメソッドです。
これらはdoJanken()メソッドで処理しています。

doJanken()メソッドでは、ラベルの更新メソッドであるupdateLabels()を呼び出しています。
引数として、自分の手(myHand)と相手の手(cpuHand)を渡しています。
この際に、新規の相手の手はgetCpuHand()で取得しています。

updateLabels()では、自分の手・相手の手・じゃんけんの結果を各ラベルに表示させます。
じゃんけんの結果については、getResult()メソッドを使って取得しています。

package jp.suzushin7.sample.janken;

import java.net.URL;
import java.util.Random;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class JankenController implements Initializable {
    private final Random random = new Random();
    private final String[] hands = {
        "グー", "チョキ", "パー"
    };
    
    @FXML private Label cpuHandLabel;
    @FXML private Label myHandLabel;
    @FXML private Label resultLabel;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    
    }
    
    @FXML
    private void putOutRockHand() {
        doJanken(0);
    }
    
    @FXML
    private void putOutScissorsHand() {
        doJanken(1);
    }
    
    @FXML
    private void putOutPaperHand() {
        doJanken(2);
    }
    
    private void doJanken(int myHand) {
        updateLabels(myHand, getCpuHand());
    }
    
    private int getCpuHand() {
        return random.nextInt(3);
    }
    
    private String getResult(int myHand, int cpuHand) {
        int r = (myHand - cpuHand + 3) % 3;
        return (r == 2) ? "あなたの勝ち!" : ((r == 1) ? "あなたの負け!" : "あいこ!");
    }
    
    private void updateLabels(int myHand, int cpuHand) {
        cpuHandLabel.setText("コンピュータの手: " + hands[cpuHand]);
        myHandLabel.setText("あなたの手: " + hands[myHand]);
        resultLabel.setText("結果: " + getResult(myHand, cpuHand));
    }
}

Janken.javaの作成

最後に、メインクラスとなるJanken.javaの作成をします。

ここでは、単純にFXMLLoaderを使ってJanken.fxmlをロード、そしてSceneにセットするくらいです。
このアプリケーションのタイトルは「じゃんけん」としてみました。
…そのままですね!

package jp.suzushin7.sample.janken;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Janken extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {        
        Parent root = FXMLLoader.load(getClass().getResource("Janken.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        
        primaryStage.setTitle("じゃんけん");
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        Application.launch(args);
    }
}

じゃんけんゲームの実行結果

それでは、早速プログラムを実行してみます。

プログラムが実行されると、まず以下のような画面が表示されます。

JavaFX - じゃんけんゲーム

この画面上にある、グー・チョキ・パーのいずれかのボタンをクリックすると、コンピュータとじゃんけんができます。
じゃんけん後は、コンピュータの手・自分の手・じゃんけんの結果が画面上に表示されます。
ちなみに、コンピュータはランダムな手を選びますので、じゃんけんをする度に結果が変わります。

JavaFX - じゃんけんゲームの実行結果

ひとこと

今回は、JavaFXを使って簡単なじゃんけんゲームを作成してみました。
JavaFX入門用の題材としては、このじゃんけんゲームはちょうど良いのではないでしょうか?
もし良かったら、あなたもじゃんけんゲームを作成して遊んでみてくださいね。

Java NetBeansでコマンドライン引数を複数指定して実行する方法

NetBeans

こんにちは、すずしんです。

Javaのプログラムを作成するときに、実行時に引数を渡して処理したい時がありますよね?
コンソールを使って実行させるなら、引数を直接指定できますが…。
もしIDEを使っているなら、そのままでは引数を指定することができません。
IDEでプログラムを実行する時に引数を渡すためには、あらかじめ設定をしておく必要があります。

そこで、今回の記事では、NetBeansコマンドライン引数複数指定してプログラムを実行する方法について書いてみます。
ついでに、受け取ったコマンドライン引数の簡単な扱い方についても解説します。

コンソール上でコマンドライン引数を指定する方法

仮に、コマンドライン引数を受け取るプログラムを「CommandLine.java」とします。
コンパイルするときには「javac」を使いますね。
コンパイルが終了すると、「CommandLine.class」ファイルが作成されます。

javac CommandLine.java

このプログラムを実行するときにコマンドライン引数を渡すには…。
「java」コマンドに続いてプログラム名を指定した後に、スペース区切りで与えたい文字列を入力します。

例えば、「Hello」と「World」をコマンドライン引数に渡したい場合は以下のようにします。

java CommandLine.class Hello World

ちなみに、「Hello World」というスペースが入った文字列を指定したい場合には、その文字列をダブルクォーテーションで囲みます。
つまり、以下のように指定します。

java CommandLine.class "Hello World"

NetBeansでコマンドライン引数を指定する方法

NetBeansでコマンドライン引数を指定するには…。
まず、「デフォルト構成」と表示されている部分をクリックします。
すると、「カスタマイズ」という項目が表示されますので、それをクリックしてください。

NetBeans - カスタマイズ

プロジェクト・プロパティ画面が表示されます。
「メイン・クラス」に、実行したいプログラムが指定されているのを確認します。
そして、「引数」に、与えたいコマンドライン引数をスペース区切りで入力してください。
その後「OK」をクリックすれば、設定は完了です。

NetBeans - プロジェクト・プロパティ

プログラムの実行は、▶ボタンをクリックするかF6ボタンを押します。
これで、プログラムがコマンドライン引数を与えられた状態で実行されます。

コマンドライン引数の受け取り方

コマンドライン引数は、mainメソッドの引数であるargsの中に格納されています。
argsは配列になっていて、0番目に最初の引数、1番目に次の引数…というように順番に入っています。
引数の数は「args.length」で分かります。

サンプルプログラム

このサンプルプログラム(Args.java)は、入力されたコマンドライン引数の内容を全て表示するというものです。
for文でループしながら、argsの内容をSystem.out.printf()メソッドで表示させています。

package jp.suzushin7.sample;

public class Args {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.printf("args[%d]: %s%n", i, args[i]);
        }
    }
}

実行結果

上記サンプルプログラムの実行結果の例は以下のようになります。
コマンドライン引数に「Hello World 1 2 3 4 5」を与えた場合には、このような結果になります。

args[0]: Hello
args[1]: World
args[2]: 1
args[3]: 2
args[4]: 3
args[5]: 4
args[6]: 5

ひとこと

今回の記事では、NetBeansでコマンドライン引数を指定してプログラムを実行する方法について書いてみました。
実際やってみると分かりますが、引数に指定するだけですので難しいということはないですよね。

「コマンドライン引数は、プロジェクト・プロパティ画面から指定する。」
「プログラム上では、受け取ったコマンドライン引数はargsに格納されている。」
以上の事を覚えておけば問題無いです。

コマンドライン引数を使う事で、プログラムの処理を柔軟に切り替えることができますので…。
ぜひあなたもコマンドライン引数を使ったプログラムを作成してみてくださいね。

Java カレントディレクトリを取得するサンプルプログラム

Java - カレントディレクトリ

こんにちは、すずしんです。

Javaでプログラミングをしている時に…。
カレントディレクトリ取得したいという事が時々あると思います。
ファイルを参照するときなどに、カレントディレクトリを利用しますよね。

そこで、今回の記事では、Javaでカレントディレクトリを取得する方法についてまとめておきます。
やり方が一度分かってしまえば簡単ですよ。

カレントディレクトリの取得方法

Javaでカレントディレクトリを取得する方法は主に2つあります。
現在位置の絶対パスから取得する方法」と「System.getProperty()で取得する方法」ですね。
それぞれの方法について、簡単に解説していきます。

現在位置の絶対パスから取得する方法

まずは、現在位置の絶対パスから取得する方法についてです。

この方法では、まず現在位置のFileを作成します。
そして、そのFileの絶対パスをgetAbsoluteFile()で取得します。
最後に、この絶対パスの親ディレクトリをgetParent()で取得します。
このディレクトリがカレントディレクトリとなります。

この方法を使って、カレントディレクトリを取得するサンプルプログラムは以下のようになります。

package jp.suzushin7.sample;

import java.io.File;

public class CurrentDirectory {
    public static void main(String[] args) {
        String cd = new File(".").getAbsoluteFile().getParent();
        System.out.println(cd);
    }
}

System.getProperty()で取得する方法

続いて、System.getProperty()で取得する方法についてです。

こちらの場合は、System.getProperty()で与えるkeyに「user.dir」を指定するだけです。
これで取得できる値がカレントディレクトリとなっています。

この方法を使って、カレントディレクトリを取得するサンプルプログラムは以下のようになります。

package jp.suzushin7.sample;

public class CurrentDirectory {
    public static void main(String[] args) {
        String cd = System.getProperty("user.dir");
        System.out.println(cd);
    }
}

ひとこと

今回の記事では、Javaでカレントディレクトリを取得する方法について書いてみました。
2通りのやり方がありますが…。
個人的には、何となく前者の方法が好きですかね?

ファイルを参照するときなどに、カレントディレクトリを取得したくなったら…。
ぜひこの記事の方法を参考にしてくださいね。

Java 指定したURLの存在を確認するサンプルプログラム

Java

こんばんは、すずしんです。

今回の記事では、Java言語のプログラミングをしてみます。
テーマとしては「指定したURL存在確認する」というものです。

指定したURLの存在を確認する方法

指定したURLの存在を確認するには、HttpURLConnectionクラスを使います。
試しに対象のURLに接続してみて、そのレスポンスコードがHTTP_OK(200)になるかどうかを確認します。
HTTP_OKならURLが存在しているということですね。

この考え方をもとにして、指定したURLの存在を確認するメソッドisExistURL()を作成してみました。
それが以下のようなコードです。
urlStringで表されるURLが存在すればtrue、存在しなければfalseを返します。

private static boolean isExistURL(String urlString) {
    URL url;
    int response = 0;
        
    try {
        url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("HEAD");
        connection.connect();
        response = connection.getResponseCode();
        connection.disconnect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
        
    return response == HttpURLConnection.HTTP_OK;
}

サンプルプログラム

このisExistURL()の動作確認用に、サンプルプログラムURLCheckerを作成してみました。
URL_STRINGSに記述したそれぞれのURLに対してisExistURL()を実行して、その結果をコンソールに出力します。

package jp.suzushin7.sample;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class URLChecker {
    private static final String[] URL_STRINGS = {
        "http://www.suzushin7.jp/", "http://www.suzushin7.jp/sample/", "https://www.google.co.jp/"
    };
    
    public static void main(String[] args) {
        for(String u: URL_STRINGS) {
            System.out.println(u + " : " + isExistURL(u));
        }
    }
    
    private static boolean isExistURL(String urlString) {
        URL url;
        int response = 0;
        
        try {
            url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("HEAD");
            connection.connect();
            response = connection.getResponseCode();
            connection.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return response == HttpURLConnection.HTTP_OK;
    }
}

実行結果

上記サンプルプログラムを実行した結果は以下のようになります。
確かに、存在しているURLはtrue、存在していないURLはfalseとなっているのが分かりますね。

http://www.suzushin7.jp/ : true
http://www.suzushin7.jp/sample/ : false
https://www.google.co.jp/ : true

ひとこと

今回の記事では、指定したURLが存在するかどうかを確認するサンプルプログラムを作成してみました。
一度原理が分かれば、割とスムーズに作成することができますね。

isExistURL()を使う事で、リンク切れの確認ができるようになります。
これを応用して、リンク切れ確認ツールのようなプログラムを今後作成してみたいですね。

Java XMLをDOMで読み込んで内容を取得するサンプルプログラム

Java

こんにちは、すずしんです。

XMLは、データをシンプルに扱うためのデータ構造です。
非常に使い勝手が良く、Webなどの世界ではよく利用されます。

そのXMLを、Javaで扱う方法について今回は書いてみようと思います。
具体的には、XMLをDOMで読み込んで内容を取得する方法を扱います。

DOMとは?

DOMというのは、XMLを扱うためのAPI仕様の事をいいます。
この仕様では、XMLによって書かれた文書全体をドキュメントと呼びます。
ドキュメントはノードから構成されるノードツリーとなっています。

ドキュメントの取得方法(Java)

Javaでドキュメントを取得するには、主に3つのステップがあります。

ステップ1: DocumentBuilderFactoryクラスのnewInstance()メソッドを使用します。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

ステップ2: DocumentBuiderFactoryのインスタンスからnewDocumentBuilder()メソッドを呼び出します。

DocumentBuilder builder = factory.newDocumentBuilder();

ステップ3: DocumentBuilderのインスタンスからparse()メソッドを呼び出します。

Document document = builder.parse("sample.xml");

ドキュメントの操作方法

ドキュメントを操作するには、まずgetDocumentElement()メソッドでElementノードを取得します。
このElementノードに対して操作メソッドを使います。

Element root = document.getDocumentElement();

その後は、NodeやElementに対する操作が多くなりますが…。
これらで使用できるメソッド群についての詳細はAPIを参照してください。

Node (Java Platform SE 7 )
Element (Java Platform SE 7 )

今回の例で使用するのは、主に以下のメソッドです。

Node
String getNodeName(): ノード名を取得。
NodeList getChildNodes(): このノードの子をすべて含むNodeListを取得。

Element
String getAttribute(String name): 属性を取得。

NodeList
int getLength(): リスト内のノード数を取得。
Node item(int index): リスト内のindex番目の項目を取得。

DOMでXMLを扱うサンプルプログラム

このサンプルで扱うXMLは以下のようになっています。
友達リストのような形です。
これをpersons.xmlとして保存してあります。

<?xml version="1.0" encoding="utf-8" ?>
<persons name="friends">
  <person name="Asakura">
    <gender>Male</gender>
    <age>20</age>
    <interest>Game</interest>
  </person>
  <person name="Kikuchi">
    <gender>Male</gender>
    <age>23</age>
    <interest>Tennis</interest>
  </person>
  <person name="Suzuki">
    <gender>Female</gender>
    <age>19</age>
    <interest>Baseball</interest>
  </person>
</persons>

persons.xmlの内容を取得して、コンソールに取得するサンプルプログラムは以下のようになります。
ここではXMLReaderクラスとしてみました。

package jp.suzushin7.sample;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLReader {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("persons.xml");
        
        Element root = document.getDocumentElement();
        
        System.out.println("Node: " + root.getNodeName());
        System.out.println("name: " + root.getAttribute("name"));
        
        System.out.println("==============================");
        
        NodeList personsNodeList = root.getChildNodes();
        for(int i = 0; i < personsNodeList.getLength(); i++) {
            Node personNode = personsNodeList.item(i);
            if(personNode.getNodeType() == Node.ELEMENT_NODE) {
                Element personElement = (Element)personNode;
                if(personElement.getNodeName().equals("person")) {
                    System.out.println("[" + personElement.getAttribute("name") + "]");
                    NodeList personChildrenNodeList = personElement.getChildNodes();
                    for(int j = 0; j < personChildrenNodeList.getLength(); j++) {
                        Node node = personChildrenNodeList.item(j);
                        if(node.getNodeType() == Node.ELEMENT_NODE) {
                            System.out.println(node.getNodeName() + ": " + node.getTextContent());
                        }
                    }
                }
            }
        }
        
        System.out.println("==============================");
    }
}

実行結果

上記サンプルプログラムを実行すると、以下のような結果が得られます。
確かに、persons.xmlの内容が正しく取得できているのが分かりますね。

Node: persons
name: friends
==============================
[Asakura]
gender: Male
age: 20
interest: Game
[Kikuchi]
gender: Male
age: 23
interest: Tennis
[Suzuki]
gender: Female
age: 19
interest: Baseball
==============================

ひとこと

今回の記事では、JavaでDOMを使ってXMLを扱う方法について書いてみました。
やり方が分かってしまえば、それほど難しいというわけでもなさそうですね。

今回のサンプルプログラムは、XMLの内容を表示するだけの非常にシンプルなものでしたが…。
XMLを扱えるようになると、もっと色々な応用ができると思います。
ぜひ工夫して便利なプログラムを作成してみてくださいね。

Java String 文字列がnullまたは空文字列かどうかの確認方法(isEmpty)

Java - isEmptyメソッド

こんにちは、すずしんです。

Javaでプログラミングをしていると、文字列の処理をすることがあると思いますが…。
特に、「文字列がnullまたは空文字列かどうか」を確認することが多いのではないでしょうか?
主に入力チェックをした時によく利用しますね。

そこで、今回の記事では…。
文字列がnullまたは空文字列かどうかを確認する方法について書いてみます。

isEmptyメソッド

ここでは、文字列がnullまたは空文字列かどうかの結果を返すメソッドを定義します。
メソッド名はisEmptyとしてみました。

このisEmptyメソッドの実装例としては以下のような感じです。
まさに条件をそのままプログラムにしてありますね。

package jp.suzushin7.sample;

public class StringUtils {
    public static boolean isEmpty(String value) {
        if(value == null || value.length() == 0)
            return true;
        else
            return false;
    }
}

サンプルプログラム

上記のisEmptyメソッドを使ったサンプルプログラムの例は以下のような感じです。
mainメソッドでは、まずvalue1にnull、value2に空文字列、value3には"Sample"という文字列を代入したインスタンスを用意しておきます。
そして、それぞれのインスタンスに対してisEmptyを実行して、その結果を出力しています。

package jp.suzushin7.sample;

public class IsEmptyTest {
    public static void main(String[] args) {
        String value1 = null;
        String value2 = "";
        String value3 = "Sample";

        System.out.println(StringUtils.isEmpty(value1));
        System.out.println(StringUtils.isEmpty(value2));
        System.out.println(StringUtils.isEmpty(value3));
    }
}

サンプルプログラムの実行結果

上記サンプルプログラムの実行結果は以下のようになります。
文字列がnullまたは空文字列の時(value1とvalue2)は、結果がtrueになっています。
そして、それ以外の文字列の時(value3)には、結果はfalseとなっていますね。

true
true
false

ひとこと

文字列がnullまたは空文字列かどうかを確認する機会というのは結構あるかもしれません。
その時に備えて予めisEmptyメソッドを準備しておくと、ちょっと幸せになるのではないでしょうか。

Java 整数配列をバブルソートするプログラムを作成してみた

Java - バブルソート

こんにちは、すずしんです。

しばらく私はプログラミングをしていませんでしたので…。
久しぶりに、簡単なプログラムを書いてみました。

今回作成したプログラムというのは、「整数配列をバブルソートで整列する」というものです。
具体的には、ランダムな数字の整数配列を昇順に並び替えるプログラムとなっています。
ちなみに、使用したプログラミング言語はJavaです。

プログラムの難易度としては、かなり簡単な部類になると思いますが…。
久しぶりに書くのでリハビリにはちょうど良いかなと。

バブルソートとは?

バブルソートというのは、リスト(配列)に対して、隣り合う二つの要素の値を比較して条件に応じた交換を行う整列アルゴリズムです。
ここで、条件というのは要素の大小関係の事をいいます。
値の大きい順(降順)または小さい順(昇順)で並び替えます。
このソートを行うと、値の大きいまたは小さい要素が浮かびあがってくるように見えるので、バブル(泡)ソートと呼ばれます。

バブルソートの例

ここでは、以下のような配列の昇順でのバブルソートの例を挙げてみます。

1回目で最も小さい値の1が左端へ順に移動していきます。
続いて、2回目で次に小さい値の3が左へ移動していきます。
同様に3回目、4回目と同じ操作をしていくと、最終的に昇順に整列されます。

7,9,5,1,3 - スタート時
7,9,1,5,3
7,1,9,5,3
1,7,9,5,3 - 1回目終了時
1,7,9,3,5
1,7,3,9,5
1,3,7,9,5 - 2回目終了時
1,3,7,5,9
1,3,5,7,9 - 3回目終了時
1,3,5,7,9 - 4回目終了時

バブルソートのサンプルプログラム

整数配列のバブルソートを行うサンプルプログラムを書いてみました。
ここでは、10個の要素を持つ整数配列を昇順に並び替えています。

mainメソッドでは、まず乱数を扱うためにRandomクラスのインスタンスrを用意します。
そして、int型配列を生成した後、forループ中で乱数を代入していきます。
printArrayメソッドで整列前の配列の中身を表示してから、bubbleSortメソッドでソートし、再びprintArrayメソッドで整列後の配列の中身を表示しています。

package jp.suzushin7.sample;

import java.util.Random;

public class BubbleSort {
    public static void main(String[] args) {
        Random r = new Random();

        int[] n = new int[10];
        for(int i = 0; i < n.length; i++) {
            n[i] = r.nextInt(100);
        }

        printArray(n);
        bubbleSort(n);
        printArray(n);
    }

    private static void bubbleSort(int[] n) {
        int tmp;
        for(int i = 0; i < n.length - 1; i++) {
            for(int j = n.length - 1; i < j; j--) {
                if(n[j-1] > n[j]) {
                    tmp = n[j-1];
                    n[j-1] = n[j];
                    n[j] = tmp;
                }
            }
        }
    }

    private static void printArray(int[] n) {
        for(int i = 0; i < n.length; i++) {
            if(i == n.length - 1) {
                System.out.println(n[i]);
            } else {
                System.out.print(n[i]+",");
            }
        }
    }
}

バブルソートのサンプルプログラムの実行結果

上記サンプルプログラムの実行結果の例を載せておきます。

ソート前の配列は、ランダムな数字が並んでいます。
そして、ソートされた後の配列は綺麗に昇順になっています。

乱数を使っていますので、実行するたびに数字が変わりますが…。
全てのパターンで正しく昇順にソートされるのが分かります。

93,88,96,74,76,32,46,90,37,54
32,37,46,54,74,76,88,90,93,96

ひとこと

今回は、バブルソートのプログラムを作成してみましたが…。
実際やってみると、意外と簡単にプログラムが組めてしまうというのが分かりましたね。
パパっとできましたよっ!

実装の難易度はとても低いですので…。
プログラミングを学び始めた方にとって、バブルソートを実装してみるというのは非常に良い練習になるのではないでしょうか。

ぜひ使って!自作フリーソフト「デスクトップ付箋」の紹介

こんにちは、すずしんです。

現在、私は趣味でプログラミングをしています。
これまでには、いくつかのAndroidアプリやフリーソフトを開発してきました。

これらのAndroidアプリやフリーソフトは既に外部で公開しているのですが…。
知名度がありませんので、なかなかダウンロードして使ってもらえていないのが現状です。

そこで、今回の記事では…。
私が過去に作成した自作フリーソフトデスクトップ付箋」の紹介をさせてもらおうと思います。
この記事を読んだ方には、ぜひとも一度使って頂きたいですね。

デスクトップ付箋とは?

デスクトップ付箋というのは、パソコンのデスクトップに簡易的な付箋を配置することで、簡単なメモを残すことができるようにするフリーソフトです。
ファイルなどにメモしておくのと比べて、常にメモの内容を確認できたり、簡単に編集をしたりすることができるという利点があります。
ちなみに、このデスクトップ付箋はJavaFXで作成しています。

デスクトップ付箋の主な機能は以下のとおりです。
シンプルに使えるような設計にしていますので、付箋紙として必要な最小限の機能のみを実装しています。

  • 付箋紙の作成(大/中/小サイズ)
  • 付箋紙の移動
  • 付箋紙の削除
  • 付箋紙のコンテンツ部分の表示・非表示
  • 付箋紙の編集
  • タイトル/コンテンツの編集
    • 付箋紙の色変更(赤/橙/黄/緑/水/青/紫)
    • 文字サイズの変更(15/18/21/24/27/30)
    • 最上面表示変更
    • 不透明度の変更

デスクトップ付箋のスクリーンショットはこんな感じです。
デスクトップの右上にあるのが、デスクトップ付箋によって作成された付箋紙です。
これで大体どんなものかイメージがつきましたか?

デスクトップ付箋 - スクリーンショット

それでは、ここからデスクトップ付箋の使い方について書いていきます。

新規付箋紙(メモ)の作成

新しい付箋紙を作成するには、タスクトレイ(システムトレイ)にあるデスクトップ付箋のアイコンを右クリック→「新規」からサイズを選択します。
もしくは、既に作成されている付箋紙のタイトル部分上で右クリック→「新規」からサイズを選択します。
サイズは大(400x300)、中(320x240)、小(240x180)の3サイズがあります。

デスクトップ付箋 - 新規付箋紙

デスクトップ付箋 - 新規付箋紙

付箋紙の移動

付箋紙の位置を変えるには、付箋紙のタイトル部分をドラッグしてください。
すると、ドラッグしている間マウスに追従していきます。
配置したい位置でマウスドラッグをやめてください。

デスクトップ付箋 - 付箋紙の移動

付箋紙の削除

付箋紙の削除は、付箋紙のタイトル部分を右クリック→「削除」を選択でできます。
一度削除すると復元できませんのでご注意ください。

デスクトップ付箋 - 付箋紙の削除

付箋紙のコンテンツ部分の表示・非表示

付箋紙の左上にあるボタンをクリックすると、付箋紙のコンテンツ部分の表示・非表示を選択できます。
非表示にすると省スペースになりますので、その状態で並べるとスッキリします。
ちなみに、タイトル部分にマウスを持っていきしばらく待つと、付箋紙のタイトルとコンテンツの内容が表示されるツールチップが表示されます。
そのため、非表示状態でも付箋紙の内容を確認することができます。

デスクトップ付箋 - 付箋紙のコンテンツ部分の表示・非表示

デスクトップ付箋 - ツールチップの表示

付箋紙の編集

タイトル/コンテンツの編集

付箋紙のタイトルの編集は、タイトル部分をクリックしてフォーカスを当ててから文字を入力します。
コンテンツの編集は、コンテンツ部分をクリックしてフォーカスを当ててから文字を入力します。
入力されたテキストはオートセーブされます。

デスクトップ付箋 - タイトル・コンテンツの編集

付箋紙の色変更

付箋紙の色を変更するには、付箋紙のタイトル部分を右クリック→「設定」→「色」から選択可能です。
赤/橙/黄/緑/水/青/紫の中からお好きな色を選んでください。

デスクトップ付箋 - 付箋紙の色変更

文字サイズの変更

付箋紙の文字サイズを変更するには、付箋紙のタイトル部分を右クリック→「設定」→「文字サイズ」から選択可能です。
15/18/21/24/27/30からお好きなサイズを選んでください。
ちなみに、これによって変わるのはコンテンツ部分の文字サイズとなっています。

デスクトップ付箋 - 文字サイズの変更

付箋紙の表示方法の設定

付箋紙の表示方法を設定するには、付箋紙のタイトル部分を右クリック→「設定」→「表示」から選択可能です。
最上面を選択すると、常に付箋紙が一番上に表示されるようになります。
通常を選択すると、通常の表示方法となります。

デスクトップ付箋 - 表示方法の設定

付箋紙の不透明度の設定

付箋紙の不透明度を設定するには、付箋紙のタイトル部分を右クリック→「設定」→「不透明度」から選択可能です。
設定可能な不透明度は0.1~1.0の10段階となっています。
あなたが使いやすいと思う値を設定してくださいね。

デスクトップ付箋 - 不透明度の設定

ダウンロード

デスクトップ付箋は、現在Vectorにて公開中です。
以下にリンクを貼っておきますので、そこからダウンロードをしてください。
ファイルをダウンロード後、解凍してできたフォルダの中の「DesktopFusen.jar」をクリックすると起動します。

www.vector.co.jp

ちなみに、このデスクトップ付箋を動作させるためには、最新版のJava Runtime Environment(JRE)が必要になります。
もしJREがお使いのパソコンにインストールされていない場合には、以下のリンクからJREをダウンロード・インストールしてください。

java.com

一応、デスクトップ付箋はWindowsのみでの動作確認をしていますが…。
Javaで作成していますので、おそらくMacでも動くのではないかと推測されます。
Windowsの方はもちろんですが、Macの方もぜひ試してみてください。

ひとこと

今回の記事では、過去に作成した自作フリーソフト「デスクトップ付箋」の紹介をしてみました。
このデスクトップ付箋を使うと、簡単かつ手軽にデスクトップ上にメモを残すことができるようになります。

もし興味を持ってもらえたなら…。
ぜひデスクトップ付箋をダウンロードして実際に使ってみてくださいね。
感想などを頂けるとありがたいです。

Androidアプリ「CSメモ帳」をリリースしました!

こんにちは、すずしんです。

先日、私はAndroidアプリCSメモ帳」の開発を開始したことを報告しましたね。 そのアプリを今日リリースすることができましたので…。 今回の記事では、そのCSメモ帳について簡単に紹介しておこうと思います。 ぜひ使ってみてくださいね。

CSメモ帳とは?

「CSメモ帳」というのは、簡単に言ってしまうと超シンプルなメモ帳アプリです。 シンプルイズベストをモットーにしていて、メモを取ることだけに特化しています。 メモを取ること以外の余計な機能は全て省いています。 非常にシンプルな作りとなっていますので、誰でもすぐ簡単に使えるようになると思います。

主な機能

CSメモ帳の主な機能は以下の通りです。 本当に必要最小限だけですね…。

・メモの新規作成 ・メモの編集 ・メモの削除 ・メモの共有

最初の段階では、メモの検索機能も実装しようかと考えましたが…。 必ずしも必須ではないなと判断し実装を見送りました。

使い方

リスト画面

CSメモ帳 - リスト画面

リスト画面には、これまでに作成したメモのリストが表示されます。 メモを新規作成するには、右上にある「新規」アイコンをタップします。 すると、リストに新規メモが表示されます。 メモを編集するときは、その項目をタップするか、長押しして「編集」を選択してください。 メモを削除するときは、削除したいメモの項目を長押しして「削除」を選択してください。 メモを全部削除するときには、「…」をタップして表示される「全削除」を選択してください。

編集画面

CSメモ帳 - 編集画面

編集画面では、メモのテキストを編集することができます。 好きなようにテキストを入力後、右上にある「保存」アイコンをタップして保存してください。 すると、メモが保存されてリスト画面に移動します。 メモをシェアしたいときには、「共有」アイコンをタップして共有先を選択してください。 メモのテキストをクリアしたいときには、「…」をタップしてから表示される「クリア」を選択してください。

ダウンロードおよびインストール

CSメモ帳のダウンロードおよびインストールはGoogle Playからできます。 以下のリンク先にありますので、ぜひ一度試してみてください。

CSメモ帳 - とてもシンプルなメモ帳アプリ - Google Play の Android アプリ

ひとこと

メモ帳アプリというのは、あればちょっと便利ですよね。 高機能なものもたくさんありますが、メモを取るだけで十分だという方もいると思います。 そんな方は、ぜひこのCSメモ帳をお試しください。 あまりのシンプルさに驚くかもしれませんよ?

実際にCSメモ帳を使用していただいたら…。 使ってみた感想などをコメントしていただけると嬉しいです。 1人でも多くの方がこのアプリを使ってもらえるようになりたいですね。

Androidアプリ「CSメモ帳」の開発を開始しました!

プログラミング

こんにちは、すずしんです。

この度、私はAndroidアプリの新作「CSメモ帳」の開発を始めました! 今日から作成を始めて、遅くとも今月中にはリリースできるようにしたいと思っています。

CSメモ帳とは?

「CSメモ帳」というのは、簡単に言ってしまえばシンプルに使えるメモ帳アプリです。 このアプリでは、メモ帳として使える必要最小限の機能のみに絞って実装を行います。 余分な機能は一切省くことで、誰でも簡単に、そしてすぐに使えるようにすることを目的としています。 ちなみに、CSメモ帳のCSというのは「Crescendo Studio」の略です。

最初は既存のアプリ「ちょいめもFree」を書き換えて実装しようと思ったのですが…。 そうすると、仕様が大きく変わってしまうため、改めて別に作成することにしました。

実装予定の機能

CSメモ帳では、以下の機能を実装予定です。

一覧画面

一覧画面では、メモの一覧を表示します。 この画面からメモの作成・編集・削除・保存ができるようにします。 また、簡易的なメモ検索機能は搭載する予定です。

編集画面

編集画面では、メモの内容の編集ができるようにします。 ここで扱うのはテキストのみとします。

テキストにコマンドを仕込むことを予定しています。 例えば、メモに「G:TODO」と入力しておくと、TODOグループとして登録されるといった具合です。 他には、「T:Tag1」としてタグTag1を登録といった機能も付ける予定です。 これらは必須の機能ではありませんが、検索をしやすくするために実装しようと考えています。

ひとこと

CSメモ帳は、実装する機能をできるだけ絞って作成する予定です。 あまり複雑な事をする必要が無いので、作成難易度的にはそれほど高くないとは思います。 できるだけ早い時期にアプリが完成できると良いのですが…。