GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» Colisões não funcionando
por RastaMaan Sex 26 Abr 2024, 19:49

» Como ajustar velocidade de cada frame da animação no game maker
por pequetux Sex 26 Abr 2024, 16:45

» Preciso de ajuda
por AftonDuGrau Dom 21 Abr 2024, 20:18

» Como faz o evento drawn GUI, não se repetir?
por aminaro Sex 19 Abr 2024, 20:30

» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07

» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45

» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51

» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31

» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11

» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21

» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21


lists 2D?

4 participantes

Ir para baixo

lists 2D? Empty lists 2D?

Mensagem por saim Sáb 26 Set 2020, 17:04

O que eu quero fazer:
Meu jogo é de tabuleiro e cada casa começa com uma pedrinha, que tem um dos quatro valores "A"taque, "D"efesa, "M"ovimento ou "V"ida. Cada jogador (o jogo terá 2 a 4) tem algumas ações por turno e pode usar uma dessas ações pra pegar uma pedra.
Eu preciso saber quais pedras cada jogador já pegou.

Claro que posso usar um vetor (array) 2D (mão[numero_do_jogador, numero_da_pedra] = valor_da_pedra), mas seria bacana que fosse fácil organizar as pedrinhas na mão de cada jogador. Eu acho lists mais fácil de lidar porque podem ter qualquer tamanho e ao retirar ou acrescentar um valor, elas se organizam automaticamente.

MAS listas só têm uma dimensão. E a única aula que eu tive sobre dictionaries deixou meio no ar a utilidade deles. Me parecem listas 2D, mas... de certa forma, parecem listas 1D, também, só diferentes. Se houver alguma literatura fácil de entender, sobre o assunto, me mandem, por favor.

Mas voltando ao assunto, cada jogador pega a pedrinha e guarda na mão (vou querer exibir essas mãos, então tem que ser possível acessar esses valores). Além disso, ele pode colocar a pedrinha de volta no tabuleiro, depois.
Há 100 pedrinhas no total, o que já serve como limite de tamanho pra array, mas cada jogador vai segurar, normalmente, umas 10.

Eu posso criar rotinas pra organizar a array (deixar todos os elementos não-nulos no começo, talvez organizar por ordem alfabética), mas se puder usar lists 2D, facilita. Ou fazer um frankenstein: crio uma array para os jogadores em cada elemento da array, coloco a list com a mão desse jogador. Isso é possível?

O que você sugerem? Como fariam?
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : lists 2D? Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por Willy Sáb 26 Set 2020, 18:18

Que tal... uma lista de listas? What a Face

E a única aula que eu tive sobre dictionaries deixou meio no ar a utilidade deles. Me parecem listas 2D, mas... de certa forma, parecem listas 1D, também, só diferentes.
Dicionários servem pra "traduzir", por isso o nome. É como se fosse um array com uma chave (key) customizada ao invés de usar index. E sim, seria 1D e não atenderia sua necessidade.
Willy
Willy

Games Ranking : Nota A

Notas recebidas : C + B + A + A
Data de inscrição : 08/06/2009
Reputação : 264
Número de Mensagens : 1890
Prêmios : lists 2D? Empty

Medalhas x 0 Tutoriais x 2 Moedas x 0

Ouro x 2 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://willy-gmbr.blogspot.com/

saim e Diemorth gostam desta mensagem

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por Ralphed Sáb 26 Set 2020, 21:57

Bom, eu usaria ds_maps, que tenho mais familiaridade. Se nunca mexeu com ds_maps, imagine eles como arquivos ini. (desculpe se também não conhece kkkk).

Bom, na ds_list eu faria uma key com a ID de cada player, e a value delas com a quantia de pedras.
Eu sei que muita gente gosta de trabalhar com arrays, e sim, são bem práticos. Mas gosto dos "ds" pela possibilidade de gerencia-los melhor.
Ralphed
Ralphed

Data de inscrição : 18/08/2010
Reputação : 12
Número de Mensagens : 461
Prêmios : lists 2D? Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker 8.0 ou 8.1
  • Game Maker Studio 1.4
  • Game Maker Studio 2.0
  • Godot
  • Outros


saim gosta desta mensagem

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por theguitarmester Dom 27 Set 2020, 01:11

Dictionary funciona 'igual' Map para Java, que é sim uma lista '1d', porém em que tu nomeia ela de alguma forma, ao inver de ser apenas indices.

Tu pode imaginar um Dictionary como.... dicionário Very Happy, let me explain:
tu quer criar a explicação de alguma palavra, então tu coloca "casa", e daí quando procurar por casa, vai achar a explicação..
- novo dicionário
- adiciona palavra "casa" com o a descrição "edifício de formatos e tamanhos variados, ger. de um ou dois andares, quase sempre destinado à habitação."

E daí quando tu quiser procurar nesse dicionário, tu pode colocar Debug.Log(dicionario["casa"]); e com isso tu vai ver no console, a descrição/valor da 'casa', caso tu procurar uma palavra que não tiver no dicionário, vai dar erro.
Esse é o princípio do map/dictionary, mas só pensando que essa descrição pode ser qualquer tipo de objeto, no caso eu dei o exemplo com uma string, mas poderia ser até outro dictionary.

Eu ainda no que to fazendo não precisei de uma array/lista 2D, então não procurei se tem algo já pronto assim, mas tu sempre pode criar uma lista dentro de outra, como aqui:
https://answers.unity.com/questions/531953/creating-a-multidimensional-array-list.html
" List testList = new List(); "
ou
Código:
List<List<string>> tabulerin = new ArrayList<List<string>>()
e daí instanciar cada linha com o new Arra... também.
theguitarmester
theguitarmester

Games Ranking : Nota C

Notas recebidas : B + C
Data de inscrição : 28/02/2012
Reputação : 139
Número de Mensagens : 2209
Prêmios : lists 2D? Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 2 Prata x 2 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Plataformas :
  • Unity


http://guitarmester.no.comunidades.net/index.php?pagina=19362978

saim gosta desta mensagem

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por saim Seg 28 Set 2020, 10:29

Willy escreveu:Que tal... uma lista de listas? What a Face
É uma! Me parece um pouco menos frankenstein que um vetor de listas. Só que deu um nó, aqui, na cabeça. Um nó menor do que quando eu tentei fazer o vetor de listas, mas ainda não consigo desatar.
Como eu faria pra inicializar essa ideia?
Código:
List<List> listajogadores = new List<List>(); // a lista em que vou colocar cada sub-lista
List<string> listaPedra = new List<string>(); // a sub-lista de cada lista
ou
Código:
List<List> listajogadores = new List<List>(); // a lista em que vou colocar cada sub-lista
List<string> listaPedra1 = new List<string>(); // a sub-lista do jogador 1
List<string> listaPedra2 = new List<string>(); // a sub-lista do jogador 2
List<string> listaPedra3 = new List<string>(); // a sub-lista do jogador 3
List<string> listaPedra4 = new List<string>(); // a sub-lista do jogador 4
A segunda me parece mais provável de estar certa que a primeira, mas aí, eu teria o mesmo problema pra acessar cada uma que simplesmente criar as 4 listas e pronto...

Além disso, a primeira linha me dá o seguinte erro:
erro escreveu:Assets\Resources\Scripts\List of lists.cs(10,46): error CS0305: Using the generic type 'List' requires 1 type arguments

Tentar fazer o primeiro monstro (vetor de listas) também não foi uma boa ideia.
Código:
List[] listajogadores = new List[4]; // a lista em que vou colocar cada sub-lista
erro escreveu:Assets\Resources\Scripts\List of lists.cs(10,9): error CS0305: Using the generic type 'List' requires 1 type arguments

...

Beleza. Resta uma esperança.
Código:
public List<string>[] listapedras = new List<string>[4]; // o vetor em que cada elemento é uma lista
Isso não gera erros visíveis... mas na hora em que roda, não funciona. Talvez eu esteja errando só na hora de alimentar a lista, porque o erro é:
erro escreveu:NullReferenceException: Object reference not set to an instance of an object
testlist.Start () (at Assets/Resources/Scripts/List of lists.cs:13)
e o código completo (pro caso realmente ser na hora de alimentar as listas):
Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class testlist : MonoBehaviour
{
    public List<string>[] listapedras = new List<string>[4]; // o vetor em que cada elemento é uma lista
    // Start is called before the first frame update
    void Start()
    {
        for(int i = 0; i < 4; i ++){
            for(int j = 0; j < 2; j++){
                listapedras[i].Add("A");
            }
        }
        /*foreach(string letra in listapedras[2]){
            print(letra);
        }*/
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : lists 2D? Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por Willy Seg 28 Set 2020, 10:42

Tu fez quase certo.
Exception escreveu: error CS0305: Using the generic type 'List' requires 1 type arguments
Você tentou criar uma lista de lista, o que está correto. Então você sabe que a lista contém... Listas! Mas, listas de quê?
Faltou você dizer o tipo de listas que a segunda lista deve suportar. Ou seja:
Código:
List<List<string>> listajogadores = new List<List<string>>();
Willy
Willy

Games Ranking : Nota A

Notas recebidas : C + B + A + A
Data de inscrição : 08/06/2009
Reputação : 264
Número de Mensagens : 1890
Prêmios : lists 2D? Empty

Medalhas x 0 Tutoriais x 2 Moedas x 0

Ouro x 2 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://willy-gmbr.blogspot.com/

saim gosta desta mensagem

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por saim Seg 28 Set 2020, 11:56

Bacana! Testei, aqui, e deu certinho, o erro sumiu mesmo!
Agora, só falta eu aprender a usar a sintaxe correta. Como eu faria, por exemplo, pra alimentar cada sub-lista com os valores "A", "D", "M" e "V" e depois imprimir isso no console? Tentei colocar a primeira lista (ainda vazia) como elemento da lista e já descobri um erro novo
Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class testlist : MonoBehaviour
{
    public List<List<string>> pedraJoga = new List<List<string>>(); // a listona com as listinhas
    public List<string> pedrinhas = new List<string>(); // cada listinha
    // Start is called before the first frame update
    void Start()
    {
        for(int i = 0; i < 4; i ++){
            pedraJoga.Add(pedrinhas);
            //pedraJoga.pedrinhas.Add("A");
        }
    }
}
erro escreveu:ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource) (at :0)
System.ThrowHelper.ThrowArgumentOutOfRangeException () (at :0)
testlist.Start () (at Assets/Resources/Scripts/List of lists.cs:27)
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : lists 2D? Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por Willy Ter 29 Set 2020, 10:19

Uma maneira:
Código:
var listona = new List<List<string>>();

            for (int i = 0; i < 4; i++)
            {
                listona.Add(new List<string>
                {
                    "A" + i,
                    "B" + i,
                    "C" + i
                });
            }
Se preocupe em criar um meio de gerar a "listinha". Depois de gerar, você adiciona ela na listona.
Willy
Willy

Games Ranking : Nota A

Notas recebidas : C + B + A + A
Data de inscrição : 08/06/2009
Reputação : 264
Número de Mensagens : 1890
Prêmios : lists 2D? Empty

Medalhas x 0 Tutoriais x 2 Moedas x 0

Ouro x 2 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://willy-gmbr.blogspot.com/

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por saim Ter 29 Set 2020, 22:11

Entendi não! geek
Rsrs... o lance é que eu preciso das listinhas vazias, pra ir alimentando elas. E ainda não sei acessar (adicionar e remover elementos) nessas listas.
Acabei apelando pra um switch... meu código está ficando monstruoso, mas está rodando do jeito que eu quero. E, pra ser sincero, o switch é o menos monstruoso, por enquanto. Vou te mostrar como está o método, pra você entender o que eu quero...

Código:
//no início da classe, defino as lists
//fiz as 4 lists, separadas, por enquanto
public List<string> pedrasP1 = new List<string>();
public List<string> pedrasP2 = new List<string>();
public List<string> pedrasP3 = new List<string>();
public List<string> pedrasP4 = new List<string>();
/* Daí, vou pular um monte de coisa que você não quer ver, por enquanto*/
//chegou no método que pega a pedra
void pegaPedra()
{
// pega a pedra sob o jogador e coloca na list correspondente
string letra;
int xx, yy;
// grava a posição atual numa variável curtinha, pra não ficar muito feio
xx = peao[curPlayer].transform.GetComponent<scrPeao>().minhaposX;
// curPlayer é current Player, peao[0-3] é o objeto que mostra o peão do jogador
// e scrPeao é um script em inicializo algumas variáveis, entre elas a posição do peão
yy = peao[curPlayer].transform.GetComponent<scrPeao>().minhaposY;
letra = umacasa[yy, xx].transform.GetComponent<scrCasa>().minhavar; // a variável com o valor da pedrinha
// umacasa[0-8, 0-8] é cada casa do tabuleiro, onde ficam as pedrianhas.
// "minhavar", não sei mais se vale a pena manter, mas é a string que uso pra saber qual pedrinha tem lá.
// scrCasa, como o scrPeao, eu uso pra inicializar as variáveis.

// aqui que começa mesmo, o que eu quero
umacasa[yy, xx].transform.GetComponent<scrCasa>().minhavar = "vazio"; // apaga a variável da casa
if(letra != "vazio"){
switch(curPlayer){
case 0: pedrasP1.Add(letra); break;
case 1: pedrasP2.Add(letra); break;
case 2: pedrasP3.Add(letra); break;
case 3: pedrasP4.Add(letra); break;
}
Destroy(umacasa[yy, xx].transform.GetComponent<scrCasa>().minhaLetra); // destrói o objeto que estou usando pra mostrar a letra (já que não conheço algo do tipo draw_sprite)
}
}
O que eu queria era substituir o "switch" por algo como pedras[curPlayer].Add(letra). E depois, quando for acessar essa lista (ainda tenho que descobrir uma forma de fazer isso na interface), seria algo como
letradevolta = pedras[curPlayer[índice]];


Ah, se você tiver metodologias mais elegantes de fazer alguma dessas coisas (tipo um draw_sprite ao invés de um objeto inteiro só pra mostrar uma sprite por cima do outro), me fale. Está tudo muito "na raça". Funciona, mas não está bonito de se ver... e daqui a pouco, essa deselegância vai começar a avacalhar minha vida.
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : lists 2D? Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

lists 2D? Empty Re: lists 2D?

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos