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
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


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