"Simple" is "Best"

開発時に詰まったところや 調べた結果日本語での情報が無かったり古かったりした場合に自分用のメモとして高校生(?)が更新していくブログ

JAVAでコマンド版カウントダウンをしてみる

たまに、Youtubeなどで

コマンドプロンプト上で動くゲームを作る実況動画なるものがあるが

全てC系統で組んでいる

何故JAVAがないのかを考えてみると

System("cls")

がないことに気づく

素直にC系統を勉強して作ればいいだけかもしれないが

たまたまこのような記事を見つけたので

応用(と言うなの丸パクリ)してコマンドライン上で動く

カウントダウンアプリ(?)を作ってみる

 

使うもの

特筆して使うものは以下の2つ

  1. Thread.sleep()
  2. Process(ProcessBuilder)

 

大まかな仕組み

仕組みというほど大げさなものではないが

Whileループの中でSystem.out.printを使って一秒単位で画面上に秒数を表示する

画面の更新にはSE7から追加されたProcessを使う

1,2共にエラーをTry-catchしないといけないので

前回同様実装時には適切なエラー処理を

 

ソースコード

public class Main {
	public static void main ( String[] args ) {
		int c = 0;
		ProcessBuilder pb = new ProcessBuilder( "cmd", "/c", "cls" );
		while ( c < 10 ) {
			try {
				pb.inheritIO().start().waitFor();
				System.out.print( c );			//printlnではなくprint
				Thread.sleep( 1000 );
			} //以下エラー処理(省略)
			catch( InterruptedException iue ){} 
			catch( IOException ioe ){}
			c++;
		}
	}
}

これぞ5分クオリティ

 

解説(と言うかメモ)

見て一発でわかるプログラムなもんだから書くことなどなにもないのだが

ProcessBuilder pb = new ProcessBuilder( "cmd", "/c", "cls" );
pb.inheritIO().start().waitFor();

参考にしたサイトの方がよくわからないと仰っていたこの部分だけ調べたのでメモ

参考サイトの方では変数を使わず直接繋げてやっていられた

個人的にはこっちのほうが理解しやすかったのと

Whileの中でインスタンスを毎回生成すると言う無駄なことを防ぐためにこうした

 

一行目は普通のインスタンス作成

どうやら第一引数に起動したいプログラム名(?)

それ以降にそれぞれ分けてそのコマンドの引数

上記だと

コマンドプロンプト上でclsを実行する

というProcessBuilderインスタンスを作ることになる

次の行は1つずつ分解して考えてみる

 

inheritIO()

返り値はProcessであることに注意

リファレンスを見てみると

サブプロセスの標準入出力の入力元と出力先を、
現在の Java プロセスと同じものに設定します。

 とある

簡単に言えば

”結果をいま実行しているコマンドライン上に表示する”といった感じ(あくまでも感じ)

今回はclsなので動かしているコマンドライン上の画面がクリアされる

start()

これも返り値はProcess

名前の通り登録したプロセスを実行するメソッド

コヤツはいくつかエラーを吐くので

詳しくはこちらを確認

waitFor()

ラスト

返り値はint型、所謂終了コードを返してくれる

これは要求したプロセス(ここではcls)が終了するまで

JAVAの処理を中断するというもの

 

以上

これで二行目の文の説明(?)終了

 

もう少し実用的にするのであれば

最初に数値入力を促すウェザードを実装するか

引数で秒数を取得するなどして

時間の上限を動的にするといいかも

 

今後

最初に書いたように

コマンドライン上で動くゲームをJAVA作りたい

そんなこと考えながら

まず第一歩として画面の更新の方法をまとめてみた

そのうちに連載企画としてやってみたい