Ir para o conteúdo
turkis

Minesweeper - desisto...podem pegar e melhorar

Mensagens Recomendadas

turkis    0
turkis

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 

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

-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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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 :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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 :$

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
turkis    0
turkis

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade