VBのチャットを作っているのですが、○×ゲームをそのチャットにつけようと思っています。
○×ゲームを作るにはどーすればよいでしょうか?
まず、ローカルでまるばつゲームを作ることから考えてみてください。
まるばつゲームを作るには、"コンピュータにまるばつゲームのルールを理解させること"が必要です。
○か×が縦横斜めどれかに並んだら、並べた方の勝ちだとか、そんなことです。
この場合AIが操作するみたいなことはないので、それだけで何とかなりますね。
ん〜頑張ってみたのですが、できないのですが↓
ん〜できれば、詳しく教えていただければありがたいです。
どの辺ができないんでしょうか?
GUI?ルールを教えること?○や×をプレイヤーに置かせること?
返事ありがとうございます。
勝ち負けを判断させるところができません。
できたら、その辺りを詳しく教えていただければありがたいです。
お願いします。
If 〜 End If 文を使えばできそうじゃないですか?
例えば、
○ or ×が、縦横斜のどれかに並んだかどうかを、
○ or ×を選ぶ(置く?)時に判定すれば出来るかと思います。
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の構文よく覚えてないので、微妙に違うかも。適当に読み替えてください
これは横列を確かめる処理ですね。同じ要領で縦も斜めも可能です。
あー、やっぱり再帰した方がわかりやすいかなぁ。
返事ありがとうございます。
たかひえみさんの
While((not WinFlag) or i < 3) begin
if cells[0, i] = MyMark then
と
MsgBox(MyMark & 'の勝ちです(#^.^#)')
のところが赤になって実行できないのですが(><)
while の部分がDelphi構文になってるんじゃないですか?
編集 削除そうです(-_-;)
ですから"適当に読み替えてください"と…。
とりあえずヘルプで確認すれば、その辺は問題ないはずですので。
返事ありがとうございます。
ん〜やっぱり勝敗がでませんでした。
どのように考えていけばよいのでしょうか?
このゲームを作るのに何が一番大事ですか?
まさかわたしの書いたコードをそのまま流用したとか?
(4つ上の書き込みの内容からすると…)
わたしが言ったとおり、アレは不完全(横一列の勝敗判定のみ)です。
アレを工夫して、縦、斜めも作っていってください と言うことです。
それから、データ管理が二次元配列じゃなかったら、当然処理方法も適当に考えて変えてやらないといけませんよ。
わたしはいまはVBユーザーじゃありません。一応VB歴はあるし、アドバイス程度ならできるだろうなと思って、ここに来ているだけです。
わたしを信用しきっちゃいけませんよ。たまにVBとDelphiを間違えたりしますので。
最後にものを言うのは応用力です。応用さえできれば、いまのヒントで十分解けると思います。
> このゲームを作るのに何が一番大事ですか?
それはもちろん、"勝敗を決めること"です。リバーシ(オセロ)ならまだしも、まるばつゲームに他に必要なことはありませんね。
(まあ、GUIがどうこう言うのならありますけど)
知恵を働かせるのはこの場合人間ですから、他は何にも考えなくていいです。ごく単純に機械的に、こちら(プログラム側)は判断だけしていればいいのです。
返事ありがとうございます。
一応、横、縦、斜めと全部作ったのですが、勝敗の判断ができませんでした。
ん〜また最初から作りなおしてみます。
ありがとうございました。
○×配置の状態変数は、二次元配列を使ってるのですか?
それなら、置かれた時点で
<例>
横方向のサンプル
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
こんな感じ?実行とかしてないので間違ってるかもしれませんが…
この方法が、一番簡単だと思います。
012
345
678
とすると048,246,036,147,258,012,345,678の部分が
同じ数字になってないかをチェックすればいいのではないかと。
ずいぶんお困りのようですね。
以下にサンプルを載せてます。ご参考までに。
<サンプル>
ラベルをクリックすると○×交互にセットし、勝敗を判定します。
尚、この判定ルーチンは何処に置いても全ての位置を検索します。
置いた位置に関する部分だけ判定するなど工夫してください。
新規フォームにラベルを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