第11章 C++版丁半ゲームを作ろう


では、今までの知識を元にC++版丁半ゲームを作ってみましょう。 C言語では、C言語編第24章で作っているので 参照してみてください。

まず、クラスの継承を使うようにしてみます。(別に使う必要はないが せっかくクラスの継承についてやったので無理にでも使う!)

ゲーム・クラスを考えます。これは、ゲームをするための 大本のクラスとします。そして、このクラスには手持ちのお金を メンバとして持っているとします。そして、このクラスのコンストラクタに よって自動的に初めの持ち金を入力するようにします。 また、この持ち金は勝手にクラス外からアクセスされては困るので 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;

あとは、メンバ関数を記述すればよいですね。

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; }

これで、準備は整いました。あとはmain関数から 必要なメンバ関数を呼び出せばよいですね。

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言語編の時にも書きましたが このゲームを利用して賭博行為を行い警察に逮捕されても 当方は関知しません。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jan/11/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。