JAVAでコマンド版カウントダウンをしてみる
たまに、Youtubeなどで
コマンドプロンプト上で動くゲームを作る実況動画なるものがあるが
全てC系統で組んでいる
何故JAVAがないのかを考えてみると
System("cls")
がないことに気づく
素直にC系統を勉強して作ればいいだけかもしれないが
応用(と言うなの丸パクリ)してコマンドライン上で動く
カウントダウンアプリ(?)を作ってみる
使うもの
特筆して使うものは以下の2つ
Thread.sleep()
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の処理を中断するというもの
以上
これで二行目の文の説明(?)終了
もう少し実用的にするのであれば
最初に数値入力を促すウェザードを実装するか
引数で秒数を取得するなどして
時間の上限を動的にするといいかも
今後
最初に書いたように
そんなこと考えながら
まず第一歩として画面の更新の方法をまとめてみた
そのうちに連載企画としてやってみたい