Avatar billede hclarsen Nybegynder
11. april 2006 - 12:21 Der er 10 kommentarer og
1 løsning

forklaring af mere kode

hej eksperter - i følgende kode er der nogle ting jeg ikke helt kan se, hvorfor bliver gjort som de gøres. I kan eventuelt se den foregående tråd omkring "forklaring af kode" - det er samme emne

function TfrMain.GamePlay(xo_Move : Integer):integer;
var
x, y : 1..3;
iWin : integer;
begin
Result := -1;

Inc(iMove);
x := (xo_Move Div 3) + 1;    // hvorfor skal der lægges 1 til?
y := (xo_Move Mod 3) + 1;

if sPlaySign = 'O' then
begin
  iOPos[x,y] := 1;              // hvorfor omregnes det til 1?
  iWin := CheckWin(iOPos);
end
else
begin
  iXPos[x,y] := 1;
  iWin := CheckWin(iXPos);
end;

TLabel(FindComponent('lblCell' + IntToStr(xo_Move))).Caption := sPlaySign;

Result := iWin;

if iWin >= 0 then
begin
  bGameOver := True;

  if sPlaySign = 'X' then
  begin
    iXScore := iXScore + 1;
  end
  else
  begin
    iOScore := iOScore + 1;
  end;

  ShowMessage(sPlaySign + ' - Wins!');
end;

if (iMove = 9) AND (bGameOver = False) Then
begin
  ShowMessage('It''s a Draw!');
  bGameOver := True
end;

if sPlaySign = 'O' Then
  sPlaySign := 'X'
else
  sPlaySign := 'O';
end;

procedure TfrMain.lblCell0Click(Sender: TObject);
var
  iWin : integer;
  CellIndex : 0..8;
begin
if bGameOver = True Then Exit;
if TLabel(Sender).Caption <> '' then
begin
  ShowMessage('Cell ocupied!');
  Exit;
end;
CellIndex := StrToInt(RightStr(TLabel(Sender).Name,1));
iWin := GamePlay(CellIndex); // hvad gør dette?!
end;
Avatar billede arne_v Ekspert
11. april 2006 - 12:26 #1
(xo_Move Div 3) giver et tal 0..2

(xo_Move Div 3) + 1 giver et tal 1..3

man skal vel bruge det sidste fordi de arrays man bruger starter i 1
Avatar billede hclarsen Nybegynder
11. april 2006 - 12:30 #2
Nummeringenen begynder ved 0
Avatar billede nielle Nybegynder
11. april 2006 - 12:34 #3
A)

Inc(iMove);
x := (xo_Move Div 3) + 1;    // hvorfor skal der lægges 1 til?
y := (xo_Move Mod 3) + 1;

Fordi at "xo_Move Div 3" og "xo_Move Mod 3" giver tal i intervallet 0-2. Imidlertid er matricen indekseret 1-3.


B)

if sPlaySign = 'O' then
begin
    iOPos[x,y] := 1;              // hvorfor omregnes det til 1?
    iWin := CheckWin(iOPos);
end
else
begin
    iXPos[x,y] := 1;
    iWin := CheckWin(iXPos);
end;

Den troede jeg at vi havde været igennem?

Der er to matricer iOPos og iXPos som indeholder positionerne for hhv. O'erne og X'erne. Hvis der står et 1-tal i en matrice så er der et O/X og hvis der står 0 så er der ikke noget (jo måske i den anden matrice).

Variablen sPlaySign indeholder et 'O' hvis det er O-spilleren som placere sin brik (og sikkert et 'X' hvis det er den anden spiller). Derfor testes der på om sPlaySign er lig med 'O' og hvis det er, så placeres der et 1-tal i iOPos-matricen for at markere at det var et O. Og ellers placeres et 1-tal i iXPos-matricen for at markere at det var et X i stedet.


C)

procedure TfrMain.lblCell0Click(Sender: TObject);
    var
        iWin : integer;
        CellIndex : 0..8;
begin
    if bGameOver = True Then Exit;
    if TLabel(Sender).Caption <> '' then
    begin
        ShowMessage('Cell ocupied!');
        Exit;
    end;
    CellIndex := StrToInt(RightStr(TLabel(Sender).Name, 1));
    iWin := GamePlay(CellIndex); // hvad gør dette?!
end;

Meningen er vist at "den næste spiller" indtaster sit træk i et felt i brugergrænsefalden. Dette havner i variablen CellIndex.

Kaldet til GamePlay() sørger så for at den rigtige brik indsættes på feltet. Det svare simpelthen til at der spilles en runde.
Avatar billede hclarsen Nybegynder
11. april 2006 - 12:37 #4
Der lægger da en stor matematisk tanke bag dette, lader det til.

"Mod" er jo resten ved en heltalsdivision, så hvordan kan det være, at

y := (xo_Move Mod 3) + 1; giver [0..2]? 1 mod 3 giver vel 0, og + 1 = 1 - og ligeså med 2 og 3?
Avatar billede nielle Nybegynder
11. april 2006 - 12:40 #5
Det er nu (xo_Move Mod 3) som ligger i intervallet 0..2.

(xo_Move Mod 3)+1 ligger dermed i intervattet 1..3.
Avatar billede hclarsen Nybegynder
11. april 2006 - 12:56 #6
(xo_Move Div 3) giver da 0..1?
Avatar billede nielle Nybegynder
11. april 2006 - 12:59 #7
Jeg går ud fra at xo_Move er et tal i intervallet 0..8, og i så fald ligger xo_Move Div 3 i intervallet 0..2:

xo_Move, xo_Move Div 3
0, 0
1, 0
2, 0
3, 1
4, 1
5, 1
6, 2
7, 2
8, 2
Avatar billede hclarsen Nybegynder
12. april 2006 - 18:17 #8
Ok, mange tak Nielle. Jeg har endnu et spørgsmål. I http://delphi.about.com/library/code/ncaa021803a.htm returnerer funktionen "checkwin" en værdi mellem 0..8 - er denne integer result?
Avatar billede nielle Nybegynder
12. april 2006 - 22:49 #9
Ja, tallenne 0..8 er ganske rigtigt integer.

Men funktionen checkwin vil nu snarer give et af tallene -1, 0, 1, eller 2. Jeg ved ikke lige hvor at du får 0..8 fra?
Avatar billede hclarsen Nybegynder
12. april 2006 - 23:21 #10
Hmm, glem det - jeg kiggede ikke på koden ordentligt. Jeg ser meget gerne, at du lægger et svar. Iøvrigt er der vist også en foregående tråd, hvor du også gerne må lægge et svar
Avatar billede nielle Nybegynder
13. april 2006 - 08:40 #11
Den anden tråd er da vist lukket :^)

... og et svar :^)
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

IT-JOB

Styrelsen for Grøn Arealomlægning og Vandmiljø

Teamleder til Application Management

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Teamleder til AL Sydbanks GDPR & Tech Regulation i Aabenraa