アプリ版:「スタンプのみでお礼する」機能のリリースについて

sanmoku.CPP、sanmoku.hpp, game.cpp, game.hppに分けたいです
詳しい方、よろしくお願いいたします。
今、こんな感じですが、元はネットから引っ張りました。
---
//sanmoku.cpp
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "sanmoku.hpp"
#include "game.hpp"

//初期化
void sanmoku::init()
{
for(int i=0; i<3; i++){
for(int j=0; j<3; j++) {
me[i][j] = 0;
}
}
}

//座標入力
void sanmoku::get_pos(char *player, int *x, int *y)
{
cout << player << "の横座標を入力:";
cin >> *x;
while(*x > 3)
{
cin.clear();
cin.ignore(1024, '\n');
cout << "文字が入ってやり直し\n";
cout << player << "の横座標を入力:";
cin >> *x;

}
cout << player << "の縦座標を入力:";
cin >> *y;
while(*y > 3 )
{
cin.clear();
cin.ignore(1024, '\n');
cout << "文字が入ってやり直し\n";
cout << player << "の縦座標を入力:";
cin >> *y;
}

}

void com_pos()
{
srand((unsigned)time(NULL));
}
//main
int main()
{
//enum {x = 0, y =0 };
int x, y;
int p1win=0, p2win=0, draw=0;
int con = 1;
sanmoku g;

g.init();

do
{
while(1)
{
do
{
g.get_pos("○", &x, &y);
}while(g.player1(x-1, y-1) == false);

if(g.check()) {
cout << "プレイヤ1の勝ち\n";
p1win++;
break;
}

if(g.check_drawn()){
cout << "引分け\n";
draw++;
break;
}

do
{
g.get_pos("×", &x, &y);
}while(g.player2(x-1, y-1) == false);

if(g.check())
{
cout << "プレイヤ2の勝ち\n";
p2win++;
break;
}

if(g.check_drawn())
{
cout << "引分け\n";
draw++;
break;
}

}

cout << "1Pの勝ち数:" << p1win << "\n";
cout << "2Pの勝ち数:" << p2win << "\n";
cout << "ドロー:" << draw << "\n";

cout << "0でストップ:";
cin >> con;

}while(con != 0);

return 0;
}
---
//sanmoku.hpp
#include <iostream>
#ifndef SANMOKU_HPP
#define SANMOKU_HPP
using namespace std;


class sanmoku{
private:

enum me{x=3, y=3};
int me[x][y];
public:
void init();
void get_pos(char *player, int *x, int *y);
//bool player1(int x, int y);
//bool player2(int x, int y);
//bool check_drawn();
//bool check();
};
#endif //
---
//game.cpp
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include "Board.hpp"
#include "sanmoku.hpp"
#include "sanmoku.cpp"

bool game::playerproc(int x, int y, int player)
{
if(x>= 3|| y>=3 || x<0 || y<0)
{
cout << "超過中\n";
return false;
}

if(me{x][y] != 0)
{
cout << "使用中\n";
return false;
}


me[][] = player;
draw();
return true;
}
/*void com_pos()
{
game::srand((unsigned)time(NULL));
}
*/
//プレイヤ1
bool game::player1(int x, int y)
{
return playerproc(x, y, 1);
}

//プレイヤ2
bool game::player2(int x, int y)
{
return playerproc(x, y, 2);
}

//各プレイヤの入力した座標をチェック
/*bool game::playerproc(int x, int y, int player)
{
if(x>= 3|| y>=3 || x<0 || y<0)
{
cout << "超えてるよ\n";
return false;
}

if(TicTacToe::me[x][y] != 0)
{
cout << "使ってるよ\n";
return false;
}


me[][] = player;
draw();
return true;
}*/

//表と○と×を描画
void game::draw()
{
cout << " 1 2 3\n";

for(int i=0; i<3; i++)
{
cout << i + 1;
for(int j=0; j<3; j++)
{
if(me[i][j] == 1)
{
cout << "o";
}
else if(me[i][j] == 2)
{
cout << "x";
}
else
cout << " ";
cout << " ";
}
cout << "\n";
}
}
//引分けかチェック
bool game::check_drawn()
{
bool drawn = true;

for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
if(me[i][j] == 0){
drawn = false;
break;
}
}
}

return drawn;
}

//勝敗のチェック
bool game::check()
{
for(int i=0; i<3; i++)
{
if((me[i][0] != 0) && (me[i][0] == me[i][1] && me[i][0] == me[i][2])) return true;
}

for(int j=0 ; j<3 ; j++)
{
if((me[0][j] != 0) && (me[0][j] == me[1][j] && me[0][j] == me[2][j])) return true;
}

if((me[0][0] != 0) && (me[0][0] == me[1][1]) && (me[0][0] == me[2][2])) return true;
if((me[2][0] != 0) && (me[2][0] == me[1][1]) && (me[2][0] == me[0][2])) return true;

return false;
}
---

#ifndef GAME_HPP
#define GAME_HPP

class game{
private:

bool playerproc(int x, int y, int player);
void draw();
public:

void init();
bool player1(int x, int y);
bool player2(int x, int y);
bool check_drawn();
bool check();
};
#endif //

質問者からの補足コメント

  • うーん・・・

    コードでいっぱいいっぱいになったので補足を。
    もとはネットでから引っ張ってきました。それはCppファイルひとつで動きました。 エラーも長くて載せられませんでした。どうしたらよくなりますでしょうか? アドバイスまたは任意のコードを教えてください。よろしくお願いいたします。

      補足日時:2016/05/24 06:57

A 回答 (7件)

>メンバーに入っていないのはわかりますがどうして入っていないのかが分かりません。



そういう風に設計しているからでは?
継承しているわけでもないのですから、入っていないものはどうにもなりません。

貴方自身(class sanmoku)についている筈のロケットエンジン(player1メンバー)で火星まで行ってください。
ロケットエンジンついている筈ですが?
って言われて可能ですか?

>メンバーに入れる方法はどのような方法があるのでしょうか?

クラスに宣言を加えて、実装コードを記述してください。
# bool game::player1(int x, int y) は記述の通りclass sanmokuのメンバーではありませんのであしからず。
    • good
    • 0

なるほど, そんなエラーか.



ただ, 「こうすれば治る」という処方だけ書いても「本当に勉強するため」には意味がないので「考える筋道」を書いてみよう.

とはいっても難しいことではなく, まず
そのエラーメッセージが何を言っているのか
を理解するところから始まる. 例えば
'class sanmoku' has no member named 'player1'
を日本語に直してみてください.
    • good
    • 1
この回答へのお礼

メンバーに入っていないのはわかりますがどうして入っていないのかが分かりません。メンバーに入れる方法はどのような方法があるのでしょうか?
よろしくお願いいたします。

お礼日時:2016/05/25 02:23

おぉ, そんなところに


using namespace std;
がいるのか....

とりあえず最初の方のエラーメッセージをいくつかプリーズ.
    • good
    • 0
この回答へのお礼

ありがとうございます。 いくつかエラーを書いときます。
mainの while(g.player1(x-1, y-1) == false);のところで、
下記のエラー
|74|error: 'class sanmoku' has no member named 'player1'|
if(g.check()) のところでも、
|76|error: 'class sanmoku' has no member named 'check'|

Game.cppの meが読み込めません。
|78|error: 'me' was not declared in this scope|
|23|error: expected primary-expression before ']' token|

すみませんよろしくお願いいたします。

お礼日時:2016/05/24 16:02

引っ張って来た元ネタは…


http://codepad.org/haIjhQhY/raw.cpp
ですかね。

クラスを分割する場合は注意しないとハマるかと。
    • good
    • 0

あ~, これ今のコンパイラだと本質とは全く関係ないエラーがいろいろ出てくるねぇ....



例えば, cout は名前空間 std にあるから, 上の方の
cout << player << "の横座標を入力:";
でエラーが出ちゃう.

まあ, とりあえず #1 でも言われているように「最初の方のものだけでいいからエラーメッセージを出してくれ」ってところかなぁ.

あと,
enum me{x=3, y=3};
int me[x][y];
については通ってもいいはず>#1. ただ, 「me」って名前を選んだ理由がさっぱりわからない.
    • good
    • 0

game.cppから参照しているme[][]はclass gameのメンバー変数ではありません。


ので、参照は不可能ですからエラーになるでしょう。
そもそもclass gameのインスタンスがありません。

ついでにBoard.hppが何者か不明です。


指摘だけでアドバイスになってないですが。
# スマホから検証は、ちょっとねぇ。
    • good
    • 0
この回答へのお礼

すみません。そこはGame.hppです。

お礼日時:2016/05/24 11:32

長々とコードは細かく見ていませんが…



>エラーも長くて載せられませんでした。

最初のいくつかは掲示できませんか?
ディレクトリ名などは省略すると短くできるかと思いますが。

>enum me{x=3, y=3};
>int me[x][y];

enumとint型の二次元配列の名前が被ってるように見えますが、通ります?

>me[][] = player;

配列のアドレスに値を代入…ですか?
というかこういう書き方は無いように思いますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!