Javaプログラミング入門
じゃんけん
最終更新:
javatutorial
-
view
1. 何を作るか
今回は、コンソール(黒い画面)上で動く「じゃんけんゲーム」を作ります。
じゃんけんといえば「グー・チョキ・パー」ですが、プログラミングの世界では、言葉をそのまま扱うよりも数文字や数字に置き換えて考えると、コンピュータにとって計算しやすくなります。
まずは、じゃんけんの手を「0・1・2」の数字に置き換えてみましょう。
じゃんけんといえば「グー・チョキ・パー」ですが、プログラミングの世界では、言葉をそのまま扱うよりも数文字や数字に置き換えて考えると、コンピュータにとって計算しやすくなります。
まずは、じゃんけんの手を「0・1・2」の数字に置き換えてみましょう。
| じゃんけんの手と数値 | |
|---|---|
| 数値 | じゃんけんの手 |
| 0 | グー |
| 1 | チョキ |
| 2 | パー |
いきなり完成したプログラムを書こうとすると、頭が混乱してしまいます。
意図した処理を行わせるためには、「どの順番で考えるか」という論理的な思考がとても大切です。
今回は以下のスモールステップで、少しずつプログラムを組み立てていきます。
意図した処理を行わせるためには、「どの順番で考えるか」という論理的な思考がとても大切です。
今回は以下のスモールステップで、少しずつプログラムを組み立てていきます。
1. 入力:プレイヤー(あなた)がキーボードから数字を打ち込む
2. 乱数:コンピュータがランダムに数字を選ぶ
3. 条件分岐と勝敗判定:二つの数字を比べて、勝ち・負け・あいこを決める
2. 乱数:コンピュータがランダムに数字を選ぶ
3. 条件分岐と勝敗判定:二つの数字を比べて、勝ち・負け・あいこを決める
それでは、さっそく順番に作っていきましょう!
ステップ1:プレイヤーの入力
まずは、プレイヤーがキーボードから「0・1・2」のどれかを入力できるようにします。
入力を受け取るためには、これまで学んだ Scanner を使います。
入力を受け取るためには、これまで学んだ Scanner を使います。
サンプル:Janken.java
- import java.util.Scanner;
-
- public class Janken {
-
-
- int playerHand = scanner.nextInt();
- }
- }
【解説】
ここでは、変数 playerHand を用意して、プレイヤーが入力した数字を記憶させています。
実行して「1」と入力すると、画面に「あなたの手は 1 です。」と表示されるはずです。
これで「入力」の部分は完成です。
ここでは、変数 playerHand を用意して、プレイヤーが入力した数字を記憶させています。
実行して「1」と入力すると、画面に「あなたの手は 1 です。」と表示されるはずです。
これで「入力」の部分は完成です。
ステップ2:コンピュータの乱数
次はコンピュータの番です。
毎回同じ手を出してくるコンピュータではゲームになりませんから、毎回ランダムに手を変える仕組みが必要です。
ここで登場するのが 乱数 です。
Random を使って、0から2までの数字をランダムに作ります。
毎回同じ手を出してくるコンピュータではゲームになりませんから、毎回ランダムに手を変える仕組みが必要です。
ここで登場するのが 乱数 です。
Random を使って、0から2までの数字をランダムに作ります。
サンプル:Janken.java
- import java.util.Scanner;
- import java.util.Random;
-
- public class Janken {
- int playerHand = scanner.nextInt();
-
- int computerHand = random.nextInt(3);
- }
- }
【解説】
新しく random.nextInt(3) という命令を追加しました。
これは「0、1、2」の中からランダムに一つ数字を選んでくれる便利な機能です。選ばれた数字は、変数 computerHand に記憶させています。
これで、プレイヤーとコンピュータ、両方の手が揃いました!
新しく random.nextInt(3) という命令を追加しました。
これは「0、1、2」の中からランダムに一つ数字を選んでくれる便利な機能です。選ばれた数字は、変数 computerHand に記憶させています。
これで、プレイヤーとコンピュータ、両方の手が揃いました!
ステップ3:条件分岐による勝敗判定
最後に、二つの数字を比べて勝敗を決めます。
「もし〜なら」という判断をするためには、条件分岐(if文)を使います。
「もし〜なら」という判断をするためには、条件分岐(if文)を使います。
サンプル:Janken.java
- import java.util.Scanner;
- import java.util.Random;
-
- public class Janken {
- int playerHand = scanner.nextInt();
-
- int computerHand = random.nextInt(3);
-
- if (playerHand == computerHand) {
- } else if ((playerHand == 0 && computerHand == 1) ||
- (playerHand == 1 && computerHand == 2) ||
- (playerHand == 2 && computerHand == 0)) {
- } else {
- }
- }
- }
【解説】
if文を使って、以下の3つのパターンに分けています。
1. あいこ:プレイヤーの手とコンピュータの手が全く同じ (==) 場合です。
2. 勝ち:プレイヤーが勝つ条件は3つあります。「自分がグー(0)で相手がチョキ(1)」または「自分がチョキ(1)で相手がパー(2)」または「自分がパー(2)で相手がグー(0)」です。これを &&(かつ)と ||(または)を使って繋ぎました。
3. 負け:あいこでも勝ちでもない場合は、自動的に「負け」になります(else で処理します)。
if文を使って、以下の3つのパターンに分けています。
1. あいこ:プレイヤーの手とコンピュータの手が全く同じ (==) 場合です。
2. 勝ち:プレイヤーが勝つ条件は3つあります。「自分がグー(0)で相手がチョキ(1)」または「自分がチョキ(1)で相手がパー(2)」または「自分がパー(2)で相手がグー(0)」です。これを &&(かつ)と ||(または)を使って繋ぎました。
3. 負け:あいこでも勝ちでもない場合は、自動的に「負け」になります(else で処理します)。
実行結果
じゃんけんゲームを開始します!
あなたの手を入力してください(0:グー, 1:チョキ, 2:パー): 1
コンピュータの手は 2 です。
結果:あなたの勝ちです!よくあるまちがいと注意点
💡注意! 等価演算子(==)と代入演算子(=)を間違える
if文の中で条件を書くとき、if (playerHand = computerHand) と書いてしまうのは初心者がとてもよくやるミスです。
「=」が1つだと、変数に値を「入れる(代入)」という意味になってしまいます。
二つの値が「同じかどうか比べる」ときは、必ず「==」と2つ並べて書きましょう。
if文の中で条件を書くとき、if (playerHand = computerHand) と書いてしまうのは初心者がとてもよくやるミスです。
「=」が1つだと、変数に値を「入れる(代入)」という意味になってしまいます。
二つの値が「同じかどうか比べる」ときは、必ず「==」と2つ並べて書きましょう。
💡注意! 想定外の数字が入力されたら?
もしプレイヤーが「3」や「100」といった数字を入力したらどうなるでしょうか?
現在のプログラムでは「勝ち」や「あいこ」の条件に当てはまらないため、すべて else の処理に入ってしまい「あなたの負けです!」と表示されてしまいます。
今回は完璧に対処しなくても大丈夫ですが、「ユーザーは必ず正しい数字を入れてくれるとは限らない」と意識しておくことは、プログラミングにおいて非常に重要です。
もしプレイヤーが「3」や「100」といった数字を入力したらどうなるでしょうか?
現在のプログラムでは「勝ち」や「あいこ」の条件に当てはまらないため、すべて else の処理に入ってしまい「あなたの負けです!」と表示されてしまいます。
今回は完璧に対処しなくても大丈夫ですが、「ユーザーは必ず正しい数字を入れてくれるとは限らない」と意識しておくことは、プログラミングにおいて非常に重要です。
コラム:アルゴリズムの工夫でコードを短くする?
今回は if 文を使って、「自分がグーで相手がチョキなら…」とすべての勝ちパターンを正直に書きました。
しかし、少し高度な話になりますが、「引き算」と「割り算の余り」を組み合わせた計算式を使うと
なんとこの長い if 文を1行の計算式で判定することができます。
しかし、少し高度な話になりますが、「引き算」と「割り算の余り」を組み合わせた計算式を使うと
なんとこの長い if 文を1行の計算式で判定することができます。
たとえば、「 (プレイヤーの手 - コンピュータの手 + 3) % 3 」という数式を計算すると、
その答えが「0ならあいこ、1なら負け、2なら勝ち」と綺麗に分かれるのです!
不思議ですよね。プログラミングは、こうした数学のような「アルゴリズム(計算手順)の工夫」を知ることで
長いコードを魔法のように短くすることができる面白さを持っています。今はまだ「そんな方法もあるんだな」と知っておくだけで十分です!
その答えが「0ならあいこ、1なら負け、2なら勝ち」と綺麗に分かれるのです!
不思議ですよね。プログラミングは、こうした数学のような「アルゴリズム(計算手順)の工夫」を知ることで
長いコードを魔法のように短くすることができる面白さを持っています。今はまだ「そんな方法もあるんだな」と知っておくだけで十分です!









