11月 1日 クラスの基本まとめ

今日話したことで大事そうなところ

Fig. 1: ゲームの中の車の抽象化とクラス、および、メンバ関数による操作
Fig. 2: 2キャラクタの距離

ccar.h

#pragma once
 
class cCar
{
private:
	//メンバ変数
 
	//ボディーサイズ?
	float m_body;
 
	//タイヤの耐久度(すり減り具合)
	int m_tire; 
 
	//エンジンがかかっているかどうか
	//true:エンジンON false:エンジンOFF
	bool m_engine;
 
	//スピード
	float m_speed;
 
	//向いている方向 -1:左 0:前 1:右
	int m_direction;
public:
	//メンバ関数
 
	//コンストラクタ
	//constructor : メンバ変数の初期化をする
	//特別なメンバ関数
	cCar();
	//エンジンがかかっていなかったらエンジンON
	//戻り値 なし
	//引数 なし
	void ignition();
 
	//float doMove();//走る
 
	//エンジンがかかっていたら、スピードを10キロあげる
	void doAccel();//アクセル踏む
 
	//エンジンがかかっていたらかつ、車が動いていたら、
	//スピードを10キロ下げる(最小値0)
	void doBreak();//ブレーキ踏む
	//上の二つを実装して、mainから呼んでstatusを確認
 
	//戻り値 なし
	//第1引数 int _direction -1:左 0:まっすぐ 1:右
	void doTurn(int _direction);//曲がる
	//子の変数の実装を書いてみよう!
 
 
	//エンジンがかかっていたらエンジンをストップする
	//戻り値 なし
	//引数 なし
	void doStop();//エンジン止まる
 
	//セッター(setter):メンバ変数の値をセットするメンバ関数
	//ゲッター(getter):メンバ変数の値をゲットするメンバ関数
	//を作る
	void setTireTiredness(int _tire);//setter
	int getTireTiredness();//getter
 
	//現在の車の状態を表示するメンバ関数
	//戻り値 なし
	//引数 なし
	void printCarStatus();
};//←宣言はセミコロンで終わるよ

ccar.cpp

#include "ccar.h"
#include <iostream>
#include <string>
 
cCar::cCar()
{
	//ボディーサイズ? メートル?
	m_body = 2.5; 
	//タイヤの耐久度(すり減り具合)パーセント?
	m_tire = 100; 
	//エンジンがかかっているかどうか
	//true:エンジンON false:エンジンOFF
	m_engine = false;
	m_speed = 0.0;//スピード
	m_direction = 0; //前
}
 
 
void cCar::ignition()
{
	//エンジンをかける(エンジンがかかってなかったら)
	if (m_engine == false)
		m_engine = true;
	else
		std::cout << "Engine : Already Running" << std::endl;
}
 
void cCar::doStop()
{
	//エンジンを止める(かかっていたら)
	if (m_engine == true)
		if (m_speed == 0) {
			m_engine = false;
		}
		else
		{
			std::cout << "Engine : The Engine will not Stop While Driving!!" << std::endl;
		}
	else
		std::cout << "Engine : Not Running" << std::endl;
}
 
void cCar::doAccel()
{
	if (m_engine == true)
	{
		m_speed = m_speed + 10.0;//10km/h スピードUP
	}
	//max180km/hでリミッターかけてみよう
}
 
void cCar::doBreak()
{
	if (m_engine == true && m_speed > 0.0)
	{
		m_speed = m_speed - 10.0;//10km/h スピードDOWN
		if (m_speed < 0.0) m_speed = 0.0;
	}
}
 
void cCar::setTireTiredness(int _tire)
{
	m_tire = _tire;
}
 
int cCar::getTireTiredness()
{
	return(m_tire);
}
 
void cCar::doTurn(int _direction)
{
	m_direction = _direction;
}
 
void cCar::printCarStatus()
{
	std::cout << "-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << std::endl;
	std::cout << "Body Size : " 
		<< m_body << "m" << std::endl;
	std::cout << "Tire : " << m_tire 
		<< " % " << std::endl;
	if (m_engine)
		std::cout << "Engine : Running" << std::endl;
	else
		std::cout << "Engine : Stopped" << std::endl;
	std::cout << "Speed : " << m_speed
		<< " km/h " << std::endl;
	std::cout << "Direction : ";
	switch (m_direction)
	{
	case -1:
		std::cout << "Left" << std::endl;
		break;
	case 0:
		std::cout << "Forward" << std::endl;
		break;
	case 1:
		std::cout << "Right" << std::endl;
		break;
	defaut:
		std::cout << "Forward" << std::endl;
		break;
	}
	std::cout << "-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << std::endl;
 
}

theMain.cpp

#include <iostream>
#include "ccar.h"
 
int main()
{
	cCar mycar;//mycarはcCarクラスのインスタンス!
 
	//m_engineはprivateなのでアクセスできない!!
	//mycar.m_engine = true;
 
	mycar.ignition();
	mycar.printCarStatus();
	//ccar.cに void doStop();の実装を書き
	//mainで実際に呼び出し、エンジンをストップさせ
	//現在の車の状況を出力する
 
	mycar.doAccel(); //アクセルを踏む関数(+10km/h)
	mycar.doAccel();
	mycar.printCarStatus();//現在の車の情報を表示
	mycar.doBreak();//ブレーキを踏む(-10km/h)
	mycar.doBreak();
	mycar.printCarStatus();//現在の車の情報を表示
	mycar.setTireTiredness(50);//タイヤの耐久度をセット
	int t = mycar.getTireTiredness();//タイヤの耐久度を取得
	std::cout << t << std::endl;//タイヤの耐久度を表示
	mycar.doAccel();
	mycar.doStop();//エンジンをストップ
	mycar.printCarStatus();//現在の車の情報を表示
	//停止状態(speed==0)の時しかエンジンをストップ
	//出来ないようにしてみよう
	//走ってるときにエンジンを切ろうとしたら、警告を表示!
	//25分まで!
	mycar.doTurn(-1);
	mycar.printCarStatus();
	return 0;
}