Avatar billede jannick281090 Nybegynder
19. januar 2008 - 11:24 Der er 26 kommentarer og
1 løsning

Hjælp til angrebs script til Browser Based Game

Hej eksperter.

Jeg er igang med et Online Browser Based Game g er nu nået til den del hvor folk skal kunne angribe hinanden, jeg har prøvet mig lidt frem men det ser ikke ud til at jeg kan få noget som helst til at lykkedes. Det jeg gerne vil have er at når en bruger angriber en anden skal der så komme en liste som følgende eksempel:

Bruger A ramte Bruger B for 123 skade.
Bruger B ramte Bruger A for 456 skade.
osv osv. indtil en af brugerne har 0 liv.

Scriptet vil nok være noget i stil med:
###########################################################
Do until Bruger_A_Life = 0 OR Bruger_B_Life = 0
Randomize
Bruger_A_Life = Bruger_A_Life
Bruger_A_MinDmg = 1
Bruger_A_MaxDmg = 100
Bruger_A_Dmg = Bruger_A_MaxDmg - Bruger_A_MinDmg + 1
Bruger_A_DmgRnd = Bruger_A_Dmg * Rnd()
Bruger_A_DmgRnd = Bruger_A_DmgRnd + Bruger_A_MinDmg
Bruger_A_DmgFinal = int(Bruger_A_DmgRnd)
Bruger_B_Life = int(Bruger_A_DmgFinal) - int(Bruger_B_Life)
Response.Write "Du skadede Bruger B for " & Bruger_A_DmgFinal & "<br>"

Randomize
Bruger_B_Life = Bruger_B_Life
Bruger_B_MinDmg = 1
Bruger_B_MaxDmg = 100
Bruger_B_Dmg = Bruger_B_MaxDmg - Bruger_B_MinDmg + 1
Bruger_B_DmgRnd = Bruger_B_Dmg * Rnd()
Bruger_B_DmgRnd = Bruger_B_DmgRnd + Bruger_A_MinDmg
Bruger_B_DmgFinal = int(Bruger_B_DmgRnd)
Bruger_A_Life = int(Bruger_B_DmgFinal) - int(Bruger_A_Life)
Response.Write "Du skadede Bruger A for " & Bruger_B_DmgFinal & "<br>"
Next
Loop
###########################################################

Dette er ikke helt korrekt, bare lige et hurtigt eksempel, har prøvet og prøvet men kan virkelig bare ikke få det til at virke.

Så hvis der er en der lige kan skrive sådan et script som virker så ville det virkelig blive værdsat, på forhånd tak.
Avatar billede w13 Novice
19. januar 2008 - 11:27 #1
Brug kun randomize én gang! Har erfaret, at det ellers rent faktisk kan gøre dine tilfældige tal forudsigelige. :)
Det skal kun sættes ind øverst i koden for at undgå, at tilfældige tal på denne side ikke minder om tilfældige tal på forrige side.
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 11:32 #2
Okay tak for oplysningen, men du kan vel ikke hjælpe mig nu du er her? :)
Avatar billede w13 Novice
19. januar 2008 - 11:38 #3
Hvad går galt, når du prøver det, du har skrevet?
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 11:48 #4
Ikke andet end at der ikke står noget på siden, har prøvet og gå koden igennem tonsvis af gange for at se hvad der kunne være galt og har byttet lidt rundt på variablerne/skrevet mere kode til og fjernet lidt og ligemeget hjælper det :)
Avatar billede w13 Novice
19. januar 2008 - 11:55 #5
Har du sat Bruger_A_Life og Bruger_B_Life til noget, inden du kører Do Until, for ellers vil de jo være 0 til at begynde med. Prøv evt. at udskrive Bruger_A_Life og Bruger_B_Life lige inden Do Until for at se, om de er sat rigtigt eller er lig med nul.
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 11:56 #6
Ja de er sat til 1000
Avatar billede w13 Novice
19. januar 2008 - 12:05 #7
Ser du heller ikke teksten:
Du skadede Bruger B for
Du skadede Bruger A for

Prøv evt. også at response.write etellerandet lige i begyndelsen af Do Until, så vi kan se, om den kører. Eller du kan måske bruge Response.Redirect "http://www.google.com"... Hvis den går til google, ved vi, at den er inde i løkken.

Kan jeg evt. se et link til siden med koden?
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:08 #8
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:14 #9
Nu fik jeg da en fejl, så den er da kommet ind i løkken nu i det mindste.

Fejltype:
Der opstod en Microsoft VBScript-kompileringsfejl (0x800A041F)
Uventet 'Next'
/AH/Test.asp, line 28
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:22 #10
Sådan der, nu funker det sku :D
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:26 #11
Godt nok fiksede jeg det selv, men w13 du skal sku have de point anyway :D
Du prøvede og du kom da lige med det tip omkring Randomize også.
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:26 #12
Smid et svar
Avatar billede nielle Nybegynder
19. januar 2008 - 12:42 #13
Bare et par råd:

Du skal nok rette:

Do until Bruger_A_Life = 0 OR Bruger_B_Life = 0

- til:

Do until Bruger_A_Life =< 0 OR Bruger_B_Life =< 0

for det er jo ikke sikkert at de rammer "lige på".

Desuden tager din nuværende kode ikke højde for at de to modstandere kan have forskellige våben eller rustning og om de kan have trænet sig.
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:46 #14
Nej det ved jeg godt, det skal jeg til at kode ind i nu, og med hensyn til:

Do until Bruger_A_Life =< 0 OR Bruger_B_Life =< 0

Så havde jeg allerede kodet det sådan hehe, men ellers tak :)
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:48 #15
Du kan jo evt. tjekke det ud nu, har lige poleret koden lidt med nogle IF sætninger og sådan.
http://flex.servegame.org/AH/Test.asp
Det virker vidst fint nu :)
Avatar billede nielle Nybegynder
19. januar 2008 - 12:53 #16
Jeg ville nok også vælge at putte koden for "BrugerX angeriber BrugerY" ud i en funktion. På den msåde slipper man for at gentage angrebs-koden for "BrugerA angriber BrugerB" i tilfældet "BrugerB angriber BrugerA".
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 12:54 #17
Bruger A de brugeren der angriber, og den der angriber får altid første slag så det er vidst fint nok sådan der :P
Avatar billede nielle Nybegynder
19. januar 2008 - 12:57 #18
Prøv at kigge på din kode igen - du gentager stort set bare den samme blok kode to gange - først for bruger A og dernæst for bruger B. Ved at flytte den ud i en funktion som du kalder 2 gange så får du en mere simpel løsning ud af det.
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 13:01 #19
Ja det er selvfølgelig rigtigt nok, men det gør mig sku ik så meget så længe det virker :D det vil bare blive lidt mere indviklet at kode videre på når jeg skal til at tage hensyn til hvilket udstyr brugerne har på osv.
Avatar billede nielle Nybegynder
19. januar 2008 - 13:01 #20
Som din kode ser ud lige nu er der sådan set ikke noget som hedder første slag: Du kunne lige så godt butte de to blokke kode om - og resultatet ville væare arkurat det samme. Dine to spillere angriber faktisk "på samme tid" - ikke "den ene og så den anden (hvis han i øvrigt stadig er i live)".
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 13:05 #21
Bruger B behøver ikke nødvendigvis at være online for at man kan angribe ham/hende, den der angriber slår først og har taget hensyn til at det ikke ender uafgjort:

If Session("Bruger_B_Life") > 0 Then
Session("Bruger_B_Life") = Session("Bruger_B_Life")
Bruger_B_MinDmg = 1
Bruger_B_MaxDmg = 100
Bruger_B_Dmg = Bruger_B_MaxDmg - Bruger_B_MinDmg + 1
Bruger_B_DmgRnd = Bruger_B_Dmg * Rnd()
Bruger_B_DmgRnd = Bruger_B_DmgRnd + Bruger_A_MinDmg
Bruger_B_DmgFinal = int(Bruger_B_DmgRnd)

Response.Write "Bruger B skadede dig for " & Bruger_B_DmgFinal & "<br>"
Session("Bruger_A_Life") = int(Session("Bruger_A_Life")) - int(Bruger_B_DmgFinal)
End If

Hvis Bruger B allerede er død angriber han/hun ikke mere og Bruger A har vundet.
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 13:07 #22
Men det er ikke kun brugerne der kan angribe hinanden individuelt, der er også en 2D verden man kan rende rundt i og dræbe monstre for at finde udstyr o.l
Avatar billede nielle Nybegynder
19. januar 2008 - 13:08 #23
Jeg foreslår at du laver det lidt i denne stil:

Randomize

Fuction Angreb(MinDmg, MaxDmg)
    Dmg = MaxDmg - MinDmg + 1
    DmgRnd = Dmg * Rnd()
    DmgRnd = DmgRnd + MinDmg
    DmgFinal = int(DmgRnd)

    Angreb = DmgFinal
End Function

Do until Bruger_A_Life <= 0 Or Bruger_B_Life <= 0
    ' A angriber
    DmgFinal = Angrib(1, 100)
    Bruger_B_Life = Bruger_B_Life - DmgFinal
    Response.Write "Du skadede Bruger B for " & DmgFinal & "<br>"

    If Bruger_B_Life > 0 Then
        ' B forsvare
        DmgFinal = Angrib(1, 100)
        Bruger_A_Life = Bruger_A_Life - DmgFinal
        Response.Write "Du skadede Bruger A for " & DmgFinal & "<br>"
    End If
Loop
Avatar billede jannick281090 Nybegynder
19. januar 2008 - 13:18 #24
Det ville godt nok gøre koden lidt mere kompakt og gøre det nemmere at implementere den bonus man får fra sit udstyr, men for mig betyder det ikke det store så længe det virker i længden :)
Avatar billede nielle Nybegynder
19. januar 2008 - 13:20 #25
Fint nok. Bare du ved at muligheden er der, og hvilke fordele den giver dig, så er jeg såmen tilfreds. :^)
Avatar billede w13 Novice
19. januar 2008 - 14:26 #26
Her er et lille svar fra mig i hvert fald. =)
Avatar billede w13 Novice
19. januar 2008 - 16:12 #27
Takker for point!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester