まず、クラスの継承を使うようにしてみます。(別に使う必要はないが せっかくクラスの継承についてやったので無理にでも使う!)
ゲーム・クラスを考えます。これは、ゲームをするための
大本のクラスとします。そして、このクラスには手持ちのお金を
メンバとして持っているとします。そして、このクラスのコンストラクタに
よって自動的に初めの持ち金を入力するようにします。
また、この持ち金は勝手にクラス外からアクセスされては困るので
privateかprotectedにします。しかし、継承先のクラスからも
アクセスできた方が便利なのでprotectedにしましょう。
また、手持ちの金額を表示するメンバ関数もあった方がよいでしょう。
と、いうことでゲーム・クラスは次のような感じになります。
そして、このゲーム・クラスから丁半・クラスを導出します。 この丁半・クラスには、掛け金の入力、丁半の入力、サイコロを振る関数、 丁半の判定をする関数、さいころの目によって、 元金に掛け金を加えたり、引いたりする関数などが必要となるでしょう。 ついでに、このクラスを定義すると同時に勝負・オブジェクトを 生成してしまいましょう。class Game{ protected: long money; public: Game(); ~Game() {}; void show_money(); }; void Game::show_money() { cout << "現在の持ち金=" << money << '\n'; return; } Game::Game() { cout << "元金を入力-->"; cin >> money; cout << '\n'; }
あとは、メンバ関数を記述すればよいですね。class ChoHan:public Game { private: long kakekin, cho_han; //ユーザーの掛け金、丁半 int kekka; //0:正解 -1:ハズレ int me1, me2; //さいころの目 public: void input_kakekin(); //ユーザーの掛け金入力 void input_ch(); //ユーザーの丁半入力 int keisan(); //kekkaによって元金計算 void saikoro(); //サイコロを振る int hantei(); //丁半の判定及び勝ち負け }shobu;
これで、準備は整いました。あとはmain関数から 必要なメンバ関数を呼び出せばよいですね。void ChoHan::input_kakekin(void) { cout << "掛け金-->"; cin >> kakekin; cout << '\n'; return; } void ChoHan::input_ch(void) { cout << "丁(0) 半(1) −−>"; cin >> cho_han; cout << '\n'; return; } int ChoHan::keisan(void) { if (kekka == 0) money += kakekin; if (kekka == -1) { money -= kakekin; if (money <= 0) { cout << "破産です\n"; return (-1); } } return 0; } void ChoHan::saikoro(void) { srand((unsigned)time(NULL)); me1 = (rand() % 6 + 1); me2 = (rand() % 6 + 1); return; } int ChoHan::hantei(void) { int ch; char str[8]; saikoro(); if ((me1 + me2) % 2 == 0) ch = 0; else ch = 1; if (ch == 0) strcpy(str, "丁\n"); else strcpy(str, "半\n"); if (ch == cho_han ) { kekka = 0; cout << me1 << ", " << me2 << "の" << str; cout << "あたり!\n"; }else { kekka = -1; cout << me1 << ", " << me2 << "の" << str; cout << "ハズレ!\n"; } return 0; }
最後に、必要なヘッダファイル類をインクルードするのを 忘れないでください。int main(void) { while(1) { shobu.input_kakekin(); shobu.input_ch(); shobu.hantei(); if(shobu.keisan() == -1) break; shobu.show_money(); } cout << "ゲーム終了です\n"; return 0; }
#include <iostream.h> #include <time.h> #include <stdlib.h> #include <string.h>
どうです。クラスの継承の雰囲気がわかったでしょうか?
Cに比べてずいぶん長ったらしくなっていますね。
しかし、main関数はかなりすっきりしています。
また、これはサンプルなのですべて同じファイルに書いていますが
ふつうは、クラスの定義部分をヘッダファイル(***.h)にメンバ関数
の記述部分をcppファイルにします。そして、main関数を含むcppを
作ります。この詳しいやり方はまた、後の章で解説します。
このゲームは、破産するまでやめられません。 掛け金に0かマイナスの数値を入力すると終了するように 書き直してみてください。
C言語編の時にも書きましたが
このゲームを利用して賭博行為を行い警察に逮捕されても
当方は関知しません。
Update Jan/11/1997 By Y.Kumei