• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

N_u_n_o

Jogo 4 em Linha - Opiniões

9 mensagens neste tópico

Boas sou novo por aqui... :biggrin:, Estou a fazer o 4 em linha na aula. Gostava de saber se o que já fiz na class do jogo 4 em linha esta a ir bem  :ipool:

Public Class _4_em_linha
    Dim _matriz(,) As Integer = { _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0} _
                                    }
    Dim _jogador As Integer

    Public ReadOnly Property Jogador() As Integer
        Get
            Return _jogador
        End Get
    End Property

    Public Function IsFull(ByVal c As Integer) As Boolean
        Return _matriz(0, c) <> 0
    End Function

    Public Sub New()
        _jogador = 1
    End Sub

    Public Sub Clear()
        Dim x As Integer
        Dim y As Integer

        For y = 0 To 5
            For x = 0 To 6
                _matriz(y, x) = 0
            Next
        Next
    End Sub

    Public Function VerificaColuna(ByVal c As Integer) As Boolean
        Dim j As Integer = -1
        Dim c1 As Integer = 0
        Dim i As Integer

        For i = 0 To 5
            If _matriz(i, c) <> 0 Then
                If j = _matriz(i, c) Then
                    c1 += 1
                Else
                    c1 = 1
                    j = _matriz(i, c)
                End If
            Else
                c1 = 0
                j = -1
            End If
            If c1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaColunas() As Boolean
        Dim i As Integer

        For i = 0 To 5
            If VerificaColuna(i) Then Return True
        Next
        Return False
    End Function

    Public Function VerificaLinha(ByVal l As Integer) As Boolean
        Dim j As Integer = -1
        Dim l1 As Integer = 0
        Dim i As Integer

        For i = 0 To 6
            If _matriz(l, i) <> 0 Then
                If j = _matriz(l, i) Then
                    l1 += 1
                Else
                    l1 = 1
                    j = _matriz(l, i)
                End If
            Else
                l1 = 0
                j = -1
            End If
            If l1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaLinhas() As Boolean
        Dim i As Integer

        For i = 0 To 6
            If VerificaLinha(i) Then Return True
        Next
        Return False
    End Function
End Class

Ainda falta algumas coisas...  :) mas gostava de saber se estou a ir pelo bom caminho  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá bem vindo (para começar) :)

Não está mau, mas podias criar criar uma estrutura em vez de usar um array ... mas não é grave.

Depois mostra o resultado final.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tive de fazer um jogo de quatro em linha mas em C. Esse jogo que estás a fazer necessita de um jogador automático?

Ou é só um contra o outro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para já é só um contra o outro...agora na aula de tarde devo acabar o game...depois posto como ficou. Se por acaso o prof não pedir para ter um jogador automático, depois podias-me dar umas dicas de como o fazer, pois assim ficaria mais completo. :cheesygrin:

jpaulino como assim criar outra estrutura em vez de usar arrays ? não percebi sorry  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

era mais facil ires por printf's na minha opinião para construires o tabuleiro e definires if e else para as opçoes de vitoria isto pelo menos e so uma opiniao agora tenta encontrar a forma mais facil para ti.

cumprimentos. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

era mais fácil ires por printf's na minha opinião para construires o tabuleiro e definires if e else para as opçoes de vitoria isto pelo menos e so uma opiniao agora tenta encontrar a forma mais facil para ti.

cumprimentos. :D

Não se trata de construir o tabuleiro visualmente mas sim toda a lógica para que o jogo funcione. Mostrar o tabuleiro no écran é básico.

Além disso printf's não é para vb!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ainda continuo na class...amanha já devo terminar...estou com um problema no procedimento ganhar pois tem la um erro e ainda não consegui identifica-lo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Prontos finalmente terminei o game, mas estou com um problema...que não sei resolver. A situação é a seguinte. Dentro da minha class utilizo uma função para Verificar as Diagonais, o problema é que as minhas diagonais inferiores directa e inversa não estão a funcionar...ou seja quando um jogar faz 4 em linha de baixo para cima, o programa não da esse jogador como ganho.

1º Gostava de saber se no resto esta todo certo ou se tenho que alterar qualquer cena...

2º O programa será para apresentar na semana dos profissionais e gostava que fosse uma cena fixe, se alguém tiver alguma ideia de adicionar alguma cena, gosta que no disse-se.

3º Gostava de resolver este problema mas por muito que tente não consigo ver onde esta a falha...

Class 4 em linha

Public Class _4_em_linha
    Dim _matriz(,) As Integer = { _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0}, _
                                    {0, 0, 0, 0, 0, 0, 0} _
                                    }
    Dim _jogador As Integer
#Region "Propriadade(s)"

    Public ReadOnly Property Linhas() As Integer
        Get
            Return _matriz.GetLength(0)
        End Get
    End Property

    Public ReadOnly Property Colunas() As Integer
        Get
            Return _matriz.GetLength(1)
        End Get
    End Property

    Public ReadOnly Property Jogador() As Integer
        Get
            Return _jogador
        End Get
    End Property

