Javaプログラミング入門
反射神経ゲーム
最終更新:
javatutorial
-
view
1. 何を作るか
今回は、コンソール上で動く「反射神経ゲーム」を作ってみましょう!
ルールはとても簡単です。
「スタート!」と画面に表示されたら、できるだけ早く「エンターキー」を押します。
画面の合図から、あなたがキーを押すまでにかかった時間を測り、結果を秒単位で表示するゲームです。
「スタート!」と画面に表示されたら、できるだけ早く「エンターキー」を押します。
画面の合図から、あなたがキーを押すまでにかかった時間を測り、結果を秒単位で表示するゲームです。
このゲームを作ることで、プログラミングにおいて非常に重要な 時間計測 の方法と、プレイヤーの操作を待つ「入力待機」の仕組みを学びます。
難しそうに聞こえるかもしれませんが、今までに学んだ知識に少しの工夫を足すだけで作れますよ!
難しそうに聞こえるかもしれませんが、今までに学んだ知識に少しの工夫を足すだけで作れますよ!
2. スモールステップでの実装
ステップ1:開始時間を記録する
まずは、時間を測るための準備をしましょう。
Javaには現在の時間を教えてくれる System.currentTimeMillis() という便利な機能があります。
これを使って、ゲームが始まった瞬間の時間を記録します。
コンピュータの世界では、時間は ミリ秒(1秒の1000分の1)という単位で扱われます。
Javaには現在の時間を教えてくれる System.currentTimeMillis() という便利な機能があります。
これを使って、ゲームが始まった瞬間の時間を記録します。
コンピュータの世界では、時間は ミリ秒(1秒の1000分の1)という単位で扱われます。
- public class Main {
-
- // 現在の時間を取得して変数に入れる
- }
- }
【解説】
6行目:現在の時間を ミリ秒 で取得し、 startTime という変数に保存しています。
非常に大きな数字になるため、int型ではなくlong型を使っているのがポイントです。
6行目:現在の時間を ミリ秒 で取得し、 startTime という変数に保存しています。
非常に大きな数字になるため、int型ではなくlong型を使っているのがポイントです。
ステップ2:入力を待つ
次に、プレイヤーがエンターキーを押すのを待つ仕組みを作ります。
文字の入力でおなじみの Scanner を使います。
文字の入力でおなじみの Scanner を使います。
- import java.util.Scanner;
-
- public class Main {
-
-
-
- // エンターキーが押されるまでここで待機する
- scanner.nextLine();
-
- }
- }
【解説】
5行目:キーボードからの入力を受け取るために Scanner を準備しています。
12行目:scanner.nextLine() は、プレイヤーがエンターキーを押すまでプログラムの動きをピタッと止めて待ってくれる命令です。
これが「入力待機」の役割を果たします。
5行目:キーボードからの入力を受け取るために Scanner を準備しています。
12行目:scanner.nextLine() は、プレイヤーがエンターキーを押すまでプログラムの動きをピタッと止めて待ってくれる命令です。
これが「入力待機」の役割を果たします。
ステップ3:終了時間を記録し、かかった時間を計算する
最後に、エンターキーが押された瞬間の「終了時間」を記録し、どれくらい時間がかかったかを計算します。
「終了時間」から「開始時間」を引けば、かかった時間がわかりますね。
「終了時間」から「開始時間」を引けば、かかった時間がわかりますね。
- import java.util.Scanner;
-
- public class Main {
-
-
- // 1. 開始時間を記録
-
- // 2. エンターキーが押されるのを待つ
- scanner.nextLine();
-
- // 3. 終了時間を記録
-
- // 4. かかった時間を計算(終了時間 - 開始時間)
- long diffTime = endTime - startTime;
-
- // 5. ミリ秒を秒に変換して表示(1000.0で割る)
- double seconds = diffTime / 1000.0;
-
- scanner.close();
- }
- }
【解説】
18行目:キーが押された直後の時間を endTime(終了時間)として記録します。
21行目:終了時間から開始時間を引いて、かかった時間(ミリ秒)を計算し、diffTime に入れています。
24行目:ミリ秒のままでは人間にはわかりにくいので、1000.0 で割って「秒」に変換し、double型の変数に入れています。
18行目:キーが押された直後の時間を endTime(終了時間)として記録します。
21行目:終了時間から開始時間を引いて、かかった時間(ミリ秒)を計算し、diffTime に入れています。
24行目:ミリ秒のままでは人間にはわかりにくいので、1000.0 で割って「秒」に変換し、double型の変数に入れています。
=== 反射神経ゲーム ===
「スタート!」と出たら素早くエンターを押してください。
スタート!
あなたの記録は 0.453 秒でした!
3. よくあるまちがいと注意点
💡注意! ミリ秒から秒への変換ミス
かかった時間を秒に直すとき、 diffTime / 1000 と書いてしまうと、思わぬ落とし穴にはまります。
Javaでは「整数 ÷ 整数」の計算結果は「整数」になってしまうため、小数点以下が切り捨てられて「0秒」や「1秒」といった大雑把な記録になってしまいます。
正確に「0.45秒」のように計算するには、 1000.0 と小数で割るか、キャストを使って (double)diffTime / 1000 と書く必要があります。
かかった時間を秒に直すとき、 diffTime / 1000 と書いてしまうと、思わぬ落とし穴にはまります。
Javaでは「整数 ÷ 整数」の計算結果は「整数」になってしまうため、小数点以下が切り捨てられて「0秒」や「1秒」といった大雑把な記録になってしまいます。
正確に「0.45秒」のように計算するには、 1000.0 と小数で割るか、キャストを使って (double)diffTime / 1000 と書く必要があります。
💡注意! 変数の型間違い(int型とlong型)
時間を記録する変数をいつものクセで int startTime と書いてしまうとエラーになります。
System.currentTimeMillis() で取得できるミリ秒は非常に桁が大きい数字(13桁以上)なので、int型(約21億まで)の箱には入りきらず、データがあふれてしまいます(オーバーフローと呼ばれます)。
時間をミリ秒で扱うときは、必ず大きな数字が入る long型 を使いましょう。
時間を記録する変数をいつものクセで int startTime と書いてしまうとエラーになります。
System.currentTimeMillis() で取得できるミリ秒は非常に桁が大きい数字(13桁以上)なので、int型(約21億まで)の箱には入りきらず、データがあふれてしまいます(オーバーフローと呼ばれます)。
時間をミリ秒で扱うときは、必ず大きな数字が入る long型 を使いましょう。
コラム:コンピュータは「1970年」から時間を数えている?
時間を取得するときに使った System.currentTimeMillis() という不思議な名前の命令。
実はこれ、「今何時何分か」を見ているわけではありません。
コンピュータの世界には「UNIXエポック」と呼ばれる基準のタイミングがあります。
それは 1970年1月1日 午前0時0分0秒 です。
System.currentTimeMillis() は、「この1970年の基準時刻から、今この瞬間までに何ミリ秒経過したか」という途方もなく大きな数字を数え続けているのです。
実はこれ、「今何時何分か」を見ているわけではありません。
コンピュータの世界には「UNIXエポック」と呼ばれる基準のタイミングがあります。
それは 1970年1月1日 午前0時0分0秒 です。
System.currentTimeMillis() は、「この1970年の基準時刻から、今この瞬間までに何ミリ秒経過したか」という途方もなく大きな数字を数え続けているのです。
| 人間の時間とコンピュータの時間の違い | |
|---|---|
| 人間の時間の捉え方 | コンピュータの時間の捉え方 |
| 時計を見て「12時00分」 | 1970年から「〇〇〇〇〇〇〇〇ミリ秒経過」 |
私たちが普段見ている時計とは全く違う形で、コンピュータは時間を把握しているんですね。









