VBで○×ゲームを作るには?


ラフ  2004-01-07 00:20:48  No: 81273  IP: [192.*.*.*]

VBのチャットを作っているのですが、○×ゲームをそのチャットにつけようと思っています。
○×ゲームを作るにはどーすればよいでしょうか?

編集    削除
たかみちえ  URL  2004-01-07 01:29:37  No: 81274  IP: [192.*.*.*]

まず、ローカルでまるばつゲームを作ることから考えてみてください。
まるばつゲームを作るには、"コンピュータにまるばつゲームのルールを理解させること"が必要です。
○か×が縦横斜めどれかに並んだら、並べた方の勝ちだとか、そんなことです。

  この場合AIが操作するみたいなことはないので、それだけで何とかなりますね。

編集    削除
ラフ  2004-01-07 06:13:32  No: 81275  IP: [192.*.*.*]

ん〜頑張ってみたのですが、できないのですが↓
ん〜できれば、詳しく教えていただければありがたいです。

編集    削除
たかみちえ  URL  2004-01-07 08:41:38  No: 81276  IP: [192.*.*.*]

どの辺ができないんでしょうか?
GUI?ルールを教えること?○や×をプレイヤーに置かせること?

編集    削除
ラフ  2004-01-07 21:42:01  No: 81277  IP: [192.*.*.*]

返事ありがとうございます。
勝ち負けを判断させるところができません。
できたら、その辺りを詳しく教えていただければありがたいです。
お願いします。

編集    削除
K  2004-01-07 21:57:09  No: 81278  IP: [192.*.*.*]

If 〜 End If 文を使えばできそうじゃないですか?
例えば、
○ or ×が、縦横斜のどれかに並んだかどうかを、
○ or ×を選ぶ(置く?)時に判定すれば出来るかと思います。

編集    削除
たかみちえ  URL  2004-01-07 23:11:18  No: 81279  IP: [192.*.*.*]

Ifは基本ですから、まずFor文(またはWhile文)でしょう。
まるばつゲームは、"縦"か、"横"か、"斜め"にそろったときに勝敗が決まります。
  どういう方法でデータを管理しているかは知りませんけど、データを見ただけで2Dの表はできているんですよね?(たとえば、二次元配列とか)
ならば、それを一個ずつ、Forでマッチしてるか(いまおいた駒と同じ駒か)どうか、調べていけばいいのです。
  二次元配列を例にとるとするならば、
Dim WinFlag As Boolean ' 勝ちフラグですね。
Dim i As Integer ' カウンタです。
Dim MyMark As String ' いまおいた駒が入ってるとしましょう
WinFlag = true
i = 0
MyMark = "○"
While((not WinFlag) or i < 3) begin
  if cells[0, i] = MyMark then
    WinFlag = true ' 勝ちの可能性があるので、ループ続けます。
  else
    WinFlag = false ' もう勝ちの見込みはないので、ループ抜けます。
end
if WinFlag then ' ループを抜けてもまだ勝ちフラグがたってるんだから、勝ちです。
  MsgBox(MyMark & 'の勝ちです(#^.^#)')
else ' 勝ちフラグがたってなかったら、つまりまだ勝ってません。次の敵ターンに移行します。
  NextTurn
' VBの構文よく覚えてないので、微妙に違うかも。適当に読み替えてください

  これは横列を確かめる処理ですね。同じ要領で縦も斜めも可能です。
  あー、やっぱり再帰した方がわかりやすいかなぁ。

編集    削除
ラフ  2004-01-08 01:14:23  No: 81280  IP: [192.*.*.*]

返事ありがとうございます。
たかひえみさんの
While((not WinFlag) or i < 3) begin
  if cells[0, i] = MyMark then

MsgBox(MyMark & 'の勝ちです(#^.^#)')
のところが赤になって実行できないのですが(><)

編集    削除
sawa  2004-01-08 01:37:41  No: 81281  IP: [192.*.*.*]

while の部分がDelphi構文になってるんじゃないですか?

編集    削除
たかみちえ  URL  2004-01-08 01:48:41  No: 81282  IP: [192.*.*.*]

そうです(-_-;)
ですから"適当に読み替えてください"と…。

  とりあえずヘルプで確認すれば、その辺は問題ないはずですので。

編集    削除
ラフ  2004-01-08 04:39:14  No: 81283  IP: [192.*.*.*]

返事ありがとうございます。
ん〜やっぱり勝敗がでませんでした。
どのように考えていけばよいのでしょうか?
このゲームを作るのに何が一番大事ですか?

編集    削除
たかみちえ  URL  2004-01-08 05:10:39  No: 81284  IP: [192.*.*.*]

まさかわたしの書いたコードをそのまま流用したとか?
(4つ上の書き込みの内容からすると…)

  わたしが言ったとおり、アレは不完全(横一列の勝敗判定のみ)です。
