RPG-Charakter
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 58 von 61.
Aufgabe
EinfachLass uns ein RPG-Charakter-Kampfsystem entwickeln: ein klassisches Beispiel, das Strukturen, Methoden, Konstruktoren und Objektinteraktion in einem sauberen, modularen Design zusammenführt.
Du wirst deinen Code auf drei Dateien verteilen:
character.h: Definiere eineCharacter-Struktur mit zwei ganzzahligen Feldern:healthunddamage. Deklariere die Funktionsprototypen zum Erstellen eines Charakters, Ausführen eines Angriffs, Überprüfen, ob ein Charakter am Leben ist, und Ausgeben des Status eines Charakters.character.c: Implementiere dein Charaktersystem:create_character: nimmt anfängliche Gesundheits- und Schadenswerte entgegen, reserviert einen Character auf dem Heap, initialisiert seine Felder und gibt einen Zeiger zurückattack: nimmt zwei Character-Zeiger (Angreifer und Ziel) entgegen und reduziert die Gesundheit des Ziels um den Schaden des Angreifersis_alive: nimmt einen const-Character-Zeiger entgegen und gibt 1 zurück, wenn die Gesundheit größer als 0 ist, andernfalls 0print_status: nimmt einen const-Character-Zeiger entgegen und gibt die Gesundheit des Charakters im FormatHealth: Xausfree_character: gibt den reservierten Speicher frei
main.c: Erstelle eine Kampfsimulation! Lies vier Ganzzahlen ein, die Folgendes darstellen: die Gesundheit des Helden, den Schaden des Helden, die Gesundheit des Gegners und den Schaden des Gegners. Erstelle beide Charaktere mithilfe deines Konstruktors. Simuliere anschließend Kampfrunden; in jeder Runde greift der Held zuerst an, dann schlägt der Gegner zurück. Beide Schläge finden innerhalb derselben Runde statt, daher trifft der Gegenangriff des Gegners auch dann, wenn der Angriff des Helden dessen Gesundheit bereits auf null oder darunter reduziert hat. Fahre fort, bis ein Charakter fällt. Gib nach jeder Runde den Status beider Charaktere aus (zuerst den Helden, dann den Gegner). Wenn der Kampf endet, gib je nachdem, wer überlebt hat, entwederHero wins!oderEnemy wins!aus. Vergiss nicht, beide Charaktere freizugeben.
Dein Programm erhält vier Eingaben:
- Die anfängliche Gesundheit des Helden
- Der Schaden des Helden pro Angriff
- Die anfängliche Gesundheit des Gegners
- Der Schaden des Gegners pro Angriff
Beispielausgabe bei den Eingaben 50, 20, 30, 15:
Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!Beispielausgabe bei den Eingaben 20, 5, 100, 25:
Health: -5
Health: 95
Enemy wins!Denke daran, Include-Guards in deiner Header-Datei zu verwenden. Die Funktion attack veranschaulicht, wie ein Objekt den internen Zustand eines anderen Objekts ändern kann – ein zentrales Konzept im objektorientierten Design. Verwende const-Zeiger 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: Erstelle Helden- und Gegner-Charaktere mit create_character
// TODO: Simuliere Kampfrunden
// - Held greift zuerst an
// - Gegner greift an, wenn er noch am Leben ist
// - Gib den Status beider Charaktere nach jeder Runde aus (zuerst Held, dann Gegner)
// - Setze fort, bis ein Charakter fällt
// TODO: Gib den Gewinner aus ("Hero wins!" oder "Enemy wins!")
// TODO: Gib beide Charaktere frei
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
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Übe selbstständig: Online-C-Compiler