ページ 11

○×ゲーム

Posted: 2008年12月15日(月) 11:14
by ざこ
VC++で3行3列の○×ゲーム作ってるのですが(交互に○とX書いて先に1列そろった方が勝ちというゲーム)
今単純に9個のコンボックスに○と×データ用意して9個のリストボックスに貼り付けるという感じにしてるのですが
それだとbuttonも9個用意しなきゃならないし、1つ1つに関数用意してるから判定ができないです・・
何かいい方法ないですか?

Re:○×ゲーム

Posted: 2008年12月15日(月) 13:08
by バグ
>>今単純に9個のコンボックスに○と×データ用意して9個のリストボックスに貼り付けるという感じにしてるのですが

えっと、ここの意味がよくわからないのですが…
コンボックスというのは『コンボボックス』のことでしょうか?
リストボックスに貼り付けるというのはどういうことでしょうか?

>>それだとbuttonも9個用意しなきゃならないし、1つ1つに関数用意してるから判定ができないです・・

これも意味が分かりません。なぜボタンが9個必要になるのでしょうか?
何故、1つ1つに関数を用意してるから判定ができないのでしょうか?

Re:○×ゲーム

Posted: 2008年12月15日(月) 13:35
by ざこ
①②③
④⑤⑥
⑦⑧⑨

とするとそれぞれの番号には○と×のデータが入っていてどちらか決めてbuttonを押しますと(①に○をいれる場合)
○②③
④⑤⑥
⑦⑧⑨

と表示していくようにしてるのです。
交互に○とXをつけていきたいので、butanが1つだと
2回目以降は次の行に書かれます。
交互に○とXをつけて一行そろった時点で勝利判定の文字を表示したいのです。

※コンボボックスのことです。

少し質問が意味不明になってしまったのでまとめさせていただきますね。
目的:○Xゲームを作る。
プログラム内容:交互に○と×を入れ一行そろった時点で勝利。ゲームの経過を表示する。
        MessageBoxなどで勝利です などいれる
わからないこと:クラスなど構想内容や判定の仕方など
自分で考えたこと:ぐちゃぐちゃすぎるので忘れてください・・

Re:○×ゲーム

Posted: 2008年12月15日(月) 14:26
by バグ
すみません、何点か確認させてください。

123
456
789

という風に並んでいるのはボタンですか、それともコンボボックスですか?

>>とするとそれぞれの番号には○と×のデータが入っていてどちらか決めてbuttonを押しますと(①に○をいれる場合)

この『どちらかを決める』というのはどのようなインターフェースを想定されていますか?
『どちらかを決める』という事は、○か×かを選択できる箇所があって、選択した後に決定ボタンのような物を押すという事でしょうか?

通常、○か×は自動で切り替わりますが、それは考慮しなくてもいいという事でしょうか?



※ここからは私ならば、こうするという仕様です

1:必ず○が先手とする。
2:9個のボタンを用意する。初期状態では何も書かれていない状態にしておく。
3:○か×かの表示はボタンが押された際に直接描画する(SetWindowText関数を使用する)
4:ボタンが押された際に既に○か×かがセットされていたら、メッセージボックスで別のボタンを押すように促す。
5:勝利判定を行う。
6:9回繰り返した時点で勝敗がつかなった場合は引き分けとする。
7:勝敗がついてない場合は○と×を切り換えて、3に戻る

Re:○×ゲーム

Posted: 2008年12月15日(月) 14:37
by ざこ
ありがとうございました。一応自分が考えたのでも不恰好ですができました。

>という風に並んでいるのはボタンですか、それともコンボボックスですか?

コンボボックスです。コンボボックスには通常データを入れておけて垂直バーで選択できますよね。
それに○と×を入れてます。

>通常、○か×は自動で切り替わりますが、それは考慮しなくてもいいという事でしょうか?

すいません。よくわかりません;


私が作った簡易版は
①コンボボックスに○と×を入れておき選択してButtonを押すとStaticに貼り付けるようにする。
SetDlgItemTextを使いました。
②それを3X3行列だから9個用意する

③前レスの例だと
①②③

④⑤⑥

⑦⑧⑨

①④⑦

②⑤⑧

③⑥⑨

③⑤⑦

①⑤⑨

がそれぞれ○かXで揃ったとき勝利判定にしました。

後バグさんの仰られた先手のときと引き分けのときとかも考えてみます。

Re:○×ゲーム

Posted: 2008年12月15日(月) 15:15
by バグ
ああ、なるほど。
あらかじめコンボボックスに○と×をセットしておき、どちらかを選択し、別に用意してある9つのボタンを押すと、その押した場所に対応したスタティックに○か×かがセットされるという事ですね。


123 123
456 456
789 789

上記の0がコンボボックスで、左の1~9がボタン、右の1~9がスタティックのようなイメージでしょうか?
なかなか面白いインターフェースですね(^-^)

Re:○×ゲーム

Posted: 2008年12月15日(月) 18:33
by ざこ
そのような感じですね。ただムダが多すぎるということでNGになりました。修正する箇所は2つ
(a)○か×を選択してButtonを押すのはムダで、コンボボックス内の○か×をチェックした時にプログラムを実行するようにする。

(b)限られた箇所だけ判定する。例えば①に最初○かXいれるとき
判定するのは①②③ ①④⑦ ①⑤⑨だけ。
②の場合
反対するのは①②③ ②⑤⑧だけ



(a)の条件から今まで1つの関数に詰め込んでいたのが
関数9つ作らないといけませんよね。そのせいで判定がややこしくなってわからなくなってしまいました。
お手数ですが教えてください。

Re:○×ゲーム

Posted: 2008年12月15日(月) 21:23
by ibis
>(a)の条件から今まで1つの関数に詰め込んでいたのが
>関数9つ作らないといけませんよね。そのせいで判定がややこしくなってわからなくなってしまいました。

判定でしたら(b)ではないですか?
とりあえず(b)という前提で言いますが。

3つのコンボボックスを特定できる情報(例えば1~9や0~8の整数とか、コンボボックスのハンドルとか)を受け取って判定結果を返す関数を作れれば、あとは比較的簡単です。
例えばそれがint f(int, int, int);という関数だとすると、全ての判定を行う関数は例えば以下のようにできます。
int g(int input){
    int n = 0;
    switch(input){
    case 1:
        n = n ? n : f(1, 2, 3);
        n = n ? n : f(1, 4, 7);
        n = n ? n : f(1, 5, 9);
        break;
    case 2:
        n = n ? n : f(1, 2, 3);
        n = n ? n : f(2, 5, 8);
        break;

        ・・・

    }
    return n;
}
データをどのように扱ってるかにもよりますが、多分こんな感じでできるのではないかと思います。

Re:○×ゲーム

Posted: 2008年12月16日(火) 10:12
by ざこ
ありがとうございました。おそらくibisさんが扱ってるのはちょっと違うタイプのものだとは思いますが、
参考にさせていただきます。