アレを工夫して、縦、斜めも作っていってください と言うことです。
それから、データ管理が二次元配列じゃなかったら、当然処理方法も適当に考えて変えてやらないといけませんよ。

  わたしはいまはVBユーザーじゃありません。一応VB歴はあるし、アドバイス程度ならできるだろうなと思って、ここに来ているだけです。
わたしを信用しきっちゃいけませんよ。たまにVBとDelphiを間違えたりしますので。

  最後にものを言うのは応用力です。応用さえできれば、いまのヒントで十分解けると思います。


> このゲームを作るのに何が一番大事ですか?
  それはもちろん、"勝敗を決めること"です。リバーシ(オセロ)ならまだしも、まるばつゲームに他に必要なことはありませんね。
(まあ、GUIがどうこう言うのならありますけど)
  知恵を働かせるのはこの場合人間ですから、他は何にも考えなくていいです。ごく単純に機械的に、こちら(プログラム側)は判断だけしていればいいのです。

編集    削除
ラフ  2004-01-08 07:15:47  No: 81285  IP: [192.*.*.*]

返事ありがとうございます。
一応、横、縦、斜めと全部作ったのですが、勝敗の判断ができませんでした。
ん〜また最初から作りなおしてみます。
ありがとうございました。

編集    削除
吉野  2004-01-08 21:37:37  No: 81286  IP: [192.*.*.*]

○×配置の状態変数は、二次元配列を使ってるのですか?
それなら、置かれた時点で
<例>
横方向のサンプル
For i=1 to 3
  If masu(置かれた縦位置, i)<>置かれた○× Then
    'この時点で成立しません(関数であれば、不成立を返します)
  End If
Next i

縦方向のサンプル
For i=1 to 3
  If masu(i, 置かれた横位置)<>置かれた○× Then
    'この時点で成立しません(関数であれば、不成立を返します)
  End If
Next i

'斜め方向のサンプル(左上から、右下へ)
'応用して、反対(右上から、左下)も出来ます
For i=1 to 3
  if masu(i, i)<>置かれた○× Then
    'この時点で成立しません(関数であれば、不成立を返します)
  End If
Next i

こんな感じ?実行とかしてないので間違ってるかもしれませんが…
この方法が、一番簡単だと思います。

編集    削除
銀猫  2004-01-09 21:02:18  No: 81287  IP: [192.*.*.*]

012
345
678
とすると048,246,036,147,258,012,345,678の部分が
同じ数字になってないかをチェックすればいいのではないかと。

編集    削除
吉野  2004-01-10 03:51:26  No: 81288  IP: [192.*.*.*]

ずいぶんお困りのようですね。
以下にサンプルを載せてます。ご参考までに。

<サンプル>
ラベルをクリックすると○×交互にセットし、勝敗を判定します。
尚、この判定ルーチンは何処に置いても全ての位置を検索します。
置いた位置に関する部分だけ判定するなど工夫してください。

新規フォームにラベルを9つ配置してください。
lblMasu(1)〜lblMasu(9)

(配置順)
1 2 3
4 5 6
7 8 9

後は、以下のコードを貼り付けてください。
Option Explicit
Private blnTurn As Boolean        'ターン(True…×/False…○)

Private Sub lblMasu_Click(Index As Integer)

    Dim strPlayer As String    'プレイヤーの記号
    Dim blnWin    As Boolean   '勝ち判定フラグ
    Dim i         As Integer   'ループ制御変数
    Dim j         As Integer   'ループ制御変数
    
    '記号をセット
    If blnTurn Then
        strPlayer = "×"
    Else
        strPlayer = "○"
    End If
    
    '記号を表示
    lblMasu(Index).Caption = strPlayer
    
    '横判定
    For i = 1 To 7 Step 3
        blnWin = True
        For j = i To i + 2
            If lblMasu(j).Caption <> strPlayer Then
                blnWin = False
                Exit For
            End If
        Next j
        If blnWin Then
            MsgBox "Win!!"
            Exit Sub
        End If
    Next i
    
    '縦判定
    For i = 1 To 3
        blnWin = True
        For j = i To i + 6 Step 3
            If lblMasu(j).Caption <> strPlayer Then
                blnWin = False
                Exit For
            End If
        Next j
        If blnWin Then
            MsgBox "Win!!"
            Exit Sub
        End If
    Next i
    
    '斜め判定(左上から右下へ)
    blnWin = True
    For i = 1 To 9 Step 4
        If lblMasu(i).Caption <> strPlayer Then
            blnWin = False
            Exit For
        End If
    Next i
    If blnWin Then
        MsgBox "Win!!"
        Exit Sub
    End If
    
    '斜め判定(右上から左下へ)
    blnWin = True
    For i = 3 To 7 Step 2
        If lblMasu(i).Caption <> strPlayer Then
            blnWin = False
            Exit For
        End If
    Next i
    If blnWin Then
        MsgBox "Win!!"
        Exit Sub
    End If
    
    '交代
    blnTurn = Not blnTurn
End Sub

編集    削除