/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Pascal parser til et spil
Fra : Torben Jørgensen


Dato : 25-01-03 20:51

Hej Alle!!

Jeg sidder med et problem og har prøvet at løse det i en uges tid, men jeg
kan ikke regne den ud. Så jeg må have noget hjælp.

Jeg er ved at lave et statestik program til spillet MOH:AA eller Medal of
Honor Allied Assault. Jeg har en while løkke kørende, som først finder et
navn i en buddyliste, dette navn bliver sammenlignet med et "kill udtryk" i
en logfil, som spillet har outputtet. Problemet er at while løkken ikke kan
finde ud af om det er den ene spiller eller den anden spiller der har opnået
et kill jf. "kill udtrykket". Dvs løkken kan ikke finde ud af, hvor mange
gange en bestemt spiller har opnået et kill.

Jeg har følgende variabler til løkken:

budname: string; (spiller navn)
Temp1 :string; (kill udtryk)
No1 : LongInt; (tæller for antal kill jf kill udtryk)

Jeg har 3 stk tekst filer hvor af den ene er en liste med spillere navne,
med det associerede fil navn: readbuddylist".
Den anden fil er den log fil, som spillet har outputtet. Den har det
associerede navn: readlogfile.
Den tredie fil er en fil som jeg outputter resultatet til. Den har det
associerede navn: status.

Temp1 initaliseres med følgende:
Temp1:='clubbed by ';

No1 initialiseres med følgende:
No1:=0;

Min While løkker ser ud som følgende:

ReadLn(readbuddyfile, budname);
WriteLn(Tstatus, budname);
while not eof(readlogfile) do
begin
ReadLn(readlogfile, budname);
if pos(Temp1, budname) <> 0 then
inc(No1);
end;
incident1:=No1;
WriteLn(status, incident1);

Dette er en forkortet udgave af den logfil jeg søger spiller + kill i:

Et eller andet was clubbed by [B@dass Joe DK]
[B@dass Joe DK] was clubbed by Et eller andet

Det jeg får ud af ovenstående er, at løkken finder ud af at der er to
sætninger med en spiller ved navn [B@dass Joe DK] og der er to sætninger
hvor udtrykket "was clubbed by" indgår. Dvs. at spilleren [B@dass Joe DK]
får tildelt to kills og ikke, som det burde være, ét kill. Jeg kan
simpelthen ikke finde ud af at løse det. Jeg vil blive meget glad for
hjælp??

Mange hilsner
Torben



 
 
Harald (25-01-2003)
Kommentar
Fra : Harald


Dato : 25-01-03 21:03

"Torben Jørgensen" <vilfert@hotmail.com> skrev i en meddelelse
news:b0upnq$poe$1@sunsite.dk...
> Hej Alle!!
>
> Jeg sidder med et problem og har prøvet at løse det i en uges tid, men jeg
> kan ikke regne den ud. Så jeg må have noget hjælp.
>
> Jeg er ved at lave et statestik program til spillet MOH:AA eller Medal of
> Honor Allied Assault. Jeg har en while løkke kørende, som først finder et
> navn i en buddyliste, dette navn bliver sammenlignet med et "kill udtryk"
i
> en logfil, som spillet har outputtet. Problemet er at while løkken ikke
kan
> finde ud af om det er den ene spiller eller den anden spiller der har
opnået
> et kill jf. "kill udtrykket". Dvs løkken kan ikke finde ud af, hvor mange
> gange en bestemt spiller har opnået et kill.
>
> Jeg har følgende variabler til løkken:
>
> budname: string; (spiller navn)
> Temp1 :string; (kill udtryk)
> No1 : LongInt; (tæller for antal kill jf kill udtryk)
>
> Jeg har 3 stk tekst filer hvor af den ene er en liste med spillere navne,
> med det associerede fil navn: readbuddylist".
> Den anden fil er den log fil, som spillet har outputtet. Den har det
> associerede navn: readlogfile.
> Den tredie fil er en fil som jeg outputter resultatet til. Den har det
> associerede navn: status.
>
> Temp1 initaliseres med følgende:
> Temp1:='clubbed by ';
>
> No1 initialiseres med følgende:
> No1:=0;
>
> Min While løkker ser ud som følgende:
>
> ReadLn(readbuddyfile, budname);
> WriteLn(Tstatus, budname);
> while not eof(readlogfile) do
> begin
> ReadLn(readlogfile, budname);
> if pos(Temp1, budname) <> 0 then
> inc(No1);
> end;
> incident1:=No1;
> WriteLn(status, incident1);
>
> Dette er en forkortet udgave af den logfil jeg søger spiller + kill i:
>
> Et eller andet was clubbed by [B@dass Joe DK]
> [B@dass Joe DK] was clubbed by Et eller andet
>
> Det jeg får ud af ovenstående er, at løkken finder ud af at der er to
> sætninger med en spiller ved navn [B@dass Joe DK] og der er to sætninger
> hvor udtrykket "was clubbed by" indgår. Dvs. at spilleren [B@dass Joe DK]
> får tildelt to kills og ikke, som det burde være, ét kill. Jeg kan
> simpelthen ikke finde ud af at løse det. Jeg vil blive meget glad for
> hjælp??

Hvad med at ændre din if sætning til:
if pos(Temp1, budname)>3 then

Mvh
HK




N/A (25-01-2003)
Kommentar
Fra : N/A


Dato : 25-01-03 22:20



Torben Jørgensen (25-01-2003)
Kommentar
Fra : Torben Jørgensen


Dato : 25-01-03 22:20


"Harald" <swobu@kroning.dk> wrote in message
news:3e32ef5e$0$213$edfadb0f@dread14.news.tele.dk...
> "Torben Jørgensen" <vilfert@hotmail.com> skrev i en meddelelse
> news:b0upnq$poe$1@sunsite.dk...
> > Hej Alle!!
> >
> > Jeg sidder med et problem og har prøvet at løse det i en uges tid, men
jeg
> > kan ikke regne den ud. Så jeg må have noget hjælp.
> >
> > Jeg er ved at lave et statestik program til spillet MOH:AA eller Medal
of
> > Honor Allied Assault. Jeg har en while løkke kørende, som først finder
et
> > navn i en buddyliste, dette navn bliver sammenlignet med et "kill
udtryk"
> i
> > en logfil, som spillet har outputtet. Problemet er at while løkken ikke
> kan
> > finde ud af om det er den ene spiller eller den anden spiller der har
> opnået
> > et kill jf. "kill udtrykket". Dvs løkken kan ikke finde ud af, hvor
mange
> > gange en bestemt spiller har opnået et kill.
> >
> > Jeg har følgende variabler til løkken:
> >
> > budname: string; (spiller navn)
> > Temp1 :string; (kill udtryk)
> > No1 : LongInt; (tæller for antal kill jf kill udtryk)
> >
> > Jeg har 3 stk tekst filer hvor af den ene er en liste med spillere
navne,
> > med det associerede fil navn: readbuddylist".
> > Den anden fil er den log fil, som spillet har outputtet. Den har det
> > associerede navn: readlogfile.
> > Den tredie fil er en fil som jeg outputter resultatet til. Den har det
> > associerede navn: status.
> >
> > Temp1 initaliseres med følgende:
> > Temp1:='clubbed by ';
> >
> > No1 initialiseres med følgende:
> > No1:=0;
> >
> > Min While løkker ser ud som følgende:
> >
> > ReadLn(readbuddyfile, budname);
> > WriteLn(Tstatus, budname);
> > while not eof(readlogfile) do
> > begin
> > ReadLn(readlogfile, budname);
> > if pos(Temp1, budname) <> 0 then
> > inc(No1);
> > end;
> > incident1:=No1;
> > WriteLn(status, incident1);
> >
> > Dette er en forkortet udgave af den logfil jeg søger spiller + kill i:
> >
> > Et eller andet was clubbed by [B@dass Joe DK]
> > [B@dass Joe DK] was clubbed by Et eller andet
> >
> > Det jeg får ud af ovenstående er, at løkken finder ud af at der er to
> > sætninger med en spiller ved navn [B@dass Joe DK] og der er to sætninger
> > hvor udtrykket "was clubbed by" indgår. Dvs. at spilleren [B@dass Joe
DK]
> > får tildelt to kills og ikke, som det burde være, ét kill. Jeg kan
> > simpelthen ikke finde ud af at løse det. Jeg vil blive meget glad for
> > hjælp??
>
> Glem mit første svar og prøv dette i stedet:
>
> ReadLn(readlogfile, Temp1);
> if pos('was clubbed by ['+budname, Temp1)>0 then
> inc(No1);
>
> Mvh
> HK
>
<KLIP>

