Mecânica simples no estilo Jogo da Memória
2 participantes
Página 1 de 1
Mecânica simples no estilo Jogo da Memória
Oi...
Estou tentando fazer uma mecânica simples tipo jogo da memória...
O problema é que sempre fica posicoes vazias ou posicao com mais de duas cartas... tentei de várias formas e não consegui... então, alguém pode me ajudar como posso fazer essa parte de um jeito simples?
As demais partes tentarei fazer... qq coisa pergunto aqui...
Estou tentando fazer uma mecânica simples tipo jogo da memória...
- Código:
using UnityEngine;
public class JogoMemoria : MonoBehaviour
{
public GameObject[] cartas; //4 cartas
public Transform[] posicao; //4 posicoes
public void MudarPosicao() // onClick de um botao
{
foreach (GameObject item in cartas)
{
int objRandom = Random.Range(0, cartas.Length);
item.transform.position = posicao[objRandom].position;
}
}
}
O problema é que sempre fica posicoes vazias ou posicao com mais de duas cartas... tentei de várias formas e não consegui... então, alguém pode me ajudar como posso fazer essa parte de um jeito simples?
As demais partes tentarei fazer... qq coisa pergunto aqui...
joffersoju- Avançado
- PONTOS : 2503
REPUTAÇÃO : 4
Respeito as regras :
Re: Mecânica simples no estilo Jogo da Memória
É que vc está deixando sortear valores repetidos.
Tente adicionar numa lista as posições que já foram sorteadas e verificar com um if se essa posição sorteada já existe na lista, se sim, sorteie outra, se não sorteia ela mesmo.
Tente adicionar numa lista as posições que já foram sorteadas e verificar com um if se essa posição sorteada já existe na lista, se sim, sorteie outra, se não sorteia ela mesmo.
Re: Mecânica simples no estilo Jogo da Memória
Oi...
Fiz assim, peguei uns scripts e fui adequando...
Linkei o indice randomico e fui add os sprites linkados no inspector a posicao dos gameobjectos anversos... funcionou...
O que achou?
Fiz assim, peguei uns scripts e fui adequando...
Linkei o indice randomico e fui add os sprites linkados no inspector a posicao dos gameobjectos anversos... funcionou...
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JogoMemoria : MonoBehaviour
{
private int valorMin = 0;
public int valorMax;
[Space(20)]
public int valorSorteado;
[Space(20)]
public List<int> numerosJaSorteados = new List<int>();
public GameObject[] anverso;
public Sprite[] cartaOuro;
void Update()
{
valorSorteado = NumeroRandomico();
foreach (GameObject objeto in anverso)
{
int index = System.Array.IndexOf(anverso, objeto);
objeto.GetComponent<SpriteRenderer>().sprite = cartaOuro[numerosJaSorteados[index]];
}
}
public int NumeroRandomico()
{
if (Mathf.Abs(valorMax - valorMin) > numerosJaSorteados.Count)
{
while (true)
{
int numeroAleatorio = Random.Range(valorMin, valorMax);
if (!numerosJaSorteados.Contains(numeroAleatorio))
{
numerosJaSorteados.Add(numeroAleatorio);
return numeroAleatorio;
}
}
}
else
{
Debug.LogError("todas as cartas já saíram");
return 0;
}
}
}
O que achou?
joffersoju- Avançado
- PONTOS : 2503
REPUTAÇÃO : 4
Respeito as regras :
Re: Mecânica simples no estilo Jogo da Memória
Hum, ficou um pouco mais complexo do que eu imaginava, mas parece que ficou bom.
Re: Mecânica simples no estilo Jogo da Memória
Oi... como poderia ficar mais simples e ter a mesma funcionalidade???MayLeone escreveu:Hum, ficou um pouco mais complexo do que eu imaginava, mas parece que ficou bom.
Poderia me mostrar para que eu aprenda por gentileza?
joffersoju- Avançado
- PONTOS : 2503
REPUTAÇÃO : 4
Respeito as regras :
Re: Mecânica simples no estilo Jogo da Memória
Pois, tentei fazer como disse... encontrando a posição vazia... mas, não consegui... só consegui desse outro jeito... vc pode me mostrar como eu faria para encontrar a posição que ficou vazia e assim, atribuir um Sprite a ela? como tb evitar que uma mesma posição recebesse dois sprites?
joffersoju- Avançado
- PONTOS : 2503
REPUTAÇÃO : 4
Respeito as regras :
Re: Mecânica simples no estilo Jogo da Memória
Oi... continuei o jogo...
Coloquei esse script em cada carta que vira...
mas, não consigo fazer com que na carta anterior... o sprite do verso volte pra ela...
pode me ajudar???
Coloquei esse script em cada carta que vira...
mas, não consigo fazer com que na carta anterior... o sprite do verso volte pra ela...
pode me ajudar???
- Código:
using System;
using UnityEngine;
using UnityEngine.UI;
public class AbrirCarta : MonoBehaviour
{
public GameObject posicao;
public Sprite verso;
public Text[] cartaTexto;
private void OnMouseDown()
{
JogoMemoria.pontosCarta = JogoMemoria.pontosCarta + 1;
GetComponent<SpriteRenderer>().sprite = posicao.GetComponent<SpriteRenderer>().sprite;
if (JogoMemoria.pontosCarta == 1)
{
cartaTexto[0].text = GetComponent<SpriteRenderer>().sprite.name;
}
else if (JogoMemoria.pontosCarta == 2)
{
cartaTexto[1].text = GetComponent<SpriteRenderer>().sprite.name;
CompararCartas();
}
}
void CompararCartas()
{
if (cartaTexto[0].text.Equals(cartaTexto[1].text))
{
Debug.Log("Voce venceu");
JogoMemoria.pontosCarta = 0;
}
else
{
GetComponent<SpriteRenderer>().sprite = verso;
JogoMemoria.pontosCarta = 0;
}
}
}
joffersoju- Avançado
- PONTOS : 2503
REPUTAÇÃO : 4
Respeito as regras :
Re: Mecânica simples no estilo Jogo da Memória
o outro código
já com algumas pequenas alteracoes...
- Código:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class JogoMemoria : MonoBehaviour
{
private int valorMin = 0;
public int valorMax;
[Space(20)]
public int valorSorteado;
[Space(20)]
public List<int> numerosJaSorteados = new List<int>();
public GameObject[] anverso, cartasVerso;
public Sprite[] cartaOuro;
public Text nomeCarta1, nomeCarta2;
public static int pontosCarta = 0;
public int pontosCartaFake;
private void Start()
{
foreach(GameObject obj in cartasVerso)
{
print(obj);
}
}
private void Update()
{
pontosCartaFake = pontosCarta;
}
public void NovoNumero()
{
valorSorteado = NumeroRandomico();
while(numerosJaSorteados.Count < valorMax)
{
valorSorteado = NumeroRandomico();
}
foreach (GameObject objeto in anverso)
{
int index = System.Array.IndexOf(anverso, objeto);
objeto.GetComponent<SpriteRenderer>().sprite = cartaOuro[numerosJaSorteados[index]];
}
}
public int NumeroRandomico()
{
if (Mathf.Abs(valorMax - valorMin) > numerosJaSorteados.Count)
{
while (true)
{
int numeroAleatorio = Random.Range(valorMin, valorMax);
if (!numerosJaSorteados.Contains(numeroAleatorio))
{
numerosJaSorteados.Add(numeroAleatorio);
return numeroAleatorio;
}
}
}
else
{
Debug.LogError("todas as cartas já saíram");
return 0;
}
}
}
já com algumas pequenas alteracoes...
joffersoju- Avançado
- PONTOS : 2503
REPUTAÇÃO : 4
Respeito as regras :
Re: Mecânica simples no estilo Jogo da Memória
Fechei a mecânica básica...
1. []cartasAleatorias recebem as []cartasEscolhidas sem repetição...
2. A []cartasPosições recebem ao serem clicadas os as[]cartasAleatorias...
3. Após clicar nas duas cartas, elas comparam por string e se forem iguais, mantem viradas, senão desviram, por tag e depois, a tag é desabilitada...
É isso, a mecânica do jogo da memória funcionou bacana...
Melhoria são bem vindas...
Script JogoMemoria em qualquer objeto
Script AbrirCarta nas cartas que serão abertas
1. []cartasAleatorias recebem as []cartasEscolhidas sem repetição...
2. A []cartasPosições recebem ao serem clicadas os as[]cartasAleatorias...
3. Após clicar nas duas cartas, elas comparam por string e se forem iguais, mantem viradas, senão desviram, por tag e depois, a tag é desabilitada...
É isso, a mecânica do jogo da memória funcionou bacana...
Melhoria são bem vindas...
Script JogoMemoria em qualquer objeto
Script AbrirCarta nas cartas que serão abertas
- Código:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class JogoMemoria : MonoBehaviour
{
private int valorMin = 0;
public int valorMax;
[Space(20)]
public int valorSorteado;
[Space(20)]
public List<int> numerosJaSorteados = new List<int>();
public GameObject[] anverso;
public Sprite[] cartaOuro;
public static int pontosCarta = 0;
public int pontosCartaFake;
private void Update()
{
pontosCartaFake = pontosCarta;
}
public void NovoNumero()
{
valorSorteado = NumeroRandomico();
while (numerosJaSorteados.Count < valorMax)
{
valorSorteado = NumeroRandomico();
}
foreach (GameObject objeto in anverso)
{
int index = System.Array.IndexOf(anverso, objeto);
objeto.GetComponent<SpriteRenderer>().sprite = cartaOuro[numerosJaSorteados[index]];
}
}
public int NumeroRandomico()
{
if (Mathf.Abs(valorMax - valorMin) > numerosJaSorteados.Count)
{
while (true)
{
int numeroAleatorio = UnityEngine.Random.Range(valorMin, valorMax);
if (!numerosJaSorteados.Contains(numeroAleatorio))
{
numerosJaSorteados.Add(numeroAleatorio);
return numeroAleatorio;
}
}
}
else
{
Debug.LogError("todas as cartas já saíram");
return 0;
}
}
}
- Código:
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityScript.Steps;
public class AbrirCarta : MonoBehaviour
{
public GameObject[] baralhoAleatorio, cartaPrimeira;
public Sprite verso;
public Text[] cartaTexto;
public string posicaoCartaString;
public int posicaoCartaInt;
public new string tag;
private void OnMouseDown()
{
JogoMemoria.pontosCarta = JogoMemoria.pontosCarta + 1;
posicaoCartaInt = Convert.ToInt16(posicaoCartaString);
GetComponent<SpriteRenderer>().sprite = baralhoAleatorio[posicaoCartaInt].GetComponent<SpriteRenderer>().sprite;
gameObject.tag = tag;
if (JogoMemoria.pontosCarta == 1)
{
cartaTexto[0].text = GetComponent<SpriteRenderer>().sprite.name;
}
else if (JogoMemoria.pontosCarta == 2)
{
cartaTexto[1].text = GetComponent<SpriteRenderer>().sprite.name;
CompararCartas();
}
}
void CompararCartas()
{
if (cartaTexto[0].text.Equals(cartaTexto[1].text))
{
Debug.Log("Voce venceu");
foreach (GameObject carta in cartaPrimeira)
{
carta.tag = "Untagged";
}
JogoMemoria.pontosCarta = 0;
}
else
{
Invoke("Tempo", 1);
}
}
void Tempo()
{
GetComponent<SpriteRenderer>().sprite = verso;
cartaPrimeira = GameObject.FindGameObjectsWithTag("tag");
foreach (GameObject carta in cartaPrimeira)
{
carta.GetComponent<SpriteRenderer>().sprite = verso;
carta.tag = "Untagged";
}
JogoMemoria.pontosCarta = 0;
}
}
joffersoju- Avançado
- PONTOS : 2503
REPUTAÇÃO : 4
Respeito as regras :
Tópicos semelhantes
» Fiz esse jogo a bastante tempo que tipo de mecanica eu poderia adicionar?
» Sistema de Jogo da Memória
» jogo 2D IA Simples
» Ajuda para jogo da memória! Aleatorizar Cartas
» [TUTORIAL] Criando jogo da memória em C# & Visual Studio
» Sistema de Jogo da Memória
» jogo 2D IA Simples
» Ajuda para jogo da memória! Aleatorizar Cartas
» [TUTORIAL] Criando jogo da memória em C# & Visual Studio
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos