none
Carregar imagens aleatórias sem repetição ao pressionar botão RRS feed

  • Pergunta

  • Boa tarde,

    Preciso de uma ajuda em um código,onde irei criar um formulário com 2 picturebox, ao pressionar o botão essas picture box irão carregar duas imagens e se for novamente pressionado irá carregar mais outras duas assim por diante. Uma observação importante é que essas imagens não podem se repetir. Um exemplo bom para ilustrar seria uma especie de baralho como se cada vez que for pressionado o botão uma carta seria revelada até que não tenha mais nenhuma a ser carregada. Desde já agradeço! Saúde e paz a todos.

    segunda-feira, 25 de janeiro de 2016 19:26

Respostas

  • Frankson, é simples o problema.

    Como você não tem código nenhum vamos só na teoria.

    As imagens estão em uma pasta e são arquivos que serão carregados no PictureBox. Como carregar um arquivo no PictureBox eu não vou descrever aqui porque é simplesmente associar o arquivo a propriedade "Image" (ou "Picture" - não lembro).

    O que você vai fazer é criar um array de string (ou um "Dictionary", classe do namespace "System.Collections.Generic") e colocar lá toda imagem que você carregar (o caminho ou nome da imagem). Assim sendo, quando você carregar uma imagem deve remover da lista de imagens da pasta e lançar na lista de imagens que já foram carregadas.

    Quando você "Randomizar", irá fazê-lo apenas nas imagens da lista ainda não carregada.

    Então - liste as imagens da pasta no Array1, randomize uma posição qualquer no array para carregar, remova essa entrada do Array1. Mais simples ainda...

    • Marcado como Resposta Marcos SJ terça-feira, 26 de janeiro de 2016 10:54
    terça-feira, 26 de janeiro de 2016 10:44
  • Boa tarde, Fulvio C ficou muito bom o seu exemplo. Parabéns e muito obrigado pela sua ajuda!! Vai ser muito útil...
    terça-feira, 26 de janeiro de 2016 16:23

Todas as Respostas

  • Boa tarde,

    Preciso de uma ajuda em um código,onde irei criar um formulário com 2 picturebox, ao pressionar o botão essas picture box irão carregar duas imagens e se for novamente pressionado irá carregar mais outras duas assim por diante. Uma observação importante é que essas imagens não podem se repetir. Um exemplo bom para ilustrar seria uma especie de baralho como se cada vez que for pressionado o botão uma carta seria revelada até que não tenha mais nenhuma a ser carregada. Desde já agradeço! Saúde e paz a todos.

    Tem algum código já iniciado?

    Qual é a sua verdadeira duvida?

    Quantas imagens terão nesse codigo?

    Da onde as imagens serão buscadas ou trazidas?

    Um hora algum ou as duas poderam se repetir?

    Terá então finalizador por não poderem se repetir?

    Espero que auxilie nesse aspecto!!!

    Saúde e paz a você também amigo!

    Paz do Senhor!


    Fulvio C

    segunda-feira, 25 de janeiro de 2016 19:40
  • Frankson, é simples o problema.

    Como você não tem código nenhum vamos só na teoria.

    As imagens estão em uma pasta e são arquivos que serão carregados no PictureBox. Como carregar um arquivo no PictureBox eu não vou descrever aqui porque é simplesmente associar o arquivo a propriedade "Image" (ou "Picture" - não lembro).

    O que você vai fazer é criar um array de string (ou um "Dictionary", classe do namespace "System.Collections.Generic") e colocar lá toda imagem que você carregar (o caminho ou nome da imagem). Assim sendo, quando você carregar uma imagem deve remover da lista de imagens da pasta e lançar na lista de imagens que já foram carregadas.

    Quando você "Randomizar", irá fazê-lo apenas nas imagens da lista ainda não carregada.

    Então - liste as imagens da pasta no Array1, randomize uma posição qualquer no array para carregar, remova essa entrada do Array1. Mais simples ainda...

    • Marcado como Resposta Marcos SJ terça-feira, 26 de janeiro de 2016 10:54
    terça-feira, 26 de janeiro de 2016 10:44
  • Muito bom! Já deu pra ter um embasamento. A única coisa que vou dar uma pesquisada vai ser na relação do Dicionary com a picturebox. Muito Obrigado! 
    terça-feira, 26 de janeiro de 2016 11:13
  • Tem algum código já iniciado?

    Não apenas havia criado um pequeno form com a labels e botões.

    Qual é a sua verdadeira duvida?

    Seria a relação entre randomizar,carregar automaticamente as imagens no picture box, randomizando as e não poderia ter repetição. Minha dúvida seria mais ou menos qual estrutura do C# a ser implementada e como relaciona-las, por exemplo se eu fosse usar um array ou um Dicionary como iria relacionalos ao picturebox.

    Quantas imagens terão nesse codigo?

    Até então não esta definido, mas terão em media de 50 imagens.

    Da onde as imagens serão buscadas ou trazidas?

    A principio pensei em trazer da pasta do próprio sistema.

    Um hora algum ou as duas poderam se repetir?

    Nunca devem se repetir. A não ser que o sistema seja reiniciado.

    Terá então finalizador por não poderem se repetir?

    A função de trazer a próxima imagem sim.

    Obrigado pela ajuda!

    terça-feira, 26 de janeiro de 2016 11:23
  • Olá FranksonFernandes,

    Tudo bem?

    Bem vindo ao fórum e obrigado por sua participação.

    É necessário que você crie o seu código e a comunidade irá ajudá-lo quando houver algum erro/problema com o código. O fórum não presta suporte a "How to". O fórum não é focado em compartilhamento de código como alguns outros fóruns de desenvolvimento. A intenção é prestar algum suporte conforme informado acima e não necessáriamente o auxílio na criação de código.

    Atenciosamente


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.


    • Editado Marcos SJ terça-feira, 26 de janeiro de 2016 12:40
    terça-feira, 26 de janeiro de 2016 12:37
  • Ok Frankson, sugeri o Dictionary porque ele já tem métodos para não deixar você colocar 2 vezes a mesma chave etc.

    Boa sorte.

    terça-feira, 26 de janeiro de 2016 12:53
  • Protótipo:

    Código:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Linq;
    namespace WAppImagem
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private IList<string> _imagens;
            private IList<string> _exibidas;
            private Random _random;
            private void BtnCarregar_Click(object sender, EventArgs e)
            {
                ViewImagens();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {            
                _imagens = System.IO.Directory.EnumerateFiles(@"c:\Temp\1", "*.*", System.IO.SearchOption.AllDirectories)
                    .Where(s => s.ToLower().EndsWith(".png") || 
                    s.ToLower().EndsWith(".jpg") || 
                    s.ToLower().EndsWith(".jpeg") || 
                    s.ToLower().EndsWith(".gif")).ToList();
    
                _exibidas = new List<string>();
                _random = new Random();
                BtnReinicia.Enabled = false;
                BtnCarregar.Enabled = true;
                ViewImagens();
            }
    
            private void ViewImagens()
            {
                PictureBox1.Image = null;
                PictureBox2.Image = null;
    
                int numero = -1;
                if (_imagens.Count > 0)
                {
                    for (int i = 0; i < 2; i++)
                    {
                        do
                        {
                            numero = _random.Next(0, _imagens.Count);
                        }
                        while (_exibidas.Any(x => x.Equals(_imagens[numero])));
    
                        string nameImagem = _imagens[numero];
    
                        if (i == 0)
                        {
                            PictureBox1.Load(nameImagem);
                        }
                        else if (i == 1)
                        {
                            PictureBox2.Load(nameImagem);
                        }
                                            
                        _exibidas.Add(nameImagem);                    
                        _imagens.Remove(nameImagem);
    
                        if (_imagens.Count == 0)
                        {
                            BtnReinicia.Enabled = true;
                            BtnCarregar.Enabled = false;
                            MessageBox.Show("Não possui mais itens para randonizar");
                            break;
                        }
                    }
                }
            }
    
            private void BtnReinicia_Click(object sender, EventArgs e)
            {
                _imagens.Clear();
                _exibidas.ToList().ForEach(x =>
                {
                    _imagens.Add(x);
                });
                _exibidas.Clear();
                BtnReinicia.Enabled = false;
                BtnCarregar.Enabled = true;
                ViewImagens();
            }
        }
    }

    A imagens (o seu o Form) e esse código fazem o que você precisa. Como funciona:

    Ele lê um diretório, pega todas as imagens de extensão (gif, jpg, jpeg e png) monta um array e já mostra de cara duas imagens.

    Após ir clicando no botão ele troca as informações de um array para o outro até o acabar as imagens a serem randonizadas. Quando acabar mostra um mensagem e depois habilita o botão Reinicializar para que comece tudo de novo.

    O código aproximado de sua dúvida está ai, você deve estudar e tentar entender! 

    Espero que ajude!


    Fulvio C

    terça-feira, 26 de janeiro de 2016 14:23
  • Boa tarde, Fulvio C ficou muito bom o seu exemplo. Parabéns e muito obrigado pela sua ajuda!! Vai ser muito útil...
    terça-feira, 26 de janeiro de 2016 16:23