• Forum
      /  
    Programmering og webdesign
      /  
    Programmering
  • 19-02-2015 · 14:16 1970 visninger 23 svar
  • Denne tråd er over 6 måneder gammel

    Er du sikker på, at du har noget relevant at tilføje?

  • C# spil - random angreb + tekst samt mere

    Af NoName27 Ny på siden
hey hol
jeg er godt igang med et tekst figting game i CMD i C# men jeg har lidt problemer pt.
Jeg har 4 characters, som skal angribe hinanden randomly samt der skal komme en tekst med.
jeg har prøvet lidt af hver men kan ikke få det til at fungerer, mit seneste forsøg ser sådan ud: (det er kun et eksempel med 2 characters)
http://puu.sh/g3AR9/82254eb0c5.PNG
men den vil ikke tage i mod min attack kommando
cThraceSpartacus.Attack(cGualCrixus) er min attack kommando, som skal med samt tekst.
alle characters skal altså have en chance for at angribe de 3 andre characters.
en anden ting er at når 1 character er nået ned på 0 hp, så skal man ikke kunne angribe ham, så det nu kun er 3 mod hinanden, når den næste så dør, så er det 2 mod i hinanden og til sidst vinderen.

håber i forstår hvad jeg mener her og tak på forhånd :)
p.s jeg er ny til programmering, bare lige så i ved det ^^
edit: jeg har fået lavet et lille spil men det er kun med 2 characters.

Monsterbruger
19-02-2015 14:27
Start med at flytte din random uden for loopet, ellers kan du ikke regne med at det er særligt random.

For det andet skal der {} rundt om de linier kode der er en del af et if statement, så længe der er tale om mere end 1 linie kode
Guru
19-02-2015 14:28
Du skal ikke lave en ny tilfældigtalsgenerator i hvert gennemløb.
Så flyt Random generator erklæringen ud af løkken.

Det er jo en stump grafik, du linker til. Du skal give os kildekoden som tekst.

Umiddelbart kan det, du viser os, slet ikke kompilere.

Det er en god ide altid at bruge krøllede parenteser i if...else
Elite Supporter
19-02-2015 14:30
Først og fremmest, { } { }, de mangler, sæt dem ind (din if)
[CODE]if(noget) {Ting i din; if sætning;}else{Ting; i din else;}[/CODE]
Du kan godt lave en if else uden, men så må hver af dem KUN indeholde en line (et ;)
Så en god regl er altid at sætte dem ind, medmindre du har en god grund.

Der efter, du er klar over at Random.Next(i) betyder at den ved første "gennemløb" kan være mellem 0 og 1, mens den ved sidste gennemløb er 0 til 50, det vil sige at chancen bliver mindre og mindre for at "spartacus" kan angribe og chancen for at "crixus" bliver mærkant større (49 til 1 i sidste gennemløb)?
Ultra Supporter
19-02-2015 14:39
#1 og #2 det med {} var en fejl men den er rettet nu og random er smidt uden for løkken
#3 det med random.next vidste jeg ikke nej, planen er at chancen skal være lige så stor alle gangene selvfølgelig, så hvordan skal den så laves? :)
Junior Nørd
19-02-2015 14:46
#4 - Hvis du bare skifter i ud med 1, altså random.Next(1), så bør den altid spytte 1 eller 0 ud, og så har du 50/50% chance.
CDK

#6

Skribent
19-02-2015 14:47
der er flere ting der kunne være lavet smartere:

1)
Smid "Random random = new Random();" ud af dit for-loop..
Problemet er at du laver et nyt random-objekt hver gang.. måden random er bygget op på gør at den udregning den laver der giver et "tilfældigt" tal, som bliver baseret på et seed. Hvis du genbruger random objectet så bruger den samme seed (seedet bliver i første gang lavet baseret på klokken og en masse andet).. Hvis det ikke giver mening så læs evt op på Random :)
Så ved at bruge samme Random-object, så sørger du for at den ikke får samme tal

2)
hvorfor bruger du random.next(i)?

random.next(i) giver et tilfældigt tal mellem 0 (inklusivt) og i (ekslusivt)..

Så som du har det nu sker random.next(i) som følgende:
første call = tal mellem 0 og -1
andet call = tal mellem 0 og 0
tredje = 0 og 1

osv..

derfor bliver chancen mindre og mindre og opfører sig antageligvis anderledes end du forventer..

3)
du mangler brackets ved både if/else statements:
lige nu sker det som følger:
hvis random.next(i) == 0 så skriver den til consolen.
uanset hvad random.next(i) er, så angriber den.
(og det samme sker ved 'else')

skriv istedet:
[CODE]
if(random.next(i) == 0)
{
Console.WriteLine("blablabal");
guy.attack(otherguy);
}
[/CODE]
osv (med de rigtige navne osv :)


Also - brug pastebin eller lignende en anden gang :) så kan du smide teksten ind, istedet for et billede deraf - det gør det lettere at overskue :)

