- 締切済み
○×ゲーム
○×ゲーム ○×ゲームをつくろうとしてるのですがどうプログラムを組んでいいのか分りません。ポインタとクラスを使って作りたいのですがどなたか教えていただけないでしょうか。 途中までのプログラムを載せておきます。ここからどうすればいいのか教えてください。 #include<iostream> #include<cstdlib> #include<ctime> #define NON 0 #define MARU 1 #define BATU 2 #define MAX_HEIGHT 3 #define MAX_WIDTH 3 using namespace std; int g_mas[MAX_WIDTH][MAX_HEIGHT]; class Game{ public: void Clear(); void Player(int *width, int *height); bool Draw(); } void Game::Clear() { for(int width=0; width<MAX_WIDTH; width++) { for(int height=0; height<MAX_HEIGHT; height++) { g_mas[MAX_WIDTH][MAX_HEIGHT] = NON; } } } void Game::Player(int width, int height) { } bool Game::Draw() { for(int width=0; i<MAX_WIDTH; width++) { for(int height=0; i<MAX_HEIGHT; height++) { if(g_mas[MAX_WIDTH][MAX_HEIGHT] == NON) { return 0; //引分けじゃない時、0を返す } } } return 1; //引分けだった時、1を返す } int main() { int width, height; Game g; g.Clear(); srand((unsigned int)time(NULL)); }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- CanvasShoes
- ベストアンサー率64% (16/25)
プロンプトなら、入力系のメソッドを変更して、次のような感じ。 メインプログラムのイメージも追加しました。 //***************** // 入力系 //***************** // ユーザーに次の一手を入力させて、その値を取得する。 bool GetNextMove(/* out */ int *prow, /* out */ int *pcolumn, /* out */ int *pnew_value) const ; //***************** // 判定系 //***************** // ゲーム終了かどうか(すべてのマスが埋まっているか判定) bool IsEnd(void) const ; //***************** // メインプログラムのイメージ //***************** main() { Game game ; // 初期化 game.InitStatus() ; // 状態を表示 game.Redraw() ; // ゲームする while (! game.IsEnd()) { // 次の一手を取得 int row, column, new_value ; GetNextMove(&row, &column, &new_value) ; // 状態を変更 game.SetStatus(row, column, new_value) ; // 最新の状態を表示 game.Redraw() ; } ; // 勝ち負けを表示 switch (game.WhichIsWin()) { case MARU : printf("MARU won !!\n") ; break ; case BATU : printf("BATU won !!\n") ; break ; case NON : default : printf("Draw !!\n") ; break ; } ; } ;
- CanvasShoes
- ベストアンサー率64% (16/25)
まず、クラスの設計をきちんとなさるとよいと思います。 およそ、以下のような変数とメソッドが定義されていれば、組み合わせて実現できると思います。 //***************** // 状態の定義 //***************** int m_mas[MAX_WIDTH][MAX_HEIGHT] ; int m_next_player ; // 次のプレーヤー。MARU or BATU int m_counter ; // すでに埋まったマスの数 //***************** // 描画情報の定義 //***************** #define CELL_PIX_WIDTH 100 // 1マスのピクセル幅 #define CELL_PIX_HEIGHT 100 // 1マスのピクセル高さ //***************** // 描画系...描くだけ。 //***************** void Redraw()...画面をクリアして、マス目や、今の状態( ○×)を描く。 //***************** // ロジック系 //***************** // 状態(g_mas/g_next_playerなど)を初期化する void InitStatus(void) ; // マスに新しい値をセットする。すでにMARU/BATUがセットされていたらfalseを返す。 bool SetStatus(int row, int column, int new_value) ; //***************** // 判定系 //***************** // セルの状態NON/MARU/BATUのいずれかを返す。 int GetStatus(int row, int column) const ; // どっちが勝ったかNON/MARU/BATUを返す。 int WhichIsWin(void) const ; //***************** // 入力系 //***************** // どのマスがクリックされたか判定する。 // どのマスもクリックされていなければ、falseを返す。 bool GetCellIndex(/* in */ POINT point, /* out */ int *prow, /* out */ int *pcolumn) const ;
お礼
ありがとうございます。
補足
仕様について話してなかったので補足します。 プロンプト上で動くタイプの○×ゲームでXとYを指定して○か×を付ける感じです。 あとプレイヤが交互にマスを指定するタイプなのでコンピュータとの対戦は無しです。 //例 1 2 3 1 2 3 X軸を指定してください: Y軸を指定してください: