プログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ざこ

プログラム

#1

投稿記事 by ざこ » 16年前

前回のMFCによる○Xゲームを改良しています。前回はコンボボックスに○と×をいれておきどちらか選んでからstaticなどに貼り付けていました。今回はその選ぶ作業を省き
①②③
④⑤⑥
⑦⑧⑨
の各番号を押すと最初は○、次違う番号押すと×と交互に押していくという作業にしたいと思います。
①②③  ○     ○×    ○×
④⑤⑥→     →     →  ○
⑦⑧⑨
などのようにです。

わからない所は最初は○で次から交互にという作業のプログラムです。教えて下さい。

バグ

Re:プログラム

#2

投稿記事 by バグ » 16年前

1:○か×かの判定を行うBOOL型のメンバ変数を1つ追加する。(例:TRUEの場合は○、FALSEの場合は×とする)

2:最初の手順を○にする為に、OnInitDialog関数の中で、このメンバ変数をTRUEで初期化しておく。

3:ボタンが押されたら、押された番号に対応した場所に○か×を表示したあと、TRUEとFALSEを反転させる。(ついでに、一度押された場所を押せないようにする為にボタンを無効にしておくといいかもしれません)

ざこ

Re:プログラム

#3

投稿記事 by ざこ » 16年前

成る程じっくり考えてみます。

ざこ

Re:プログラム

#4

投稿記事 by ざこ » 16年前

じっくり考えたのですがわかりません・・お手数ですが教えてください。
BOOLは整数型でCStringは文字列だからごちゃごちゃになって混乱してしまいました。

バグ

Re:プログラム

#5

投稿記事 by バグ » 16年前

うーん、私にはざこさんが何が分からないのかがよく分かりません。
私の前の書き込みの1~3で理解出来た事(もしくは理解出来そうな事)と理解出来ない事、それから何が理解出来ないのかを「具体的」に挙げてもらえますか?

ざこ

Re:プログラム

#6

投稿記事 by ざこ » 16年前

書いてあることはわかるのですがプログラムが書けないんです。

ざこ

Re:プログラム

#7

投稿記事 by ざこ » 16年前

簡単の為9個ではなく2個にしてます。①,②の値がそれぞれp1,p2です。
void CMyDlg::OnButton1()
{
hantei();
}

void CMyDlg::OnButton2()
{
  hantei();
}

void CMyDlg::hantei()
{
  BOOL sw;
  CString p1,p2;
  if(p1=='○'||p2=='○'){

  sw=true;//値が○のときtrueとする
}

  else{
    sw=false; //×のときfalseとする


if(sw==true){
SetDlgItemText(IDC_STATIC1,p1);
sw=false;
}

else{
SetDlgItemText(IDC_STATIC1,p1);
sw=true;

}


if(sw==true){
SetDlgItemText(IDC_STATIC2,p2);
sw=false;
}

else{
SetDlgItemText(IDC_STATIC2,p2);
sw=true;
}

}
}


というむちゃくちゃな文になってます。

御津凪

Re:プログラム

#8

投稿記事 by 御津凪 » 16年前

const char* CMyDlg::GetCheckMark(){
    const char* mark;
    if(mSetMarkIsMaru){
        mark = "○";
    }
    else{
        mark = "×";
    }
    mSetMarkIsMaru = !mSetMarkIsMaru;
    return mark;
}
このメンバ関数と、 BOOL 型メンバ変数 mSetMarkIsMaru (初期値は TRUE とするように)
をCMyDlg に追加して、
各 OnButton 関数内で呼び出せば、この関数の戻り値で○と×が交互に返されます。
後は、バグさんの3.にあるように、○と×がついたボタンを押しても変化が無いように
書き換えるだけのはずです。

バグ

Re:プログラム

#9

投稿記事 by バグ » 16年前

ひょっとして、メンバ変数・関数の追加方法が分からないとか?

ざこ

Re:プログラム

#10

投稿記事 by ざこ » 16年前

いやそれはわかると思います。ちょっとやってみますね。ありがとうございました

バグ

Re:プログラム

#11

投稿記事 by バグ » 16年前

ひとつ気になったので…
WINAPIのBOOL型とbool型は別物です。
BOOL型は真がTRUE、偽がFALSEで、bool型は真がtrue、偽がfalseです。
使うべき箇所や使い方は同じで構いませんが、この違いは把握しておいてください。

ざこ

Re:プログラム

#12

投稿記事 by ざこ » 16年前

void CMyDlg::OnButton1()
{
GetCheckMark()
}

void CMyDlg::OnButton2()
{
GetCheckMark()
}

const char* CMyDlg::GetCheckMark(){
const char* mark;
if(mSetMarkIsMaru){
mark = "○";
}
else{
mark = "×";
}
mSetMarkIsMaru = !mSetMarkIsMaru;
return mark;
}

としたんですが文字列入力するのはどこでやるとよいのでしょうか?
コンボボックス使っていたときは追加した関数の中でしてたんですが今回はこれをすると
botton1押したら①だけでなく②とかも入力されちゃいますよね。
呼び出し元の関数でするのも判定のときにつらくなりそうなので・・
何か良い方法はありますか?

>バグさん
それは知りませんでした。きちんと勉強しておきますね。

バグ

Re:プログラム

#13

投稿記事 by バグ » 16年前

時間があったので、サンプルを書いてみました。
VC++6.0のMFC使用のダイアログベースアプリです。
分からない事があったら、また質問してください。

ざこ

Re:プログラム

#14

投稿記事 by ざこ » 16年前

ありがとうございました。
ところで判定のとき,Judgeのときです。
BOOL CMaruBatsuDlg::Judge(INT nNumber)

{

	// Staticのテキストを取り出す

	CString cString[9];

	INT nStatic[/url] = {IDC_STATIC1, IDC_STATIC2, IDC_STATIC3, IDC_STATIC4, IDC_STATIC5, IDC_STATIC6, IDC_STATIC7, IDC_STATIC8, IDC_STATIC9};



	for (INT i = 0; i < 9; ++i)

	{

		CStatic* pStatic = (CStatic*)GetDlgItem(nStatic);

		pStatic->GetWindowText(cString);

	}


のpStatic->GetWindowText(cString);
の所でtypedef識別子にクラスメンバ アクセス演算子(->)を使用しましたって出てエラーが直らないんですが
どうすればいいのでしょうか?

バグ

Re:プログラム

#15

投稿記事 by バグ » 16年前

同じバージョンをこちらでビルドしてもエラーは起こりません。
何か変更しましたか?

ざこ

Re:プログラム

#16

投稿記事 by ざこ » 16年前

自己解決しました。ありがとうございました。
コピペじゃなくて1つ1つ理解する為に自分で打ち込んでいったのでミスがあったようです;

pStatic->GetWindowText(cString); →pStatic->GetWindowText(CString); になってました。

Blue

Re:プログラム

#17

投稿記事 by Blue » 16年前

GetWindowTextで間違いないですか?(Setではなくて)

取得するならCStringの変数を渡さないと。

Blue

Re:プログラム

#18

投稿記事 by Blue » 16年前

すみません、勘違いでした。

ざこ

Re:プログラム

#19

投稿記事 by ざこ » 16年前

なんか⑤の所おかしいんですが①⑤ ②⑤ ⑧⑤ ⑦⑤ ④⑤と押すとその時点で勝利とでます。
私の所だけかな・・

バグ

Re:プログラム

#20

投稿記事 by バグ » 16年前

5がおかしいならば、そこを判定している箇所がおかしいのでしょう。
Judge関数の中のswitchの中のcase 5の箇所がそうです。

ちなみにこちらでは誤判定は確認できません。

閉鎖

“C言語何でも質問掲示板” へ戻る