EDIT: too late
Ultra Supporter
19-02-2015 15:05
#5 fungerer ikke, den første sætning "if" har nu 100% chance
#6 jeg takker for dit uddybende svar :)
siden random.next ikke kan bruges, hvad skal jeg så have fat i?
Junior Nørd
19-02-2015 15:08
#7 - Ah, upper bound er eksklusiv i Random.Next, skriver #6, så skal det jo bare være random.Next(2).
Ultra Supporter
19-02-2015 15:11
#8 super det fungerer nu :)
problemet er bare at der bliver ikke angrebet, det er kun teksten med "spartacus attacks crixus" osv, som dukker op og ikke at de skader hinanden.
inden jeg lavede random, så skadede de hinanden.
vil i have hele min kode?
Znake

#10

Junior Nørd
19-02-2015 15:13
Sæt er breakpoint ved din if, og step igennem, og se om den rent faktisk får kaldt din attack metode, eller hvad der sker.

Og smid eventuelt din kode på http://pastebin.com/ - så er det nemmere for os at følge med.
Ultra Supporter
19-02-2015 15:20
#10 den bliver ikke hentet :)
jeg har lige prøvet og smidt det i pastebin:
http://pastebin.com/cvRaW15V
virker det?
CDK

#12

Skribent
19-02-2015 16:51
#11 du kan optimere din kode en masse med Lists/arrays og lignende :)

Hvis du har lyst til noget mere dybde gående hjælp så kan jeg hjælpe over skype eller lignende.. :)

ydermere kan jeg meget anbefale Heads First C# - den er rimelig humoristisk indgangsvinkel til C#, og er derfor rimelig 'let' selvom der er 800 sider ish... er lige blevet færdig med den, efter at have brugt C# i 2 år på "noob" niveau - mange ting jeg fik lært af den. klart at anbefale :)

Et 'trick' er at smide debugging text ind, det er en god måde at forstå hvordan din kode fungerer.. så jeg ville evt ændre din Attack() class til:

[CODE]public void Attack(Character EnemyCharacter)
{
double DamageDone = this.attack * (1-(EnemyCharacter.armor / 200));
int randNum = dodgeRandom.Next(1, 101);
Console.WriteLine(this.name + " attacked " +EnemyCharacter.name + " - randNum = "+randNum+" & and have a dogde score of" +EnemyCharacter.dodge + " with a dmg of="+DamageDone);
if (randNum > EnemyCharacter.dodge)
{
EnemyCharacter.health = EnemyCharacter.health - DamageDone;
}
}[/CODE]

Så kan du også følge med i hvad der sker - men breakpoints og så at step igennem koden er også en god løsning :)

Melder koden fejl? prøvede du at step igennem koden?

Ydermere er der en masse 'gode' tommelfinger regler mht. navngivning osv som er godt at få på rygraden i starten.. De er ikke 'lovpligtige' men gør koden lettere og læse for dig og andre :) Igen - Overvej at kig på Heads First C#, eller en lign bog, og så bare kom igennem det, selvom det virker tungt osv! :)
Ultra Supporter
20-02-2015 17:40
#12 jeg vil nok kigge nærmere på heads first C# :)
koden melder ingen fejl nej.
billede af hver der sker:
http://puu.sh/g59vG/ce8311555a.PNG
den skal gerne opdater med statsene, som du kan se i starten men det er ligesom at min angreb kode ikke bliver hentet
Ultra Supporter
20-02-2015 19:28
jeg fik det til at virke med switch/case :D
http://pastebin.com/BtnfkJBX
men nu har jeg et nyt problem, hvordan tilføjer jeg stats til de 2 sidste characters "gannicus" og "oenomaus", da jeg jo har brugt if og else ved "spartacus" og "crixus" :)
Nørd
20-02-2015 21:22
14#
If(...)
else if (...)
...
else

Men du burde måske overveje, at lave en klasse "Homeland" som indeholder stats. Så kunne Character tage Homeland og så få dens attributter, så slap du for en masse if else for hvert Homeland.
Repete

#16

Guru
20-02-2015 22:44
Du har stadig Random generatoren inde i en while løkke. Den skal ud i yderste niveau.
Ultra Supporter
20-02-2015 22:50
#16 ja sorry, glemte det helt men jeg flytter den lige :).
#15 super, jeg roder lige videre med det i morgen! :)
Ultra Supporter
21-02-2015 16:08
Jeg har nu fået lavet en class stats til class character (prøvet i hvert fald) men problemet er nu at den stadig kun viser spartacus og crixus men nu får ingen af dem damage
http://pastebin.com/nJseXmm9
nogle gode ideer? :)
Ultra Supporter
21-02-2015 16:22
..
Gæsten

#20

Gæst
21-02-2015 17:11
Hvor meget af det du har nu har du fået hjælp til at lave?

Jeg tror du bliver nødt til at læse en eller anden C# for kids da det mest af alt ligner du bare prøver at indsætte tilfældige liniers kode.
Ultra Supporter
21-02-2015 17:19
#20 dejlig brugbar kommentar fra en gæst men det er jo typisk efterhånden ^^
Nørd
21-02-2015 17:36
din stats klasse skal ikke have en Main. Initialiser dine characters i din Program.Main
Ultra Supporter
21-02-2015 18:14
#22 har fået det til at virke nu, jeg takker for hjælpen :)
Bruger påkrævet
En bruger er påkrævet for at oprette svar på Hardwareonline.dk
Du kan oprette en bruger her eller logge ind her

Log ind for at få flere funktioner