>
> > Glem mit første svar og prøv dette i stedet:
> >
> > ReadLn(readlogfile, Temp1);
> > if pos('was clubbed by ['+budname, Temp1)>0 then
> > inc(No1);
> >
> > Mvh
> > HK
> >
> Hey HK
> Tak for dit svar.
> Det virkede ikke helt, nu får [B@dass Joe DK] tildelt 0 kills og ikke 1
> kill, som det burder være.
> Har du et andet forslag, vil jeg være meget taknemmelig?

Jeg kan ikke se hvorfor det ikke skulle virke, men prøv at spørg i NG´en

Mvh
HK




Torben Jørgensen (25-01-2003)
Kommentar
Fra : Torben Jørgensen


Dato : 25-01-03 22:26


"Torben Jørgensen" <vilfert@hotmail.com> wrote in message
news:b0uuu7$eoe$1@sunsite.dk...
>
> "Harald" <swobu@kroning.dk> wrote in message
> news:3e32ef5e$0$213$edfadb0f@dread14.news.tele.dk...
> > "Torben Jørgensen" <vilfert@hotmail.com> skrev i en meddelelse
> > news:b0upnq$poe$1@sunsite.dk...
> > ReadLn(readlogfile, Temp1);
> > if pos('was clubbed by ['+budname, Temp1)>0 then
> > inc(No1);
> >
> > Mvh
> > HK
> >
> <KLIP>
>
> >
> > > Glem mit første svar og prøv dette i stedet:
> > >
> > > ReadLn(readlogfile, Temp1);
> > > if pos('was clubbed by ['+budname, Temp1)>0 then
> > > inc(No1);
> > >
> > > Mvh
> > > HK
> > >
> > Hey HK
> > Tak for dit svar.
> > Det virkede ikke helt, nu får [B@dass Joe DK] tildelt 0 kills og ikke 1
> > kill, som det burder være.
> > Har du et andet forslag, vil jeg være meget taknemmelig?
>
> Jeg kan ikke se hvorfor det ikke skulle virke, men prøv at spørg i NG´en
>
> Mvh
> HK
>
Sorry jeg sidder og fumler lidt med det her nyhedsgruppe halløj, jeg er helt
ny i denne forbindelse.
Haralds udemærkede forslag, gør at det nu kun er den initialiserde variabel
der udskrives med sin initialiserede værdi, nemlig 0. Alså 0 kill istedet
for 1 kill. Det virker på mig som om at sætningen:

if pos('was clubbed by '+budname, Temp1)>0 then

Slet ikke kommer i spil??

Hilsen Torben
>



Harald (25-01-2003)
Kommentar
Fra : Harald


Dato : 25-01-03 22:41

"Torben Jørgensen" <vilfert@hotmail.com> skrev i en meddelelse
news:b0uva3$flu$1@sunsite.dk...
>
> "Torben Jørgensen" <vilfert@hotmail.com> wrote in message
> news:b0uuu7$eoe$1@sunsite.dk...
> >
> > "Harald" <swobu@kroning.dk> wrote in message
> > news:3e32ef5e$0$213$edfadb0f@dread14.news.tele.dk...
> > > "Torben Jørgensen" <vilfert@hotmail.com> skrev i en meddelelse
> > > news:b0upnq$poe$1@sunsite.dk...
> > > ReadLn(readlogfile, Temp1);
> > > if pos('was clubbed by ['+budname, Temp1)>0 then
> > > inc(No1);
> > >
> > > Mvh
> > > HK
> > >
> > <KLIP>
> >
> > >
> > > > Glem mit første svar og prøv dette i stedet:
> > > >
> > > > ReadLn(readlogfile, Temp1);
> > > > if pos('was clubbed by ['+budname, Temp1)>0 then
> > > > inc(No1);
> > > >
> > > > Mvh
> > > > HK
> > > >
> > > Hey HK
> > > Tak for dit svar.
> > > Det virkede ikke helt, nu får [B@dass Joe DK] tildelt 0 kills og ikke
1
> > > kill, som det burder være.
> > > Har du et andet forslag, vil jeg være meget taknemmelig?
> >
> > Jeg kan ikke se hvorfor det ikke skulle virke, men prøv at spørg i NG´en
> >
> > Mvh
> > HK
> >
> Sorry jeg sidder og fumler lidt med det her nyhedsgruppe halløj, jeg er
helt
> ny i denne forbindelse.
> Haralds udemærkede forslag, gør at det nu kun er den initialiserde
variabel
> der udskrives med sin initialiserede værdi, nemlig 0. Alså 0 kill istedet
> for 1 kill. Det virker på mig som om at sætningen:
>
> if pos('was clubbed by '+budname, Temp1)>0 then
>
> Slet ikke kommer i spil??

Det burde virke, du kan evt. prøve at sende de 2 logfiler til mig.

Mvh
HK



Harald (26-01-2003)
Kommentar
Fra : Harald


Dato : 26-01-03 00:20

"Harald" <swobu@kroning.dk> skrev i en meddelelse
news:3e330452$0$218$edfadb0f@dread14.news.tele.dk...
> "Torben Jørgensen" <vilfert@hotmail.com> skrev i en meddelelse
> news:b0uva3$flu$1@sunsite.dk...

<KLIP en masse>

> > > > > Glem mit første svar og prøv dette i stedet:
> > > > >
> > > > > ReadLn(readlogfile, Temp1);
> > > > > if pos('was clubbed by ['+budname, Temp1)>0 then
> > > > > inc(No1);

<KLIP en masse>

> > Sorry jeg sidder og fumler lidt med det her nyhedsgruppe halløj, jeg er
> helt
> > ny i denne forbindelse.
> > Haralds udemærkede forslag, gør at det nu kun er den initialiserde
> variabel
> > der udskrives med sin initialiserede værdi, nemlig 0. Alså 0 kill
istedet
> > for 1 kill. Det virker på mig som om at sætningen:
> >
> > if pos('was clubbed by '+budname, Temp1)>0 then
> >
> > Slet ikke kommer i spil??
>
> Det burde virke, du kan evt. prøve at sende de 2 logfiler til mig.

Jeg har fået de 2 logfiler:
qconsole.log
Et eller andet was clubbed by [B@dass Joe DK]
[B@dass Joe DK] was clubbed by Et eller andet

og BuddyList.txt
[B@dass Joe Dk]
Et eller andet
[B@dass Richie DK]

i din qconsole.log er DK i B@dass Joe DK med stort, det er det ikke i
BuddyList.txt, så derfor kan du lave de strenge du sammenligner om til store
eller små bogstaver dvs. at efter du har indlæst budname med
ReadLn(readbuddyfile, budname); så lav budname om ved at kalde f.eks.
budname:=AnsiUpperCase(budname);

og det samme med Temp1 efter ReadLn(readlogfile, Temp1); indsætter du:
Temp1:=AnsiUpperCase(Temp1);

da [ er med i de enkelte navne i BuddyList.txt skal denne ikke være i if
sætningen så lav den om til dette:
if pos('CLUBBED BY '+budname, Temp1)>0 then
inc(No1);

bemærk at CLUBBED BY nu skal skrives med stort:

Mvh
HK



Torben Jørgensen (26-01-2003)
Kommentar
Fra : Torben Jørgensen


Dato : 26-01-03 01:12

Hey Harald
LOL, HVOR DUM KAN MAN VÆRE?!?!?!?
Det havde jeg ikke lige gennemskuet at jeg havde stavet forkert hehe. Det
betyder at dit første forslag virker perfekt!!
Så har jeg kun et problem tilbage. Jeg har tildelt spilleren med navnet "Et
eller andet", 3 kills af typen "clubbed by" og har lagt en repeat løkke
omkring min while løkket, det hele ser sådan ud:

repeat
No1:=0;
ReadLn(readbuddyfile, budname);
WriteLn(Tstatus, budname);
while not eof(readlogfile) do
begin
ReadLn(readlogfile, Temp1);
if pos('was clubbed by '+budname, Temp1) > 0 then
inc(No1);
end;
incident1:=No1;
WriteLn(Tstatus, incident1);
until eof(readbuddyfile);

Men når hele løkke strukturen går igang med at parse for det andet navn dvs.
spilleren med navnet "Et eller andet", så får denne spiller tildelt 0 kills,
hvor det skulle være 3. Hvis du kan klare den så har jeg fået løst alle
problemer??

Forøvrigt mange tak fordi du gad bruge tid på det

Hilsner Torben
> Jeg har fået de 2 logfiler:
> qconsole.log
> Et eller andet was clubbed by [B@dass Joe DK]
> [B@dass Joe DK] was clubbed by Et eller andet
>
> og BuddyList.txt
> [B@dass Joe Dk]
> Et eller andet
> [B@dass Richie DK]
>
> i din qconsole.log er DK i B@dass Joe DK med stort, det er det ikke i
> BuddyList.txt, så derfor kan du lave de strenge du sammenligner om til
store
> eller små bogstaver dvs. at efter du har indlæst budname med
> ReadLn(readbuddyfile, budname); så lav budname om ved at kalde f.eks.
> budname:=AnsiUpperCase(budname);
>
> og det samme med Temp1 efter ReadLn(readlogfile, Temp1); indsætter du:
> Temp1:=AnsiUpperCase(Temp1);
>
> da [ er med i de enkelte navne i BuddyList.txt skal denne ikke være i if
> sætningen så lav den om til dette:
> if pos('CLUBBED BY '+budname, Temp1)>0 then
> inc(No1);
>
> bemærk at CLUBBED BY nu skal skrives med stort:
>
> Mvh
> HK
>
>



Harald (26-01-2003)
Kommentar
Fra : Harald


Dato : 26-01-03 01:26

"Torben Jørgensen" <vilfert@hotmail.com> skrev i en meddelelse
news:b0v901$irf$1@sunsite.dk...
> Hey Harald
> LOL, HVOR DUM KAN MAN VÆRE?!?!?!?
> Det havde jeg ikke lige gennemskuet at jeg havde stavet forkert hehe. Det
> betyder at dit første forslag virker perfekt!!
> Så har jeg kun et problem tilbage. Jeg har tildelt spilleren med navnet
"Et
> eller andet", 3 kills af typen "clubbed by" og har lagt en repeat løkke
> omkring min while løkket, det hele ser sådan ud:
>
> repeat
> No1:=0;
> ReadLn(readbuddyfile, budname);
> WriteLn(Tstatus, budname);
> while not eof(readlogfile) do
> begin
> ReadLn(readlogfile, Temp1);
> if pos('was clubbed by '+budname, Temp1) > 0 then
> inc(No1);
> end;
> incident1:=No1;
> WriteLn(Tstatus, incident1);
> until eof(readbuddyfile);
>
> Men når hele løkke strukturen går igang med at parse for det andet navn
dvs.
> spilleren med navnet "Et eller andet", så får denne spiller tildelt 0
kills,
> hvor det skulle være 3. Hvis du kan klare den så har jeg fået løst alle
> problemer??
>
> Forøvrigt mange tak fordi du gad bruge tid på det

Efter 1. gennemløb i din while do er filepos på readlogfile slutningen af
filen, dvs. at ved starten af næste gennemløb er eof(readlogfile) true. Da
det er en text fil mener jeg ikke der er andre muligheder for at få filepos
til starten af filen end af lukke og åbne filen igen. En løsning er derfor
at åbne readlogfile lige før din while do løkke og lukke den lige efter. En
bedere løsning IMHO ville være at benytte en TStringList.

Mvh
HK


<KLIP>



Torben Jørgensen (26-01-2003)
Kommentar
Fra : Torben Jørgensen


Dato : 26-01-03 12:25

Hej Harald

Jeg ved rent faktisk intet om programering når det kommer til stykket. Jeg
har prøvet at fedte lidt med Pascal 7.0 det er det hele. Det jeg har gjordt
er at jeg har min Pascal kode ind i units i Delphi 7, hvor jeg så har nogle
knapper der aktivere koden. Så TstringList etc er ikke noget jeg har prøvet
før.

Men jeg opdagede at man ikke bare kan "klistre" de næste kills på den if
sætning vi lavede igår med en else. Så jeg tror jeg vil lave det som
procedure. Hvor den første finder navnet i en navne liste, overføre navnet
til en procedure der leder efter kills i log listen.

Hilsen Torben
> Efter 1. gennemløb i din while do er filepos på readlogfile slutningen af
> filen, dvs. at ved starten af næste gennemløb er eof(readlogfile) true. Da
> det er en text fil mener jeg ikke der er andre muligheder for at få
filepos
> til starten af filen end af lukke og åbne filen igen. En løsning er derfor
> at åbne readlogfile lige før din while do løkke og lukke den lige efter.
En
> bedere løsning IMHO ville være at benytte en TStringList.
>
> Mvh
> HK
>
>
> <KLIP>
>
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste