unity3D做的翻纸牌消除游戏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity3D做的翻纸牌消除游戏相关的知识,希望对你有一定的参考价值。

参考技术A 一、功能介绍

1.1场景切换

我们的场景分为3个,一个开始场景,主要负责向其他场景的调转以及游戏的退出。另一个是游戏场景,是游戏的主体部分,实现娱乐功能。还一个是帮助场景,玩家可以在此查看游戏玩法。

T1开始场景

T2游戏场景

T3帮助场景

1.2游戏场景布置

整个游戏场景中分为三个部分,分别为:16个Button、2个Text、16张image、8张Sprite。

1)按钮的功能主要接收玩家的点击,显示下层纸牌,计数,传递匹配名。按钮将以纸牌背面显示。

2)文本的功能是实时显示倒计时以及玩家得分。

3))图片的功能是渲染纸牌,它将以纸牌正面显示。

1.3洗牌

每次游戏纸牌排布循序都将不同,增加游戏的不确定性和可玩性。

1.4点击三次匹配

当玩家翻开三张不同的扑克时,游戏将会自动检查前两张是否匹配,匹配则加分并且消除纸牌;不匹配则将前两张纸牌重新置反。

1.5匹配以及消除

游戏判断纸牌是否为相同的纸牌。将纸牌从游戏场景中消除

1.6总分

弹出游戏面板,并且显示玩家的总分。

二、 实现

2.1场景切换

给每个场景添加按钮,在场景跳转的按钮上添加脚本。使用SceneManager.LoadScene(“string”)  函数可以通过修改string参数实现向不同场景的跳转。

2.2游戏场景布置

1)设置按钮、图片为预制体并用两个数组分别参访。通过排布预制体的方法可以快速布局游戏场景。同时调节按钮的图层高于图片,用于最先显示按钮。

T4

T5

2)设置按钮的source image将按钮的显示图片改为纸牌背面。同时,给按钮添加点击事件:向GameManager脚本传入图片名字和对应按钮,并且把按钮设为不可见、不可点击。

3)使用InvokeRepeating()函数实现每秒减一的功能,并且修改时间的文本,以更新时间。

4)16张图片的作用是渲染纸牌,它将以纸牌正面显示。纸牌由8张sprite用作纸牌正面。修改图片的source image使图片渲染纸牌。渲染纸牌正面所用到的图片用一个数组来存放。

T6

2.3洗牌

首先设置两个数组,一个存放0~15的正序数,另一个存放打乱后的数字作为T5数组渲染T6图片的index.

具体通过使用Random.Range(),函数实现随机取数,然后将取到的数存放到第二个数组中并remove()第一组中相应的内容。

2.4点击三次匹配

首先设置一个showing变量每次点击纸牌时加一,当加到3的时候调用匹配函数。并且重新置1。值得一提的是,在最后一次匹配时判断依据变为匹配数满14并且showing变量为2。其中匹配数为一个整形变量,每成功匹配一对,加二。

2.5匹配和消除

给每个按钮设置对应0~15的标签,用于确定点击的按钮在数组中的位置。通过这个位置访问T6相应位置上图片的名字。每次点击纸牌都将传出对应的名字,并在游戏主脚本中设置一个集合接收。通过比较集合中前两个元素来检查是否匹配。如果匹配成功就将传值的按钮可见性通过GetComponent<>().enable设置为false。并且把被渲染的图片也设置为false。然后再把接收名字和按钮的集合清空。

如果匹配不成过,那么重新把就收到的按钮设为可点击,并且把按钮设为可见,把底层图片设为不可见。

2.7总分

设置一个Panel,并且一开始设为不可见,当倒计时为0时,调节为可见。在Panel上添加得分文本、重来和返回菜单的按钮。

得分文本通过访问游戏的得分数据来显示。给按钮添加场景跳转功能。

如何用VB编程开发纸牌接龙游戏?

往期精彩内容


大家好,在Windows系统的电脑上,都可以发现有纸牌这个有趣的休闲小游戏。


如何用VB编程开发纸牌接龙游戏?

电脑自带的纸牌游戏图


纸牌游戏规则


游戏中下方的牌称为为主牌,若上面有比主牌大1或者小1的牌,点击它们可消除。若没有可消除的,可点击主牌可换主牌。


那么,如何用VB编程来开发呢?

分析:

用VB编程开发纸牌游戏,需要用到VB常用控件、控件数组、图形控件、控制结构、数组、过程、文件方面的综合内容。


如何用VB编程开发纸牌接龙游戏?

VB开发纸牌游戏运行图

程序实现代码


提示:由于程序实现代码多,代码比较长,看代码也不方便,如果对本游戏程序感兴趣,可直接扫描文尾的小编微信号,备注
:“纸牌”
,添加后,会把完整的程序文件发给你,可以直接在电脑上运行,方便学习。

Option Explicit

Dim x0 As Long, y0 As Long     '拖动过程中保存鼠标的位置

Dim left0 As Long, top0 As Long  '被拖动多张牌中最上方牌的位置

Dim inmove As Boolean            '如果为True表示处于拖动过程中

Dim cardsmove() As Integer       '动态数组,保存移动中的多张牌(0~cardsmovenum-1)

Dim cardsmovenum As Integer      '移动牌的张数

Dim movefrom As Integer           '保存拖动的源序列号

Dim min As Long, sec As Integer  '游戏的分与秒


Private Sub Form_Load()

    Dim i As Integer, j As Integer

    

    '空档牌

    j = 0

    For i = 0 To 4

        imgBack(i).Picture = GetPicture(5, 14)

        imgBack(i).Top = conVerGap

        imgBack(i).Left = conHorGap * (j + 1) + conCardWidth * j

        j = j + 1

        If i = 0 Then j = j + 2

    Next

    '生成另外51张牌

    For i = 2 To 52

        Load imgCards(i)

    Next如何用VB编程开发纸牌接龙游戏?

        If Dir(App.Path & "\cards.txt") <> "" Then

        If MsgBox("是否恢复上次保存的牌局?", vbYesNo + vbQuestion, "接龙") = vbYes Then

            Open App.Path & "\cards.txt" For Input As 1

            Input #1, back

            For i = 0 To 12

                For j = 0 To 30

                    Input #1, queues(i, j)

                    If queues(i, j) <> 0 Then Input #1, updown(queues(i, j))

                Next

            Next

            Input #1, min, sec

            Close 1

        Else

            Randomize

            back = 1 + Rnd * 12             '背面图案

            Call Shuffle                    '随机洗牌

        End If

    Else

        Randomize

        back = 1 + Rnd * 12                 '背面图案

        Call Shuffle                        '随机洗牌

    End If

    

    Call ShowCards  '显示所有牌

    

End Sub


Private Sub Form_Unload(Cancel As Integer)

    Dim i As Integer, j As Integer

    If MsgBox("是否保存牌局?下次启动后继续。", vbYesNo + vbQuestion, "接龙") = vbYes Then

        Open App.Path & "\cards.txt" For Output As 1

        Write #1, back

        For i = 0 To 12

            For j = 0 To 30

                Write #1, queues(i, j),

                If queues(i, j) <> 0 Then Write #1, updown(queues(i, j)),

            Next

        Next

        Write #1,

        Write #1, min, sec  '记录游戏的分与秒

        Close 1

    Else

        If Dir(App.Path & "\cards.txt") <> "" Then

            Kill App.Path & "\cards.txt"

        End If

    End If

End Sub

如何用VB编程开发纸牌接龙游戏?

Private Sub mnuExit_Click()

    Unload Me

End Sub


Private Sub mnuNew_Click()

    sec = 0

    min = 0

    Call Shuffle    '   洗牌

    Call ShowCards  '显示所有牌

End Sub

