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

turkis

Minesweeper - desisto...podem pegar e melhorar

50 mensagens neste tópico

boas...

estou a fazer um clone do minesweeper, apenas por curiosidade.

já fiz o algoritmo para definir a posição das minas com uma matriz, e tb para saber quantas minhas existem à volta de cada casa vazia. esta parte já está

optei depois por usar picturebox's para representar as minas e as casas vazias num procedimento do tipo "for each", em que defino a posição de cada picturebox numa grelha igual à matriz e às quais mudo a imagem em função do valor dessa posição na matriz.

agora encalhei aqui:

nos eventos do rato,só consigo ter eventos relacionados com algum objecto. ora as picturebox's ficam todas por cima, e penso que não há necessidade de fazer um evento mouse_click para cada.

deve haver uma maneira de sacar esse evento sem estar relacionado a um objecto.tb preciso do evento mouse_move para saber onde anda o ponteirodo rato :S

agora estou no trab e não tenho aqui o código, mas se for necessário posto-o aqui. claro que depois disto acabado coloco tudo à disposição =)

Edit:

aqui estão os links para o minas(já quase feito)

aqui está:

completo (vb2005)

http://rapidshare.com/files/112032458/minas_novo.rar.html 

apenas o exe

http://rapidshare.com/files/112033135/Minas.rar.html 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi muito bem o que queres mas vê la se é isto:

 

Private Sub MouseClickEvent(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim pb As PictureBox = CType(sender, PictureBox)
        MessageBox.Show(pb.Name.ToString)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler PictureBox1.MouseClick, AddressOf MouseClickEvent
        AddHandler PictureBox2.MouseClick, AddressOf MouseClickEvent
        AddHandler PictureBox3.MouseClick, AddressOf MouseClickEvent
        AddHandler PictureBox4.MouseClick, AddressOf MouseClickEvent
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas....

não percebi nada do código, e o meu prof de BP diz que é um bocado à frente do que estamos a dar :S

o problema é este:

quero ter acesso aos eventos ro rato sem ser aplicado a um objecto(picturebox, form, textbox, etc...)

aqui está o código:

Public Class Form1
    Public Event Mouse_click As EventHandler
    Dim Matriz(16, 16) As Integer
    Dim Padpos_x, Padpos_y As Integer
    Dim Matrizpos_x, Matrizpos_y As Integer
    Dim Colunas As Integer = 15, Linhas As Integer = 15
    Dim Minas As Integer = 9

    Private Sub Desenhar_new(ByVal Linhas As Integer, ByVal Colunas As Integer)

        Dim i, j As Byte         'Var aux para numeração das casas
        Dim ctrl As Control         'Var de controlo de objectos

        i = 0 : j = 0

        For Each ctrl In Panel1.Controls
            'Ver se é do tipo "Label"
            If TypeOf (ctrl) Is PictureBox Then
                ctrl.BackgroundImage = My.Resources.amarelo
            End If
            ctrl.Location = New System.Drawing.Point(i * 20, j * 20)
            i += 1
            If i = Linhas Then
                i = 0
                j += 1
            End If
        Next
    End Sub

    Private Sub Desenhar(ByVal Linha As Integer, ByVal Coluna As Integer)

        Dim i, j As Byte         'Var aux para numeração das casas
        Dim ctrl As Control         'Var de controlo de objectos 


        i = 0 : j = 0

        For Each ctrl In Panel1.Controls
            'Ver se é do tipo "Label"
            If TypeOf (ctrl) Is PictureBox Then
                If Matriz(i + 1, j + 1) = -1 Then
                    ctrl.BackgroundImage = My.Resources.vermelho
                ElseIf Matriz(i + 1, j + 1) = 0 Then
                    ctrl.BackgroundImage = My.Resources.verde
                Else
                    Select Case Matriz(i + 1, j + 1)
                        Case 1
                            ctrl.BackgroundImage = My.Resources._1
                        Case 2
                            ctrl.BackgroundImage = My.Resources._2
                        Case 3
                            ctrl.BackgroundImage = My.Resources._3
                        Case 4
                            ctrl.BackgroundImage = My.Resources._4
                        Case 5
                            ctrl.BackgroundImage = My.Resources._5
                        Case 6
                            ctrl.BackgroundImage = My.Resources._6
                        Case 7
                            ctrl.BackgroundImage = My.Resources._7
                        Case 8
                            ctrl.BackgroundImage = My.Resources._8
                    End Select
                End If
                ctrl.Location = New System.Drawing.Point(i * 20, j * 20)
                i += 1
                If i = Linhas Then
                    i = 0
                    j += 1
                End If
            End If
        Next
    End Sub

    Private Sub Gerar(ByVal Linhas As Byte, ByVal Colunas As Byte, ByVal Minas As Byte)



        Dim i, j, k As Integer
        Dim Linha, Coluna As Integer


        'Zerar vectores
        For i = 0 To 16
            For j = 0 To 16
                Matriz(i, j) = 0
            Next
        Next


        'Gerar números
        k = 1
        Do While Not k > Minas
            Randomize()
            Linha = Int((Rnd() * Linhas) + 1)
            Coluna = Int((Rnd() * Colunas) + 1)
            If Matriz(Linha, Coluna) = 0 Then
                Matriz(Linha, Coluna) = -1
                k += 1
            End If
        Loop

        For i = 1 To Linhas
            For j = 1 To Colunas
                If Matriz(i, j) = 0 Then
                    k = 0
                    For m As Integer = -1 To 1
                        For n As Integer = -1 To 1
                            If Matriz(i + m, j + n) = -1 Then
                                k += 1
                            End If
                        Next
                    Next
                    Matriz(i, j) = k
                End If
            Next
        Next

        Desenhar_new(Linhas, Colunas)

    End Sub


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

        Gerar(Linhas, Colunas, Minas)

    End Sub

    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick

        Desenhar(Colunas, Linhas)

    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove

        Padpos_x = e.X
        Padpos_y = e.Y

    End Sub




End Class

não liguem à arrumação, isto ainda está em estudo :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Podes fazer o upload da aplicação para dar uma vista de olhos ? É mais fácil de perceber.

PS: Só tenho o VS 2005

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

http://rapidshare.com/files/104025427/Minas_e_armadilhas.rar.html

aqui está...

podem dar sujestões à vontade, o principal já está feito, que era fazer o mapa de minas e contar as minas à volta de cada casa vazia...para isso fiz assim:

       

 For i = 1 To Linhas
            For j = 1 To Colunas
                If Matriz(i, j) = 0 Then
                    k = 0
                    For m As Integer = -1 To 1
                        For n As Integer = -1 To 1
                            If Matriz(i + m, j + n) = -1 Then
                                k += 1
                            End If
                        Next
                    Next
                    Matriz(i, j) = k
                End If
            Next
        Next

ou seja:

"enganei" o programa, atribuindo duas colunas e duas linhas a mais, de forma a que a procura não passe dos limites da matriz...assim posso percorrer os dois "For" de incremento (-1 a 1), e começo a procura na posição 1...

só me falta achar uma maneira de "sacar" os eventos do rato sem ser aplicado a um objecto...

já pensei em fazer um procedimento para isso, e em cada Picturebox(com o evento Mouse_Click) chamo esse procedimento...mas tenho que fazer o mesmo código 225 vezes :S, e quero evitar isso...

se reparares, eu chamo o procedimento "desenhar" no Sum "form1_click", mas só dá se não estiver nada por cima desta...por isso é que mantive a Form maior...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá novamente,

Na verdade tu para detectares quando se clica em algo tens de associar algum evento. De uma forma ou outra tens de o fazer. Uma da soluções é atribuir o Handler com a instrução AddHandler ou directamente no sub. Ex:

AddHandler PictureBox1.MouseClick, AddressOf MouseClickEvent
AddHandler PictureBox2.MouseClick, AddressOf MouseClickEvent
' atribuir eventos até à ultima picturebox e recolher de acordo com o exemplo já mostrado

Ou

 

 Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick, PictureBox2.MouseClick, ... até ao ultimo
         ' Código quando se clica na picturebox
    End Sub

Mas como são muitas o melhor é criar um ciclo nos controlos. Se aquilo que mostrei era um pouco à frente, isto é um bocadinho mais :P. Nada de especial vais ver.

   

' Recolhe a informação do qual a picturebox que foi clicada e mostra uma mensagem
    Private Sub MouseClickEvent(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim pb As PictureBox = CType(sender, PictureBox)
        MessageBox.Show(pb.Name.ToString)
    End Sub

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

        '  Teu código para gerar linas, coluna e minas
        Gerar(Linhas, Colunas, Minas)

        ' Ciclo que percorre todos os controlos dentro do painel1
        For Each ctrl As Control In Me.Panel1.Controls
           ' Se o controlo for do tipo picturebox
            If TypeOf ctrl Is PictureBox Then
                ' Converte e atribui o handler (evento)
                Dim pb As PictureBox = CType(ctrl, PictureBox)
                AddHandler pb.MouseClick, AddressOf MouseClickEvent
            End If
        Next

    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hum...já percebi a cena...em vez de apresentar a msgbox posso aplicar o meu código....okidoki...vou acabar o prog...merci a lot :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

só uma coisa...como eu trabalho e estudo ao mesmo tempo, só no fds é que vou pegar nisto :S e nas aulas de BP, claro :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No problem! Se tiveres mais algum problema diz ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

http://rapidshare.com/files/105514544/Minas.rar.html

ora boas...

isto deu para partir a tola... :wallbash: mas já está feito, pelo menos o principal...ainda falta o resto, que tenho que ver como há-de ser (isso é trabalho meu, não me ajudem pf.)

preciso de ajuda para o seguinte:

-em vez de criar as imagebox's de início, não as posso fazer com programação? tipo fazer um ciclo "for"? evitava assim ter-las a mais...

-como sacar o evento do botão direito do rato?

obrigado pela vossa atenção.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

-como sacar o evento do botão direito do rato?

Detectar o botão onde ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

da mesma forma do outro, só que uso o botão direito...é para marcar as minas. qual é o evento??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já agora, e para me explicar melhor...de que forma se saca os eventos do botão direito?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

-como sacar o evento do botão direito do rato?

Na função que mostrei fazes o seguinte:

Private Sub MouseClickEvent(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    Dim pb As PictureBox = CType(sender, PictureBox)        
    If e.Button = Windows.Forms.MouseButtons.Right Then
        MessageBox.Show(pb.Name.ToString)   
    End If
End Sub

-em vez de criar as imagebox's de início, não as posso fazer com programação? tipo fazer um ciclo "for"? evitava assim ter-las a mais...

Mais ou menos isto:

     

 Dim pb As PictureBox
        For x As Byte = 0 To 50
            pb = New PictureBox
            pb.Image = New Bitmap("c:\123.bmp")
            pb.BackColor = Color.AliceBlue
            Controls.Add(pb)
        Next

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas....

isto já está quase...mas a cena das imagebox's automáticas não está a dar :S

os parametros que me deste não chegam, e pelo menos isso tenho que pedir ajuda para todos os parametros :$

de resto já está, incluindo o procedimento de abrir todas as casas vizinhas a uma vazia :)...não foi fácil, tive que fazer um procedimento recursivo, e impor-lhe os limites da matriz e de casas que já estejam descobertas, e já dá :)...há! falta as bandeirolas, timer e a conclusão se tudo estiver descoberto, mas isso é a parte mais fácil :::green:::

outra coisa:

como já devem ter reparado, a parte gráfica está uma vergonha :$, confesso que não tenho lá muito jeito para isso...se alguém quizer arranjar umas imagens fixes agradeço imenso!

o meu prof de BP diz que ainda não tinha visto um minesweeper feito em .net, está a adorar a minha solução e quere-a para um pc com ecrã de toque para o átrio da Escola Secundária José Estêvão (Aveiro). por isso se quizerem fazer as imagens, façam-nas com um bom tamanho (100x100), que eu depois redimenciono-as para o que precisar.

obrigado

PS

esqueci-me do programa no portátil, não tenho net em casa e estou no trabalho...mas é claro que quando puder disponiblizo toda a solução :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

os parametros que me deste não chegam, e pelo menos isso tenho que pedir ajuda para todos os parametros :$

Explica lá melhor o que queres e se ainda precisas de ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

são os os parametros para fazer imagebox's por código. os que me deste não chegam, e o programa assim fica muito pesado, além de limitado :S

a outra cena era para ver se alguém com jeito para fazer imagens me oferecia umas imagenzitas, dado que para isso não tenho jeito nenhum :$

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uma coisa importante e que me esqueci de referir...

isto começou por ser apenas uma curiosidade, mas agora é para um trabalho escolar, e o meu prof de BP está a par das ajudas que aqui tenho pedido e conhece este tópico. como ele disse, há coisas que não posso adivinhar como se fazem e ele não se importa que eu peça ajuda para questões relacionadas com a linguagem (vb.net) e que fugam da máteria,  e também com o design...só não posso pedir ajuda para a lógica (claro :P)..mas nesse ponto desenrrasco-me :P

PS

o meu prof de BP achou o fórum bastante interessante!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

são os os parametros para fazer imagebox's por código. os que me deste não chegam, e o programa assim fica muito pesado, além de limitado :S

Explica lá melhor o que queres e o que torna pesado?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

quero o código para gerar imagebox's.

o utilizador quando forneçe as medidas do quadro e o nº de minas, o programa tem que gerar as imagebox's necessárias, por exemplo para um quadro 10x10 preciso de 100 imagebox's

exemplo:

for i as integer=1 to linhas*colunas

(criar imagebox)

next

o que tu me deste foi isto:

       

 Dim pb As PictureBox
        For x As Byte = 0 To 50
            pb = New PictureBox
            pb.Image = New Bitmap("c:\123.bmp")
            pb.BackColor = Color.AliceBlue
            Controls.Add(pb)
        Next

mas não é o suficiente :S que eu saiba falta definir a posição, o nome, e outras coisas que nem faço ideia de como se fazem :S já experimentei e claro que não resulta só com isto e nem preciso de atribuir imagem neste passo.preciso de atribuir nome (acho eu), localização (dentro do contentor), tamanho, etc.

para contornar este problema, criei de início umas 700(copy/paste). por isso é que o programa fica pesado na edição, e claro que depois na execução fica limitado ao nº de imagebox's previamente criadas (700)

só me falta isto para acabar o programa :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas é claro que o código que te dei serve só para criar dinamicamente picturebox's! A parte da lógica e posição és tu que tens de criar.

Quantas linha, quantas colunas, quantas tens de criar, qual o tamanho, etc. Isso tens de ser tu a definir. Tens de ver como queres fazer e fazer umas contar! Depois é só dizeres onde fica (left e top) e o tamanho (width e height).

Se eu te mostrar como se faz isto estava a fazer o programa por ti! (e acho que não é essa a ideia)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a posição pode ser definida logo de início! e pode ser toda igual...

se reparares no procedimento "desenhar", atribuo as posições aí. as imagebox´s que criei estão todas no mesmo sítio. repara no programa que fiz para o euromilhões(armazem de código). sempre que percorro os objectos dentro de um contentor atribuo uma posição para cada um! essa parte já está. repara no código que vos disponibilizei para o euromilhões e tb para o minas(está nesta thread)

só preciso nesmo de as criar, que me digas quais os parametros que preciso, o resto faço eu :P

podes meter um exemplo tipo : "image.location=(localização)" que eu já percebo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outro exemplo:

       

Dim pb As PictureBox
        Dim pbleft As Integer = 0

        For x As Byte = 1 To 10
            pb = New PictureBox
            pb.Height = 50
            pb.Width = 50
            pb.Left = pbleft
            pbleft += 50
            Controls.Add(pb)
        Next

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