プログラム実習(問21~問30) -後期課題-

■ルール

	・25問以上解答で合格
	・問題の合否は中地が判断する
	・提出記述は1/27(18:10)まで
	・提出時はTask02_名前(ローマ字表記)というフォルダを作成し、
	 そこにプロジェクトを入れて提出すること
	・コンパイルは必ず通るものを作成すること
	・アクセス指定子は指定がなければ「public」とする
	・ソリューションは問題の大項目毎に作成する
	・ソリューション名の仕様は以下の通り
		PG_CPP_***
		
		*** => 問題の項目番号
			例:
				問1 => PG_CPP_001
				問2 => PG_CPP_002		
	・ファイル名指定がされている場合はそのファイルを作成し、
	 そこに定義を行うこと
	・ヘッダファイルにはインクルードガードを必ず使用すること
	・メンバ変数名、メンバ関数名の隣の()はアクセス指定子
	・インデントはきちとして、読みやすいソースにする
	・main関数は必ず実装する

■問21

	仕様:
		以下の仕様を満たしなさい


		①.クラス定義
			クラス名:
				Gauge
			メンバ変数:
				float m_Min:
					ゲージの最小値
				float m_Max:
					ゲージの最大値
				float m_Now:
					現状のゲージの値
			メンバ関数:
				その①.
					関数名:
						コンストラクタ
					引数:
						float min:
							m_Minの値
						float max:
							m_Maxの値
						float now: 
							初期値(デフォルトはminの値)
					内容:
						引数の内容でメンバを初期化する
				その②.
					m_Minのゲッター
				その③.
					m_Maxのゲッター
				その④.
					m_Nowのゲッター
				その⑤.
					m_Nowのセッター
				その⑥.
					関数名:
						GetPercentageOfGauge
					戻り値:
						float:
							m_Nowのゲージ内での割合
					引数:
						なし
					内容:
						m_Now、m_Min、m_Maxの値を使用して
						m_Nowのゲージ内の割合をパーセント単位で返す

						例:
							m_Min => 0
							m_Max => 100
							m_Now => 30
							戻り値 => 30(%)

		②.実装仕様:
			main関数内で以下の仕様を実装しなさい

			2-1.クラスのインスタンス化
				①で作成したクラスを以下のデータでインスタンス化しなさい
					変数①.
						変数名:
							gauge_01
						m_Min:
							0
						m_Max:
							100
						m_Now:
							0
					変数②.
						変数名:
							gauge_02
						m_Min:
							50
						m_Max:
							100
						m_Now:
							50

			2-2.m_Nowのセッターの呼び出し
				変数①、②のm_Nowのセッターを以下の引数の値で呼び出しなさい

					変数①:
						60
					変数②:
						75
			2-3.パーセント表示
				変数①と変数②の現状のゲージの値をパーセント単位で出力しなさい
				※結果は変数①は60%、変数②は50%と表示されます

■問22

	仕様:
		じゃんけんゲームを作成しなさい

		①.じゃんけん用定数
			じゃんけんの手
				GU => 0
				TYOKI => 1
				PA => 2

			勝敗
				勝ち => 0
				負け => 1
				引き分け => 2

			※定数化しなかったら減点

		②.クラス定義
			クラス名:
				Judge
			メンバ関数:
				その①.
					関数名:
						Judgement
					戻り値:
						勝敗
					引数:
						第一引数:
							ユーザーの手
						第二引数:
							相手の手
					内容:
						ユーザーの手と相手の手を比較して
						ユーザ視点の勝敗を返す
			
				その②.
					関数名:
						PrintJudgement
					戻り値:
						なし
					引数:
						第一引数:
							勝敗
					内容:
						勝敗によって以下内容の出力を行う

						勝ち:
							ユーザーの勝ちです。
						負け:
							ユーザーの負けです。
						引き分け:
							引き分けです。

		③.じゃんけん仕様
			3-1.ユーザーの手の決定
				ユーザーの手はユーザーが入力して決定する
				グー、チョキ、パー以外の値を入力した場合は再入力させる

			3-2.相手の手の決定
				相手の手はランダムで決定する

			3-3.勝敗判定と表示
				Judgementクラスをインスタンス化し、
				ユーザーと相手の手の勝敗判定を行い、結果を出力する
			3-4.終了入力
				再度ユーザーに入力を行ってもらい以下の入力情報の結果で
				続行か、終了かを判断し、続行ならば3-1から繰り返す
		
				入力値:
					0 => 終了
					非0 => 続行

■問23

	仕様:
		じゃんけんゲームを作成しなさい

		①.じゃんけん用定数
			じゃんけんの手
				GU => 0
				TYOKI => 1
				PA => 2

			勝敗
				勝ち => 0
				負け => 1
				引き分け => 2

			※定数化しなかったら減点

		②.クラス定義
			その①.
				クラス名
					Hand
				メンバ関数:
					その①.
						関数名:
							GetHandType
						戻り値:
							なし
						引数:
							なし
						内容:
							じゃんけんの手の定数を返す
							※純粋仮想関数
					その②.
						関数名:
							Judgement
						戻り値:
							勝敗
						引数:
							判定を行うじゃんけんの手
						内容:
							クラスの手の定数と引数の手を比較して
							じゃんけんの結果を返す
							※純粋仮想関数
			その②.
				クラス名:
					Gu
				基底クラス:
					Hand
				メンバ関数:
					その①.
						関数名:
							GetHandType
						戻り値:
							なし
						引数:
							なし
						内容:
							グーの定数を返す
					その②.
						関数名:
							Judgement
						戻り値:
							勝敗
						引数:
							判定を行うじゃんけんの手
						内容:
							グーと引数の手を比較して
							じゃんけんの結果を返す
					
			その③.
				クラス名:
					Tyoki
				基底クラス:
					Hand
				メンバ関数:
					その①.
						関数名:
							GetHandType
						戻り値:
							なし
						引数:
							なし
						内容:
							チョキの定数を返す
					その②.
						関数名:
							Judgement
						戻り値:
							勝敗
						引数:
							判定を行うじゃんけんの手
						内容:
							チョキと引数の手を比較して
							じゃんけんの結果を返す
					
			その④.
				クラス名:
					Pa
				基底クラス:
					Hand
				メンバ関数:
					その①.
						関数名:
							GetHandType
						戻り値:
							なし
						引数:
							なし
						内容:
							パーの定数を返す
					その②.
						関数名:
							Judgement
						戻り値:
							勝敗
						引数:
							判定を行うじゃんけんの手
						内容:
							パーと引数の手を比較して
							じゃんけんの結果を返す
			その⑤.
				クラス名:
					HandFactory
				メンバ関数:
					関数名:
						CreateHand
					戻り値:
						Handのポインタ
					引数:
						じゃんけんの手の定数
					内容:
						じゃんけんの手の定数に応じたクラスを作成して返す
						
							グー => Gu
							チョキ => Tyoki
							パー => Pa
							その他 => NULL

		③.じゃんけん仕様
			3-1.ユーザーの手の決定
				ユーザーの手はユーザーが入力して決定する
				グー、チョキ、パー以外の値を入力した場合は再入力させる

			3-2.相手の手の決定
				相手の手はランダムで決定する

			3-3.ユーザーと相手の手クラスのインスタンス化
				HandFactoryクラスをインスタンス化し、
				3-1と3-2で決定されたユーザーと相手の手をインスタンス化する

			3-4.勝敗判定
				ユーザーのJudgement関数を使用して勝敗を決める
				Judgement関数の引数には相手の手を使用する

			3-5.勝敗表示
				3-4で確定した勝敗の表示を行う
				出力内容は以下の通り

				勝ち:
					ユーザーの勝ちです。
				負け:
					ユーザーの負けです。
				引き分け:
					引き分けです。
			3-6.インスタンス削除
				3-3で作成したオブジェクトは動的なものなのできちんと解放する
			3-7.終入力
				再度ユーザーに入力を行ってもらい以下の入力情報の結果で
				続行か、終了かを判断し、続行ならば3-1から繰り返す

				入力値:
					0 => 終了
					非0 => 続行

■問24

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義
			その①.
				クラス名:
					Character
				メンバ関数:
					その①.
						関数名:
							Control
						戻り値:
							なし
						引数:
							なし
						内容:
							純粋仮想関数
					その②.
						関数名:
							Draw
						戻り値:
							なし
						引数:
							なし
						内容:
							純粋仮想関数
			その②.
				クラス名:
					Player
				継承元:
					Character
				メンバ関数:
					その①.
						関数名:
							Control
						戻り値:
							なし
						引数:
							なし
						内容:
							「プレイヤーのゲーム処理」と出力
					その②.
						関数名:
							Draw
						戻り値:
							なし
						引数:
							なし
						内容:
							「プレイヤーの描画」と出力
			その③.
				クラス名:
					Enemy
				継承元:
					Character
				メンバ関数:
					その①.
						関数名:
							Control
						戻り値:
							なし
						引数:
							なし
						内容:
							「敵のゲーム処理」と出力
					その②.
						関数名:
							Draw
						戻り値:
							なし
						引数:
							なし
						内容:
							「敵の描画」と出力
		②.仕様
			①.Characterのポインタ配列を用意
				Characterのポインタ配列(サイズ:1000)を用意して
				NULLクリアしておく

			②.ループ処理を使用して以下の処理を1000回繰り返す。
				2-1.Player作成
					ループ回数(0からカウント)が5の倍数なら
					Playerクラスを作成し、①で作成した配列に追加する
					※空きになっている配列の管理は開発側で行う

				2-2.Enemy作成
					ループ回数(0からカウント)が10の倍数なら
					Enemyクラスを作成し、①で作成した配列に追加する
					※空きになっている配列の管理は開発側で行う

				2-3.Control関数実行
					2-1、2-2で作成したクラス分だけ①の配列をまわし、
					Control関数を実行する

				2-4.Draw関数実行
					2-1、2-2で作成したクラス分だけ①の配列をまわし、
					Draw関数を実行する

■問25

	仕様:
		以下の仕様を満たしなさい

		①.定数
			シーン
				Title => 0:
					タイトル
				Game => 1:
					ゲーム
				Result => 2
					結果

		②.クラス定義
			その①.
				クラス名:
					SceneBase
				メンバ変数:
					int m_Counter(protected):
						カウンター
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							なし
						内容:
							m_Counterを0で初期化する

					その②.
						関数名:
							GetSceneType
						戻り値:
							シーン用定数
						引数:
							なし
						内容:
							シーンクラスに応じたシーン用定数を返す
							※純粋仮想関数
					その③.
						関数名:
							Control
						戻り値:
							Sceneの種類
						引数:
							なし
						内容:
							ゲーム処理関数
							※純粋仮想関数
			その②.
				クラス名:
					TitleScene
				継承元クラス:
					SceneBase
				メンバ関数:
					その①.
						関数名:
							GetSceneType
						戻り値:
							Sceneの種類(Title)
						引数:
							なし
						内容:
							Titleの定数を返す
					その②.
						関数名:
							Control
						戻り値:
							SceneType
						引数:
							なし
						内容:
							戻り値は基本自分のSceneTypeを返し、
							切り替える時のみ変更時のSceneを返す

							「Titleシーン実行中」と出力
							m_Counterを1加算して
							60になったらGameシーンの定数を返す
			その③.
				クラス名:
					GameScene
				継承元クラス:
					SceneBase
				メンバ関数:
					その①.
						関数名:
							GetSceneType
						戻り値:
							Sceneの種類(Game)
						引数:
							なし
						内容:
							Gameの定数を返す
					その②.
						関数名:
							Control
						戻り値:
							SceneType
						引数:
							なし
						内容:
							戻り値は基本自分のSceneTypeを返し、
							切り替える時のみ変更時のSceneを返す

							「Gameシーン実行中」と出力
							m_Counterを1加算して
							60になったらResultシーンの定数を返す
			その④.
				クラス名:
					ResultScene
				継承元クラス:
					SceneBase
				メンバ関数:
					その①.
						関数名:
							GetSceneType
						戻り値:
							Sceneの種類(Result)
						引数:
							なし
						内容:
							Resultの定数を返す
					その②.
						関数名:
							Control
						戻り値:
							SceneType
						引数:
							なし
						内容:
							戻り値は基本自分のSceneTypeを返し、
							切り替える時のみ変更時のSceneを返す

							「Resultシーン実行中」と出力
							m_Counterを1加算して
							60になったらTitleシーンの定数を返す

			その⑤.
				クラス名:
					SceneManager
				メンバ変数:
					SceneBase *m_Scene:
						現在動作しているシーンのポインタ
				メンバ関数:
					その①.
						関数名:
							コンストラクタ
						引数:
							なし
						内容:
							Titleシーンを動的に作成する
					その②.
						関数名:
							Control
						戻り値:
							bool
								true:
									終了
								false:
									続行
						引数:
							なし
						内容:
							m_SceneのControl関数を呼び出す。
							m_SceneのControlの戻り値がそのシーンの定数と
							値が異なったらシーン終了と判断してシーンを切り替える
							シーンの切り替えの流れは以下の通り
								Title => Game => Result
							この関数の戻り値はResultシーンが終了したらtrueを返し、
							それ以外はfalseを返す

							※m_Sceneは動的に確保しているので解放を忘れないようにする
		その③.仕様実装
			main関数内で以下の処理を実装して下さい。
			
			3-1.SceneManagerインスタンス化
				SceneManagerの変数を宣言し、インスタンス化を行う
			3-2.終了待ち
				SceneManagerのControlの戻り値がtrueを返すまで
				Controlを繰り返すようにする

■問26

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義

■問27

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義

■問28

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義

■問29

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義

■問30

	仕様:
		以下の仕様を満たしなさい

		①.クラス定義