Javaで勇者VSドラゴンのプログラムを書いてみた

f:id:nowa0402:20210425160737p:plain
こんにちは。のわです。
現在、Javaのプログラムを勉強しています。
今回は、初めて自分で考え作成したプログラムを載せてみます。
タイトルは『勇者vsドラゴン』

まずはコードから
【Main.java

package com.nowa0402.sample;

public class Main {

	public static void main(String[] args) {
		Hero h = new Hero();
		Dragon d = new Dragon();
		boolean heroDie = false;
		boolean dragonDie = false;
		System.out.println("名前を入れてください");
		h.name = new java.util.Scanner(System.in).nextLine();
		System.out.println(h.name + "が生まれました!");
		System.out.println("これからドラゴン退治が始まります!");
		System.out.println("ドラゴンが出てきた!");
		
		System.out.println(h.name + "の現HPは" + h.hp + "です。");
		System.out.println(h.name + "の現MPは" + h.mp + "です。");
		System.out.println("回復、攻撃呪文を唱えるたびにMPは5消費されます");
     // ここから戦闘ブロック
		do {
     // 勇者側のターン。選択権を与えています。
			System.out.println(h.name + "はどうする?");
			System.out.print("1:攻撃 2:回復 3:攻撃呪文");
			int select = new java.util.Scanner(System.in).nextInt();
		// 入力値によって処理が変化
			switch (select) {
			case 1:
				h.attack(d);
				break;
			case 2:
				h.heal();
				break;
			case 3:
				h.fireBoll(d);
				break;
			}
	  // ドラゴンのターン前にドラゴンのHPが0以下か確認
			if(d.hp <= 0) {
			//もし体力がなければドラゴンが倒れ、返り値「true」がdragonDieに入る
				dragonDie = d.die();
			} else {
			//体力が残っていればドラゴンのターン、確立で【攻撃】が【火の息】か分ける
			int dSelect = new java.util.Random().nextInt(5);
			if(dSelect <= 3) {
				d.attack(h);
			} else {
				d.fire(h);
			}
		// 勇者の体力が残っているか判定
			if(h.hp <= 0) {
			//勇者の体力が0以下の場合、勇者は力尽きてゲームオーバー
				heroDie = h.die();
			} else {
			// 体力が残っている場合、残りHPとMPをお知らせ
				System.out.println(h.name + "の残HPは" + h.hp + "です。");
				System.out.println(h.name + "の残MPは" + h.mp + "です。");
			}
			}
		// 繰り返し判定「勇者とドラゴンどちらも力尽きていない場合は【do】まで戻る」
		} while (heroDie == false && dragonDie == false);
		// 最終判定「ドラゴンが力尽きたか、勇者が力尽きたかでメッセージが変わる」
		if(dragonDie == true) {
			System.out.println("見事ドラゴンを倒しました!やったね☆");
		} else if(heroDie == true) {
			System.out.println("ドラゴンを倒せませんでした。また挑戦してね!");
		}
		// 最終メッセージ
		System.out.println("遊んでくれてありがとうございました!!");
	}

}


【Hero.java

package com.nowa0402.sample;

public class Hero {
	int hp;
	int mp;
	String name;
	
	public Hero() {
		this.hp = 100;
		this.mp = 50;
	}
	
	public void attack(Dragon d) {
		System.out.println(this.name + "の攻撃!");
		d.hp -= 10;
		System.out.println("10ポイントのダメージを与えた!");
	}
	
	public boolean die() {
		System.out.println(this.name + "は力尽きた...");
		System.out.println("GAME OVER");
		return true;
	}
	
	public void heal() {
		System.out.println(this.name + "は回復呪文を唱えた!");
		if (this.mp >= 5) {
			this.mp -= 5;
			int healHp = 50;
			this.hp = Math.min(100, healHp + this.hp);
			System.out.println(this.name + "は50ポイント回復した!");
		} else {
			System.out.println("魔力が足りません!");
		}
	}
	
	public void fireBoll(Dragon d) {
		System.out.println(this.name + "は攻撃呪文を唱えた!");
		if (this.mp >= 5) {
			this.mp -= 5;
			d.hp -= 20;
			System.out.println(this.name + "は火の玉を繰り出した!");
			System.out.println("20ポイントのダメージを与えた!");
		} else {
			System.out.println("魔力が足りません!");
		}
	}
	
}


【Dragon.java

package com.nowa0402.sample;

public class Dragon {
	int hp;
	
	public Dragon() {
		this.hp = 200;
	}
	
	public void attack(Hero h) {
		System.out.println("ドラゴンの攻撃!");
		h.hp -= 10;
		System.out.println(h.name + "は10ポイントのダメージを受けた!");
	}
	
	public boolean die() {
		System.out.println("ドラゴンは倒れた!");
		return true;
	}
	
	public void fire(Hero h) {
		System.out.println("ドラゴンは火の息を繰り出した!");
		h.hp -= 20;
		System.out.println(h.name + "は20ポイントのダメージを受けた!");
	}
}

Hero.javaとDragon.javaでフィールドとメソッドを作成。
Main.javaでシナリオを進めています。

個人的に考えたのは『繰り返し処理を何で判定するか』です。
繰り返し処理はwhile文になります。
判定基準はどちらかのHPが0になることまではイメージできていました。
それをどうやって表現するか。。。


考えた結果、私の答えは
『booleanで返り値つけて判定するか』
でした。

booleanは簡単に説明すると『真偽値』
正しければ『true』を間違っていれば『false』を返します。

つまり
『繰り返し処理を何で判定するか』については
『繰り返し処理は勇者、ドラゴンがどちらかが倒れていれば抜け出す』
になります。


この処理を実現したのが以下の文になります。

【Hero.java

public boolean die() {
		System.out.println(this.name + "は力尽きた...");
		System.out.println("GAME OVER");
		return true;
	}

【Dragon.java

public boolean die() {
		System.out.println("ドラゴンは倒れた!");
		return true;
	}

【Main.java

while (heroDie == false && dragonDie == false);

Hero.javaとDragon.javaのDieメソッドに返り値『true』を付けています

Main.javaでは繰り返し判断(while文)で
 ○どちらか倒れていれば(trueの返り値が来ていたら)繰り返し終了
 ○どちらも生きていれば(trueの返り値が来ていない)繰り返し処理『do』の位置まで戻る
を実現しています。


今回のプログラム紹介は以上になります。

ただ、これから修正していきたい点はたくさんあります。
例えば
・名前の入力後にその名前で問題ないか問い合わせる。
・選択肢で数字を間違えたら、再度選択肢画面に戻る
・勇者以外の職も作ってみる
・ドラゴンだけではなく他のモンスターも作る
などなど...

まずは『一つ作り上げる』
これを目標にしていたので達成できて良かったです!


今後は
・このプログラムをアップデートしていくこと
Java Silverの資格勉強
にフォーカスしつつ引き続き勉強頑張っていきたいと思います!

【合格体験記】LPIC101に合格したので勉強方法をご紹介

f:id:nowa0402:20210416190905p:plain
こんにちは。のわです。
本日(2021.04.16)に無事LPIC101試験を合格できました!
f:id:nowa0402:20210416191047j:plain

今回は勉強~受験までの道のりを書き残したいと思います。
私と同じく受験しようと思っている方がいれば是非参考にしていただければ幸いです。

【勉強期間】

 ・期間は1ヶ月半程度
 ・勉強時間は平日2時間、休日6時間

【勉強方法】

参考書

  今回の受験にあたって、下記の参考書を購入しました。
 ①『1週間でLPICの基礎が学べる本』
  

1週間でLPICの基礎が学べる本 第3版 (1週間シリーズ)

1週間でLPICの基礎が学べる本 第3版 (1週間シリーズ)

  • 作者:中島 能和
  • 発売日: 2019/06/20
  • メディア: 単行本(ソフトカバー)

 ②『Linux教科書 LPICレベル1』通称『あずき本』
  

Linux教科書 LPICレベル1 Version5.0対応

Linux教科書 LPICレベル1 Version5.0対応

  • 作者:中島 能和
  • 発売日: 2019/04/08
  • メディア: 単行本(ソフトカバー)

 ③『Linux教科書 LPICレベル1 スピードマスター問題集』
  

Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応

Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応

 

勉強の仕方について

  ※勉強する前に
   LPIC試験は実際に実機でコマンドを叩きながらやるのが体系的に覚えられるのでLinuxをインストールすることをおすすめします!
   Linuxの参考書を購入(上記参考書なら①と②)すると仮想環境の構築法が載っていると思いますのでそれを見ながらやればOKです!
  
(1)学習開始~2週間 「①の参考書をすすめる」
   ①の基礎本を進めながら実際にコマンドを叩いてみます。
   一週間で学べるとありますが私は2週間かかりました。。。意外と1日のボリュームがあります。
   それと参考書の説明がとても分かりやすいです。
   この後あずき本が出てきますが説明の理解しやすさは圧倒的に基礎が学べる本です。

(2)2週間経過~4週間目まで 「あずき本とスピードマスターを一周する」
   ①の参考書を終了後に②のあずき本にとりかかりました。
   私は単元ごとにあずき本をやったら③のスピマスをやるをしながら勉強を進めました。
   また、スピマスの他に私は『Ping-t』という勉強サイトを活用していました。
   あずき本⇒スピマス⇒Ping-tの演習問題 を単元ごとに繰り返す形です。
   2週間を目処に模試以外を終わらせました。

(3)4週間目~試験前日まで 「模試と苦手分野を集中的に勉強する」
   ここからは追い込みをかけていきました。
   あずき本、スピマス、Ping-tにある模試を80%超えるよう繰り返し勉強しました。
   一番お世話になったのはPing-tです。
   解説が一番分かりやすいので何故そうなるのか理解しやすいです。
   正解を覚えるのではなく解説を読み込んで実際にコマンドを打ちながら進めていきました。
   試験前日までに90%を安定して取れるようにしました。
   また、このときに苦手分野の単元を毎日勉強して頭に叩き込んでいました。

  (4)試験当日
   試験当日はあずき本のチェックシートを使って、不安な箇所を今一度整理しました。
   試験中、最も苦しめられたのは日本語訳がおかしい箇所があるところです。
   後はスピマスの模試問題で出てくる問題がいくつかありました。
   

勉強のポイント

  勉強するにあたってのポイントですが
   ・実機で操作
   ・わからない言葉は自分で調べながらすすめること
   ・ノートにまとめてみる
  個人的には一番最後に記載した「ノートにまとめる」のが一番良かったと思っています。
  ○ノートにまとめる=情報を整理するので頭の整理にもなる
  ○コマンドやファイルパスを書く事で記憶力があがる
  それと私はTwitterもやっているのですが
  毎日今日理解したことを整理して発信していました!
  ノートにまとめると同じ効果+140文字で伝えるという制限があるので
  情報をより細かく整理する力がつき、より理解が深まると思います!

【感想】

 Linuxの基礎を学びつつすすめる事ができたので個人的には大満足です。
 ただ、まだまだ理解出来ていない箇所もあるので引き続き参考書にはお世話になるかなと思います。
 LIPC1の認定には102の試験もあるので引き続き頑張りたいと思います!

Linux LIPC1対策日記_パッケージ管理について

f:id:nowa0402:20210409175550p:plain
こんにちは。のわです。


今回は現在勉強中のLinux LPIC101から
パッケージ管理についての備忘録を書き留めておきます。

 因みに使用している参考書はこちら(小豆本です)

Linux教科書 LPICレベル1 Version5.0対応

Linux教科書 LPICレベル1 Version5.0対応

  • 作者:中島 能和
  • 発売日: 2019/04/08
  • メディア: 単行本(ソフトカバー)

パッケージ管理コマンドで一番苦労しているのが
『形式によってオプションが全然違う』
ことです。
※両者形式については以下の通り
 ◎Debian形式(Debian系のディストリビューション)
  dpkg、aptコマンド
 ◎RPM形式(Red Hat系のディストリビューション)
  rpmyumコマンド

 
例えばオプションが下記だったとします。

 -l または --list オプション

この場合
dpkgコマンドで実行すると『インストール済パッケージを検索して表示』
rpmコマンドで実行すると『指定したパッケージに含まれるファイルを表示』
という意味になります。(※説明は参考書より引用)

教科書の説明からして何言っているんだ…といった感じですが
いい機会なので自分なりの言葉で共通部分の整理をしたいと思います。


①『パッケージの情報を表示』

dpkg -s パッケージ名
dpkg --status パッケージ名
rpm -qi パッケージ名
rpm -q --info パッケージ名



②『指定パッケージから生成されたファイルを表示』

dpkg -L パッケージ名
dpkg --listfiles パッケージ名
rpm -ql パッケージ名
rpm -q --list パッケージ名



③『指定ファイルを生成したパッケージを表示』

dpkg -S ファイル名
dpkg --search ファイル名
rpm -qf ファイル名



④『全パッケージ一覧を表示』

dpkg -l 
dpkg --list 
rpm -qa 
rpm -q --all 


とても簡易的ですが、参考にしていただければ幸いです。

Java:import文を少し理解した話

こんにちは、のわです。
今回はJavaプログラミング勉強中にちょっとした躓きについて話したいと思います。
現在、スッキリわかるJava入門編の参考書をもとに勉強しています。

スッキリわかるJava入門 第3版 (スッキリシリーズ)

スッキリわかるJava入門 第3版 (スッキリシリーズ)

その中で日付と時刻を扱う章があるのですが、躓き、学んだ出来事があったので備忘録として記録したいと思います。

現在日時を取得する方法にjava.util.Dateクラスがあります。
参考書のサンプルコードは以下の通り

import java.util.Date;

public class Main {
  public static void main(String[] args) {
    Date d = new Date();  //現在日時を取得するDateインスタンスを生成する
    System.out.println(d);
  }
}

最初に当該クラスをimportするようになっています。

これを私はimportしないでやってみよう!と考えました。
そして書いたプログラムコードは以下の通り

public class Main {
  public static void main(String[] args) {
    Date d = new java.util.Date();  //importしなかったDateクラスをここで指定
    System.out.println(d);
  }
}

これで問題ないと思っていました。しかし、コンパイルすると以下のエラー文が発生
Main.java:3: エラー: シンボルを見つけられません
Date d = new java.util.Date();
^
シンボル: クラス Date
場所: クラス Main
エラー1個

「え、シンボルエラー?クラスあるじゃん」
と思ったが最後、なかなか解決策が出ず苦労しました。。。






そのまま諦めようかと思っていた時、ふと気が付きました。
「これって、FQCNで指定するのか?」
FQCN(Full Qualified Class Name)とはパッケージを含むクラス名を指定すること
簡単にいうなら正式名称です。
それを踏まえるとDateクラスは以下のような意味合いになります
Dateクラスはjava.utilパッケージ内のDateクラスである
つまり、私の書いたプログラムを修正すると

public class Main {
  public static void main(String[] args) {
    //Dateクラスにパッケージ名を追加
    java.util.Date d = new java.util.Date();  
    System.out.println(d);
  }
}

のようになります。
これだとコンパイルが成功し、現在の時刻を表示することが可能になります。

では、なぜインスタンスにはパッケージ名をつけたのに
クラスにはつけていなかったのか
以下のコードをご覧ください

public class Main {
  public static void main(String[] args) {
    int r = new java.util.Random().nextInt(10);  
    System.out.println(r);
  }
}

上記コードは0〜9までのランダムな数値をint型の変数rに格納し表示するコードです。

最初、私の頭の中にこれがよぎり
「型 変数名 = new クラス名」だったなと勝手に変換していました。

インスタンスの生成は
「クラス名 変数名 = new クラス名();」
が基本の形でだったことを失念していました。。。


というわけでまとめると
インスタンスの生成は「クラス名 変数名 = new クラス名();」の形
・クラス名の指定は二通り
 ①パッケージを含むクラス(FQCN)で指定すること
 ②事前にパッケージを含むクラスをimportし、クラスのみ記載する

初歩的なミスですが、分かっただけですごく嬉しかったです
こういった気づきを大切にしていきたいなと思います!

このブログについて

皆様初めまして。『のわ』と申します。

このブログはエンジニア転職を目指す過程での勉強アウトプット、備忘録になります。

 

初めに私の現状についてお話させていただきます。

 ・25歳 現鉄道会社勤務

 ・2021年1月よりネットワーク関係の勉強を開始

 ・2月にITパスポートを取得

 ・3月からLinux(LPIC1)とネットワークの基礎、プログラミングの学習開始

 

プログラミング言語ですが、私はJavaを選択しました。

理由は『需要の高さと何でも出来る器用さ』に惹かれたから...。

そのため、備忘録も主にJava関係がメインになると思います。

 

 今後の予定ですが

 ・ネットワーク全般の用語解説

 ・Linux LPIC試験までの備忘録

 ・Javaの勉強、Javasilver試験までの備忘録

この辺りを書き留めていきたいと思います。

 

どうぞよろしくお願いします!