(C#) Hjälp med DMG formel i ett RPG spel

Permalänk
Inaktiv

(C#) Hjälp med DMG formel i ett RPG spel

Hej, jag är en någorlunda ny programmerare och jag håller på att lära mig C# genom konsolen just nu. (Kommer gå vidare till XNA efter jullovet).

Just nu håller jag på med ett textbaserat RPG där man har en main hub, staden. Därifrån kommer man kunna uppgradera vapen, ta in på ett värdshus, se sina stats och sedan gå till templet där man ska fighta ett monster på varje nivå. (Ska finnas 10 nivåer.)

Problemet jag har är att jag inte vet hur formeln för damage ska se ut. Jag har med HP, Attack och Defense. Både på playern och monstret. Någon som har något tips på en formel jag kanske skulle kunna använda?

Jag har tänkt på att jag ska ha med ett random generated nummer också. Så alltså ska formeln först räkna ut ett balanserat värde mellan båda personernas stats + sen lägga till ett random nummer mellan 2 tal.

Jag har tänkt såhär:

int randomdmg = RND.Next(10, 30);
int playerdmg = Formeln för hur attack och defense ska påverka varandra;
int totalplayerdmg = playerdmg + randomdmg;

Permalänk
Medlem

playerdmg = Math.Max(0, attack - defense)

Permalänk
Inaktiv
Skrivet av Megamannens:

playerdmg = Math.Max(0, attack - defense)

Skulle du kunna förklara kortfattat hur formeln är uppbyggd? Har inte använt Math metoder innan.

Permalänk
Medlem
Skrivet av anon182011:

Skulle du kunna förklara kortfattat hur formeln är uppbyggd? Har inte använt Math metoder innan.

Då han verkar ha loggat ut så kan jag förklara

Math.max() tar i detta fallet 2 variabler och returnerar det högsta av dem två. I detta fallet så skickar han in attack subtraherat med defense, men han har även skickat in en nolla också ifall differansen blir mindre än 0. Om det blir mindre än noll så får den andra hp gissar jag på och det vore inte så bra

Alltså: Math.max() väljer det största talet av dem talen man skickar med(säger skickar med då jag glömt vad med heter )

Permalänk
Inaktiv
Skrivet av Kabeltv:

Då han verkar ha loggat ut så kan jag förklara

Math.max() tar i detta fallet 2 variabler och returnerar det högsta av dem två. I detta fallet så skickar han in attack subtraherat med defense, men han har även skickat in en nolla också ifall differansen blir mindre än 0. Om det blir mindre än noll så får den andra hp gissar jag på och det vore inte så bra

Alltså: Math.max() väljer det största talet av dem talen man skickar med(säger skickar med då jag glömt vad med heter )

Awesome, ska titta närmre på det imorgon men nu på rak hand efter en kvarts mixtrande så ser det ut att funka rätt bra. Det random genererade numret är större delen av skadan och playerdmg ökar sakta men säkert när man uppgraderar vapen och armor för att få ett litet men vitalt övertag över fienden.

Tackar så mycket för hjälpen! Jag citerar er 2 imorgon om jag skulle behöva ytterligare hjälp om det är okej! Ha det gött.

Permalänk

En annan sak du kan göra är att lägga till critical hits.

Permalänk
Medlem

Nu blev jag sugen på att göra något liknande

Visa signatur

CPU : 12900KS GPU : 3090 Strix OC RAM : G.Skill 32GB 6600MHz 34-40-40-105SSD : 2st SN850 1TB Bildskärm 1: Strix PG279Q 1440p@165Hz G-SYNC Bildskärm 2: Asus VG27AQ 27" 1440p@165Hz Bildskärm 3: Asus VG27AQ 27" 1440p@165Hz Vattenkylning CPU,GPU och RAM, 3*360 rad

Permalänk
Inaktiv
Skrivet av Formel117:

En annan sak du kan göra är att lägga till critical hits.

Yes, hade tänkt att göra det så småningom! Ska göra klart hela spelet först (har inte mycket kvar) och sedan lägga till fler och fler funktioner om jag hinner!

Skrivet av Boozfob:

Nu blev jag sugen på att göra något liknande

Haha, gör det! Skitkul att sitta och mixtra med! ^^

Permalänk
Inaktiv

Har stött på ett till problem i min kod.

Som sagt så ska det vara 10 nivåer. Du sticker till templet, fightar ett monster och sedan kommer tillbaka. Det ska göras 10 gånger.

Därför har jag skapat 10 fiender.

static fiende fiende1 = new fiende("Spider", 1, 70, 7, 7);
static fiende fiende2 = new fiende("Troll", 2, 75, 9, 9); (Namn, level, hp, attack, defense)

När man då kommer till en strid så har jag en funktion med hela striden.

static void Strid() //Strider
{

Jag vet hur man gör om man ska fighta en fiende på ett floor. Tex

if (Våning == 1)
{
Console.WriteLine("Du stötte på " + fiende1.namn);
(och sedan stridssystemet)
}
else if (våning == 2)
{
Console.WriteLine("Du stötte på " + fiende2.namn);
(etc etc)
}

Jag vill dock göra det så kort och effektivt som möjligt, så att man slipper skriva koden för stridssystemet 10 gånger. Hur ska jag gå tilllväga då?

Permalänk
Medlem
Skrivet av anon182011:

Jag vill dock göra det så kort och effektivt som möjligt, så att man slipper skriva koden för stridssystemet 10 gånger. Hur ska jag gå tilllväga då?

Om strid tog två argument, spelare och fiende, så skulle du kunna återanvända den till varje strid.

Permalänk
Inaktiv
Skrivet av Fnorken:

Om strid tog två argument, spelare och fiende, så skulle du kunna återanvända den till varje strid.

Yapp, strid() tar två argument. Dock är problemet att om jag skriver tex if (fiende2.hp < 1) så gäller bara stridssystemet för fiende2 och inte alla andra fiender som stridssystemet ska använda.

Permalänk
Hedersmedlem

Snabb tanke:
Du skulle kunna ha en array(list) med dina 10 fiender och sen bara hämta ut fienden med Enemies[level] eller något sånt. Det är inte så bra om man vill expandera spelet till att ha ett godtyckligt antal fiender dock. Då måste du göra fienderna mer generella så du slipper mata in det manuellt.

Permalänk
Inaktiv
Skrivet av Shimonu:

Snabb tanke:
Du skulle kunna ha en array(list) med dina 10 fiender och sen bara hämta ut fienden med Enemies[level] eller något sånt. Det är inte så bra om man vill expandera spelet till att ha ett godtyckligt antal fiender dock. Då måste du göra fienderna mer generella så du slipper mata in det manuellt.

Tanken är att fienden ska bli svårare för varje nivå som går. Fiende1 är svår, fiende2 är svårare etc. Har man en array så vet jag inte hur det skulle funka då jag som du sa måste göra fienderna mer generella vilket jag inte vill.

Permalänk

Varför skapar du inte bara ett interface för fiende som du kan implementera med olika typer av fiender?

Permalänk
Inaktiv
Skrivet av D€lt@WuLf:

Varför skapar du inte bara ett interface för fiende som du kan implementera med olika typer av fiender?

Har inte lärt mig använda interface därav varför jag inte använder det.

Permalänk
Medlem
Skrivet av anon182011:

Yapp, strid() tar två argument. Dock är problemet att om jag skriver tex if (fiende2.hp < 1) så gäller bara stridssystemet för fiende2 och inte alla andra fiender som stridssystemet ska använda.

Visa gärna hur strid() tar två argument! För det är ju dom du skall använda istället för att hårdkoda fiende2 etc.

static void strid(argument1) // argument1 = fiende Console.WriteLine("Du stötte på" argument1.namn) //argument1 kommer vara fienden som du definerade att du ville använda. Attackera.blablabla if (argument1.hp < 1) Console.WriteLine("Du vann!") return "Victory" // här nedan startar jag funktionen. forstaStriden = strid(fiende1) if forstaStriden == "Victory" Console.WriteLine("Ok, dags att gå in i nästa rum.") andraStriden() = strid(fiende2) etc..

Sorry för väldigt illa skriven kod, men jag hoppas du förstår principen. Jag tror inte du har förstått riktigt hur funktioner används (hur man använder argument och retunerar värden ifrån dom). Samt vill jag reservera mig för att jag enbart kan python och vissa funktioner som att jämföra stringen "Victory" med en annan string kanske inte funkar i C# på samma sätt!

Men posta gärna hela din kod, då är det lättare att förstå hur du försöker arbeta.

Visa signatur
Permalänk
Inaktiv
Skrivet av bubbleq:

Visa gärna hur strid() tar två argument! För det är ju dom du skall använda istället för att hårdkoda fiende2 etc.

static void strid(argument1) // argument1 = fiende Console.WriteLine("Du stötte på" argument1.namn) //argument1 kommer vara fienden som du definerade att du ville använda. Attackera.blablabla if (argument1.hp < 1) Console.WriteLine("Du vann!") return "Victory" // här nedan startar jag funktionen. forstaStriden = strid(fiende1) if forstaStriden == "Victory" Console.WriteLine("Ok, dags att gå in i nästa rum.") andraStriden() = strid(fiende2) etc..

Sorry för väldigt illa skriven kod, men jag hoppas du förstår principen. Jag tror inte du har förstått riktigt hur funktioner används (hur man använder argument och retunerar värden ifrån dom). Samt vill jag reservera mig för att jag enbart kan python och vissa funktioner som att jämföra stringen "Victory" med en annan string kanske inte funkar i C# på samma sätt!

Men posta gärna hela din kod, då är det lättare att förstå hur du försöker arbeta.

Förlåt för sent svar då jag varit upptagen med läxor etc.
Klar med spelet nu iaf! Gjorde som ditt exempel + lite annat och det funkar skitbra! Nu måste jag bara balansera stats så att det blir en jämn svårighetsgrad vilket går på max en timme.

Har lärt mig mycket mer om klasser och funktioner nu iaf, hur man kan använda dem på bästa sätt istället för att hårdkoda! Tack till alla för all hjälp i denna tråden!