Skip to content

Jogo inspirado no popular Balatro, desenvolvido em C# para a disciplina Programação Orientado a Objetos na Universidade São Francisco de Itatiba.

License

Notifications You must be signed in to change notification settings

LucasIda/Royal_Card

Repository files navigation

⚠️ Aviso Importante

Este projeto foi inspirado no jogo Balatro.
Não temos qualquer intenção de monetizar, distribuir comercialmente ou violar direitos autorais.
O desenvolvimento deste jogo é exclusivamente para fins de estudo e aprendizado em programação e design de jogos.


🎴 Royal Cards

1. Objetivo do Jogo

O objetivo do jogo é formar mãos com combinações de cartas que gerem a maior pontuação possível, manipular o deck e criar estratégias. Ao final de cada rodada, se o jogador atingir a pontuação necessária, ele vence, passando para a próxima fase. O objetivo é alcançar a maior pontuação possível, utilizando os curingas à disposição.


2. Conceitos Básicos

Image

2.1 Cartas

O jogo utiliza um baralho padrão de 52 cartas (sem curingas, salvo variação combinada). Cada carta tem valor numérico e naipe.

Valores:
Números 2 a 10: valor nominal.
A (Ás): 11 pontos.
Q (Dama), K (Rei) e J (Valete): 10 pontos.

2.2 Mão

Cada jogador recebe uma quantidade fixa de cartas (8 cartas).
A mão é composta pelas cartas que o jogador possui na sua vez.
O jogador deve analisar sua mão para formar combinações de valor.

2.3 Combinações

  • Sequência (Straight): cartas consecutivas do mesmo naipe. Ex: 5♠ 6♠ 7♠
  • Trinca (Three of a Kind): três cartas de mesmo valor. Ex: 7♣ 7♦ 7♥
  • Quadra (Four of a Kind): quatro cartas de mesmo valor.
  • Flush: cinco cartas do mesmo naipe, não necessariamente em sequência.

2.4 Blinds e Ante

Blinds e ante são como as “fases” do jogo, cada ante tem 3 blinds diferentes: small, big e boss.

Ao iniciar o jogo o jogador estará na ante 1 small blind. Caso o jogador consiga atingir a pontuação necessária, ele avança para a ante 1 big blind; se conseguir novamente, avança ao boss blind. Ao derrotar o boss blind, o jogador avança para a ante 2 — o ciclo se repete até a ante 12.


3. Pontuação

Cada combinação possui um valor de pontuação específico:

Image


4. Descarte

4.1 Objetivo do Descarte

O objetivo do descarte é eliminar cartas que, no momento, não favorecem a criação de combinações fortes, dando a chance de receber cartas melhores após o descarte.

4.2 Regras do Descarte

O jogador começa uma rodada com 3 descartes. Cada descarte pode ser de 1 até 5 cartas.
Após descartar, essas cartas não poderão mais ser utilizadas na rodada.
O mesmo número de cartas descartadas será comprado do deck (se disponível).
Exemplo: se o jogador descarta 5 cartas, mas restam apenas 3 no deck, ele comprará apenas 3.


5. Loja

Image

A Loja é o espaço onde o jogador pode gastar dinheiro ($) para adquirir Curingas.
Ela aparece apenas após vitórias em determinadas fases, como Small Blind, Big Blind ou Boss Blind.
Funciona como uma fase de compras entre batalhas, permitindo fortalecer a estratégia antes de prosseguir.

5.1 Reroll

O Reroll permite ao jogador pagar dinheiro para trocar as cartas disponíveis na loja por novas opções.
Cada reroll exibe três novas cartas aleatórias no lugar das anteriores.
O custo começa em $2 e aumenta em $1 a cada uso, voltando para $2 ao abrir uma nova loja.


6. Curingas

Image

Curingas são a principal ferramenta do jogo — capazes de gerar pontuação, manipular o deck e criar economia.
Eles não são jogados junto às cartas do baralho comum.
O jogador pode possuir até 5 curingas na mão e vender qualquer um a qualquer momento.

Curingas têm diferentes raridades, que afetam no seu custo para compra


7. Os 4 Pilares da POO no Projeto

Os quatro pilares da Programação Orientada a Objetos (POO) foram aplicados da seguinte forma:


7.1 Encapsulamento

Aplicado para proteger dados críticos como o dinheiro do jogador (PlayerCoins), controlado pelo GameManager.cs. Apenas métodos públicos (AddCoins, SpendCoins) podem alterar esse valor.

// O 'private set' garante que só o GameManager pode definir o valor
public int PlayerCoins { get; private set; } = 4;

public void AddCoins(int amount)
{
    if (amount > 0)
        PlayerCoins += amount;
}

public void SpendCoins(int amount)
{
    if (amount > PlayerCoins) return;
    PlayerCoins -= amount;
}

Motivo: protege a variável de alterações indevidas e centraliza a lógica de validação.


7.2 Herança

Utilizada para reutilizar código entre Card e JokerCard, ambas derivadas da classe base BaseCard.cs.

public abstract partial class BaseCard : TextureRect
{
    public string Name { get; protected set; }
    public bool IsSelected { get; private set; }
}

public partial class Card : BaseCard
{
    public CardData Data { get; private set; }
}

public partial class JokerCard : BaseCard
{
    private List<IJokerEffect> _effects = new();
    public int Cost { get; private set; }
}

Motivo: evita duplicação de código e mantém a lógica comum em um único local.


7.3 Abstração

Utilizamos a interface IJokerEffect para padronizar o comportamento dos efeitos de curingas, sem expor detalhes de implementação.

public interface IJokerEffect
{
    string Description { get; }
    void Apply(HandValue.HandResult result);
}

Implementações concretas:

public class EffectAddChips : IJokerEffect
{
    private int _chips;
    public void Apply(HandValue.HandResult result)
    {
        result.ChipsBase += _chips;
    }
}
public class EffectMultiplyMultiplier : IJokerEffect
{
    private float _factor;
    public void Apply(HandValue.HandResult result)
    {
        result.MultBase = (int)(result.MultBase * _factor);
    }
}

Motivo: o JokerCard apenas chama effect.Apply(result) — sem precisar saber o tipo específico do efeito.


7.4 Polimorfismo

Usado para que Card e JokerCard tenham comportamentos diferentes ao sobrescrever métodos herdados da BaseCard.

protected virtual void HideTooltip() { }

protected override void HideTooltip()
{
    base.HideTooltip();
    if (tooltip != null)
    {
        tooltip.QueueFree();
        tooltip = null;
    }
}

Motivo: permite comportamentos distintos para cada tipo de carta (ex: tooltips diferentes), usando a mesma chamada.


🕹️ Como executar o jogo na sua máquina

Para rodar o Royal Poker localmente, siga as etapas abaixo:

  1. Instale o .NET Framework mais recente
    Baixe a versão atual diretamente pelo site oficial da Microsoft:
    https://dotnet.microsoft.com/pt-br/download
  2. Baixe e extraia o arquivo RoyalPoker.zip
    Após o download, descompacte o arquivo em uma pasta de sua preferência.
  3. Execute o arquivo RoyalPoker.exe
    Dentro da pasta extraída, localize e abra o executável para iniciar o jogo.

Após seguir esses passos, o jogo estará pronto para uso na sua máquina! 🎮


Desenvolvido por DotsEng.Studio

About

Jogo inspirado no popular Balatro, desenvolvido em C# para a disciplina Programação Orientado a Objetos na Universidade São Francisco de Itatiba.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5