1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Java開発の基本~プログラムの書き方*演習1~

Last updated at Posted at 2019-06-16

Java開発の基本~プログラムの書き方*演習~

今までの知識を使って簡単な演習をしてみましょう。

必要な知識

  • 変数と型
  • 条件分岐
  • フローチャート
    今までこのページに記載しきた内容だけでは不十分なので適宜ググりながらやってみてください。

問題1-1

フローチャートを参考にして「グーしか出さないじゃんけん」を実装して必ず自分が勝つプログラムを実装してください。
じゃんけんの勝ち負けの判定はこのページを参考にしてください。
じゃんけん.png

問題1-2

「グーしかださないじゃんけん」をチョキしか出さないじゃんけんに変更してください。

問題1-3

「グーしか出さないじゃんけん」をグー以外も出す普通のじゃんけんに変更してください。 ただし、あいこの場合は繰り返さず「あいこ」を結果として出力してください。

問題1-4

自分の手を外部から値を入力できるようにして、勝負のごとに結果を表示してください。勝つまで終われないじゃんけんプログラムを作成してください。また、勝つまでにかかった回数を最後に表示してください。


回答

問題1-1

Janken.java
package janken;
public class Gudake {
	public static void main(String[] args) {
		//一回セットしたら変更しない変数は"final"をつけて定数かします。・・・①
		final int GUU=0;
		final int CHOKI=1;
		final int PA=2;
		//自分と敵の手をセット・・・②
		int myHand=PA;
		int enemyHand=CHOKI;
		//条件式
		//この条件式は分けた方がコード的に綺麗か・・・③
		if(((myHand-enemyHand)%3)==2) {
			System.out.println("あなたの勝ちです");
		}else {
			System.out.println("そんなはずはありません");
		}
	}
}

解説)

  • プログラム全体について
    フローチャートにもありますが、今回は勝ち負けのケースしか考えません。この辺常識にとらわれず仕様通りに実装してください。


  • グー、チョキ、パーにそれぞれ数字を当てはめます。当てはめなくてもプログラムは動きますが他の人が読んだ時にそれぞれの数字が何を指しているか分からなくなります。意味はあるけど何を指しているか分からない数字はマジックナンバーと言い、この書き方をすると後生文句を言われ続けます。
    今回のグー、チョキ、パーの値はそれぞれ変更することはないので型の前にfinalをつけて定数化しましょう。
    定数化すると、値を書き換えられなくなります。試しに書き換えてみてください。
    定数は変数と異なり、全て大文字で書く決まりです。


  • 自分の手と敵の手をセットします。変数はラクダ文字(ラクダの背中みたいに大文字小文字を混ぜる)で書きましょう。
    今回はソースコードにベタ書きでいいです。


  • 条件判定をします。if分の中で値を計算していますが、基本的に直接計算式を条件式の中に入れるのはよくないです・・・
    ただ、今回は分岐が一回しかない、かつ使い捨てのサンプルコードなので。。。

問題1-2

1-1のenemyHand=GUenemyHand=CHOKIに変更するだけです。
もし、グー、チョキ、パーを定数化していなかったらどの数がそれぞれどの手に対応するか忘れる終了ですが、今回のように定数化しているとプログラムの修正も容易になります。

問題1-3

Janken.java
package janken;
import java.util.Random;
public class Janken {
	public static void main(String args[]) {
		final int GUU=0;
		final int CHOKI=1;
		final int PA=2;
		int myHand=CHOKI;
		//相手の手をランダムに設定します。・・・①
        Random roundom = new Random(2);
		int enemyHand=roundom.nextInt(3);
		//ifで書く場合・・・②
		//勝敗条件をあらかじめ計算する・・・③
		int winningResult=((myHand-enemyHand)%3);
		if(winningResult==0){
			System.out.println("アイコです");
		}else if (winningResult==1) {
			System.out.println("負けです");
		}else {
			System.out.println("勝ちです");
		}
		//swichで書く場・・・④
		switch((myHand-enemyHand)%3){
			case 0:
				System.out.println("アイコです");
				break;
			case 1:
				System.out.println("負けです");
				break;
			case 2:
				System.out.println("勝ちです");
				break;
		}
	}
}
  • このプログラムについて
    普通のじゃんけんですがあいこの場合に繰り返さないことに注意しましょう。
    勝ち、負け、あいこがあり判定には3パターンります。


  • ランダムな数を生成する時にはRandom roundom = new Random(2);を使いました。java ランダムなどで計算するとサンプルプログラムがたくさん出てくるので参考にしましょう。javaにはこのようにやりたいことを一行で実現してくれるパーツがたくさんあるので、適宜検索して使いましょう。


  • 勝ち、負け、あいこの3パターンの分岐がありますが、javaはyes no問題しか答えられません。yes no問題で3パターン網羅できるようにフローを考えましょう。


  • 3パターンの分岐をするため、複数回条件判定をしています。別にif分の中に判定式を書いてもいいのですが、もし判定式が誤っている場合修正箇所が増えてしまいます。
    プログラムにバグが発生することも考慮して判定式は外に切り出しましょう。


  • 今回の場合はifを使うよりもswitchを使って書いた方がスッキリするかもしれません。一応switchで分岐させる場合も記載しておきます。

問題1-4

フローチャートから書く必要ありそうで、ちょっと大変なので要望あれば追記します。。。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?