RPG-Charakter
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 58 von 61.
Aufgabe
EinfachLassen Sie uns ein RPG Character Kampfsystem bauen — ein klassisches Beispiel, das Structs, Methoden, Konstruktoren und Objektinteraktion in einem sauberen, modularen Design zusammenführt.
Sie werden Ihren Code über drei Dateien organisieren:
character.h: Definieren Sie einCharacterStruct mit zwei Integer-Feldern:healthunddamage. Deklarieren Sie die Funktionsprototypen für das Erstellen eines Charakters, das Ausführen eines Angriffs, das Überprüfen, ob ein Charakter am Leben ist, und das Ausgeben des Status eines Charakters.character.c: Implementieren Sie Ihr Charaktersystem:create_character— nimmt initiale Werte für Gesundheit und Schaden entgegen, alloziert einen Character auf dem Heap, initialisiert seine Felder und gibt einen Pointer zurückattack— nimmt zwei Character-Pointer (Angreifer und Ziel), reduziert die Gesundheit des Ziels um den Schaden des Angreifersis_alive— nimmt einen const Character-Pointer und gibt 1 zurück, wenn die Gesundheit größer als 0 ist, andernfalls 0print_status— nimmt einen const Character-Pointer und gibt die Gesundheit des Charakters im FormatHealth: Xausfree_character— gibt den allozierten Speicher frei
main.c: Erstellen Sie eine Kampfsimulation! Lesen Sie vier Integer ein, die Folgendes repräsentieren: Gesundheit des Helden, Schaden des Helden, Gesundheit des Gegners und Schaden des Gegners. Erstellen Sie beide Charaktere mit Ihrem Konstruktor. Simulieren Sie dann Kampfrunden — in jeder Runde greift der Held zuerst an, dann schlägt der Gegner zurück. Beide Schläge finden innerhalb derselben Runde statt, sodass der Gegenangriff des Gegners auch dann erfolgt, wenn der Angriff des Helden ihn bereits auf Null oder darunter reduziert hat. Fahren Sie fort, bis ein Charakter fällt. Geben Sie nach jeder Runde den Status beider Charaktere aus (zuerst Held, dann Gegner). Wenn der Kampf endet, geben Sie entwederHero wins!oderEnemy wins!aus, je nachdem, wer überlebt hat. Vergessen Sie nicht, beide Charaktere freizugeben.
Ihr Programm wird vier Eingaben erhalten:
- Startgesundheit des Helden
- Schaden des Helden pro Angriff
- Startgesundheit des Gegners
- Schaden des Gegners pro Angriff
Beispielhafte Ausgabe, wenn die Eingaben 50, 20, 30, 15 sind:
Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!Beispielhafte Ausgabe, wenn die Eingaben 20, 5, 100, 25 sind:
Health: -5
Health: 95
Enemy wins!Denken Sie daran, Include-Guards in Ihrer Header-Datei zu verwenden. Die attack-Funktion demonstriert, wie ein Objekt den internen Zustand eines anderen verändern kann — ein Schlüsselkonzept im objektorientierten Design. Verwenden Sie const-Pointer angemessen für Funktionen, die Daten nur lesen.
Probier es selbst
#include <stdio.h>
#include "character.h"
int main() {
// Eingabewerte lesen
int hero_health, hero_damage, enemy_health, enemy_damage;
scanf("%d", &hero_health);
scanf("%d", &hero_damage);
scanf("%d", &enemy_health);
scanf("%d", &enemy_damage);
// TODO: Helden- und Gegner-Charaktere mit `create_character` erstellen
// TODO: Kampfrunden simulieren
// - Held greift zuerst an
// - Gegner greift an, falls er noch am Leben ist
// - Status beider Charaktere nach jeder Runde ausgeben (zuerst Held, dann Gegner)
// - Fortfahren, bis ein Charakter fällt
// TODO: Gewinner ausgeben ("Hero wins!" oder "Enemy wins!")
// TODO: Beide Charaktere freigeben
return 0;
}
Alle Lektionen in Object Oriented Programming
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-Container