Come implementare le "carte con effetti speciali" del gioco di carte collezionabili?


16

Sto cercando di scrivere una specie di gioco di carte collezionabili qui, in qualche modo, è simile a Magic The Gathering o Yu-Gi-Oh! gioco di carte.

Per quelli di voi che non lo conoscono, in sostanza, nel gioco, esiste un tipo speciale di carta (carte Magia / Carte Trappola / ecc.), Che ha effetti speciali che possono piegare le regole del gioco. Quello che non ho assolutamente idea è come implementare la logica di queste carte. Ho qualche idea di memorizzare i dati della carta con alcune bandiere che possono segnalare il tipo di abilità che ha, ma sarebbe molto limitato in ciò che può fare (solo qualche semplice modifica delle statistiche, forse).

Per darti un'idea del tipo di effetti che queste carte possono avere, ecco alcuni esempi degli effetti delle carte incantesimo presenti in Yu-Gi-Oh! gioco di carte:

  • Rianima una creatura che è stata distrutta
  • Prendi il controllo della creatura dell'avversario
  • Modifica le statistiche della creatura in base ad alcune condizioni (ad es. Numero di creatura con determinati nomi che sono stati distrutti)
  • Evoca in modo speciale alcune creature se sono soddisfatte alcune condizioni.
  • Unisci due o più creature in una creatura più forte.
  • Immunità ad alcuni degli effetti delle carte speciali.

Konami ha realizzato diversi videogiochi del gioco, completi di intelligenza artificiale e varietà di migliaia di carte. Non penso che sia effettivamente possibile codificare l'intero database, vero?

Ora, ovviamente, ciò che sto cercando di fare non è in nessun caso così complesso come quei giochi, ma sono curioso, come li implementano?

Risposte:


17

Esistono diversi progetti open source di questa natura, con approcci diversi per l'attuazione delle regole. Ecco un post sul blog del creatore di una delle più note implementazioni MtG, CardForge. Potrebbe non essere un elenco completo, ma contiene diversi progetti open source in cui puoi semplicemente sfogliare il codice o visitare i forum per domande specifiche.

Come risposta effettiva: la soluzione migliore per un framework solido è quella di utilizzare rigorosamente la programmazione orientata agli oggetti. Ogni azione, ogni innesco, ogni abilità è un oggetto. Zone come Hand, Library sono anche oggetti, inutile dirlo. Nel motore delle regole, non passare mai intorno a oggetti stupidi come stringhe o numeri interi per descrivere oggetti di gioco, ma solo i tuoi oggetti.

Ogni azione mette una serie di innesco in una pila, dove ogni altra abilità può verificare se si preoccupano o meno di quel particolare innesco, e se lo fanno, sparano le proprie azioni, potenzialmente creando nuovi inneschi e così via.

Quindi lavori su quelle pile in base alle regole del gioco, fino a quando la pila è vuota, a quel punto possono essere intraprese nuove azioni ecc.

Idealmente, se si implementano perfettamente le regole del gioco, il codice delle regole non contiene una singola carta codificata. Le carte hardcoding possono creare comode scorciatoie, ma a lungo termine ciò gonfia il codice e crea potenziali insidie, come quando vengono rilasciate nuove carte che interagiscono con quelle carte in modo nuovo. In un gioco come MtG con oltre 12.000 carte uniche e senza fine in vista, ci sono MOLTE interazioni del genere.


1
Buona risposta. Provenendo dal mondo della programmazione funzionale, vorrei che ogni carta fosse una chiusura sull'ambiente di gioco, per essere ancora più ridicolmente generica. Ad esempio, una carta potrebbe creare in modo accettabile una nuova "Area" aggiungendo un elenco di carte all'elenco delle aree. Concretamente: Zombie Monster Mayhem: tutte le creature sconfitte vengono rianimate nel nuovo "Cimitero Comunale" senza le loro abilità speciali e attaccano casualmente un giocatore in base al tiro di un dado.
brice il

Link aggiuntivo: github.com/Fluorohydride/ygopro-core per una famosa implementazione di YGO open source, poiché anche YGO è stato menzionato nella domanda.
SK19

2

È abbastanza inutile provare a incorporare tutto ciò con solo switch e variabili. Dovresti avere funzioni di codice reale o, molto probabilmente, avere uno script che interpreti durante il runtime. Dovresti esporre le funzioni necessarie per controllare lo stato del tabellone e dei mazzi e dei cimiteri allo script e alle funzioni per eseguire le azioni, e così via. Lo script è quindi solo una semplice stringa da memorizzare insieme alle altre variabili associate alla scheda.


O come ha suggerito l'hackworth, avendo una sorta di blocchi comuni che vengono combinati per ottenere il comportamento richiesto. Richiederebbe anche alcuni blocchi logici oltre a quello che ha suggerito, credo. Avere blocchi di comportamento condivisi potrebbe rendere più semplice il filtro per le carte che hanno una sorta di qualità condivise.
Toni,

1

Sto anche pianificando un gioco di carte usando i linguaggi web con mysql db. Attualmente sto andando per una configurazione molto generica, quindi rimane molto flessibile con nuove carte uniche. Ad esempio invece di:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

potrebbe facilmente essere:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

l'applicazione di questo concetto per tutte le azioni semplifica le classi, consente la creazione di nuove carte semplicemente aggiungendo una singola riga al tavolo delle carte.

Tutte le opzioni e le abilità verranno definite nel db in quella singola riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.