Entrar
Últimos assuntos
» player não consegue andarpor 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
GMBR :: Ensine & Aprenda :: Perguntas e Respostas :: Unity
Página 1 de 1
lists 2D?
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?
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: lists 2D?
Que tal... uma lista de listas?
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.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.
saim e Diemorth gostam desta mensagem
Re: lists 2D?
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.
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- Data de inscrição : 18/08/2010
Reputação : 12
Número de Mensagens : 461
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 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
Re: lists 2D?
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 , 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
Tu pode imaginar um Dictionary como.... dicionário , 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>>()
saim gosta desta mensagem
Re: lists 2D?
É 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.Willy escreveu:Que tal... uma lista de listas?
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
- 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
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
e o código completo (pro caso realmente ser na hora de alimentar as listas):erro escreveu:NullReferenceException: Object reference not set to an instance of an object
testlist.Start () (at Assets/Resources/Scripts/List of lists.cs:13)
- 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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: lists 2D?
Tu fez quase certo.
Faltou você dizer o tipo de listas que a segunda lista deve suportar. Ou seja:
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ê?Exception escreveu: error CS0305: Using the generic type 'List' requires 1 type arguments
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>>();
saim gosta desta mensagem
Re: lists 2D?
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
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: lists 2D?
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
});
}
Re: lists 2D?
Entendi não!
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...
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.
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)
}
}
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
GMBR :: Ensine & Aprenda :: Perguntas e Respostas :: Unity
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos