ページ 1 / 1
プログラム
Posted: 2008年12月17日(水) 10:15
by ざこ
前回のMFCによる○Xゲームを改良しています。前回はコンボボックスに○と×をいれておきどちらか選んでからstaticなどに貼り付けていました。今回はその選ぶ作業を省き
①②③
④⑤⑥
⑦⑧⑨
の各番号を押すと最初は○、次違う番号押すと×と交互に押していくという作業にしたいと思います。
①②③ ○ ○× ○×
④⑤⑥→ → → ○
⑦⑧⑨
などのようにです。
わからない所は最初は○で次から交互にという作業のプログラムです。教えて下さい。
Re:プログラム
Posted: 2008年12月17日(水) 11:57
by バグ
1:○か×かの判定を行うBOOL型のメンバ変数を1つ追加する。(例:TRUEの場合は○、FALSEの場合は×とする)
2:最初の手順を○にする為に、OnInitDialog関数の中で、このメンバ変数をTRUEで初期化しておく。
3:ボタンが押されたら、押された番号に対応した場所に○か×を表示したあと、TRUEとFALSEを反転させる。(ついでに、一度押された場所を押せないようにする為にボタンを無効にしておくといいかもしれません)
Re:プログラム
Posted: 2008年12月17日(水) 13:00
by ざこ
成る程じっくり考えてみます。
Re:プログラム
Posted: 2008年12月17日(水) 16:23
by ざこ
じっくり考えたのですがわかりません・・お手数ですが教えてください。
BOOLは整数型でCStringは文字列だからごちゃごちゃになって混乱してしまいました。
Re:プログラム
Posted: 2008年12月17日(水) 17:26
by バグ
うーん、私にはざこさんが何が分からないのかがよく分かりません。
私の前の書き込みの1~3で理解出来た事(もしくは理解出来そうな事)と理解出来ない事、それから何が理解出来ないのかを「具体的」に挙げてもらえますか?
Re:プログラム
Posted: 2008年12月17日(水) 17:45
by ざこ
書いてあることはわかるのですがプログラムが書けないんです。
Re:プログラム
Posted: 2008年12月17日(水) 17:59
by ざこ
簡単の為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:プログラム
Posted: 2008年12月17日(水) 18:16
by 御津凪
const char* CMyDlg::GetCheckMark(){
const char* mark;
if(mSetMarkIsMaru){
mark = "○";
}
else{
mark = "×";
}
mSetMarkIsMaru = !mSetMarkIsMaru;
return mark;
}
このメンバ関数と、 BOOL 型メンバ変数 mSetMarkIsMaru (初期値は TRUE とするように)
をCMyDlg に追加して、
各 OnButton 関数内で呼び出せば、この関数の戻り値で○と×が交互に返されます。
後は、バグさんの3.にあるように、○と×がついたボタンを押しても変化が無いように
書き換えるだけのはずです。
Re:プログラム
Posted: 2008年12月17日(水) 18:33
by バグ
ひょっとして、メンバ変数・関数の追加方法が分からないとか?
Re:プログラム
Posted: 2008年12月17日(水) 18:41
by ざこ
いやそれはわかると思います。ちょっとやってみますね。ありがとうございました
Re:プログラム
Posted: 2008年12月17日(水) 19:06
by バグ
ひとつ気になったので…
WINAPIのBOOL型とbool型は別物です。
BOOL型は真がTRUE、偽がFALSEで、bool型は真がtrue、偽がfalseです。
使うべき箇所や使い方は同じで構いませんが、この違いは把握しておいてください。
Re:プログラム
Posted: 2008年12月17日(水) 19:14
by ざこ
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:プログラム
Posted: 2008年12月17日(水) 20:04
by バグ
時間があったので、サンプルを書いてみました。
VC++6.0のMFC使用のダイアログベースアプリです。
分からない事があったら、また質問してください。
Re:プログラム
Posted: 2008年12月18日(木) 10:53
by ざこ
ありがとうございました。
ところで判定のとき,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:プログラム
Posted: 2008年12月18日(木) 11:14
by バグ
同じバージョンをこちらでビルドしてもエラーは起こりません。
何か変更しましたか?
Re:プログラム
Posted: 2008年12月18日(木) 11:14
by ざこ
自己解決しました。ありがとうございました。
コピペじゃなくて1つ1つ理解する為に自分で打ち込んでいったのでミスがあったようです;
pStatic->GetWindowText(cString); →pStatic->GetWindowText(CString); になってました。
Re:プログラム
Posted: 2008年12月18日(木) 11:15
by Blue
GetWindowTextで間違いないですか?(Setではなくて)
取得するならCStringの変数を渡さないと。
Re:プログラム
Posted: 2008年12月18日(木) 11:16
by Blue
すみません、勘違いでした。
Re:プログラム
Posted: 2008年12月18日(木) 12:04
by ざこ
なんか⑤の所おかしいんですが①⑤ ②⑤ ⑧⑤ ⑦⑤ ④⑤と押すとその時点で勝利とでます。
私の所だけかな・・
Re:プログラム
Posted: 2008年12月18日(木) 12:13
by バグ
5がおかしいならば、そこを判定している箇所がおかしいのでしょう。
Judge関数の中のswitchの中のcase 5の箇所がそうです。
ちなみにこちらでは誤判定は確認できません。