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

anolsi

Jogo do Galo VB.net 2005 (Objectos)

1 mensagem neste tópico

Aqui está um jogo do Galo em Vb.net 2005 a utilizar objectos. O que facilita muita coisa.

Objecto:

Public Class clsJogoGalo
#Region "Estrutura de Dados"
    Enum enuTipo As Integer
        Jogador = 0
        Computador = 1
    End Enum
    Private Const Vazio As String = "-"
    Private Comp As String = "OO" 'Determina 2O para procurar atacar
    Private Pessoa As String = "XX" 'Determina 2X para procurar perigo
    Private gr As String, activo As Boolean
    Private jogtipo(1) As enuTipo, sai As Boolean
#End Region
#Region "Constructores"
    Public Sub New(ByVal activo As Boolean)
        gr = "---------"
        Me.activo = activo
        jogtipo(0) = enuTipo.Jogador
        jogtipo(1) = enuTipo.Jogador
    End Sub
#End Region
#Region "Propriedades"
    Public ReadOnly Property CampoDeJogo() As String
        Get
            Return Me.gr
        End Get
    End Property
    Public Property JogoActivo() As Boolean
        Get
            Return Me.activo
        End Get
        Set(ByVal value As Boolean)
            Me.activo = value
        End Set
    End Property
    Public Property Jogador1() As enuTipo
        Get
            Return Me.jogtipo(0)
        End Get
        Set(ByVal value As enuTipo)
            Me.jogtipo(0) = value
        End Set
    End Property
    Public Property Jogador2() As enuTipo
        Get
            Return Me.jogtipo(1)
        End Get
        Set(ByVal value As enuTipo)
            Me.jogtipo(1) = value
        End Set
    End Property
#End Region
#Region "Métodos"
    Public Function JogarComputador(ByVal primeiro As Boolean) As Integer
        Dim posi As Integer
        Select Case primeiro
            Case True
                Comp = "XX"
                Pessoa = "OO"
                posi = Me.Regras()
                Me.gr = Me.gr.Insert(posi - 1, "X")
                Me.gr = Me.gr.Remove(posi, 1)
            Case False
                Comp = "OO"
                Pessoa = "XX"
                posi = Me.Regras()
                Me.gr = Me.gr.Insert(posi - 1, "O")
                Me.gr = Me.gr.Remove(posi, 1)
        End Select
    End Function
    Private Function Regras() As Integer

        Dim posi As Integer

        sai = False

        '-------------------- 1ª Regra ---------------------------
        If gr.Chars(4) = Vazio Then Return 5


        '--------------------- Ataque ----------------------------

        '------------------- Linhas ----------------------------
        posi = Linhas(Me.Pessoa)
        If sai Then Return posi
        '------------------- Colunas ---------------------------
        posi = Colunas(Me.Pessoa)
        If sai Then Return posi
        '------------------ Diagonais --------------------------
        posi = Diagonais(Me.Pessoa)
        If sai Then Return posi


        '--------------------- Perigo ----------------------------

        '------------------- Linhas ----------------------------
        posi = Linhas(Me.Comp)
        If sai Then Return posi
        '------------------- Colunas ---------------------------
        posi = Colunas(Me.Comp)
        If sai Then Return posi
        '------------------ Diagonais --------------------------
        posi = Diagonais(Me.Comp)
        If sai Then Return posi



        '---------------------- Sorte ----------------------------

        Randomize()
        Dim aux As Integer
        Do
            aux = CInt(8 * Rnd() + 1)
        Loop Until gr.Chars(aux - 1).ToString = Vazio

        Return aux
    End Function
    Private Function Linhas(ByVal pessoa As String) As Integer

        Dim padrao As String, posi, I As Integer

        For I = 1 To 9 Step 3 ' Linhas estilo "XX?"
            padrao = gr.Substring(I - 1, 2)
            If padrao = pessoa Then
                posi = I + 2
                If gr.Substring(posi - 1, 1) = Vazio Then sai = True : Return posi
            End If
        Next I
        For I = 1 To 9 Step 3 ' Linhas estilo "X?X"
            padrao = gr.Chars(I - 1) + gr.Chars(I + 1)
            If padrao = pessoa Then
                posi = I + 1
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I
        For I = 2 To 9 Step 3 ' Linhas estilo "?XX"
            padrao = gr.Chars(I - 1) + gr.Chars(I)
            If padrao = pessoa Then
                posi = I - 1
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I


    End Function
    Private Function Colunas(ByVal pessoa As String) As Integer

        Dim padrao As String, posi, I As Integer

        For I = 1 To 3 ' Colunas estilo (cima-baixo) "?XX"
            padrao = gr.Chars(I - 1) + gr.Chars(I + 2)
            If padrao = pessoa Then
                posi = I + 6
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I
        For I = 1 To 3 ' Colunas estilo (cima-baixo) "XX?"
            padrao = gr.Chars(I + 2) + gr.Chars(I + 5)
            If padrao = pessoa Then
                posi = I
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I
        For I = 1 To 3 ' Colunas estilo (cima-baixo) "X?X"
            padrao = gr.Chars(I + 5) + gr.Chars(I - 1)
            If padrao = pessoa Then
                posi = I + 3
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I


    End Function
    Private Function Diagonais(ByVal pessoa As String) As Integer

        Dim padrao As String, posi, I As Integer

        For I = 1 To 3 Step 2 ' Linhas estilo (esquerda-direita) "XX?"
            If I = 1 Then
                padrao = gr.Chars(I - 1) + gr.Chars(I + 3)
            Else
                padrao = gr.Chars(I + 3) + gr.Chars(I + 1)
            End If
            If padrao = pessoa Then
                If I = 1 Then posi = I + 8 Else posi = I
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I

        For I = 1 To 3 Step 2 ' Linhas estilo (esquerda-direita) "X?X"
            If I = 1 Then
                padrao = gr.Chars(I - 1) + gr.Chars(I + 7)
            Else
                padrao = gr.Chars(I + 3) + gr.Chars(I - 1)
            End If
            If padrao = pessoa Then
                If I = 1 Then posi = I + 4 Else posi = I + 2
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I

        For I = 1 To 3 Step 2 ' Linhas estilo (esquerda-direita) "?XX"
            If I = 1 Then
                padrao = gr.Chars(I + 3) + gr.Chars(I + 7)
            Else
                padrao = gr.Chars(I + 1) + gr.Chars(I - 1)
            End If
            If padrao = pessoa Then
                If I = 1 Then posi = I Else posi = I + 4
                If gr.Chars(posi - 1) = Vazio Then sai = True : Return posi
            End If
        Next I


    End Function
    Public Function DeterminaVitoria() As String

        Dim padrao As String

        '--------------------- Linhas ----------------------------
        padrao = gr.Substring(0, 3)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)

        padrao = gr.Substring(3, 3)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)

        padrao = gr.Substring(6, 3)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)

        '------------------- Colunas -----------------------------
        padrao = gr.Chars(0) & gr.Chars(3) & gr.Chars(6)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)

        padrao = gr.Chars(1) & gr.Chars(4) & gr.Chars(7)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)

        padrao = gr.Chars(2) & gr.Chars(5) & gr.Chars(8)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)

        '------------------ Diagonais ----------------------------
        padrao = gr.Chars(0) & gr.Chars(4) & gr.Chars(8)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)

        padrao = gr.Chars(2) & gr.Chars(4) & gr.Chars(6)
        If padrao = "XXX" Or padrao = "OOO" Then Return padrao.Chars(0)


        '------------------ Ainda não acabaou --------------------------
        For I As Integer = 0 To 8
            If Me.gr(I) = Vazio Then Return " "
        Next

        '------------------   Existe empate   --------------------------
        Return "-"

    End Function
    Public Sub JogadaJogador(ByVal jogador1 As Boolean, ByVal posi As Integer)
        If jogador1 And Me.jogtipo(0) = enuTipo.Jogador Then
            Me.gr = Me.gr.Substring(0, posi - 1) & "X" & Me.gr.Substring(posi, Me.gr.Length - (posi))
        ElseIf jogador1 = False And Me.jogtipo(1) = enuTipo.Jogador Then
            Me.gr = Me.gr.Substring(0, posi - 1) & "O" & Me.gr.Substring(posi, Me.gr.Length - (posi))
        End If
    End Sub
    Public Sub Recomeca(ByVal activo As Boolean)
        gr = "---------"
        Me.activo = activo
        jogtipo(0) = enuTipo.Jogador
        jogtipo(1) = enuTipo.Jogador
    End Sub
    Public Sub Continuar()
        gr = "---------"
        Me.activo = True
    End Sub
#End Region
End Class

Interface:

Public Class frmPrincipal
    Private jogo As New clsJogoGalo(False), jog As Integer = 1
    
    Private Sub txtNome_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtNome.KeyDown
        If e.KeyCode = 13 Then
            If Me.lblPrincipal.Text = "Jogador X" Then
                Me.lblJog1.Text = "Jogador X --> " & Me.txtNome.Text
                Me.txtNome.Text = ""
                Me.jogo.Jogador1 = CType(Me.cmbTipo.SelectedIndex, clsJogoGalo.enuTipo)
                Me.lblPrincipal.Text = "Jogador O"
            Else
                Me.lblJog2.Text = "Jogador O --> " & Me.txtNome.Text
                Me.jogo.Jogador2 = CType(Me.cmbTipo.SelectedIndex, clsJogoGalo.enuTipo)
                Me.jogo.JogoActivo = True
                Me.txtNome.Visible = False
                Me.lblPrincipal.Visible = False
                Me.cmbTipo.Visible = False
                Me.lblJogador.Visible = True
                Me.lblJogador.Text = "Jogador X"
            End If
        End If
    End Sub
    Private Sub Jogar(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn9.Click, btn8.Click, btn7.Click, btn6.Click, btn5.Click, btn4.Click, btn3.Click, btn2.Click, btn1.Click
        Dim letra As String
        Dim botao As Windows.Forms.Button = CType(sender, Windows.Forms.Button)
        If Me.jogo.JogoActivo Then
            If botao.Text = "-" Then
                If Me.jog = 1 Then
                    jog = 2
                    botao.Text = "X"
                    Me.jogo.JogadaJogador(True, Integer.Parse(botao.Name.Chars(3)))
                    letra = "O"
                Else
                    jog = 1
                    botao.Text = "O"
                    letra = "X"
                    Me.jogo.JogadaJogador(False, Integer.Parse(botao.Name.Chars(3)))
                End If
                Me.VerificaVitoria()
                If Me.jogo.JogoActivo Then Me.lblJogador.Text = "Jogador " & letra
            End If
        Else
            MessageBox.Show("Não está nenhum jogo a decorrer!", "Jogo do Galo", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub
    

    Private Sub frmPrincipal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.lblJogador.Left = Integer.Parse(((Me.Width - Me.lblJogador.Width) / 2).ToString)
        Me.cmbTipo.Text = "Jogador"
    End Sub
    Public Sub Redesenha()
        Me.btn1.Text = Me.jogo.CampoDeJogo.Chars(0)
        Me.btn2.Text = Me.jogo.CampoDeJogo.Chars(1)
        Me.btn3.Text = Me.jogo.CampoDeJogo.Chars(2)
        Me.btn4.Text = Me.jogo.CampoDeJogo.Chars(3)
        Me.btn5.Text = Me.jogo.CampoDeJogo.Chars(4)
        Me.btn6.Text = Me.jogo.CampoDeJogo.Chars(5)
        Me.btn7.Text = Me.jogo.CampoDeJogo.Chars(6)
        Me.btn8.Text = Me.jogo.CampoDeJogo.Chars(7)
        Me.btn9.Text = Me.jogo.CampoDeJogo.Chars(8)
    End Sub

    Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click
        Me.Close()
    End Sub

    Private Sub btnRe_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRe.Click
        Me.jogo.Recomeca(False)
        Me.lblJog1.Text = ""
        Me.lblJog2.Text = ""
        Me.lblPrincipal.Text = "Jogador X"
        Me.lblJogador.Visible = False
        Me.lblPrincipal.Visible = True
        Me.txtNome.Text = ""
        Me.txtNome.Visible = True
        Me.cmbTipo.Text = "Jogador"
        Me.cmbTipo.Visible = True
        Me.jog = 1
        Me.btnContinuar.Enabled = False
        Me.Redesenha()
    End Sub

    Private Sub cmbTipo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbTipo.SelectedIndexChanged
        If Me.cmbTipo.Text = "Computador" Then
            Me.txtNome.Text = "Computador"
            Me.txtNome_KeyDown(txtNome, New Windows.Forms.KeyEventArgs(Keys.Enter))
            Me.cmbTipo.Text = "Jogador"
        End If

    End Sub

    Private Sub mnuSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuSair.Click
        Me.Close()
    End Sub

    Private Sub mnuSobre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuSobre.Click
        frmSobre.Show()
    End Sub

    Private Sub mnuCor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCor.Click
        Me.dlgCor.Color = My.Settings.Cor
        If Me.dlgCor.ShowDialog() = Windows.Forms.DialogResult.OK Then
            If Me.dlgCor.Color <> Color.Black Then
                My.Settings.Cor = Me.dlgCor.Color
            Else
                MessageBox.Show("Cor Impossivel", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End If

    End Sub

    Public Sub New()

        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
    End Sub

    Private Sub mnuRepor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuRepor.Click
        My.Settings.Reset()
    End Sub

    Private Sub mnuTransparencia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuTransparencia.Click
        If frmTrans.ShowDialog() = Windows.Forms.DialogResult.OK Then My.Settings.Trans = 1 - (frmTrans.nup.Value / 100)
    End Sub
    Private Sub lblJogador_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lblJogador.SizeChanged
        Me.lblJogador.Left = CInt((Me.Width - Me.lblJogador.Width) / 2)
    End Sub
    Private Sub btnContinuar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnContinuar.Click
        Me.jogo.JogoActivo = False
        Me.lblJogador.Text = ""
        Me.jogo.Continuar()
        Me.Redesenha()
        Me.jog = 1
        Me.btnContinuar.Enabled = False
        Me.lblJogador.Text = "Jogador X"
    End Sub
    Private Sub lblJogador_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lblJogador.TextChanged
        If Me.jogo.JogoActivo Then
            Dim local As Integer, letra As String = "", aux As String = "", jogou As Boolean = False
            If Me.jogo.Jogador1 = clsJogoGalo.enuTipo.Computador AndAlso Me.jog = 1 Then
                local = Me.jogo.JogarComputador(True)
                Me.jog = 2
                jogou = True
                letra = "O"
            ElseIf Me.jogo.Jogador2 = clsJogoGalo.enuTipo.Computador AndAlso Me.jog = 2 Then
                local = Me.jogo.JogarComputador(False)
                Me.jog = 1
                jogou = True
                letra = "X"
            End If
            If jogou Then
                Me.Redesenha()
                Me.VerificaVitoria()
                If Me.jogo.JogoActivo Then Me.lblJogador.Text = "Jogador " & letra
            End If
        End If
    End Sub

    Public Sub VerificaVitoria()
        Dim aux As String
        aux = Me.jogo.DeterminaVitoria()
        Select Case aux
            Case "X", "O"
                Me.jogo.JogoActivo = False
                Me.lblJogador.Text = "Ganhou o jogador " & aux & "!"
                Me.btnContinuar.Enabled = True
            Case "-"
                Me.jogo.JogoActivo = False
                Me.lblJogador.Text = "Houve um empate!"
                Me.btnContinuar.Enabled = True
        End Select
    End Sub
End Class

Vou tentar diponiblizar o jogo...  ;)

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