タイトル | : Re^4: VB .NET 2003でゲーム |
記事No | : 7080 |
投稿日 | : 2008/02/23(Sat) 03:34 |
投稿者 | : よねKEN |
> と名前で判定をやっていますが、いくら頭を使っても消える判定ができません。
と書かれていますが、「名前で判定」というのはどこでやっているのでしょうか? 提示のコードで書かれているのは ・ゲーム盤面上8 * 17の牌をボタンを使って表現 ・34種類の牌のイメージの読み込み の2点だけのようですが(一部不明なコードも)、肝心のその牌をどうこうする処理がないようです。
> やはり配列に入れないとダメでしょうか? > といっても配列に入れる方法もわからないのでお手上げ状態です。
いきなり大きな盤面でやろうと考えず、小さな盤面で考えてみてください。 ・3 * 4 の盤面 ・牌の代わりに1,2,3という数字で牌を表すものとします。 ・牌の置かれていない場所は0で表します。 ・四川省のルールを考慮して、データ構造上は5 * 6の配列で表します。(X=0〜4、Y=0〜5)
例えば、以下は初期状態の盤面のイメージです。 01234 X ----- 0|00000 1|03230 2|01310 3|03120 4|02110 5|00000
Y
これをVBで表すなら、例えば、以下のような2次元配列の表現で表せます。 (ロジックを考える上では見た目は重要ではありませんので、コンソールプログラムで書いてます。)
Module Program Private board As Byte(,)
Sub InitBoard() board = New Byte(,){ _ {0,0,0,0,0}, _ {0,3,2,3,0}, _ {0,1,3,1,0}, _ {0,3,1,2,0}, _ {0,2,1,1,0}, _ {0,0,0,0,0} _ } End Sub
Sub DisplayBoard() ' 現在の盤面の状態を表示 For y As Integer = 0 To 5 For x As Integer = 0 To 4 Console.Write("{0} ", board(y,x)) Next Console.WriteLine() Next End Sub
Sub Main() InitBoard() DisplayBoard()
' コンソールプログラムのため、実行したらすぐにDOSプロンプトが閉じてしまうため ' エンターキー押下まで待つ Console.Write("Press Enter key to finish ...") Console.ReadLine() End Sub
End Module
で、この配列を使ってごにょごにょすれば、四川省で必要な内部情報は扱えるようになりますが、 長くなるので、とりあえずここまでのヒントで頑張ってみてください。
> とりあえず、隣接したボタンを押せば消えるという処理をしたいのですが、教えていただければと思い、投稿しました。
「隣接したボタンを押せば消える」というのは隣り合った同じ牌があったら消せるようにするということだと思いますが、その前に、二つのボタンを選択できるように作りこむのが先になりますね。
考え方としては、
(1) 1つ目のボタンが押された → 1つ目に押されたボタン(牌の種類と座標)を覚えておく (2) 2つ目のボタンが押された → 2つ目に押されたボタン(牌の種類と座標)を覚えておく (3) 覚えておいた1つ目、2つ目のボタンの座標と牌の種類から消せるかどうかを判定する →隣接した牌のみ消せるというルールの場合、 (3)-a 2つの牌が同じか? → 同じでなければ消せない、同じなら(3)-bの判定へ (3)-b 1つ目と2つ目の座標のX軸、Y軸のどちらかの方向だけが前後1異なる → その通りなら牌は消せる
という判定になりますね。
|