Private Sub ShowCards()

    Dim i As Integer, j As Integer, k As Integer

    Dim offset As Integer           '每个序列中牌的纵向偏移量

    

    

    For i = 0 To 6              '显示下列7个序列

        j = 0

        offset = 0

        k = queues(i, j)

        Do While k <> 0

            If updown(k) Then   '正面

                imgCards(k) = GetPicture((k - 1) \ 13 + 1, (k - 1) Mod 13 + 1)

            Else                '反面

                imgCards(k) = GetPicture(5, back)

            End If

            imgCards(k).Top = offset + conCardHeight + 2 * conVerGap      '纵坐标

            imgCards(k).Left = conHorGap * (i + 1) + conCardWidth * i       '横坐标

            imgCards(k).ZOrder 0

            imgCards(k).Visible = True

            j = j + 1

            If updown(k) Then offset = offset + conVerGap Else offset = offset + conMiniVerGap  '反面的和正面的间柜不同

            k = queues(i, j)

        Loop

    Next

    

    For i = 7 To 8               '显示左上角2个序列

        j = 0

        

        k = queues(i, j)

        Do While k <> 0

            If updown(k) Then   '正面

                imgCards(k) = GetPicture((k - 1) \ 13 + 1, (k - 1) Mod 13 + 1)

            Else                '反面

                imgCards(k) = GetPicture(5, back)

            End If

            imgCards(k).Top = conVerGap

            imgCards(k).Left = conHorGap * (i - 7 + 1) + conCardWidth * (i - 7)

            imgCards(k).ZOrder 0

            imgCards(k).Visible = True

            j = j + 1

            k = queues(i, j)

        Loop

    Next

    

    For i = 9 To 12              '显示右上角的4个序列

        j = 0

        k = queues(i, j)

        Do While k <> 0

            If updown(k) Then   '正面

                imgCards(k).Picture = GetPicture((k - 1) \ 13 + 1, (k - 1) Mod 13 + 1)

            Else                '反面

                imgCards(k).Picture = GetPicture(5, back)

            End If

            imgCards(k).Top = conVerGap

            imgCards(k).Left = conHorGap * (i + 1 - 9 + 3) + conCardWidth * (i - 9 + 3)

            imgCards(k).ZOrder 0

            imgCards(k).Visible = True

            j = j + 1

            k = queues(i, j)

        Loop

    Next

    

End Sub



Private Sub imgBack_Click(Index As Integer)           '如果点击的是序列7最下面的空牌,则将序列8中的牌移至序列7

    Dim i As Integer, j As Integer

    If Index = 0 Then

        j = queuetop(8)             '查找第8序列中最顶牌的序号

        i = 0

        Do While j >= 0

            queues(7, i) = queues(8, j)

            queues(8, j) = 0

            updown(queues(7, i)) = False  '反面

            imgCards(queues(7, i)).Picture = GetPicture(5, back)

            imgCards(queues(7, i)).Left = conHorGap

            imgCards(queues(7, i)).ZOrder 0

            i = i + 1

            j = j - 1

        Loop

        Exit Sub

    End If


End Sub


Private Sub imgCards_DblClick(Index As Integer)     '如果双击了序列8最顶层牌,判断该牌是否可以放置在序列9-12之一的顶层

    Dim i As Integer, j As Integer, k As Integer

    Dim queueclicked As Integer             '被双击的序列号

    queueclicked = queueno(Index)

    If queueclicked = 7 Or queueclicked >= 9 And queueclicked <= 12 Then Exit Sub   '这几个序列不接受双击操作

    k = queuetop(queueclicked)

    If queues(queueclicked, k) <> Index Then Exit Sub        '如果双击的牌不是该序列最顶层牌,则不反应

    If Not updown(Index) Then Exit Sub                      '如果双击的背面,则不反应

    

如何用VB编程开发纸牌接龙游戏?

    If Index Mod 13 = 1 Then    '判断此牌是否为A

        '将A放置在9-12序列中第一个空序列中

        For i = 9 To 12

            j = queuetop(i)     '查找空序列

            If j = -1 Then

                queues(i, j + 1) = Index

                queues(queueclicked, k) = 0

                imgCards(Index).Top = conVerGap

                imgCards(Index).Left = conHorGap * (i - 9 + 4) + conCardWidth * (i - 9 + 3)

                Exit For

            End If

        Next

    Else                        '如果不是A ,则搜索比其小1,同花色的牌

        For i = 9 To 12

            j = queuetop(i)     '查找非空序列

            If j <> -1 Then

                If queues(i, j) = Index - 1 Then

                    queues(i, j + 1) = Index

                    queues(queueclicked, k) = 0

                    imgCards(Index).Top = conVerGap

                    imgCards(Index).Left = conHorGap * (i - 9 + 4) + conCardWidth * (i - 9 + 3)

                    Exit For

                End If

            End If

        Next

        

        If ifFinish() Then      '判断是否完成

            MsgBox "祝贺接龙成功!" & Chr(10) & Chr(13) & "用时" & min & "分" & sec & "秒。", vbInformation, "接龙"

        End If

        

    End If

End Sub


Private Sub imgCards_MouseDown(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)

    Dim i As Integer, j As Integer, k As Integer

    Dim fTop As Boolean                     '判断点击的牌是否位于序列顶部

    Dim que As Integer, ind As Integer      '当前点击牌位于的序列和序号

    Dim topind As Integer                   '本序列中最顶牌的序号

    Dim mousepos As POINTAPI                '保存鼠标位置

    

    que = queueno(Index)                     '点击的序列

    ind = queueindex(Index)                  '被点击牌的序号

    topind = queuetop(que)                   '被点击序列的顶张牌的序号

    If queues(que, ind + 1) = 0 Then fTop = True Else fTop = False  '判断点击的牌是否最顶层

    

    

如何用VB编程开发纸牌接龙游戏?

    '如果是点击了左上角的第7序列,则其上最顶牌移至第8序列

    If que = 7 And fTop Then

        For i = 30 To 0 Step -1             '查找第8序列

            If queues(8, i) <> 0 Then

                Exit For

            End If

        Next

        i = i + 1

        queues(8, i) = queues(7, ind)     '移动牌

        queues(7, ind) = 0

        updown(Index) = True     '将牌翻起

        imgCards(Index).Picture = GetPicture((Index - 1) \ 13 + 1, (Index - 1) Mod 13 + 1)

        imgCards(Index).Left = conCardWidth + 2 * conHorGap

        imgCards(Index).ZOrder 0

    ElseIf que >= 0 And que <= 7 And fTop And updown(Index) = False Then '如果点击的是序列0-7中顶反面牌,则将其反转

        Call Turn(Index, True)

    ElseIf updown(Index) Then                                            '如果点击的是其他正面牌,则进入拖动状态

        left0 = imgCards(Index).Left

        top0 = imgCards(Index).Top

        Call GetCursorPos(mousepos)

        x0 = mousepos.x

        y0 = mousepos.y

        inmove = True

        cardsmovenum = topind - ind + 1         '移动的牌数

        movefrom = que                          '拖动的源序列

        ReDim cardsmove(1 To cardsmovenum)      '保存每个被拖动的牌号

        For i = 1 To cardsmovenum

            cardsmove(i) = queues(que, ind + i - 1)

            imgCards(cardsmove(i)).ZOrder 0

        Next

    End If

    

End Sub


Private Sub imgCards_MouseMove(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)

    Dim i As Integer

    Dim mousepos As POINTAPI

    

   

    If inmove Then

        Call GetCursorPos(mousepos)         '得到新的鼠标位置

        For i = 1 To cardsmovenum

            imgCards(cardsmove(i)).Left = imgCards(cardsmove(i)).Left + mousepos.x - x0

            imgCards(cardsmove(i)).Top = imgCards(cardsmove(i)).Top + mousepos.y - y0

        Next

        x0 = mousepos.x

        y0 = mousepos.y

    End If

End Sub


Private Sub imgCards_MouseUp(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)

    Dim moveto As Integer   '鼠标释放时所处的序列

    Dim i As Integer, j As Integer, k As Integer

    Dim delx As Long, dely As Long

    Dim newx As Long, newy As Long

    Dim fmoveback As Boolean        '是否移回原位置

    

    If inmove Then

        moveto = getqueueatcursor()

        If moveto = -1 Or movefrom = moveto Then            '拖动的位置不对(不在序列0-7和9-12上),返回初始位置

            fmoveback = True

        ElseIf moveto >= 9 And moveto <= 12 And cardsmovenum > 1 Then   '拖多张至9-12序列

            fmoveback = True

        End If

        If Not fmoveback Then

            If moveto >= 9 And moveto <= 12 Then                '拖至9-12序列

                If queuetop(moveto) = -1 And cardsmove(1) Mod 13 <> 1 Then '序列空,但拖来的不是A

                    fmoveback = True

                ElseIf queuetop(moveto) <> -1 Then

                    If queues(moveto, queuetop(moveto)) + 1 <> cardsmove(1) Then    '序列非空,但不连续

                        fmoveback = True

                    End If

                End If

            ElseIf moveto >= 0 And moveto <= 7 Then             '拖至0-7序列

                If queuetop(moveto) = -1 And cardsmove(1) Mod 13 <> 0 Then '序列空,但拖来的不是K

                    fmoveback = True

                ElseIf queuetop(moveto) <> -1 Then

                    If Not ((queues(moveto, queuetop(moveto)) - 1) Mod 13 = (cardsmove(1) Mod 13) And _

                        ((queues(moveto, queuetop(moveto)) - 1 - 1) \ 13 + ((cardsmove(1) - 1) \ 13)) Mod 2 = 1) Then   '序列非空,但不连续

                        fmoveback = True

                    End If

                End If

            End If

        End If

        

如何用VB编程开发纸牌接龙游戏?

            

        If fmoveback Then                                           '移回开始拖动的序列中

            delx = imgCards(cardsmove(1)).Left - left0

            dely = imgCards(cardsmove(1)).Top - top0

            For i = 1 To cardsmovenum

                imgCards(cardsmove(i)).Left = imgCards(cardsmove(i)).Left - delx

                imgCards(cardsmove(i)).Top = imgCards(cardsmove(i)).Top - dely

            Next

        Else                                                       '移到目标序列中

            k = queuetop(movefrom)

            For i = 1 To cardsmovenum                               '从源序列中删除

                queues(movefrom, k - i + 1) = 0

            Next

            k = queuetop(moveto)

            For i = 1 To cardsmovenum                               '移至目标序列中

                queues(moveto, k + i) = cardsmove(i)

            Next

            If k = -1 Then                                          '目标序列为空时,计算放置位置

                If moveto >= 0 And moveto <= 6 Then

                    newx = conHorGap * (moveto + 1) + conCardWidth * moveto

                    newy = conVerGap * 2 + conCardHeight

                ElseIf moveto >= 9 And moveto <= 12 Then

                    newx = conHorGap * (moveto + 1 + 3 - 9) + conCardWidth * (moveto + 3 - 9)

                    newy = conVerGap

                End If

            Else                                                     '目标序列非空时,计算放置位置

                newx = imgCards(queues(moveto, k)).Left

                If moveto >= 9 And moveto <= 12 Then

                    newy = imgCards(queues(moveto, k)).Top

                Else

                    newy = imgCards(queues(moveto, k)).Top + conVerGap

                End If

            End If

            For i = 1 To cardsmovenum                                '放置被拖动的图片

                imgCards(cardsmove(i)).Left = newx

                imgCards(cardsmove(i)).Top = newy + conVerGap * (i - 1)

                imgCards(cardsmove(i)).ZOrder 0

            Next

            

            If ifFinish() Then      '判断是否完成

                MsgBox "祝贺接龙成功!" & Chr(10) & Chr(13) & "用时" & min & "分" & sec & "秒。", vbInformation, "接龙"

            End If


        End If

        

如何用VB编程开发纸牌接龙游戏?

        inmove = False

    End If

    

End Sub


Private Function getqueueatcursor() As Integer

    Dim i As Integer, j As Integer

    Dim x As Integer, y As Integer

   

    Dim mousepos As POINTAPI

    Call GetCursorPos(mousepos)

    x = mousepos.x - Me.Left / Screen.TwipsPerPixelX

    y = mousepos.y - Me.Top / Screen.TwipsPerPixelY


    If y > 2 * conVerGap + conCardHeight Then           '0-6序列

        getqueueatcursor = x \ (conHorGap + conCardWidth)

        If getqueueatcursor < 0 Then getqueueatcursor = -1

        If getqueueatcursor > 6 Then getqueueatcursor = -1

        Exit Function

    Else

        getqueueatcursor = x \ (conHorGap + conCardWidth) + 7

        If getqueueatcursor < 7 Then getqueueatcursor = -1

        If getqueueatcursor > 13 Then getqueueatcursor = -1

        

        If getqueueatcursor <= 9 Then

            getqueueatcursor = -1

        Else

            If getqueueatcursor >= 10 Then

                getqueueatcursor = getqueueatcursor - 1

            End If

        End If

        Exit Function

    End If

End Function




Private Sub mnuSelectBack_Click()

    Dim oldback As Integer

    Dim i As Integer

    oldback = back

    frmSelectBack.Show 1, Me

    If oldback <> back Then

        For i = 1 To 52

            If Not updown(i) Then

                imgCards(i).Picture = GetPicture(5, back)

            End If

        Next

    End If

    

End Sub


Private Sub Timer1_Timer()

    sec = sec + 1

    If sec = 60 Then

        min = min + 1

        sec = 0

    End If

    Me.Caption = "接龙-" & Format(min, "00") & ":" & Format(sec, "00")

End Sub


如何用VB编程开发纸牌接龙游戏?


为了帮助VB基础薄弱或者VB零基础想快速掌握VB编程的朋友,充分利用好冬季有限的时间,2018年冬季视频直播现已正式开启了,针对VB基础薄弱或者零基础的朋友有专门的基础讲解课程;对已有VB编程基础想综合提高编程开发能力的朋友有综合讲解课程及串口通信与数据库开发课程可供选择学习。

VB视频指导包含的内容

如何用VB编程开发纸牌接龙游戏?


1、所有的VB视频都是亲自讲解,每节视频都会结合实际程序,程序代码均会一句一句详细讲解;

2、学习没有时间限制;

3、老师随时指导;

4、学习即可获得各种编程学习资料和开发工具。


跟我学VB

2018年11月下旬

学习优惠活动

1、VB从入门到综合视频直播学习优惠中,本课程由数年VB开发经验老师亲自讲解,学习问题随时指导,能够让你短时间内掌握VB课程;


2、VB全套学习资料网盘版,内容包括亲自讲解的视频、课件教程、编程实例大全(含源代码工程文件)、学习总结资料、各种编程开发工具现在优惠发放中;


3、2019年3月全国计算机二级VB考试指导进行中,找对方法、方能在有限的时间内一次顺利通过考试;


4、凡现在报名学习的朋友均送全套网盘学习资料一份!





长按上图,关注跟我学VB公众平台

更多VB精彩内容,尽在VB学习


以上是关于unity3D做的翻纸牌消除游戏的主要内容,如果未能解决你的问题,请参考以下文章

unity3D游戏开发实战原创视频讲座系列7之消消乐游戏开发

跟诸子学游戏 unity3d Rendering Mode和Render Mode

unity3d开发2d游戏中Assetbundle有啥作用

Unity3d 失去获取焦点,暂停

如何用unity做一个2d小游戏

安卓逆向Unity3D游戏层叠xx破解