AUTOMATIC SYSTEM
GREATING GAME ON VISUAL BASIC WITH MULTIPLAYER SYSTEM
Dushanbe, 2009
Main Interface
Source Code
Public lanchoice As Long 'address
Public details As String 'names
Public connected As Boolean 'if connected
Private Sub Form_Load ()
Connect. Icon = LoadResPicture ("ictac", vbResIcon) 'form icon
If usermode = "host" Then
join. Enabled = False
Else
host. Enabled = False
gamename. Visible = False
Label5. Visible = False
End If
End Sub
Private Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer)
'call on form cancel or exit by control box on form
If connectionmade = False Then
MainBoard. hostagame. Enabled = True
MainBoard. joinagame. Enabled = True
Call CloseDownDPlay
multiplayermode = False
End If
MainBoard. Enabled = True
End Sub
Private Sub host_Click ()
On Error GoTo NO_Hosting ' error handler in case creating host fails
If playersname = "" Or gamename = "" Then
MsgBox "You must enter a Players name and Game Name", vbOKOnly, "Tic Tac Oops"
Exit Sub
End If
Call goplay 'starts direct play object
Dim address As DirectPlayAddress
'Selects which choice was made for lan
Set address = EnumConnect. GetAddress (lanchoice)
'Binds address to directplay connection
Call dxplay. InitializeConnection (address)
'Starts sessiondata information
Dim SessionData As DirectPlaySessionData
Set SessionData = dxplay. CreateSessionData
Call SessionData. SetMaxPlayers (2)
Call SessionData. SetSessionName (gamename. Text)
Call SessionData. SetFlags (DPSESSION_MIGRATEHOST)
Call SessionData. SetGuidApplication (AppGuid)
'Starts a new session initializes connection
Call dxplay. Open (SessionData, DPOPEN_CREATE)
'Create Player profile
Dim PlayerName As String
Dim playerhandle As String
PlayerName = playersname. Text
profilename = PlayerName
playerhandle = "Player (Host)"
MyPlayer = dxplay. CreatePlayer (PlayerName, playerhandle, 0, 0)
dxHost = True
gameopen. Caption = gamename. Text
Call updatedisplay 'Updates game list
Label8. Caption = "Waiting for other Players"
Exit Sub
NO_Hosting:
MsgBox "Could not Host Game", vbOKOnly, "Try Again"
End Sub
Private Sub join_Click ()
On Error GoTo Oops
Call goplay
Dim address As DirectPlayAddress
Set address = EnumConnect. GetAddress (lanchoice)
Call dxplay. InitializeConnection (address)
Dim details2 As Byte
Dim SessionData As DirectPlaySessionData
Set SessionData = dxplay. CreateSessionData
'Gets Session any open session info
Set EnumSession = dxplay. GetDPEnumSessions (SessionData, 0, DPENUMSESSIONS_AVAILABLE)
Set SessionData = EnumSession. GetItem (1)
'Get open session name
details = SessionData. GetSessionName
If details > "" And usermode = "client" Then
joingame. Enabled = True
End If
Call updatedisplay
gameopen. Caption = details
Exit Sub
Oops:
MsgBox "Connection Failed", vbOKOnly, "Tic Tac Oops"
Exit Sub
End Sub
Public Function goplay ()
Set dxplay = dx7. DirectPlayCreate ("") 'open directplay object
'gets connection types
Set EnumConnect = dxplay. GetDPEnumConnections ("", DPCONNECTION_DIRECTPLAY)
End Function
Private Sub joingame_Click ()
On Error GoTo Joinfailed
If playersname = "" Then
MsgBox "You must enter a Players name", vbOKOnly, "Tic Tac Oops"
Exit Sub
End If
Dim SessionData As DirectPlaySessionData
Set SessionData = EnumSession. GetItem (1)
'Joins open session
Call dxplay. Open (SessionData, DPOPEN_JOIN)
'creats and sends player info
PlayerName = playersname. Text
profilename = PlayerName
playerhandle = "Player (Client)"
MyPlayer = dxplay. CreatePlayer (PlayerName, playerhandle, 0, 0)
Call UpdateWaiting
joingame. Enabled = False
playersname. Enabled = False
MainBoard. mnuchat. Enabled = True
Exit Sub
Joinfailed:
MsgBox "Joining Session Failed", vbOKOnly, "No Session Found"
Exit Sub
End Sub
Public Sub UpdateWaiting ()
Dim StatusMsg As String
Dim x As Integer
Dim objDPEnumPlayers As DirectPlayEnumPlayers
Dim SessionData As DirectPlaySessionData
' Enumerate players
On Error GoTo ENUMERROR
Set objDPEnumPlayers = dxplay. GetDPEnumPlayers ("", 0)
gNumPlayersWaiting = objDPEnumPlayers. GetCount
' Update label
Set SessionData = dxplay. CreateSessionData
Call dxplay. GetSessionDesc (SessionData)
StatusMsg = gNumPlayersWaiting & " of " & SessionData. GetMaxPlayers _
& " players ready..."
Label8. Caption = StatusMsg
If gNumPlayersWaiting = SessionData. GetMaxPlayers And usermode = "host" Then
start. Enabled = True
Label8. Caption = "Everyone is here Click Start"
End If
If gNumPlayersWaiting = SessionData. GetMaxPlayers And usermode = "client" Then
start. Enabled = False
Label8. Caption = "Waiting For Host To Start Session"
End If
' Update listbox
Dim PlayerName As String
For x = 1 To gNumPlayersWaiting
PlayerName = objDPEnumPlayers. GetShortName (x)
If PlayerName <> playersname. Text Then
labeljoined. Caption = PlayerName & " has joined the game."
opponentsname = PlayerName
End If
Call lstPlayers. AddItem (PlayerName)
Next x
Exit Sub
ENUMERROR:
MsgBox ("No Players Found")
Exit Sub
End Sub
Private Sub lantype_Click (Index As Integer)
lanchoice = Index + 1
host. Visible = True
join. Visible = True
End Sub
Private Sub start_Click ()
On Error GoTo CouldNotStart
Const msgsize = 21
Dim tnumplayers As DirectPlayEnumPlayers
Dim SessionData As DirectPlaySessionData
' Disable joining, in case we start before maximum no. of players reached. We
' don't want anyone slipping in at the last moment.
Set SessionData = dxplay. CreateSessionData
Call dxplay. GetSessionDesc (SessionData) ' necessary?
Call SessionData. SetFlags (SessionData. GetFlags + DPSESSION_JOINDISABLED)
Call dxplay. SetSessionDesc (SessionData)
' Set global player count. This mustn't be done earlier, because someone might
' have dropped out or joined just as the host clicked Start.
Set tnumplayers = dxplay. GetDPEnumPlayers ("", 0)
numplayers = CByte (tnumplayers. GetCount)
Dim dpmsg As DirectPlayMessage
Dim pID As Long
Dim msgtype As Long
Dim x As Byte
Set dpmsg = dxplay. CreateMessage
dpmsg. WriteLong (MSG_STARTGAME) 'case selector
dpmsg. WriteByte (numplayers) 'number of players
Dim PlayerID As Long
For x = 0 To numplayers - 1
PlayerID = tnumplayers. GetDPID (x + 1)
dpmsg. WriteLong (PlayerID)
' Keep local copy of player IDs
PlayerIDs (x) = PlayerID
' Assign place in order to the host
If PlayerID = MyPlayer Then dxMyTurn = x
Next x
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, dpmsg)
Hide
MainBoard. Enabled = True
MainBoard. Show
MainBoard. playerdisplaylabel. Caption = opponentsname & " Has Joined The Game"
MainBoard. StatusBar1. SimpleText = opponentsname & "Is Ready To Play, Start Game"
MainBoard. mnudisconnect. Enabled = True
connectionmade = True
multiplayermode = True
MainBoard. mnuchat. Enabled = True
onconnect = True
Exit Sub
CouldNotStart:
MsgBox "Could not start game. ", vbOKOnly, "System"
End Sub
Private Function updatedisplay ()
label7. Visible = True
gameopen. FontUnderline = False
gameopen. ForeColor = vbBlue
host. Enabled = False
join. Enabled = False
Dim Y As Byte
Y = 0
For Y = 0 To 2 Step 1
lantype (Y). Enabled = False
Next Y
End Function
Option Explicit
Dim a (9) As Integer
Dim Player_A (9) As Integer 'Initialize X array
Dim Computer_A (9) As Integer 'Initialize O array
Dim Test_Result (8) As Integer
Dim Win (3) As Integer ' Spots won to marked
Dim m, Token, first_turn, temp1 As Integer
Dim Temp As Boolean 'check whether player won
Dim Sq_Left, n1, mark As Integer
Dim tr As String 'string passed on win to mark routine
Dim Begin As Boolean 'continue winning spots flashing
Dim sw As Boolean 'Sets whether X or O starts game
Public Sub Initialize ()
' select who's turn
If usermode = "host" And multiplayermode = True Then
' set o or x first
If sw = True Then
MyTurn = True
Else
MyTurn = False
End If
End If
If multiplayermode = False Then
MyTurn = True
End If
Begin = False ' cancel marking routine
score = score + 1 'adds one to gamecount
If multiplayermode = True Then
If usermode = "client" And sw = True Then
MyTurn = False
ElseIf usermode = "client" And sw = False Then
MyTurn = True
End If
End If
'Start SW true mode**********************************
'initialize game settings
If sw = True Then
StatusBar1. SimpleText = "New Game Initialized" & " X's Turn"
Debug. Print "Turn Status " & MyTurn
Debug. Print "SW Value is " & sw
Dim u As Integer
u = 0
Sq_Left = 9
Token = 10
For u = 0 To 8
Layer_A (u). MousePointer = vbCustom
'select starting icon and characteristics****************************
If usermode = "host" Then
Layer_A (u). MouseIcon = LoadResPicture ("x", vbResIcon)
Else
Layer_A (u). MouseIcon = LoadResPicture ("nyt", vbResIcon)
End If
Layer_A (u). FontSize = 28
Layer_A (u). FontBold = True
Layer_A (u). Caption = ""
Layer_A (u). BackStyle = 0
Layer_A (u). Alignment = 2
Player_A (u) = 0
Computer_A (u) = 0
Layer_A (u). Enabled = True
Next u
'update statusbar and display routine******************************
If usermode = "host" And multiplayermode = True Then
StatusBar1. SimpleText = "New Game Initialized " & profilename & "'s Turn"
Out_Box. Caption = profilename & "'s Turn."
End If
If usermode = "client" And multiplayermode = True Then
StatusBar1. SimpleText = "New Game Initialized " & opponentsname & "'s Turn"
Out_Box. Caption = opponentsname & "'s Turn."
End If
If multiplayermode = False Then
Out_Box. Caption = "X Goes First"
End If
End If
'End sw true*********************************************
'set starting icon*****************
If sw = False Then
StatusBar1. SimpleText = "New Game Initialized" & " O's Turn"
Debug. Print "Turn Status " & MyTurn
Debug. Print "SW Value is " & sw
u = 0
Sq_Left = 9
Token = 10
For u = 0 To 8
Layer_A (u). MousePointer = vbCustom
If usermode = "host" And multiplayermode = True Then
Layer_A (u). MouseIcon = LoadResPicture ("nyt", vbResIcon)
Else
Layer_A (u). MouseIcon = LoadResPicture ("o", vbResIcon)
End If
Layer_A (u). FontSize = 28
Layer_A (u). FontBold = True
Layer_A (u). Caption = ""
Layer_A (u). BackStyle = 0
Layer_A (u). Alignment = 2
Player_A (u) = 0
Computer_A (u) = 0
Layer_A (u). Enabled = True
Next u
Temp = False 'initiate no win
'Update Statusbar and outbox display********************8
If usermode = "client" And multiplayermode = True Then
StatusBar1. SimpleText = "New Game Initialized " & profilename & "'s Turn"
Out_Box. Caption = profilename & " 's Turn."
End If
If usermode = "host" And multiplayermode = True Then
StatusBar1. SimpleText = "New Game Initialized " & opponentsname & "'s Turn"
Out_Box. Caption = opponentsname & " 's Turn."
End If
If multiplayermode = False Then
Out_Box. Caption = "O Goes First"
End If
End If
'End sw false*********************************************
Debug. Print "Ran Initialization Myturn status is " & MyTurn
Game_Over. Caption = "New Game"
End Sub
Private Sub exit_Click ()
If onconnect = True Then 'checks for connection
On Error GoTo NoDx 'error to handle dxplay not initialized
Dim dpmsg As DirectPlayMessage
Set dpmsg = dxplay. CreateMessage
Call dpmsg. WriteLong (MSG_STOP) 'Sends player quit message to other player
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, dpmsg)
Call CloseDownDPlay 'shuts down dxplay
End If
Unload Connect 'unloads connect form if connect frees memory
Unload MainBoard 'unloads board before ending to free memory
End
NoDx:
MsgBox "Could not stop DXPlay. ", vbOKOnly, "System"
End
End Sub
Private Sub Form_Load ()
On Error GoTo NoLoad 'Handles errors in case form won't load
MainBoard. Icon = LoadResPicture ("ictac", vbResIcon) 'form icon
restart. Visible = False 'restart button not seen on single player or client mode
mnudisconnect. Enabled = False 'set menu item to no connect state
onconnect = False 'Sets connection status to false by default
sw = True 'set starting Player to x
x. Checked = True 'set menuitem X to x checked
multiplayermode = False 'initiate mode to false
Call deinitialize 'disables all squares until gamemode and multiplayer mode is decided
score = 0 'sets game count to 0
Exit Sub
NoLoad:
MsgBox "Could Not Load Form", vbOKOnly, "Quitting"
End
End Sub
Private Sub deinitialize ()
'Disables all squares until game selection is made
Dim m As Integer
For m = 0 To 8
Layer_A (m). MousePointer = vbCustom
If sw = True Then 'sets mouse pointer to x for x first
Layer_A (m). MouseIcon = LoadResPicture ("x", vbResIcon)
Else 'sets mouse pointer to O for O first
Layer_A (m). MouseIcon = LoadResPicture ("o", vbResIcon)
End If
Layer_A (m). FontSize = 28
Layer_A (m). FontBold = True
Layer_A (m). Caption = ""
Layer_A (m). BackStyle = 0
Layer_A (m). Alignment = 2
Layer_A (m). Enabled = False
Next m
'Update Status Bar
StatusBar1. SimpleText = "Select Game - New Game or Multiplayer option to start game"
Out_Box. Caption = "Start New Game."
End Sub
Private Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer)
If onconnect = True Then
On Error GoTo NoDx
Dim dpmsg As DirectPlayMessage
Set dpmsg = dxplay. CreateMessage
Call dpmsg. WriteLong (MSG_STOP)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, dpmsg)
Call CloseDownDPlay
End If
Unload Connect
Unload MainBoard
End
NoDx:
MsgBox "Could not stop DXPlay. ", vbOKOnly, "System"
End
End Sub
Private Sub hostagame_Click ()
usermode = "host" 'Sets usermode to host
Connect. Show 'starts connect form
MainBoard. Enabled = False 'disable form so user cannot select while connect form is up
hostagame. Enabled = False 'disables menu host button.
joinagame. Enabled = False ' disables menu join button
multiplayermode = True 'sets multiplayer to true
End Sub
Private Sub joinagame_Click ()
usermode = "client" 'Sets usermode to client
Connect. Show
MainBoard. Enabled = False
multiplayermode = True
End Sub
Private Sub Layer_A_Click (Index As Integer)
playerdisplaylabel. Caption = ""
'Used For single player board selection or multiplayer your turn selection
Debug. Print "Layer A Click Turn Status " & MyTurn
Debug. Print "Layer A Multiplayer Mode Status " & multiplayermode
If multiplayermode = True And MyTurn = False Then 'Easy way to exit if not your turn
Exit Sub
End If
If Sq_Left Mod 2 = 1 Then 'check remainder of squares left divided by 2
If sw = True Then ' sets who goes first X or O
Layer_A (Index). Caption = "X"
Else
Layer_A (Index). Caption = "O"
End If
Layer_A (Index). Enabled = False 'Sets selected square to not available
Player_A (Index) = 1
Computer_A (Index) = - Token
LoadPlayer
If multiplayermode = True And MyTurn = True Then 'checks for multiplayer and turn status
'This routine below packs message to send
'to other player to select the square chosen.
Dim dpmsg As DirectPlayMessage 'alot direct playmessage
Set dpmsg = dxplay. CreateMessage 'set and create the message
Call dpmsg. WriteLong (MSG_MOVE) 'pack message structure and identify type
Call dpmsg. WriteByte (Index) 'Packs case selection number to msgtype.
'This sends the pack message structure
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, dpmsg)
End If
If multiplayermode = True Then 'Sets routines to not your turn on multiplayer
Dim Y As Integer
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("nyt", vbResIcon)
Next Y
'Update Status displays
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & opponentsname & "'s Turn"
Out_Box. Caption = opponentsname & "'s Turn."
End If
'Everything below until mod else statement is single player
If multiplayermode = False Then 'Sets X or O turn status on single player
If sw = True Then
StatusBar1. SimpleText = "New Game Initialized O's Turn"
Else
StatusBar1. SimpleText = "New Game Initialized X's Turn"
End If
If sw = True Then
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("o", vbResIcon)
Next Y
Else
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("x", vbResIcon)
Next Y
End If
If sw = True Then
Out_Box. Caption = "O's Turn"
Else
Out_Box. Caption = "X's Turn"
End If
End If
Else
'Mod else*********************************
If sw = True Then
Layer_A (Index). Caption = "O"
Else
Layer_A (Index). Caption = "X"
End If
Layer_A (Index). Enabled = False
Player_A (Index) = - Token
Computer_A (Index) = 1
If multiplayermode = True Then
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & opponentsname & "'s Turn"
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("nyt", vbResIcon)
Next Y
Out_Box. Caption = opponentsname & "'s Turn."
End If
If multiplayermode = False Then
If sw = True Then
StatusBar1. SimpleText = "New Game Initialized X's Turn"
Else
StatusBar1. SimpleText = "New Game Initialized O's Turn"
End If
If sw = True Then
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("x", vbResIcon)
Next Y
Out_Box. Caption = "X's Turn"
Else
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("o", vbResIcon)
Next Y
Out_Box. Caption = "O's Turn"
End If
End If
LoadComputer
If multiplayermode = True And MyTurn = True Then
'Same as above packs message and sends move to other player
Dim dpmsg2 As DirectPlayMessage
Set dpmsg2 = dxplay. CreateMessage
Call dpmsg2. WriteLong (MSG_MOVE)
Call dpmsg2. WriteByte (Index)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, dpmsg2)
End If
End If
Sq_Left = Sq_Left - 1
EvalNextMove
MyTurn = False
End Sub
Public Function layer_A_online (Index As Integer)
playerdisplaylabel. Caption = ""
'This routine is called to mark sqares when remote computer
'sends a move made command.
'Same as above with some redundant routines removed
If Sq_Left Mod 2 = 1 Then
If sw = True Then
Layer_A (Index). Caption = "X"
Else
Layer_A (Index). Caption = "O"
End If
Layer_A (Index). Enabled = False
Player_A (Index) = 1
Computer_A (Index) = - Token
If multiplayermode = True Then
If sw = True Then
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & profilename & "'s Turn"
Out_Box. Caption = profilename & "'s Turn."
Dim Y As Integer
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("o", vbResIcon)
Next Y
Else
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & profilename & "'s Turn"
Out_Box. Caption = profilename & "'s Turn."
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("x", vbResIcon)
Next Y
End If
End If
If multiplayermode = False Then
If sw = True Then
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("o", vbResIcon)
Out_Box. Caption = "O's Turn"
Next Y
Else
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("x", vbResIcon)
Out_Box. Caption = "X's Turn"
Next Y
End If
End If
LoadPlayer
Else
If sw = True Then
Layer_A (Index). Caption = "O"
Else
Layer_A (Index). Caption = "X"
End If
Layer_A (Index). Enabled = False
Player_A (Index) = - Token
Computer_A (Index) = 1
If multiplayermode = True Then
If sw = True Then
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & profilen
Out_Box. Caption = profilename & "'s Turn."
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("x", vbResIcon)
Next Y
Else
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & profilename & "'s Turn"
Out_Box. Caption = profilename & "'s Turn."
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("o", vbResIcon)
Next Y
End If
End If
If multiplayermode = False Then
If sw = True Then
StatusBar1. SimpleText = "New Game Initialized X's Turn"
Else
StatusBar1. SimpleText = "New Game Initialized O's Turn"
End If
If sw = True Then
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("x", vbResIcon)
Next Y
Out_Box. Caption = "X's Turn"
Else
Y = 0
For Y = 0 To 8
Layer_A (Y). MouseIcon = LoadResPicture ("o", vbResIcon)
Next Y
Out_Box. Caption = "O's Turn"
End If
End If
LoadComputer
End If
Sq_Left = Sq_Left - 1
EvalNextMove
End Function
Private Sub scan_3 () '*****************************************
Dim r As Integer
For r = 0 To 7
If Test_Result (r) = 3 Then
Temp = True
End If
Next r
End Sub
Private Sub EvalNextMove () '***********************************
test
scan_3
Debug. Print "Squares Left Value on Evaluate Next Move " & Sq_Left
Debug. Print "Boolean Temp Value on Evaluate " & Temp
Debug. Print "Token Value on Eval." & Token
If Temp = True Then
If Sq_Left Mod 2 = 0 Then 'Makes win or lose calls Turn checking is made later
Player_Wins 'call player wins routine
Else
Computer_Wins 'calls computer rountine
End If
End If
Temp = False
If Sq_Left <= 0 Then
Cats_Game
Begin = False 'Turns off mark routine
If multiplayermode = True And usermode = "host" Then 'sets turn to true
MyTurn = True
Debug. Print "Set myturn to true on win"
End If
End If
first_turn = 1
End Sub
Private Sub Computer_Wins ()
Dim s As Integer
For s = 0 To 8
Layer_A (s). Enabled = False
Next s
Begin = True
If multiplayermode = True And usermode = "host" Then
If sw = True Then 'Checks for Whos Turn and update Host or client
Out_Box. Caption = opponentsname & " Won!"
opponentsscore = opponentsscore + 1
Else
Out_Box. Caption = profilename & " Won!"
profilenamescore = profilenamescore + 1
End If
End If
If multiplayermode = True And usermode = "client" Then
If sw = True Then
Out_Box. Caption = profilename & " Won!"
profilenamescore = profilenamescore + 1
Else
Out_Box. Caption = opponentsname & " Won!"
opponentsscore = opponentsscore + 1
End If
End If
If multiplayermode = False Then 'Single Player updating
If sw = True Then
Out_Box. Caption = "O Won!!!!"
Else
Out_Box. Caption = "X Won!!!!!"
End If
End If
Game_Over. Caption = "Game Over"
'Shows Resart Option if Host
If multiplayermode = True And usermode = "host" Then
restart. Visible = True
restart. Enabled = True
End If
Timer4. Enabled = True 'Sets timer to time mark routine
If sw = True Then 'Checks Whos turn sends string to mark
Call Mark_Win ("O")
Else
Call Mark_Win ("X")
End If
End Sub
Private Sub Player_Wins ()
'See computer wins for details
Dim a As Integer
For a = 0 To 8
Layer_A (a). Enabled = False
Next a
Begin = True
If multiplayermode = True And usermode = "host" Then
If sw = True Then
profilenamescore = profilenamescore + 1
Out_Box. Caption = profilename & " Won!"
Else
opponentsscore = opponentsscore + 1
Out_Box. Caption = opponentsname & " Won!"
End If
End If
If multiplayermode = True And usermode = "client" Then
If sw = True Then
opponentsscore = opponentsscore + 1
Out_Box. Caption = opponentsname & " Won!"
Else
profilenamescore = profilenamescore + 1
Out_Box. Caption = profilename & " Won!"
End If
End If
If multiplayermode = False Then
If sw = True Then
Out_Box. Caption = "X Won!!!!"
Else
Out_Box. Caption = "O Won!!!!!"
End If
End If
Game_Over. Caption = "Game Over"
If multiplayermode = True And usermode = "host" Then
restart. Visible = True
restart. Enabled = True
End If
Timer4. Enabled = True
If sw = True Then
Call Mark_Win ("X")
Else
Call Mark_Win ("O")
End If
End Sub
Private Sub Mark_Win (tr As String) 'Marks winning squares
Dim PauseTime, start, Finish, TotalTime
While Begin = True
PauseTime = 0.3 ' Set duration.
start = Timer ' Set start time.
Do While Timer < start + PauseTime And Begin = True
For n1 = 0 To 2
mark = Win (n1)
Layer_A (mark). Caption = tr
Layer_A (mark). FontBold = False
Next n1
DoEvents ' Yield to other processes.
Loop
start = Timer ' Set start time.
Do While Timer < start + PauseTime And Begin = True
For n1 = 0 To 2
mark = Win (n1)
Layer_A (mark). FontBold = True
Layer_A (mark). Caption = tr
Next n1
DoEvents ' Yield to other processes.
Loop
Wend
End Sub
Private Sub test () 'Tests conditions for the win
Dim n, k, sample As Integer
sample = 0
For n = 0 To 2
Test_Result (sample) = a (3 * n) + a (3 * n + 1) + a (3 * n + 2)
If Test_Result (sample) = 3 Then
Win (0) = 3 * n
Win (1) = 3 * n + 1
Win (2) = 3 * n + 2
End If
sample = sample + 1
Next n
For n = 0 To 2
Test_Result (sample) = a (n) + a (n + 3) + a (n + 6)
If Test_Result (sample) = 3 Then
Win (0) = n
Win (1) = n + 3
Win (2) = n + 6
End If
sample = sample + 1
Next n
Test_Result (sample) = a (0) + a (4) + a (8)
If Test_Result (sample) = 3 Then
Win (0) = 0
Win (1) = 4
Win (2) = 8
End If
sample = sample + 1
Test_Result (sample) = a (6) + a (4) + a (2)
If Test_Result (sample) = 3 Then
Win (0) = 6
Win (1) = 4
Win (2) = 2
End If
sample = sample + 1
End Sub
Private Sub LoadPlayer ()
Dim e As Integer
For e = 0 To 8
a (e) = Player_A (e)
Next e
End Sub
Private Sub LoadComputer ()
Dim w As Integer
For w = 0 To 8
a (w) = Computer_A (w)
Next w
End Sub
Private Sub Cats_Game () 'Cats Game display routine
GameUnderway = False
Dim z As Integer
For z = 0 To 8
Layer_A (z). Enabled = False
Next z
Out_Box. Caption = "Cat's Game!"
Game_Over. Caption = "Game Over"
If multiplayermode = True And usermode = "host" Then
restart. Visible = True
restart. Enabled = True
End If
End Sub
Private Sub mnuchat_Click () 'Menu button for chatbox routine
On Error GoTo NoChat 'error handler in case chat initialization problem.
If mnuchat. Checked = True Then
Frame1. Visible = False
chatlabel. Visible = False
send_chat. Visible = False
chatbox. Visible = False
mnuchat. Checked = False
'Packs and sends DXplay message to switch chat on off
Dim chaton As DirectPlayMessage
Set chaton = dxplay. CreateMessage
Call chaton. WriteLong (MSG_CHAT_ON)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, chaton)
Else
Frame1. Visible = True
chatlabel. Visible = True
send_chat. Visible = True
chatbox. Visible = True
mnuchat. Checked = True
chatbox. Visible = True
chatbox. SetFocus
'Packs and sends DXplay message to switch chat on off
Dim chaton2 As DirectPlayMessage
Set chaton2 = dxplay. CreateMessage
Call chaton2. WriteLong (MSG_CHAT_ON)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, chaton2)
End If
Exit Sub
NoChat:
MsgBox "Could Not Start Chat", vbOKOnly, "Oops"
Exit Sub
End Sub
Public Function chatswitch () 'Menu button for incoming online Chatbox routine
On Error GoTo NoChat
If mnuchat. Checked = True Then
Frame1. Visible = False
chatlabel. Visible = False
send_chat. Visible = False
chatbox. Visible = False
mnuchat. Checked = False
Else
Frame1. Visible = True
chatlabel. Visible = True
send_chat. Visible = True
chatbox. Visible = True
mnuchat. Checked = True
chatbox. Visible = True
chatbox. SetFocus
End If
Exit Function
NoChat:
MsgBox "Could Not Start Chat", vbOKOnly, "Oops"
Exit Function
End Function
Private Sub mnudisconnect_Click () 'Disconnects and sends disconnect message
mnudisconnect. Enabled = False
newgame. Enabled = True
hostagame. Enabled = True
joinagame. Enabled = True
multiplayermode = False
usermode = "host"
'Sends player has left message to other players
Dim dpmsg As DirectPlayMessage
Set dpmsg = dxplay. CreateMessage
Call dpmsg. WriteLong (MSG_STOP)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, dpmsg)
Call CloseDownDPlay
Unload Connect
onconnect = False
End Sub
Private Sub newgame_Click () 'starts new game single or multiplayer
On Error GoTo NoGame
If usermode = "client" And multiplayermode = True Then
MsgBox "Only the host can restart the game. ", vbOKOnly, "Tic Tac Oops"
Exit Sub
End If
If multiplayermode = False Then
usermode = "host"
Call Initialize
Else
Call restart_Click 'call restart routine for multiplayer
End If
Exit Sub
NoGame:
MsgBox "Could Not Start Game. ", vbOKOnly, "Oops"
Exit Sub
End Sub
Public Sub o_Click () 'sets menu item whos first o
If GameUnderway = True Then
MsgBox "You cannot chang this option while a game is in play", vbOKOnly, "Tic Tac Oops"
Exit Sub
End If
If o. Checked = True Then
sw = False
Exit Sub
Else
o. Checked = True
x. Checked = False
sw = False
End If
If multiplayermode = True Then
'Sends who goes first message.
Dim dpmsg As DirectPlayMessage
Set dpmsg = dxplay. CreateMessage
Call dpmsg. WriteLong (MSG_XORO)
Call dpmsg. WriteByte (2)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, _
dpmsg)
End If
Debug. Print "menu X or O clicked sw is " & sw
End Sub
Public Sub restart_Click () 'Restarts Game and updates scores
GameUnderway = True
multiplayermode = True
If usermode = "host" Then
Dim dpmsg As DirectPlayMessage
Set dpmsg = dxplay. CreateMessage
Call dpmsg. WriteLong (MSG_RESTART)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, _
dpmsg)
End If
Call Initialize
If usermode = "host" Then
If sw = True Then
MyTurn = True
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & profilename & "'s Turn"
playerdisplaylabel. Caption = profilename & "'s Turn."
Else
MyTurn = False
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & opponentsname & "'s Turn"
playerdisplaylabel. Caption = opponentsname & "'s Turn."
End If
End If
If usermode = "client" Then
If sw = True Then
MyTurn = False
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & opponentsname & "'s Turn"
playerdisplaylabel. Caption = opponentsname & "'s Turn."
Else
MyTurn = True
StatusBar1. SimpleText = "Game count is " & score & " " & opponentsname & ": " & opponentsscore & " | " & profilename & ": " & profilenamescore & " " & profilename & "'s Turn"
playerdisplaylabel. Caption = profilename & "'s Turn."
End If
End If
restart. Visible = False
End Sub
Private Sub send_chat_Click ()
'handles chat boxes
Const chatlen = 5 + MChatString
Dim msgdata (chatlen) As Byte
Dim x As Integer
'packs and sends chat box information
Dim cmsg As DirectPlayMessage
Set cmsg = dxplay. CreateMessage
Call cmsg. WriteLong (MSG_CHAT)
Call cmsg. WriteString (chatbox. Text)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, cmsg)
If chatlabel. Text = "" Then
chatlabel. Text = profilename & ": " & chatbox. Text
Else
chatlabel. Text = chatlabel. Text & vbCrLf & profilename & ": " & chatbox. Text
End If
chatbox. Text = ""
End Sub
Private Sub Timer4_Timer ()
GameUnderway = False
'sets begin to false to stop letters from flashing.
'Updates score and status bar.
Begin = False
If usermode = "host" And multiplayermode = True Then
StatusBar1. SimpleText = "Select Restart Game." & "Game #" & score & " " & profilename & ": " & profilenamescore & " " & opponentsname & ": " & opponentsscore
MyTurn = True
ElseIf usermode = "client" And multiplayermode = True Then
StatusBar1. SimpleText = "Waiting on Host To Restart." & "Game #" & score & " " & profilename & ": " & profilenamescore & " " & opponentsname & ": " & opponentsscore
End If
Timer4. Enabled = False
End Sub
Public Sub x_Click () 'handles menu item X whos turn first
If GameUnderway = True Then
MsgBox "You cannot chang this option while a game is in play", vbOKOnly, "Tic Tac Oops"
Exit Sub
End If
If x. Checked = True Then
sw = True
Exit Sub
Else
x. Checked = True
o. Checked = False
sw = True
End If
If multiplayermode = True Then
'Sends who goes first message.
Dim dpmsg As DirectPlayMessage
Set dpmsg = dxplay. CreateMessage
Call dpmsg. WriteLong (MSG_XORO)
Call dpmsg. WriteByte (1)
Call dxplay. Send (MyPlayer, DPID_ALLPLAYERS, DPSEND_GUARANTEED, _
dpmsg)
End If
Debug. Print "menu X or O clicked sw is " & sw
End Sub
Global usermode As String 'sets usermode host or client
Global multiplayermode As Boolean 'Sets multiplayer yes no
Global MyTurn As Boolean 'My turn switch
Global profilename As Variant 'name for your machine
Global opponentsname As Variant 'name for remote machine
Global score As Integer ' keeps track of game score
Global profilenamescore As Integer 'your score
Global opponentsscore As Integer 'remote score
Global sw As Boolean 'set whether x or o goes first
' Constants
Public Const MaxPlayers = 2
Public Const MChatString = 60
' DirectPlay stuff
Public dx7 As New DirectX7
Public dxplay As DirectPlay4
Public EnumConnect As DirectPlayEnumConnections
Public onconnect As Boolean
Public gNumPlayersWaiting As Byte
Public MyPlayer As Long
Public EnumSession As DirectPlayEnumSessions
Public numplayers As Byte
Public dxHost As Boolean
Public CurrentPlayer As Integer
Public PlayerScores (MaxPlayers) As Byte
Public PlayerIDs (MaxPlayers) As Long
Public dxMyTurn As Integer
Public GameUnderway As Boolean
Public connectionmade As Boolean
'The appguid number was generated with the utility provide with DX7 SDK.
Public Const AppGuid = "{D4D5D10B-7D04-11D3-8E64-00A0C9E01368}"
'This defines the msgtype you will send with DXplay. send
Public Enum MSGTYPES
MSG_STOP 'Handles user diconnect
MSG_STARTGAME 'Startgame
MSG_CHAT_ON 'Chat on or off
MSG_CHAT 'chat input
MSG_RESTART 'Restart Game
MSG_XORO 'Select if X or O Starts game
MSG_MOVE 'What square selected
End Enum
Public Sub CloseDownDPlay () 'this shuts down directplay
dxHost = False
GameUnderway = False
Set EnumConnect = Nothing
Set EnumSession = Nothing
Set dxplay = Nothing
End Sub
' Main procedure. This is where we poll for DirectPlay messages in idle time.
Public Sub Main ()
MainBoard. Show
Do While DoEvents () ' allow event processing while any windows open
DPInput
Loop
End Sub
' Receive and process DirectPlay Messages
Public Sub DPInput ()
Dim FromPlayer As Long
Dim ToPlayer As Long
Dim msgsize As Long
Dim msgtype As Long
Dim dpmsg As DirectPlayMessage
Dim MsgCount As Long
Dim msgdata () As Byte
Dim x As Integer
Dim fromplayername As String
If dxplay Is Nothing Then Exit Sub 'IF single player then exit
On Error GoTo NOMESSAGE
' If this call fails, presumably it's because there's no session or
' no player.
MsgCount = dxplay. GetMessageCount (MyPlayer) 'Get number of messages.
On Error GoTo MSGERROR
Do While MsgCount > 0 'Read all messages
Set dpmsg = dxplay. Receive (FromPlayer, ToPlayer, DPRECEIVE_ALL) 'Read DXINput
msgtype = dpmsg. ReadLong () 'Read DXinput msg TYPE
MsgCount = MsgCount - 1
'Direct X System Only Messages not user defineable
If FromPlayer = DPID_SYSMSG Then
Select Case msgtype
' New player, update player list
Case DPSYS_DESTROYPLAYERORGROUP, _
DPSYS_CREATEPLAYERORGROUP
If Connect. Visible Then Connect. UpdateWaiting 'update connection sessions list
Case DPSYS_HOST 'either lost connection or changed you to host
dxHost = True
If Connect. Visible Then
MsgBox ("You are now the host. ")
Connect. UpdateWaiting ' make sure Start button is enabled
End If
End Select
' - --------------------------------------------------------------------------------------
' User specified Message Structure TYPES
Else
' Get name of sending player
If onconnect = False Then
fromplayername = dxplay. GetPlayerFriendlyName (FromPlayer) 'Gets name
opponentsname = fromplayername 'changes to games variable
'Updates status bars and labels.
If usermode = "host" Then
MainBoard. playerdisplaylabel. Caption = opponentsname & " Has Joined The Game"
MainBoard. StatusBar1. SimpleText = opponentsname & "Is Ready To Play, Start Game"
End If
If usermode = "client" Then
MainBoard. playerdisplaylabel. Caption = "You Have Joined " & opponentsname & "'s Game"
MainBoard. StatusBar1. SimpleText = opponentsname & " Will Start The Game"
End If
End If
onconnect = True
Select Case msgtype
'Below is where you define your message structure types and add responding code, cool.
Case MSG_STARTGAME
onconnect = True
multiplayermode = True
' Number of players
numplayers = dpmsg. ReadByte
' Player IDs,
MyPlayer = dpmsg. ReadLong
' Show the game board.
Connect. Hide
MainBoard. Enabled = True
MainBoard. Show
MainBoard. hostagame. Enabled = False
MainBoard. joinagame. Enabled = False
MainBoard. mnudisconnect. Enabled = True
Case MSG_MOVE 'Sent when square is click
Dim t As Byte
t = dpmsg. ReadByte
Select Case t
Case 0
Call MainBoard. layer_A_online (0)
Case 1
Call MainBoard. layer_A_online (1)
Case 2
Call MainBoard. layer_A_online (2)
Case 3
Call MainBoard. layer_A_online (3)
Case 4
Call MainBoard. layer_A_online (4)
Case 5
Call MainBoard. layer_A_online (5)
Case 6
Call MainBoard. layer_A_online (6)
Case 7
Call MainBoard. layer_A_online (7)
Case 8
Call MainBoard. layer_A_online (8)
End Select
MyTurn = True
Case MSG_CHAT_ON 'Handles Turn chat on off
Call MainBoard. chatswitch
Case MSG_XORO 'Selects who goes first X or O
Dim thing As Byte
thing = dpmsg. ReadByte
If thing = 1 Then
Call MainBoard. x_Click
End If
If thing = 2 Then
Call MainBoard. o_Click
End If
Case MSG_RESTART 'handles input for restart
multiplayermode = True
MainBoard. playerdisplaylabel. Caption = opponentsname & " has restarted the game."
If sw = True Then
MyTurn = False
Else
MyTurn = True
End If
Call MainBoard. restart_Click
Case MSG_CHAT 'Handles Chat String input
Dim chatin As String
chatin = dpmsg. ReadString ()
If MainBoard. chatlabel. Text = "" Then
MainBoard. chatlabel. Text = opponentsname & ": " & chatin
Else
MainBoard. chatlabel. Text = MainBoard. chatlabel. Text & vbCrLf & opponentsname & ": " & chatin
End If
Case MSG_STOP 'Handles player disconnected.
MsgBox opponentsname & " has left the game. ", vbOKOnly, "Tic Tac Oops"
MainBoard. mnudisconnect. Enabled = False
MainBoard. newgame. Enabled = True
MainBoard. hostagame. Enabled = True
MainBoard. joinagame. Enabled = True
multiplayermode = False
usermode = "host"
Call CloseDownDPlay
Unload Connect
onconnect = False
End Select
End If
Loop
Exit Sub
' Error handlers
MSGERROR:
MsgBox ("Error reading message. ")
CloseDownDPlay
End
NOMESSAGE:
Exit Sub
End Sub
INTERFACE