Игра Крестики - нолики

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Андрей999
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 11.12.2012 (Вт) 0:56

Игра Крестики - нолики

Сообщение Андрей999 » 11.12.2012 (Вт) 1:04

Привет всем. Это игра крестики нолики, играть можно в режиме 3х3.
А можно сделать, чтобы был выбор режима , например 3х3, 5х5, 9х9. Если кто знает, как это сделать, напишите сюда пожалуйста.

Код: Выделить всё
VERSION 5.00
Begin VB.Form FrmTTT
   Caption         =   "Ultimate Tic-Tac-Toe"
   ClientHeight    =   4125
   ClientLeft      =   60
   ClientTop       =   360
   ClientWidth     =   4920
   LinkTopic       =   "Form1"
   ScaleHeight     =   4125
   ScaleWidth      =   4920
   StartUpPosition =   3  'Windows Default
   Begin VB.CommandButton Command1
      Caption         =   "Об авторе"
      Height          =   255
      Left            =   240
      TabIndex        =   8
      Top             =   3600
      Width           =   3015
   End
   Begin VB.Frame Scoreframe
      Caption         =   "Scoreboard"
      BeginProperty Font
         Name            =   "MS Sans Serif"
         Size            =   8.25
         Charset         =   204
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   1695
      Left            =   3360
      TabIndex        =   3
      Top             =   120
      Width           =   1455
      Begin VB.Label compscore
         Height          =   255
         Left            =   240
         TabIndex        =   7
         Top             =   1200
         Width           =   495
      End
      Begin VB.Label playerscore
         Height          =   255
         Left            =   240
         TabIndex        =   6
         Top             =   600
         Width           =   495
      End
      Begin VB.Label complbl
         Caption         =   "Computer:"
         Height          =   255
         Left            =   120
         TabIndex        =   5
         Top             =   960
         Width           =   735
      End
      Begin VB.Label playerlbl
         Caption         =   "Player:"
         Height          =   255
         Left            =   120
         TabIndex        =   4
         Top             =   360
         Width           =   495
      End
   End
   Begin VB.CommandButton cmdquit
      Caption         =   "Выход"
      Height          =   615
      Left            =   3600
      TabIndex        =   1
      Top             =   3240
      Width           =   975
   End
   Begin VB.CommandButton cmdnewgame
      Caption         =   "Новая игра"
      Height          =   735
      Left            =   3600
      TabIndex        =   0
      Top             =   2040
      Width           =   975
   End
   Begin VB.PictureBox picboard
      BackColor       =   &H00000000&
      DrawWidth       =   4
      FillColor       =   &H00FFFFFF&
      ForeColor       =   &H00FF0000&
      Height          =   975
      Index           =   0
      Left            =   1200
      ScaleHeight     =   915
      ScaleWidth      =   915
      TabIndex        =   2
      Top             =   1080
      Visible         =   0   'False
      Width           =   975
   End
End
Attribute VB_Name = "FrmTTT"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim Xturn As Boolean, clickedunit(1 To 3, 1 To 3) As String
Dim X As Byte, Y As Byte, gotwinner As Boolean, numruns As Byte
Dim way1 As Boolean, way2 As Boolean, gotflag As Boolean
Dim AIxpos As Byte, AIypos As Byte
Dim playerscorenum As Byte, compscorenum As Byte

Private Sub cmdnewgame_Click()
Dim i As Byte, j As Byte
Xturn = True
numruns = 0
way1 = False
way2 = False
For i = 1 To 9
picboard(i).Cls
picboard(i).Enabled = True
Next i
For i = 1 To 3
For j = 1 To 3
clickedunit(i, j) = ""
Next j
Next i
For i = 1 To 9
picboard(i).Enabled = True
Next i
End Sub

Private Sub cmdquit_Click()
End
End Sub
Private Sub Command1_Click()
Form1.Show
End Sub

Private Sub Form_Load()
Dim i As Byte, moveX As Single, moveY As Single
playerscorenum = 0
compscorenum = 0
playerscore.Caption = playerscorenum
compscore.Caption = compscorenum
way1 = False
way1 = False
Xturn = True


moveX = 300
moveY = 300
For i = 1 To 9
    If (i - 1) / 3 = Int((i - 1) / 3) And i <> 1 Then
    moveY = moveY + picboard(0).Height
    moveX = 300
    End If
Load picboard(i)
picboard(i).Visible = True
picboard(i).Move moveX, moveY
moveX = moveX + picboard(0).Width
Next i

End Sub

Private Sub picboard_Click(index As Integer)
Call getpos(index)
If clickedunit(X, Y) = "" Then
numruns = numruns + 1
   
    If Xturn = True Then
    picboard(index).ForeColor = vbBlue
    picboard(index).Line (200, 200)-(775, 775)
    picboard(index).Line (775, 200)-(200, 775)
    Xturn = False
    clickedunit(X, Y) = "X"
   
    Else:
    picboard(index).ForeColor = vbYellow
    picboard(index).Circle (picboard(0).Width / 2, picboard(o).Height / 2), 300
    Xturn = True
    clickedunit(X, Y) = "O"
    End If
Call checkwin
End If

If Xturn = False And gotwinner = False And numruns = 1 Then
Call AIturn
ElseIf Xturn = False And gotwinner = False And numruns < 9 Then
Call AIturnoff
End If

If numruns = 9 And gotwinner = False Then
MsgBox "Nobody wins, nobody loses.", vbOKOnly, "Darn!"
    For X = 1 To 9
    picboard(X).Enabled = False
    Next X
End If

End Sub

Private Sub getpos(index As Integer)

Select Case index
Case 1 To 3
X = index
Y = 1
Case 4 To 6
X = index - 3
Y = 2
Case 7 To 9
X = index - 6
Y = 3
End Select
End Sub

Private Sub checkwin()
gotwinner = False

Y = 0
Do
Y = Y + 1
If clickedunit(1, Y) <> "" And clickedunit(1, Y) = clickedunit(2, Y) And clickedunit(1, Y) = clickedunit(3, Y) Then
Call wehaveawinner(1, Y)
End If
Loop Until Y = 3 Or gotwinner = True


X = 0
If gotwinner = False Then
Do
X = X + 1
If clickedunit(X, 1) <> "" And clickedunit(X, 1) = clickedunit(X, 2) And clickedunit(X, 1) = clickedunit(X, 3) Then
Call wehaveawinner(X, 1)
End If
Loop Until X = 3 Or gotwinner = True
End If


If gotwinner = False And clickedunit(2, 2) <> "" And clickedunit(1, 1) = clickedunit(2, 2) And clickedunit(1, 1) = clickedunit(3, 3) Then
Call wehaveawinner(2, 2)
End If
If gotwinner = False And clickedunit(2, 2) <> "" And clickedunit(2, 2) = clickedunit(1, 3) And clickedunit(2, 2) = clickedunit(3, 1) Then
Call wehaveawinner(2, 2)
gotwinner = True
End If
If gotwinner = True Then
For X = 1 To 9
picboard(X).Enabled = False
Next X
End If
End Sub

Private Sub wehaveawinner(a As Byte, b As Byte)
MsgBox clickedunit(a, b) & " wins the game!", vbOKOnly, "We have a winner!"
gotwinner = True
If clickedunit(a, b) = "X" Then
playerscorenum = playerscorenum + 1
playerscore.Caption = playerscorenum
ElseIf clickedunit(a, b) = "O" Then
compscorenum = compscorenum + 1
compscore.Caption = compscorenum
End If
End Sub


Private Sub AIturn()

If clickedunit(2, 2) = "X" Then
Randomize
randomnum = Int(4 * Rnd)
    Select Case randomnum
    Case 0
    AIxpos = 1
    AIypos = 1
    Case 1
    AIxpos = 3
    AIypos = 3
    Case 2
    AIxpos = 1
    AIypos = 3
    Case 3
    AIxpos = 3
    AIypos = 1
    End Select
way1 = True
gotflag = True
End If


If clickedunit(2, 2) = "" Then
If clickedunit(1, 1) = clickedunit(3, 3) Then
gotflag = True
AIxpos = 2
AIypos = 2
way2 = True
ElseIf clickedunit(1, 3) = clickedunit(3, 1) Then
gotflag = True
AIxpos = 2
AIypos = 2
way2 = True
End If
End If

If gotflag = True Then
Call picboard_Click((AIypos - 1) * 3 + AIxpos)
End If

End Sub

Private Sub AIturnoff()

Dim nextchecked As Byte, nextunchecked As Byte
Dim randomnum As Byte
gotflag = False


Y = 0
Do
Y = Y + 1
X = 0
nextunchecked = 2
nextchecked = 1
  Do
  X = X + 1
  nextunchecked = nextunchecked + 1
  nextchecked = nextchecked + 1
    If nextunchecked > 3 Then
    nextunchecked = nextunchecked - 3
    End If
    If nextchecked > 3 Then
    nextchecked = nextchecked - 3
    End If
    If clickedunit(X, Y) = "O" And clickedunit(X, Y) = clickedunit(nextchecked, Y) And clickedunit(nextunchecked, Y) = "" Then
    gotflag = True
    AIxpos = nextunchecked
    AIypos = Y
    End If
  Loop Until gotflag = True Or X = 3
Loop Until gotflag = True Or Y = 3


If gotflag = False Then
X = 0
  Do
  X = X + 1
  Y = 0
  nextunchecked = 2
  nextchecked = 1
    Do
    Y = Y + 1
    nextunchecked = nextunchecked + 1
    nextchecked = nextchecked + 1
      If nextunchecked > 3 Then
      nextunchecked = nextunchecked - 3
      End If
      If nextchecked > 3 Then
      nextchecked = nextchecked - 3
      End If
      If clickedunit(X, Y) = "O" And clickedunit(X, Y) = clickedunit(X, nextchecked) And clickedunit(X, nextunchecked) = "" Then
      gotflag = True
      AIxpos = X
      AIypos = nextunchecked
      End If
    Loop Until gotflag = True Or Y = 3
  Loop Until gotflag = True Or X = 3
End If


If gotflag = False Then
  If clickedunit(2, 2) = "O" Then
    If clickedunit(2, 2) = clickedunit(1, 1) And clickedunit(3, 3) = "" Then
    gotflag = True
    AIxpos = 3
    AIypos = 3
    ElseIf clickedunit(2, 2) = clickedunit(3, 3) And clickedunit(1, 1) = "" Then
    gotflag = True
    AIxpos = 1
    AIypos = 1
    ElseIf clickedunit(2, 2) = clickedunit(3, 1) And clickedunit(1, 3) = "" Then
    gotflag = True
    AIxpos = 1
    AIypos = 3
    ElseIf clickedunit(2, 2) = clickedunit(1, 3) And clickedunit(3, 1) = "" Then
    gotflag = True
    AIxpos = 3
    AIypos = 1
    End If
  End If
End If

If gotflag = True Then
Call picboard_Click((AIypos - 1) * 3 + AIxpos)
Else: Call AIturndef
End If
End Sub

Private Sub AIturndef()

Dim nextchecked As Byte, nextunchecked As Byte
Dim randomnum As Byte



Y = 0
Do
Y = Y + 1
X = 0
nextunchecked = 2
nextchecked = 1
  Do
  X = X + 1
  nextunchecked = nextunchecked + 1
  nextchecked = nextchecked + 1
    If nextunchecked > 3 Then
    nextunchecked = nextunchecked - 3
    End If
    If nextchecked > 3 Then
    nextchecked = nextchecked - 3
    End If
    If clickedunit(X, Y) <> "" And clickedunit(X, Y) = clickedunit(nextchecked, Y) And clickedunit(nextunchecked, Y) = "" Then
    gotflag = True
    AIxpos = nextunchecked
    AIypos = Y
    End If
  Loop Until gotflag = True Or X = 3
Loop Until gotflag = True Or Y = 3


If gotflag = False Then
X = 0
  Do
  X = X + 1
  Y = 0
  nextunchecked = 2
  nextchecked = 1
    Do
    Y = Y + 1
    nextunchecked = nextunchecked + 1
    nextchecked = nextchecked + 1
      If nextunchecked > 3 Then
      nextunchecked = nextunchecked - 3
      End If
      If nextchecked > 3 Then
      nextchecked = nextchecked - 3
      End If
      If clickedunit(X, Y) <> "" And clickedunit(X, Y) = clickedunit(X, nextchecked) And clickedunit(X, nextunchecked) = "" Then
      gotflag = True
      AIxpos = X
      AIypos = nextunchecked
      End If
    Loop Until gotflag = True Or Y = 3
  Loop Until gotflag = True Or X = 3
End If


If gotflag = False Then
  If clickedunit(2, 2) <> "" Then
    If clickedunit(2, 2) = clickedunit(1, 1) And clickedunit(3, 3) = "" Then
    gotflag = True
    AIxpos = 3
    AIypos = 3
    ElseIf clickedunit(2, 2) = clickedunit(3, 3) And clickedunit(1, 1) = "" Then
    gotflag = True
    AIxpos = 1
    AIypos = 1
    ElseIf clickedunit(2, 2) = clickedunit(3, 1) And clickedunit(1, 3) = "" Then
    gotflag = True
    AIxpos = 1
    AIypos = 3
    ElseIf clickedunit(2, 2) = clickedunit(1, 3) And clickedunit(3, 1) = "" Then
    gotflag = True
    AIxpos = 3
    AIypos = 1
    End If
  End If
End If

If gotflag = True Then
Call picboard_Click((AIypos - 1) * 3 + AIxpos)
Else: Call AIdeadends
End If
End Sub

Private Sub AIdeadends()



If way1 = True And numruns = 3 Then
    If (AIxpos = 1 And AIypos = 1) Or (AIxpos = 3 And AIypos = 3) Then
    Call randomAIclick(3, 7, 0, 0)
    ElseIf (AIxpos = 1 And AIypos = 3) Or (AIxpos = 3 And AIypos = 1) Then
    Call randomAIclick(1, 9, 0, 0)
    End If
End If



If way2 = True And numruns = 3 And gotflag = False Then
    If (clickedunit(1, 1) <> "" And clickedunit(1, 1) = clickedunit(3, 3)) Or clickedunit(1, 3) <> "" And clickedunit(1, 3) = clickedunit(3, 1) Then
    Call randomAIclick(2, 4, 6, 8)
    End If
End If


If way2 = True And numruns = 3 And gotflag = False Then
    If clickedunit(2, 1) = "X" And (clickedunit(1, 3) = "X" Or clickedunit(2, 3) = "X" Or clickedunit(3, 3) = "X") Then
    Call randomAIclick(4, 6, 0, 0)
    ElseIf clickedunit(2, 3) = "X" And (clickedunit(1, 1) = "X" Or clickedunit(2, 1) = "X" Or clickedunit(3, 1) = "X") Then
    Call randomAIclick(4, 6, 0, 0)
    ElseIf clickedunit(1, 2) = "X" And (clickedunit(3, 1) = "X" Or clickedunit(3, 2) = "X" Or clickedunit(3, 3) = "X") Then
    Call randomAIclick(2, 8, 0, 0)
    ElseIf clickedunit(3, 2) = "X" And (clickedunit(1, 1) = "X" Or clickedunit(1, 2) = "X" Or clickedunit(1, 3) = "X") Then
    Call randomAIclick(2, 8, 0, 0)
    End If
End If


If numruns = 3 And way2 = True And gotflag = False Then
    If clickedunit(2, 1) = "X" And clickedunit(2, 1) = clickedunit(1, 2) Then
    Call randomAIclick(1, 3, 7, 0)
    ElseIf clickedunit(2, 1) = "X" And clickedunit(3, 2) = clickedunit(2, 1) Then
    Call randomAIclick(1, 3, 9, 0)
    ElseIf clickedunit(2, 3) = "X" And clickedunit(1, 2) = clickedunit(2, 3) Then
    Call randomAIclick(1, 7, 9, 0)
    ElseIf clickedunit(2, 3) = "X" And clickedunit(3, 2) = clickedunit(2, 3) Then
    Call randomAIclick(3, 7, 9, 0)
    End If
End If


If numruns = 5 And gotflag = False And (clickedunit(2, 1) <> "" And clickedunit(2, 2) <> "" And clickedunit(2, 3) <> "") And (clickedunit(1, 2) <> "" And clickedunit(2, 2) <> "" And clickedunit(3, 2) <> "") Then
    Select Case "O"
     Case Is = clickedunit(2, 1)
     Call randomAIclick(1, 3, 0, 0)
     Case Is = clickedunit(1, 2)
     Call randomAIclick(1, 7, 0, 0)
     Case Is = clickedunit(3, 2)
     Call randomAIclick(3, 9, 0, 0)
     Case Is = clickedunit(2, 3)
     Call randomAIclick(7, 9, 0, 0)
    End Select
End If


If numruns = 5 And gotflag = False And (clickedunit(2, 1) <> "" And clickedunit(2, 2) <> "" And clickedunit(2, 3) <> "") Or (clickedunit(1, 2) <> "" And clickedunit(2, 2) <> "" And clickedunit(3, 2) <> "") Then
    If clickedunit(1, 1) = "X" Then
    Call randomAIclick(3, 7, 9, 0)
    ElseIf clickedunit(3, 1) = "X" Then
    Call randomAIclick(1, 7, 9, 0)
    ElseIf clickedunit(3, 3) = "X" Then
    Call randomAIclick(1, 3, 7, 0)
    ElseIf clickedunit(1, 3) = "X" Then
    Call randomAIclick(1, 3, 9, 0)
    End If
End If
If gotflag = False Then
Call AIrandompick
End If
End Sub

Private Sub AIrandompick()
Dim countavailable As Byte, randomnum As Byte, availcoordinate(1 To 9) As Integer
countavailable = 0

For Y = 1 To 3
  For X = 1 To 3
    If clickedunit(X, Y) = "" Then
    countavailable = countavailable + 1
    availcoordinate(countavailable) = ((Y - 1) * 3 + X)
    End If
  Next X
Next Y

Randomize
randomnum = Int(Rnd * countavailable)
Select Case randomnum
  Case 0
    Call picboard_Click(availcoordinate(1))
  Case 1
    Call picboard_Click(availcoordinate(2))
  Case 2
    Call picboard_Click(availcoordinate(3))
  Case 3
    Call picboard_Click(availcoordinate(4))
  Case 4
    Call picboard_Click(availcoordinate(5))
  Case 5
    Call picboard_Click(availcoordinate(6))
  Case 6
    Call picboard_Click(availcoordinate(7))
  Case 7
    Call picboard_Click(availcoordinate(8))
  Case 8
    Call picboard_Click(availcoordinate(9))
End Select
End Sub

Private Sub randomAIclick(a As Integer, b As Integer, c As Integer, d As Integer)
Dim randomnum As Byte
Randomize


If d = 0 And c = 0 Then
randomnum = Int(Rnd * 2)
ElseIf d = 0 Then
randomnum = Int(Rnd * 3)
Else: randomnum = Int(Rnd * 3)
End If

Select Case randomnum
Case 0
Call picboard_Click(a)
Case 1
Call picboard_Click(b)
Case 2
Call picboard_Click(c)
Case 3
Call picboard_Click(d)
End Select

gotflag = True
End Sub


Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.12.2012 (Вт) 7:23

Ну я знаю. И вообще, почти все знают. А код даже читать не хочется. Вообще, смотри тему про пятнашки.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 33

    TopList