Voltar para a
Página Inicial

 

aula 3 - versão 1.0 para Visual Basic - 09 setembro 2000

Tutorial: Noções Básicas de Programação de Jogos
endereço atual: http://www.geocities.com/victormsantanna/

"Clique" certo

Victor M. Sant'Anna

Introdução

Vamos aproveitar as duas lições anteriores e criar mais dois jogos, o primeiro programa muito simples e fácil de fazer em termos de código e o segundo visualmente mais simples, mas com maiores detalhes de programação. Os dois programas serão parecidos do ponto de vista do usuário: "clicar" botões para encontrar uma determinada resposta.

No primeiro programa, o jogador testará sua "capacidade paranormal" de prever acontecimentos futuros, tentando descobrir qual dentre cinco cartas o computador escolherá. Chamaremos esse programa de "PEs" (Percepção Extrasensorial). Veremos como ler imagens (bitmaps) gravadas em disco. Além disso, posicionaremos todos os controles em tempo de execução, ao contrário do que vínhamos fazendo anteriormente.

Ao contrário do primeiro programa, no segundo programa a disposição dos controles será em tempo de design do formulário. Testaremos a memória do jogador: quantos números uma pessoa pode guardar em seqüência? O programa irá gerar números aleatoriamente e o jogador terá de seguir a seqüência gerada pelo computador. Nesse caso, também usaremos o Timer para mostrar os números em uma velocidade suficiente para que o jogador memorize a seqüência. Os números serão armazenados em um string (ao invés de um array de inteiros, como seria o normal) para que seja mais fácil comparar a entrada do jogador contra a seqüência armazenada pelo programa.

Lendo imagens gravadas

Usando a função rnd() vista na primeira lição, vamos esperar pelo palpite do jogador antes de fazer o "sorteio" de uma imagem e conferir a resposta. Entretanto, ao invés de colar e posicionar as imagens em tempo de criação como nos programas anteriores, faremos isso durante a execução do programa. Posicionaremos todos os controles de acordo com o tamanho da tela que estiver sendo usada.

1) Crie um diretório para o programa e grave nesse diretório imagens semelhante as imagens abaixo. Use os nomes de "fig1.bmp", "fig2.bmp", "fig3.bmp", "fig4.bmp" e "fig5.bmp"

2) Crie um projeto novo e salve o projeto dentro do diretório que contém as imagens gravadas.

3) Coloque, no form1 criado, um botão (CommandButton).

4) Dê um "duplo clique" no botão para deixar o código como o mostrado abaixo:


Private Sub Command1_Click()

If testes > 0 Then

MsgBox ("Você tem a média " + Str$(pontos / testes) + " em " + Str$(testes) + _

" testes realizados. Médias acima de .50 para mais de 100 testes são " +_

"consideradas indícios de força paranormal...")

Else

MsgBox ("Tente adivinhar qual carta o computador irá escolher. "+ _

"Pressione a carta que acredita será a escolhida")

End If

End Sub

5) Coloque uma caixa de figura (PictureBox) no form e, como nas lições anteriores, dê um "copiar" (copy) nessa caixa de figura (selecione-a e use Ctrl-C, por exemplo).

6) Cole no form a caixa de figura copiada (pode usar Ctrl-V, por exemplo): o Visual Basic pergunta se você quer criar um "array" de controles, responda que sim. Repita até ter 6 caixas de figura. A posição não importa, posicionaremos via código. As caixas de figura 1 a 5 conterão as imagens lidas no início do programa em Form_Load() e a caixa zero armazenará a imagem escolhida pelo computador. Todos os controles desse programa serão visíveis.

7) Dê um duplo clique no form para inserir as linhas de código de posicionamento e leitura das imagens. O código em Form_Load() deve ficar assim:


Randomize

testes = 0

pontos = 0

MyValue = 0

Form1.Width = 3 * Screen.Width / 4 ' ocupar 3/4 de tela

Form1.Height = 3 * Screen.Height / 4 ' ocupar 3/4 de tela

' Posicionar as 5 imagens:

For i = 1 To 5

Picture1(i).Left = (i - 1) * (Form1.ScaleWidth / 5)

Picture1(i).Top = 0

Picture1(i).AutoSize = True

Next i

'carregar imagens de disco:

Picture1(1).Picture = LoadPicture("fig1.bmp")

Picture1(2).Picture = LoadPicture("fig2.bmp")

Picture1(3).Picture = LoadPicture("fig3.bmp")

Picture1(4).Picture = LoadPicture("fig4.bmp")

Picture1(5).Picture = LoadPicture("fig5.bmp")

Picture1(0).Left = 2 * (Form1.ScaleWidth / 5)

Picture1(0).Top = Form1.ScaleHeight / 3

Picture1(0).AutoSize = True

Picture1(0).Width = Picture1(1).Width

Picture1(0).Height = Picture1(1).Height

Command1.Left = 0

Command1.Height = (Form1.ScaleHeight / 4)

Command1.Width = Form1.ScaleWidth

Command1.Top = Form1.ScaleHeight - Command1.Height

Command1.Caption = "Estatísticas"

Screen.Width e Screen.Height fornecem as dimensões configuradas para a tela de monitor do usuário, largura e altura, respectivamente. Isso significa que não fará diferença se o tamanho de tela usado pelo computador é 600x480, 800x600 ou outra, nosso programa ajustará o tamanho da própria janela para deixar os controles perfeitamente distribuídos. Usamos a medida de três quartos de tela para a janela de nosso programa. Os bitmaps lidos, entretanto, tem tamanho único. Em um programa mais profissional, talvez seja interessante ter diversos conjuntos de bitmaps para os diferentes padrões de dimensões de tela.

Observe que, ao invés de usar as propriedades Width e Height, que dão o tamanho externo de nosso form, preferimos usar ScaleWidth e ScaleHeight para posicionar os controles dentro de nossa janela, pois essas propriedades retornam as dimensões internas de Form1. Como temos 5 bitmaps a serem exibidos, supondo que os mesmos tenham dimensões parecidas ou idênticas, dividimos por cinco o tamanho interno do form e posicionamos as caixas de figura em intervalos regulares. Posicionamos a caixa de figura Picture1(0) aproximadamente no meio do formulário. Por fim posicionamos o botão Command1 na parte inferior da janela, fazendo a altura do botão ser um quarto do tamanho da janela e a largura de Command1 ocupar a largura toda de nosso form. Demos à propriedade Caption do botão o valor "Estatísticas".

Usamos também uma variável para guardar os pontos feitos pelo jogador e o número de testes efetuados. Como você viu no início desse código, aproveitamos para "setar" as variáveis "pontos", "testes" e "MyValue" e acrescentar a sentença Randomize.

8) Vá na seção de declarações e coloque a seguinte declaração para as variáveis usadas no programa:


Dim pontos, testes, MyValue As Integer

9) Acrescente um Timer ao form e dê para a propriedade Interval o valor 2000. Queremos que depois de 2 segundos (2000 milissegundos) a imagem desapareça. Vamos acrescentar agora o código do Timer. Dê um "duplo clique" no desenho do Timer que está no form. Acrescente o seguinte código em Timer1_Timer():


Picture1(0).Picture = LoadPicture("")

A linha acima faz com que a imagem apresentada desapareça sempre que o Timer for ativado. Só queremos que ela fique poucos segundos a vista, para que o jogador saiba se acertou ou não seu palpite.

10) Dê um duplo clique em uma caixa de figura. Picture1_Click() deve ficar assim:


Private Sub Picture1_Click(Index As Integer)

testes = testes + 1

MyValue = Int((5 * Rnd) + 1) ' Generate random value between 1 and 5.

Picture1(0).Picture = Picture1(MyValue).Picture

If Index = MyValue Then

pontos = pontos + 1

End If

End Sub

Com isso incrementamos a variável teste sempre que o jogador "clicar" numa figura e também sorteamos um valor para "MyValue". Além disso, se a figura "clicada" for a mesma que o computador escolher, o jogador ganhará um ponto.

11) Embeleze o programa acrescentando um ícone, nome diferente e uma tela de abertura parecida com essa:

A tela acima pode ser carregada em uma caixa de figura de uma janela à parte sempre que o programa começar, por exemplo, uma espécie de "tela de abertura". Normalmente os programas tem uma tela assim contendo o nome do programa, do autor, logotipo e outras informações a chamada "splash screen" ou "splash window". Você pode preferir chamar a tela acima a partir de um botão ou menu de ajuda. Descubra no help do Visual Basic como fazer isso!

12) Crie o executável. Se testar o programa dentro do Visual Basic, verá que ele não conseguirá carregar as telas usadas, pois elas estão no diretório onde está o programa compilado (executável). Pode colocar os bitmaps no diretório do Visual Basic (temporariamente, apenas para teste), mas é preferível testar o executável diretamante, sem usar o Start do menu Run do Visual Basic.

Eis o resultado:

Não esqueça que usando telas (bitmaps) externas, você precisará distribui-las em conjunto com seu programa ou você não conseguirá que o usuário rode seu jogo!

Memória para números

Este programa serve para melhorara a memória do usuário para seqüência de números (útil para quem pretende guardar telefones e não tem uma caneta), mas não passa de um jogo bem conhecido, apesar de normalmente serem usados, no lugar de números, botões com cores e som e um menor número de botões (geralmente quatro). Usaremos para esse programa apenas botões de comando, mas fica como exercício para o programador trocar por figuras interessantes os botões utilizados.

1) Crie um form com um array de controles formados por 10 botões posicionados lado a lado. Numere os botões de zero a nove (Command1(0) a Command1(9), respectivamente).

2) Acrescente um Timer ao form. A propriedade Interval será setada pelo programa em tempo de execução.

3) Acrescente mais dois botões de comando independentes dos primeiros dez, Command2 e Command3. A propriedade Caption deles deve ser setada, respectivamente, para "Começar" e "Desistir".

4) Coloque no form duas caixas de texto (text1.text e text2.text), ambas de tamanho largo e com a propriedade Alignment setada para "2-center" e a propriedade MultiLine setada para "True". Também a propriedade Locked deve ser setada para "True", pois as caixas de texto não devem ser editadas pelo usuário (para que o jogador não possa corrigir seus erros: mundo cruel, não é?). Tente copiar o seguinte lay-out:

5) Dê um "duplo clique" no form. Vamos desabilitar o Timer e limpar as caixas de texto quando o programa iniciar, deixando Form_Load() assim:

Private Sub Form_Load()

Randomize

Text1.Text = ""

text2.Text = ""

Timer1.Enabled = False

For i = 0 To 9

Command1(i).Enabled = False

Next i

End Sub

Observe que estamos desabilitando todos os botões com algarismos, pois não queremos que o jogador os pressione no início do jogo.

6) As declarações das variáveis usadas no programa (colocadas na seção de declarações do form) devem ser estas:

Dim contaletra, rodada As Integer

Dim resposta As String

A variável "resposta" conterá a seqüência de números gerada pelo computador, para que o programa possa verificar se o jogador acertou a seqüência, "contaletra" é usada em Timer, para saber qual algarismo deve ser exibido na caixa de texto do computador (text2) e "rodada" serve para calcularmos quantas rodadas o jogador conseguiu "agüentar".

7) O botão "Começar" (command2) irá inicializar diversas variáveis, deve ficar assim:

Private Sub Command2_Click()

Text1.Text = ""

text2.Text = ""

Timer1.Interval = 1500

Timer1.Enabled = True

MyValue = Int(10 * Rnd) ' Generate random value between 0 and 9.

Resposta = Str$(MyValue)

contaletra = 1

rodada = 0

For i = 0 To 9

Command1(i).Enabled = False

Next i

End Sub

Observe que também aqui estamos desabilitando os botões com algarismos, pois não queremos que o jogador os pressione enquanto o computador não tiver terminado de exibir sua seqüência de números.

8) O botão "Desistir" (command3) deverá mostrar a contagem do jogador e terminar o programa. Ele é importante pois se o jogadar der um palpite errado tentando acertar a seqüência de algarismos, o programa não aceitará correção da resposta do jogador e ele terá de desistir! O código desse botão será:

Private Sub Command3_Click()

MsgBox "você fez " + Str$(rodada) + " pontos"

End

End Sub

9) Dê um "duplo clique" no Timer. Timer1_Timer() ficará assim:

Private Sub Timer1_Timer()

If contaletra = 0 Then

text2.Text = ""

Text1.Text = ""

End If

If contaletra > rodada + 1 Then

text2.Text = ""

contaletra = 0

Text1.Text = ""

For i = 0 To 9

Command1(i).Enabled = True

Next i

Timer1.Enabled = False

Else

contaletra = contaletra + 1

text2.Text = text2.Text + Mid$(resposta, contaletra, 1)

End If

End Sub

O código acima é um pouco complexo, mas na verdade estamos limpando as caixas de texto se a seqüência estiver iniciando (sabemos disso porque "contaletra" será zerada sempre que a seqüência tiver terminado de ser exibida). Depois disso, caso o último algarismo já tenha sido exibido pelo Timer, limpamos as caixas de texto, zeramos "contaletra", habilitamos os botões com algarismos e desabilitamos o Timer. Caso ainda não seja o último algarismo, exibimos mais um na caixa de texto text2.text.

10) Por fim, os botões de algarismos (command1). Neles fazemos duas coisas, primeiro mostramos na caixa de texto o algarismo do botão clicado e depois testamos a resposta entrada pelo jogador, para ver se o número entrado já é igual ao número armazenado em "resposta". Caso o jogador tenha acertado, um novo algarismo gerado randomicamente é acrescentado à seqüência armazenada por "resposta", o timer é habilitado, mas com valor um pouco menor (para acelerar o jogo) e desabilitamos as teclas com algarismos:


Private Sub Command1_Click(Index As Integer)

Text1.Text = Text1.Text + Trim$(Str$(Index))

If Trim$(resposta) = Trim$(Text1.Text) Then

MyValue = Int(10 * Rnd) ' Generate random value between 0 and 9.

Resposta = resposta + Trim$(Str$(MyValue))

rodada = rodada + 1

Timer1.Interval = 300 + (1000 / rodada)

Timer1.Enabled = True

For i = 0 To 9

Command1(i).Enabled = False

Next i

End If

End Sub

Como pode ser visto, esse jogo não tem fim, o jogador terá de desistir em algum momento para saber quantos pontos fez. Assim é a vida! Não esqueça de mudar o título do jogo e inventar um ícone para usar com ele. A cor do fundo da janela também pode ser diferente. Eis o resultado do programa:

Conclusão

Fizemos alguns pequenos progressos em termos de programação, mas deu para perceber que é possível complicar na confecção de programinhas simples, mesmo que usando apenas o conhecimento disponível. As vezes programas menos vistosos contém mais complexidade do que programas com maiores recursos gráficos.

O recurso de usar telas (bitmaps) externos é muito útil, as vezes queremos criar programas personalizáveis pelo usuário. Se os recursos são extrenos, o programa não precisa ser recompilado. No caso do jogo PEs, por exemplo, desde que as figuras usadas não ultrapassem um certo tamanho, é possível criar um conjunto alternativo de bitmaps ou mesmo editá-las depois do programa pronto e distribuído.

Fica como exercício (mental ou para implementação) a transformação do segundo programa em um jogo com menos botões e mais cores, usando bitmaps ao invés de comandos de botões.

 

Notas Importantes - LEIA!

© Victor M. Sant'Anna - victor@samerica.com - setembro de 2000

A utilização deste material implica na aceitação das condições exibidas neste quadro.

Autoria:

Este texto é de autoria de Victor M. Sant'Anna. O texto não deve ser alterado. Usamos a versão 4.0 do Visual Basic, mas os conceitos e comandos devem servir para todas as versões disponíveis. Caso encontre erros ou detalhes que gostaria de ver corrigidos, entre em contato no endereço acima. Seu nome figurará na lista de colaboradores nas próximas atualizações.

Objetivo e limitações:

Este texto deve ser utilizado somente para o aprendizado de noções básicas de programação de jogos. Não é um tutorial completo e nem pretende ensinar noções básicas de computação ou programação em geral. É aconselhável que o estudante tenha noções de programação antes de tentar utilizar este texto para aprendizado. Não nos responsabilizamos pelos erros advindos do mau uso das noções explanadas ou de problemas provocados por informações incompletas ou equivocadas.

Utilização do código-fonte:

O código exibido neste texto é de autoria de Victor M. Sant'Anna. Pode ser alterado e utilizado para fins de aprendizado ou comercialmente. Entretanto, caso venha a utilizar o código do autor, apesar de não ser obrigatório, gostaríamos de uma breve citação de fonte de origem (nosso nome ou endereço) na documentação ou nos programas confeccionados: isso poderia beneficiar novos estudantes de programação de jogos!

Utilização das imagens e sons:

É vedada a utilização das imagens ou sons contidos ou vinculados a esse texto ou ao material (software) que o acompanha. Ou seja: as imagens (desenhadas ou digitalizadas) e sons (criados ou digitalizados) não podem ser utilizados na confecção de novos programas ou material. Essa restrição é devida a diversidade de autoria do material aqui utilizado, parte das imagens ou sons tem seus direitos de cópia reservados e/ou pertencem a outros autores (sons e parte do material gráfico foi cedido por seus autores exclusivamente para a confecção deste texto e dos programas criados). Lista de autores responsáveis pela cessão de material sonoro e/ou gráfico vinculados à confecção deste texto: Vinícius Stein, Cesar Galvarros Juventino, Rogério de Almeida e Silva, Jorge Luiz Foques, Paulo Cesar Kielling Franco e Tatiane Ragazzon Sant'Anna.

Publicação e utilização deste material:

Este texto foi desenvolvido para uso individual (auto-aprendizado): não é recomendada sua utilização em aulas ministradas em cursos e/ou por terceiros. Apesar de não recomendável, a cópia e utilização deste texto, para fins de ilustração de conceitos em aulas ministradas em cursos e/ou por terceiros, pode ser realizada, sem permissão do autor, somente se cumpridas integralmente as condições de uso e restrições abaixo relacionadas:

1) Condições de Uso

1.1) este texto ("página www") deve ser mantido integralmente;

1.2) a utilização desse material deve utilizar o computador como mídia:

1.2.1) on-line (Internet usando navegador para exibição em tempo real) ou

1.2.1) off-line: a página pode ser gravada em meio eletrônico, ou seja, disquetes, DVD, CD-ROM, disco rígido ou outro meio "eletrônico" qualquer;

1.3) não pode ser cobrado do aluno, pela utilização deste material, nenhum tipo de taxa direta ou indiretamente. Isso significa que o uso deste material não deve fazer parte do número de horas-aula remuneradas do curso ou aulas ministradas por terceiros. Ou, em outras palavras o uso deste material só é permitido em caso de "aula extra gratuita".

2) Restrições

2.1) Este texto não pode ser impresso para utilização como material didático por instituições ou em aulas particulares, aulas de qualquer tipo ou projetos de qualquer natureza.

2.2.1) Observação: para uso individual (auto-aprendizado) são permitidas cópias impressas em qualquer quantidade.

Colabore com a boa utilização deste material

Use os conhecimentos adquiridos responsavelmente

© Victor M. Sant'Anna - setembro de 2000