home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / Thirteen__20914211212007.psc / Main.frm < prev    next >
Text File  |  2007-11-20  |  29KB  |  931 lines

  1. VERSION 5.00
  2. Begin VB.Form frmMain 
  3.    AutoRedraw      =   -1  'True
  4.    BackColor       =   &H00008000&
  5.    BorderStyle     =   1  'Fixed Single
  6.    Caption         =   "13's"
  7.    ClientHeight    =   7845
  8.    ClientLeft      =   150
  9.    ClientTop       =   765
  10.    ClientWidth     =   9870
  11.    BeginProperty Font 
  12.       Name            =   "Comic Sans MS"
  13.       Size            =   12
  14.       Charset         =   0
  15.       Weight          =   700
  16.       Underline       =   0   'False
  17.       Italic          =   0   'False
  18.       Strikethrough   =   0   'False
  19.    EndProperty
  20.    Icon            =   "Main.frx":0000
  21.    LinkTopic       =   "Form1"
  22.    MaxButton       =   0   'False
  23.    MinButton       =   0   'False
  24.    ScaleHeight     =   523
  25.    ScaleMode       =   3  'Pixel
  26.    ScaleWidth      =   658
  27.    StartUpPosition =   3  'Windows Default
  28.    Begin VB.Timer tmrRemoveCard 
  29.       Enabled         =   0   'False
  30.       Interval        =   12
  31.       Left            =   1440
  32.       Top             =   120
  33.    End
  34.    Begin VB.Timer tmrGameOver 
  35.       Enabled         =   0   'False
  36.       Interval        =   25
  37.       Left            =   840
  38.       Top             =   120
  39.    End
  40.    Begin VB.Frame frHelp 
  41.       BackColor       =   &H00C0FFFF&
  42.       Caption         =   "Help"
  43.       Height          =   3735
  44.       Left            =   2160
  45.       TabIndex        =   1
  46.       Top             =   1200
  47.       Visible         =   0   'False
  48.       Width           =   5175
  49.       Begin VB.Label lblHelp 
  50.          BackStyle       =   0  'Transparent
  51.          Caption         =   "Label1"
  52.          BeginProperty Font 
  53.             Name            =   "Arial"
  54.             Size            =   9.75
  55.             Charset         =   0
  56.             Weight          =   400
  57.             Underline       =   0   'False
  58.             Italic          =   0   'False
  59.             Strikethrough   =   0   'False
  60.          EndProperty
  61.          ForeColor       =   &H00800000&
  62.          Height          =   3255
  63.          Left            =   120
  64.          TabIndex        =   2
  65.          Top             =   360
  66.          Width           =   4935
  67.       End
  68.    End
  69.    Begin VB.Timer tmrInvalidSelection 
  70.       Enabled         =   0   'False
  71.       Interval        =   200
  72.       Left            =   120
  73.       Top             =   120
  74.    End
  75.    Begin VB.Label lblGameOver 
  76.       Alignment       =   2  'Center
  77.       BackStyle       =   0  'Transparent
  78.       Caption         =   "R"
  79.       BeginProperty Font 
  80.          Name            =   "Comic Sans MS"
  81.          Size            =   36
  82.          Charset         =   0
  83.          Weight          =   700
  84.          Underline       =   0   'False
  85.          Italic          =   0   'False
  86.          Strikethrough   =   0   'False
  87.       EndProperty
  88.       ForeColor       =   &H000080FF&
  89.       Height          =   975
  90.       Index           =   7
  91.       Left            =   6960
  92.       TabIndex        =   10
  93.       Top             =   2880
  94.       Width           =   615
  95.    End
  96.    Begin VB.Label lblGameOver 
  97.       Alignment       =   2  'Center
  98.       BackStyle       =   0  'Transparent
  99.       Caption         =   "E"
  100.       BeginProperty Font 
  101.          Name            =   "Comic Sans MS"
  102.          Size            =   36
  103.          Charset         =   0
  104.          Weight          =   700
  105.          Underline       =   0   'False
  106.          Italic          =   0   'False
  107.          Strikethrough   =   0   'False
  108.       EndProperty
  109.       ForeColor       =   &H00FF8080&
  110.       Height          =   975
  111.       Index           =   6
  112.       Left            =   6240
  113.       TabIndex        =   9
  114.       Top             =   2880
  115.       Width           =   615
  116.    End
  117.    Begin VB.Label lblGameOver 
  118.       Alignment       =   2  'Center
  119.       BackStyle       =   0  'Transparent
  120.       Caption         =   "V"
  121.       BeginProperty Font 
  122.          Name            =   "Comic Sans MS"
  123.          Size            =   36
  124.          Charset         =   0
  125.          Weight          =   700
  126.          Underline       =   0   'False
  127.          Italic          =   0   'False
  128.          Strikethrough   =   0   'False
  129.       EndProperty
  130.       ForeColor       =   &H000080FF&
  131.       Height          =   975
  132.       Index           =   5
  133.       Left            =   5520
  134.       TabIndex        =   8
  135.       Top             =   2880
  136.       Width           =   615
  137.    End
  138.    Begin VB.Label lblGameOver 
  139.       Alignment       =   2  'Center
  140.       BackStyle       =   0  'Transparent
  141.       Caption         =   "O"
  142.       BeginProperty Font 
  143.          Name            =   "Comic Sans MS"
  144.          Size            =   36
  145.          Charset         =   0
  146.          Weight          =   700
  147.          Underline       =   0   'False
  148.          Italic          =   0   'False
  149.          Strikethrough   =   0   'False
  150.       EndProperty
  151.       ForeColor       =   &H00FFFFFF&
  152.       Height          =   975
  153.       Index           =   4
  154.       Left            =   4800
  155.       TabIndex        =   7
  156.       Top             =   2880
  157.       Width           =   615
  158.    End
  159.    Begin VB.Label lblGameOver 
  160.       Alignment       =   2  'Center
  161.       BackStyle       =   0  'Transparent
  162.       Caption         =   "E"
  163.       BeginProperty Font 
  164.          Name            =   "Comic Sans MS"
  165.          Size            =   36
  166.          Charset         =   0
  167.          Weight          =   700
  168.          Underline       =   0   'False
  169.          Italic          =   0   'False
  170.          Strikethrough   =   0   'False
  171.       EndProperty
  172.       ForeColor       =   &H00FF00FF&
  173.       Height          =   975
  174.       Index           =   3
  175.       Left            =   3720
  176.       TabIndex        =   6
  177.       Top             =   2880
  178.       Width           =   615
  179.    End
  180.    Begin VB.Label lblGameOver 
  181.       Alignment       =   2  'Center
  182.       BackStyle       =   0  'Transparent
  183.       Caption         =   "M"
  184.       BeginProperty Font 
  185.          Name            =   "Comic Sans MS"
  186.          Size            =   36
  187.          Charset         =   0
  188.          Weight          =   700
  189.          Underline       =   0   'False
  190.          Italic          =   0   'False
  191.          Strikethrough   =   0   'False
  192.       EndProperty
  193.       Height          =   975
  194.       Index           =   2
  195.       Left            =   3000
  196.       TabIndex        =   5
  197.       Top             =   2880
  198.       Width           =   615
  199.    End
  200.    Begin VB.Label lblGameOver 
  201.       Alignment       =   2  'Center
  202.       BackStyle       =   0  'Transparent
  203.       Caption         =   "A"
  204.       BeginProperty Font 
  205.          Name            =   "Comic Sans MS"
  206.          Size            =   36
  207.          Charset         =   0
  208.          Weight          =   700
  209.          Underline       =   0   'False
  210.          Italic          =   0   'False
  211.          Strikethrough   =   0   'False
  212.       EndProperty
  213.       ForeColor       =   &H00FFFF00&
  214.       Height          =   975
  215.       Index           =   1
  216.       Left            =   2280
  217.       TabIndex        =   4
  218.       Top             =   2880
  219.       Width           =   615
  220.    End
  221.    Begin VB.Label lblGameOver 
  222.       Alignment       =   2  'Center
  223.       BackStyle       =   0  'Transparent
  224.       Caption         =   "G"
  225.       BeginProperty Font 
  226.          Name            =   "Comic Sans MS"
  227.          Size            =   36
  228.          Charset         =   0
  229.          Weight          =   700
  230.          Underline       =   0   'False
  231.          Italic          =   0   'False
  232.          Strikethrough   =   0   'False
  233.       EndProperty
  234.       ForeColor       =   &H0000FFFF&
  235.       Height          =   975
  236.       Index           =   0
  237.       Left            =   1560
  238.       TabIndex        =   3
  239.       Top             =   2880
  240.       Width           =   615
  241.    End
  242.    Begin VB.Label lblInvalidSelection 
  243.       BackStyle       =   0  'Transparent
  244.       Caption         =   "Invalid selection"
  245.       BeginProperty Font 
  246.          Name            =   "Comic Sans MS"
  247.          Size            =   15.75
  248.          Charset         =   0
  249.          Weight          =   700
  250.          Underline       =   0   'False
  251.          Italic          =   0   'False
  252.          Strikethrough   =   0   'False
  253.       EndProperty
  254.       ForeColor       =   &H000000FF&
  255.       Height          =   615
  256.       Left            =   2160
  257.       TabIndex        =   0
  258.       Top             =   5160
  259.       Visible         =   0   'False
  260.       Width           =   3015
  261.    End
  262.    Begin VB.Menu mnuNewGame 
  263.       Caption         =   "New Game"
  264.    End
  265.    Begin VB.Menu mnuReplay 
  266.       Caption         =   "Replay"
  267.    End
  268.    Begin VB.Menu mnuOptions 
  269.       Caption         =   "Options"
  270.       Begin VB.Menu mnuSounds 
  271.          Caption         =   "Sounds"
  272.          Checked         =   -1  'True
  273.       End
  274.       Begin VB.Menu mnuAnimateHeader 
  275.          Caption         =   "Animate"
  276.          Begin VB.Menu mnuAnimate 
  277.             Caption         =   "No"
  278.             Index           =   0
  279.          End
  280.          Begin VB.Menu mnuAnimate 
  281.             Caption         =   "Slow"
  282.             Checked         =   -1  'True
  283.             Index           =   1
  284.          End
  285.          Begin VB.Menu mnuAnimate 
  286.             Caption         =   "Fast"
  287.             Index           =   2
  288.          End
  289.       End
  290.       Begin VB.Menu mnuBacksHeader 
  291.          Caption         =   "Backs"
  292.          Begin VB.Menu mnuBacks 
  293.             Caption         =   "Plaid"
  294.             Index           =   0
  295.             Begin VB.Menu mnuPlaidColor 
  296.                Caption         =   "Red"
  297.                Index           =   0
  298.             End
  299.             Begin VB.Menu mnuPlaidColor 
  300.                Caption         =   "Blue"
  301.                Index           =   1
  302.             End
  303.             Begin VB.Menu mnuPlaidColor 
  304.                Caption         =   "Cyan"
  305.                Index           =   2
  306.             End
  307.             Begin VB.Menu mnuPlaidColor 
  308.                Caption         =   "Yellow"
  309.                Index           =   3
  310.             End
  311.             Begin VB.Menu mnuPlaidColor 
  312.                Caption         =   "Magenta"
  313.                Index           =   4
  314.             End
  315.             Begin VB.Menu mnuPlaidColor 
  316.                Caption         =   "White"
  317.                Index           =   5
  318.             End
  319.          End
  320.          Begin VB.Menu mnuBacks 
  321.             Caption         =   "Sky"
  322.             Index           =   1
  323.          End
  324.          Begin VB.Menu mnuBacks 
  325.             Caption         =   "Blues"
  326.             Index           =   2
  327.          End
  328.          Begin VB.Menu mnuBacks 
  329.             Caption         =   "Fish"
  330.             Index           =   3
  331.          End
  332.          Begin VB.Menu mnuBacks 
  333.             Caption         =   "Frog"
  334.             Index           =   4
  335.          End
  336.          Begin VB.Menu mnuBacks 
  337.             Caption         =   "Wave"
  338.             Index           =   5
  339.          End
  340.          Begin VB.Menu mnuBacks 
  341.             Caption         =   "Island"
  342.             Index           =   6
  343.          End
  344.          Begin VB.Menu mnuBacks 
  345.             Caption         =   "Cross"
  346.             Index           =   7
  347.          End
  348.          Begin VB.Menu mnuBacks 
  349.             Caption         =   "Purple"
  350.             Index           =   8
  351.          End
  352.          Begin VB.Menu mnuBacks 
  353.             Caption         =   "Dune"
  354.             Index           =   9
  355.          End
  356.          Begin VB.Menu mnuBacks 
  357.             Caption         =   "Astronaut"
  358.             Index           =   10
  359.          End
  360.          Begin VB.Menu mnuBacks 
  361.             Caption         =   "Stripes"
  362.             Index           =   11
  363.          End
  364.          Begin VB.Menu mnuBacks 
  365.             Caption         =   "Cars"
  366.             Index           =   12
  367.          End
  368.       End
  369.    End
  370.    Begin VB.Menu mnuHelp 
  371.       Caption         =   "Help"
  372.    End
  373.    Begin VB.Menu mnuExit 
  374.       Caption         =   "Exit"
  375.    End
  376. End
  377. Attribute VB_Name = "frmMain"
  378. Attribute VB_GlobalNameSpace = False
  379. Attribute VB_Creatable = False
  380. Attribute VB_PredeclaredId = True
  381. Attribute VB_Exposed = False
  382. '   13 - a card game
  383. '
  384. ' I saw this game for the first time on PSC, a post by Sehab Veljacic.
  385. ' His implementation used multiple arrays of picture boxes, timers, an ImageList
  386. ' and in my opinion rather lengthy, repetitive code.
  387. ' My challenge: rewrite it from scratch Using the Cards.dll and regions.
  388. '
  389. ' Please note hat sounds will only be heard when compiled.
  390. '
  391. ' You can use or misuse this code as long as it is done for non-commercial purposes.
  392. '
  393. ' Paul Turcksin, November 2007
  394. '
  395. '___________________________________________________________________________________
  396.  
  397. Option Explicit
  398. '............................ OBJECTS
  399. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  400.  
  401. '............................ BRUSH
  402. Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
  403. Private hBrush As Long
  404.  
  405.  
  406. '............................ REGIONS
  407. Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  408. Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long
  409. Private Declare Function GetRgnBox Lib "gdi32" (ByVal hRgn As Long, lpRect As RECT) As Long
  410. Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
  411. Private Type RECT
  412.         Left As Long
  413.         Top As Long
  414.         Right As Long
  415.         Bottom As Long
  416. End Type
  417. Private arRgn(29) As Long
  418. Private rectRemoveCard As RECT
  419. Private iCntRemoveCard As Integer
  420.  
  421. '............................ CARDS
  422. Private Declare Function cdtInit Lib "Cards.Dll" (Dx As Long, Dy As Long) As Long
  423. Private Declare Function cdtDraw Lib "Cards.Dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal iCard As Long, ByVal iDraw As Long, ByVal clr As Long) As Long
  424. Private Declare Function cdtTerm Lib "Cards.Dll" () As Long
  425.  
  426. '............................ SOUND
  427. ' Sounds are played directly from the resource file.
  428. ' !!! This feature ONLY works wwhen compiled.   !!!
  429. Private Declare Function PlayResWAV Lib "winmm" Alias "sndPlaySoundA" (ByVal lpszName&, ByVal dwFlags&) As Long
  430. Private Const SND_RESOURCE = &H40004 'play from resource
  431. Private Const SND_ASYNC = &H1        'play asynchronously or in other words return immediately after beginning the sound
  432.  
  433. ' Card constants: How are we rendering the card?
  434. Private Const ordFaces  As Long = 0          '
  435. Private Const ordBacks  As Long = 1
  436. Private Const ordInvert As Long = 2
  437.  
  438. ' card size
  439. Private lWidth As Long
  440. Private lHeight As Long
  441.  
  442. ' In the following types:
  443. ' - Number stands for the card number as defined in Cards.dll
  444. ' - Value stands for the card value: 1=ace, 2=2, ... King=13
  445. Private Type PLAYBOARD
  446.    Left As Long
  447.    Top As Long
  448.    Number As Integer
  449.    Value As Integer
  450.    Covered As Integer
  451.    Discarded As Boolean
  452. End Type
  453. Private arPlayboard(29) As PLAYBOARD
  454.  
  455. Private Type DECK
  456.    Number As Integer        ' card number as difined in Cards.dll
  457.    Value As Integer         ' card alue: 1=ace, 2=2, ... King=13
  458.    Discarded As Boolean
  459. End Type
  460. Private arDeck(23) As DECK
  461. Private iCurrentDeck As Integer
  462.  
  463. Private Type SELECTED
  464.    Index As Integer
  465.    Number As Integer
  466.    Value As Integer
  467. End Type
  468. Private FirstCard As SELECTED
  469. Private SecondCard As SELECTED
  470. Private iSelected As Integer
  471.  
  472. Private arCards(51) As Integer
  473. Private arRow(6) As Integer   ' index array is row, value is first slot number in that row
  474. Private iBack As Integer
  475. Private swAnimate As Boolean
  476. Private iAnimateSpeed As Integer
  477. Private iOldAnimateIndex As Integer
  478. Private swSound As Boolean
  479. Private Const cReplay As Boolean = True
  480.  
  481. Private Sub Form_Load()
  482.    Dim iRow As Integer
  483.    Dim iCol As Integer
  484.    Dim iCnt As Integer
  485.    Dim lLeft As Long
  486.    
  487. ' init cards DLL
  488.    cdtInit lWidth, lHeight
  489.    
  490. ' set card position on each of the seven rows and create regions
  491.    For iRow = 0 To 6
  492.       lLeft = 300 - (iRow * (lWidth \ 2))
  493.       For iCol = 0 To iRow
  494.          With arPlayboard(iCnt)
  495.             .Left = lLeft + (iCol * lWidth)
  496.             .Top = 75 + (iRow * 25)
  497.             arRgn(iCnt) = CreateRectRgn(.Left, .Top, .Left + lWidth, .Top + lHeight)
  498.             iCnt = iCnt + 1
  499.          End With
  500.       Next iCol
  501.    Next iRow
  502.    
  503. ' Finally we create two other regions:
  504. ' 1. for the covered deck: clicking it will show the next card from the deck in
  505. ' 2. uncovered deck allowing selection of the uncovered card
  506.    arRgn(28) = CreateRectRgn(300, 400, 300 + lWidth, 400 + lHeight)
  507.    arPlayboard(28).Left = 300
  508.    arPlayboard(28).Top = 400
  509.    arRgn(29) = CreateRectRgn(200, 400, 200 + lWidth, 400 + lHeight)
  510.    
  511. ' Help
  512.    lblHelp = "The objective of this game is to discard all cards shown on the board. " & _
  513.            "This is done by clicking pairs of cards that total 13. An ace = 1, a 2 = 2, " & _
  514.            "and so on. The valet = 11, queen = 12. As the king has value 13 clicking " & _
  515.            "it will discard it. On the bottom of the board is a deck with the cards not " & _
  516.            "shown on the board. Click on this deck to show the ""hidden"" cards. These " & _
  517.            "can also be used to form pairs of 13." & vbCrLf & _
  518.            "Cards hat are covered by another card cannot be selected. And if you " & _
  519.            "mistakenly selected a card, click it again to de-select it." & vbCrLf & vbCrLf & _
  520.            "Click on this message to hide it and enjoy the game!"
  521.            
  522. ' init misc
  523.    hBrush = CreateSolidBrush(Me.BackColor)
  524.    iBack = 54
  525.    arRow(1) = 1
  526.    arRow(2) = 3
  527.    arRow(3) = 6
  528.    arRow(4) = 10
  529.    arRow(5) = 15
  530.    arRow(6) = 21
  531.    Randomize   ' ensure random card shuffle
  532.    swAnimate = True
  533.    iAnimateSpeed = 1
  534.    iOldAnimateIndex = 1
  535.    subGameOverStop
  536.    subNewGame
  537. End Sub
  538.  
  539.  
  540. Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  541.    Dim i As Integer
  542.    
  543. ' clicked over a region?
  544.    iSelected = -1
  545.    For i = 29 To 0 Step -1
  546.       If PtInRegion(arRgn(i), CLng(X), CLng(Y)) <> 0 _
  547.       And Not arPlayboard(i).Discarded Then
  548.          iSelected = i
  549.          Exit For
  550.       End If
  551.    Next i
  552.    
  553.    Select Case iSelected
  554.    
  555. '     case -1" nothing to do
  556.  
  557.       Case 0 To 28  ' any uncovered  card with (28) being the deck
  558.          If arPlayboard(iSelected).Covered = 0 Then
  559.             ' is it a king
  560.             If arPlayboard(iSelected).Value = 13 Then
  561.                FirstCard.Index = iSelected
  562.                subRemoveCard FirstCard
  563.                Exit Sub
  564.             End If
  565.             subDrawCard iSelected, ordInvert
  566.            ' first card? show and preserve info
  567.             If FirstCard.Index = -1 Then
  568.                FirstCard.Index = iSelected
  569.                FirstCard.Number = arPlayboard(iSelected).Number
  570.                FirstCard.Value = arPlayboard(iSelected).Value
  571.             Else
  572.                ' second card
  573.                SecondCard.Index = iSelected
  574.                SecondCard.Number = arPlayboard(iSelected).Number
  575.                SecondCard.Value = arPlayboard(iSelected).Value
  576.                subProcessSelection
  577.             End If
  578.          End If
  579.       
  580.       Case 29        ' the covered deck (show next card)
  581.          Do
  582.             iCurrentDeck = iCurrentDeck + 1
  583.             If iCurrentDeck > 23 Then
  584.                iCurrentDeck = -1
  585.                FillRgn Me.hdc, arRgn(28), hBrush
  586.                Me.Refresh
  587.             Else
  588.                If Not arDeck(iCurrentDeck).Discarded Then
  589.                   arPlayboard(28).Number = arDeck(iCurrentDeck).Number
  590.                   arPlayboard(28).Value = arDeck(iCurrentDeck).Value
  591.                  subDrawCard 28, ordFaces
  592.                  Exit Do
  593.               End If
  594.             End If
  595.          Loop Until iCurrentDeck = -1
  596.          
  597.       End Select
  598.    Me.Refresh
  599. End Sub
  600.  
  601. Private Sub Form_Unload(Cancel As Integer)
  602.    Dim i As Integer
  603.    
  604. ' cleanup regions, brush
  605.    For i = 0 To 29
  606.       DeleteObject arRgn(i)
  607.    Next i
  608.    DeleteObject hBrush
  609. ' terminate cards.dll
  610.    cdtTerm
  611.    
  612.    Set frmMain = Nothing
  613. End Sub
  614.  
  615. Private Sub frHelp_Click()
  616.    frHelp.Visible = False
  617. End Sub
  618.  
  619. Private Sub lblHelp_Click()
  620.    frHelp.Visible = False
  621. End Sub
  622.  
  623. Private Sub mnuAnimate_Click(Index As Integer)
  624. ' uncheck previous and check new
  625.    mnuAnimate(iOldAnimateIndex).Checked = False
  626.    mnuAnimate(Index).Checked = True
  627.    iOldAnimateIndex = Index
  628.    
  629.    swAnimate = True        ' assume animation
  630.    If Index = 0 Then
  631.       swAnimate = False
  632.    Else
  633.       iAnimateSpeed = Index
  634.       Me.DrawWidth = Index
  635.    End If
  636. End Sub
  637.  
  638. Private Sub mnuBacks_Click(Index As Integer)
  639.    iBack = 53 + Index
  640.    cdtDraw Me.hdc, 200, 400, iBack, ordBacks, 0
  641.    Me.Refresh
  642. End Sub
  643.  
  644. Private Sub mnuExit_Click()
  645.    subGameOverStop
  646.   Unload Me
  647. End Sub
  648.  
  649. Private Sub mnuHelp_Click()
  650.    subGameOverStop
  651.    frHelp.Visible = True
  652. End Sub
  653.  
  654. Private Sub mnuNewGame_Click()
  655.    subGameOverStop
  656.    subNewGame
  657. End Sub
  658.  
  659. Private Sub mnuPlaidColor_Click(Index As Integer)
  660. ' Card (back) 53 uses the Color paramater of API cdtDraw
  661.    Dim iClr As Integer
  662.    
  663.    Select Case Index
  664.       Case 0: iClr = 4
  665.       Case 1: iClr = 1
  666.       Case 2: iClr = 3
  667.       Case 3: iClr = 6
  668.       Case 4: iClr = 5
  669.       Case 5: iClr = 7
  670.    End Select
  671.    cdtDraw Me.hdc, 200, 400, 53, ordBacks, QBColor(iClr)
  672.    Me.Refresh
  673. End Sub
  674.  
  675. Private Sub mnuReplay_Click()
  676.    subNewGame cReplay
  677. End Sub
  678.  
  679. Private Sub mnuSounds_Click()
  680.    mnuSounds.Checked = Not mnuSounds.Checked
  681.    swSound = mnuSounds.Checked
  682. End Sub
  683.  
  684. Private Sub tmrGameOver_Timer()
  685.    Static i As Integer
  686.    
  687.    i = i + 1
  688.    If i > 7 Then
  689.       i = 0
  690.    End If
  691.    
  692.    lblGameOver(i).Visible = Not lblGameOver(i).Visible
  693. End Sub
  694.  
  695. Private Sub tmrInvalidSelection_Timer()
  696.    Static iCount As Integer
  697.    
  698.    lblInvalidSelection.Visible = Not lblInvalidSelection.Visible
  699.    iCount = iCount + 1
  700.    If iCount > 7 Then
  701.       tmrInvalidSelection.Enabled = False
  702.       iCount = 0
  703.       subDrawCard FirstCard.Index, ordFaces
  704.       subDrawCard SecondCard.Index, ordFaces
  705.       FirstCard.Index = -1
  706.       SecondCard.Index = -1
  707.    End If
  708. End Sub
  709.  
  710. Private Sub tmrRemoveCard_Timer()
  711.    With rectRemoveCard
  712.       Me.Line (.Left + iCntRemoveCard, .Top + iCntRemoveCard)-(.Right - iCntRemoveCard, .Bottom - iCntRemoveCard), Me.BackColor, B
  713.       Me.Refresh
  714.       End With
  715.    iCntRemoveCard = iCntRemoveCard + iAnimateSpeed
  716.    If iCntRemoveCard > 36 Then
  717.       tmrRemoveCard = False
  718.    End If
  719.  
  720. End Sub
  721.  
  722. '======================================================================================
  723. '
  724. '                                 LOCAL PROCEDURES
  725. '______________________________________________________________________________________
  726.  
  727. Private Sub subDrawCard(sIndex As Integer, sState As Integer)
  728.    If Not arPlayboard(sIndex).Discarded Then
  729.       cdtDraw Me.hdc, arPlayboard(sIndex).Left, arPlayboard(sIndex).Top, arPlayboard(sIndex).Number, sState, vbWhite
  730.       Me.Refresh
  731.    End If
  732. End Sub
  733.  
  734. Private Sub subGameOverStop()
  735.    Dim i As Integer
  736.    
  737.    tmrGameOver.Enabled = False
  738.    For i = 0 To 7
  739.       lblGameOver(i).Visible = False
  740.    Next i
  741. End Sub
  742.  
  743. Private Sub subNewGame(Optional sReplay As Boolean)
  744.  
  745.    Dim Temp       As Integer
  746.    Dim ItemPicked As Integer
  747.    Dim Remaining   As Integer
  748.    Dim i As Integer
  749.    
  750.  ' clear the playboard
  751.     Me.Cls
  752.     FirstCard.Index = -1
  753.     SecondCard.Index = -1
  754.     
  755.  ' Skip shuffle if we replay
  756.     If Not sReplay Then
  757.        ' load values into array , cardnumber(1) = 1, etc
  758.       For i = 0 To 51
  759.          arCards(i) = i
  760.       Next i
  761.    
  762.       ' shuffle this array
  763.       For i = 51 To 1 Step -1
  764.          ItemPicked = Int(Rnd * i)        ' pick a card from cards remaining
  765.          Temp = arCards(i)                ' get bottom card and put it as temp
  766.          arCards(i) = arCards(ItemPicked) ' move picked card to bottom
  767.          arCards(ItemPicked) = Temp       ' put (saved) bottom card
  768.       Next i
  769.    End If
  770.    
  771. '
  772. ' first 28 cards are shown on the "playing" area and we save card characteristics
  773.    For i = 0 To 27
  774.       cdtDraw Me.hdc, arPlayboard(i).Left, arPlayboard(i).Top, arCards(i), ordFaces, 0
  775.       arPlayboard(i).Number = arCards(i)
  776.       arPlayboard(i).Value = arCards(i) \ 4 + 1
  777.       ' each card is covered by two cards in the next row, the last row excepted
  778.       arPlayboard(i).Covered = IIf(i < 21, 2, 0)
  779.       arPlayboard(i).Discarded = False
  780.    Next i
  781.    Me.Refresh
  782. ' save characteristics of remaining cards (deck)
  783.    For i = 28 To 51
  784.       arDeck(i - 28).Number = arCards(i)
  785.       arDeck(i - 28).Value = arCards(i) \ 4 + 1
  786.       arDeck(i - 28).Discarded = False
  787.    Next i
  788.    
  789. ' the covered deck
  790.    cdtDraw Me.hdc, 200, 400, iBack, ordBacks, 0
  791. ' the uncovered deck
  792.    FillRgn Me.hdc, arRgn(28), hBrush
  793.    Me.Refresh
  794.    arPlayboard(28).Covered = 0
  795.    iCurrentDeck = -1
  796. End Sub
  797.  
  798. Private Sub subProcessSelection()
  799.  
  800. ' if the same card has been clicked undo the highligthing and reset
  801.    If FirstCard.Index = SecondCard.Index Then
  802.       subDrawCard FirstCard.Index, ordFaces
  803.       FirstCard.Index = -1
  804.       SecondCard.Index = -1
  805.       Exit Sub
  806.    End If
  807.    
  808. ' do both cards add up to 13
  809.    If FirstCard.Value + SecondCard.Value = 13 Then
  810. ' Yes: remove first and last card selected in descending sequence
  811.       If FirstCard.Index > SecondCard.Index Then
  812.          subRemoveCard FirstCard
  813.          subRemoveCard SecondCard
  814.       Else
  815.          subRemoveCard SecondCard
  816.          subRemoveCard FirstCard
  817.       End If
  818.       
  819. ' No: undo selection
  820.    Else
  821.       If swSound Then
  822.          PlayResWAV 102, SND_ASYNC + SND_RESOURCE
  823.       End If
  824.       tmrInvalidSelection.Enabled = True
  825.    End If
  826.    
  827. End Sub
  828.  
  829.  
  830. Private Sub subRemoveCard(sCard As SELECTED)
  831.    Dim iRow As Integer
  832.    Dim iIndex As Integer
  833.    
  834. ' preserve sCard.Index and flag it as processed
  835.    iIndex = sCard.Index
  836.    sCard.Index = -1
  837.    If swSound Then
  838.     PlayResWAV 101, SND_ASYNC + SND_RESOURCE
  839.    End If
  840.    If swAnimate Then
  841.       GetRgnBox arRgn(iIndex), rectRemoveCard
  842.       iCntRemoveCard = 0
  843.       tmrRemoveCard.Enabled = True
  844.       Do   ' wait for the timer to finish its job before proceeding
  845.         DoEvents
  846.       Loop Until tmrRemoveCard.Enabled = False
  847.    End If
  848.    
  849. ' deck (show underlying card)
  850.    If iIndex = 28 Then
  851.       arDeck(iCurrentDeck).Discarded = True
  852.       Do
  853.          iCurrentDeck = iCurrentDeck - 1
  854.          ' uncovered deck exhausted
  855.          If iCurrentDeck < 0 Then
  856.             FillRgn Me.hdc, arRgn(28), hBrush
  857.            If swSound Then
  858.               PlayResWAV 101, SND_ASYNC + SND_RESOURCE
  859.            End If
  860.           Me.Refresh
  861.             Exit Do
  862.          End If
  863.          If Not arDeck(iCurrentDeck).Discarded Then
  864.             arPlayboard(28).Number = arDeck(iCurrentDeck).Number
  865.             arPlayboard(28).Value = arDeck(iCurrentDeck).Value
  866.             subDrawCard 28, ordFaces
  867.             Exit Do
  868.          End If
  869.       Loop Until iCurrentDeck = -1
  870.       Exit Sub
  871.    End If
  872.  
  873. ' playboard : remove card and region
  874.    If swSound Then
  875.     PlayResWAV 101, SND_ASYNC + SND_RESOURCE
  876.    End If
  877.    If swAnimate Then
  878.       GetRgnBox arRgn(iIndex), rectRemoveCard
  879.       iCntRemoveCard = 0
  880.       tmrRemoveCard.Enabled = True
  881.       Do   ' wait for the timer to finish its job before proceeding
  882.         DoEvents
  883.       Loop Until tmrRemoveCard.Enabled = False
  884.    Else
  885.       FillRgn Me.hdc, arRgn(iIndex), hBrush
  886.    End If
  887.    arPlayboard(iIndex).Discarded = True
  888.    
  889. ' now check if last card has been removed
  890.    If iIndex = 0 Then
  891.       Me.Cls
  892.       If swSound Then
  893.          PlayResWAV 103, SND_ASYNC + SND_RESOURCE
  894.       End If
  895.       tmrGameOver.Enabled = True
  896.       Exit Sub
  897.    End If
  898.    
  899. ' repaint surroundng cards and set uncovered cards status
  900.    Select Case iIndex
  901.       Case 1, 2:     iRow = 1
  902.       Case 3 To 5:   iRow = 2
  903.       Case 6 To 9:   iRow = 3
  904.       Case 10 To 14: iRow = 4
  905.       Case 15 To 20: iRow = 5
  906.       Case 21 To 27: iRow = 6
  907.    End Select
  908.    
  909. ' any slot in a row except last: repaint up rigth and next right
  910.    If iIndex < arRow(iRow) + iRow Then
  911.       subDrawCard iIndex - iRow, ordFaces
  912.       arPlayboard(iIndex - iRow).Covered = arPlayboard(iIndex - iRow).Covered - 1
  913.       subDrawCard iIndex + 1, ordFaces
  914.    End If
  915.    
  916. ' any slot in a row except first: repaint up left and next left
  917.    If iIndex > arRow(iRow) Then
  918.       subDrawCard iIndex - iRow - 1, ordFaces
  919.       arPlayboard(iIndex - iRow - 1).Covered = arPlayboard(iIndex - iRow - 1).Covered - 1
  920.       subDrawCard iIndex - 1, ordFaces
  921.    End If
  922.    
  923. ' cards below the row of the processed card may have been overwritten
  924.    If iRow < 6 Then
  925.       For iIndex = arRow(iRow + 1) To 27
  926.          subDrawCard iIndex, ordFaces
  927.       Next iIndex
  928.    End If
  929.    
  930. End Sub
  931.