#End Region
#Region "Função(ões)"

    Public Function IsFull(ByVal c As Integer) As Boolean
        Return _matriz(0, c) <> 0
    End Function

    Public Function VerificaColuna(ByVal c As Integer) As Boolean
        Dim j As Integer = -1
        Dim c1 As Integer = 0
        Dim i As Integer

        For i = 0 To Linhas - 1
            If _matriz(i, c) <> 0 Then
                If j = _matriz(i, c) Then
                    c1 += 1
                Else
                    c1 = 1
                    j = _matriz(i, c)
                End If
            Else
                c1 = 0
                j = -1
            End If
            If c1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaColunas() As Boolean
        Dim i As Integer

        For i = 0 To Colunas - 1
            If VerificaColuna(i) Then Return True
        Next
        Return False
    End Function

    Public Function VerificaLinha(ByVal l As Integer) As Boolean
        Dim j As Integer = -1
        Dim l1 As Integer = 0
        Dim i As Integer

        For i = 0 To Colunas - 1
            If _matriz(l, i) <> 0 Then
                If j = _matriz(l, i) Then
                    l1 += 1
                Else
                    l1 = 1
                    j = _matriz(l, i)
                End If
            Else
                l1 = 0
                j = -1
            End If
            If l1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaLinhas() As Boolean
        Dim i As Integer

        For i = 0 To Linhas - 1
            If VerificaLinha(i) Then Return True
        Next
        Return False
    End Function

    Public Function VerificaDiagonalSuperiorDirecta(ByVal d As Integer) As Boolean
        Dim j As Integer = -1
        Dim d1 As Integer = 0
        Dim i As Integer
        Dim y As Integer

        For i = d To Colunas - 1
            y = i - d
            If y > Linhas - 1 Then
                Return False
            End If
            If _matriz(y, i) <> 0 Then
                If j = _matriz(y, i) Then
                    d1 += 1
                Else
                    d1 = 1
                    j = _matriz(y, i)
                End If
            Else
                d1 = 0
                j = -1
            End If
            If d1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaDiagonalInferiorDirecta(ByVal d As Integer) As Boolean
        Dim j As Integer = -1
        Dim d1 As Integer = 0
        Dim i As Integer
        Dim x As Integer

        For i = d To Linhas - 1
            x = i - d
            If x > Colunas - 1 Then
                Return False
            End If
            If _matriz(i, x) <> 0 Then
                If j = _matriz(i, x) Then
                    d1 += 1
                Else
                    d1 = 1
                    j = _matriz(i, x)
                End If
            Else
                d1 = 0
                j = -1
            End If
            If d1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaDiagonalSuperiorInversa(ByVal d As Integer) As Boolean
        Dim j As Integer = -1
        Dim d1 As Integer = 0
        Dim i As Integer
        Dim y As Integer

        For i = d To Colunas - 1
            y = Colunas - 1 - i + d
            If y > Linhas - 1 Or y < 0 Then
                Return False
            End If

            If _matriz(y, i) <> 0 Then
                If j = _matriz(y, i) Then
                    d1 += 1
                Else
                    d1 = 1
                    j = _matriz(y, i)
                End If
            Else
                d1 = 0
                j = -1
            End If
            If d1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaDiagonalInferiorInversa(ByVal d As Integer) As Boolean
        Dim j As Integer = -1
        Dim d1 As Integer = 0
        Dim i As Integer
        Dim x As Integer

        For i = d To Linhas - 1
            x = Colunas - 1 - i + d
            If x > Colunas - 1 Or x < 0 Then
                Return False
            End If
            If _matriz(i, x) <> 0 Then
                If j = _matriz(i, x) Then
                    d1 += 1
                Else
                    d1 = 1
                    j = _matriz(i, x)
                End If
            Else
                d1 = 0
                j = -1
            End If
            If d1 = 4 Then Return True
        Next
        Return False
    End Function

    Public Function VerificaDiagonais() As Boolean
        Dim i As Integer

        For i = 0 To Colunas - 1
            If VerificaDiagonalSuperiorDirecta(i) Then Return True
        Next
        For i = 1 To Linhas - 1
            If VerificaDiagonalInferiorDirecta(i) Then Return True
        Next
        For i = 0 To Colunas - 1
            If VerificaDiagonalSuperiorInversa(i) Then Return True
        Next
        For i = 1 To Linhas - 1
            If VerificaDiagonalInferiorInversa(i) Then Return True
        Next
        Return False
    End Function

    Public Function Jogar(ByVal c As Integer) As Integer
        If IsFull(c) Then
            Return -1
        End If
        _matriz(Freepos(c), c) = Jogador
        If Ganhou() Then Return Jogador
        If Jogador = 1 Then
            _jogador = 2
        Else
            _jogador = 1
        End If
        Return 0
    End Function

    Public Function Freepos(ByVal c As Integer) As Integer
        For i = Linhas - 1 To 0 Step -1
            If _matriz(i, c) = 0 Then
                Return i
            End If
        Next
        Return -1
    End Function

    Public Function Ganhou() As Boolean
        Return VerificaColunas() Or VerificaLinhas() Or VerificaDiagonais()
    End Function

#End Region
#Region "Procedimento(s)"

    Public Sub Clear()
        Dim x As Integer
        Dim y As Integer

        For y = 0 To Linhas - 1
            For x = 0 To Colunas - 1
                _matriz(y, x) = 0
            Next
        Next
    End Sub

#End Region
#Region "Construtor(es)"

    Public Sub New(ByVal Linhas As Integer, ByVal Colunas As Integer)
        _jogador = 1
        ReDim _matriz(Linhas - 1, Colunas - 1)
        Clear()
    End Sub

    Public Sub New()
        _jogador = 1
        Clear()
    End Sub

#End Region
End Class

Form1

Public Class Form1
    Dim C0(5) As PictureBox
    Dim C1(5) As PictureBox
    Dim C2(5) As PictureBox
    Dim C3(5) As PictureBox
    Dim C4(5) As PictureBox
    Dim C5(5) As PictureBox
    Dim C6(5) As PictureBox
    Dim Tabuleiro()() As PictureBox = {C0, C1, C2, C3, C4, C5, C6}
    Dim Jogo As _4_em_linha

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click, Button6.Click, Button5.Click, Button4.Click, Button3.Click, Button2.Click, Button1.Click
        Dim btn As Button
        Dim Jogador As Integer = Jogo.Jogador

        btn = CType(sender, Button)

        Select Case btn.Name
            Case "Button1"
                Jogar(0)
            Case "Button2"
                Jogar(1)
            Case "Button3"
                Jogar(2)
            Case "Button4"
                Jogar(3)
            Case "Button5"
                Jogar(4)
            Case "Button6"
                Jogar(5)
            Case "Button7"
                Jogar(6)
        End Select
    End Sub

    Public Sub Jogar(ByVal c As Integer)
        Dim linha As Integer = Jogo.Freepos(c)
        If linha <> -1 Then
            Tabuleiro(c)(linha).Image = ImageList1.Images.Item(Jogo.Jogador - 1)
            Dim Ganhou As Integer = Jogo.Jogar(c)
            If Ganhou = 1 Or Ganhou = 2 Then
                MsgBox("Ganhou o jogador " & Ganhou.ToString)
            End If
        End If
    End Sub

    'Public Sub Inicializar()
    'Dim lbl As PictureBox

    '   For Each lbl In Me.Controls

    '  Next
    'End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        'Coluna 0
        C0(0) = PictureBox6
        C0(1) = PictureBox5
        C0(2) = PictureBox4
        C0(3) = PictureBox3
        C0(4) = PictureBox2
        C0(5) = PictureBox1

        'Coluna 1
        C1(0) = PictureBox12
        C1(1) = PictureBox11
        C1(2) = PictureBox10
        C1(3) = PictureBox9
        C1(4) = PictureBox8
        C1(5) = PictureBox7

        'Coluna 2
        C2(0) = PictureBox18
        C2(1) = PictureBox17
        C2(2) = PictureBox16
        C2(3) = PictureBox15
        C2(4) = PictureBox14
        C2(5) = PictureBox13

        'Coluna 3
        C3(0) = PictureBox24
        C3(1) = PictureBox23
        C3(2) = PictureBox22
        C3(3) = PictureBox21
        C3(4) = PictureBox20
        C3(5) = PictureBox19

        'Coluna 4
        C4(0) = PictureBox30
        C4(1) = PictureBox29
        C4(2) = PictureBox28
        C4(3) = PictureBox27
        C4(4) = PictureBox26
        C4(5) = PictureBox25

        'Coluna 5
        C5(0) = PictureBox36
        C5(1) = PictureBox35
        C5(2) = PictureBox34
        C5(3) = PictureBox33
        C5(4) = PictureBox32
        C5(5) = PictureBox31

        'Coluna 6
        C6(0) = PictureBox42
        C6(1) = PictureBox41
        C6(2) = PictureBox40
        C6(3) = PictureBox39
        C6(4) = PictureBox38
        C6(5) = PictureBox37

        Jogo = New _4_em_linha
    End Sub
End Class

Na form uso picturebox's e bottons....não sei se será a melhor opção...se alguém souber de alguma melhor =)

Já agora gostava de saber como é que se aplica uma barra de tarefas...tipo a do Mozilla ( Ficheiro, Editar, Ver, Histórico ) pois assim podia adicionar la algo para recomeçar o jogo.

Obrigado pela atenção

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora gostava de saber como é que se aplica uma barra de tarefas...tipo a do Mozilla ( Ficheiro, Editar, Ver, Histórico ) pois assim podia adicionar la algo para recomeçar o jogo.

MenuBar Control :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora