uses tpu3,graph,crt;

const
  toekenning  :array[65..90,1..2] of byte =
               ((6,1),(2,3),(2,3),(5,1),(18,1),(1,5),(4,2),(3,2),(6,1),
               (2,4),(2,4),(3,2),(2,3),(10,1),(6,1),(2,3),(1,10),(6,1),
               (3,1),(6,1),(2,4),(2,4),(2,4),(1,8),(1,8),(2,6));

const
  scoreletters :array[1..100] of byte =
               (1,1,1,1,1,1,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,5,2,2,2,2,2,2,2,1,1,1,1,1,1,4,4,4,4,2,2,2,3,3,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,3,3,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,4,4,4,4,4,4,8,8,6,6);

const
  aantalletters:array[1..100] of string =
               ('A','A','A','A','A','A','B','B','C','C','D','D','D','D','D',
                'E','E','E','E','E','E','E','E','E','E','E','E','E','E','E',
                'E','E','E','F','G','G','G','G','H','H','H','I','I','I','I',
                'I','I','J','J','K','K','L','L','L','M','M','N','N','N','N',
                'N','N','N','N','N','N','O','O','O','O','O','O','P','P','Q',
                'R','R','R','R','R','R','S','S','S','T','T','T','T','T','T',
                'U','U','V','V','W','W','X','Y','Z','Z');

const
  kleurvakken :array[1..61,1..3] of integer =
               ((21,21,4),(96,21,9),(196,21,4),(296,21,9),(371,21,4),
               (46,46,13),(146,46,1),(246,46,1),(346,46,13),
               (71,71,13),(171,71,9),(221,71,9),(321,71,13),
               (21,96,9),(96,96,13),(196,96,9),(296,96,13),(371,96,9),
               (121,121,13),(271,121,13),
               (46,146,1),(146,146,1),(246,146,1),(346,146,1),
               (71,171,9),(171,171,9),(221,171,9),(321,171,9),
  { midden }   (21,196,4),(96,196,9),(196,196,13),(296,196,9),(371,196,4),
               (71,221,9),(171,221,9),(221,221,9),(321,221,9),
               (46,246,1),(146,246,1),(246,246,1),(346,246,1),
               (121,271,13),(271,271,13),
               (21,296,9),(96,296,13),(196,296,9),(296,296,13),(371,296,9),
               (71,321,13),(171,321,9),(221,321,9),(321,321,13),
               (46,346,13),(146,346,1),(246,346,1),(346,346,13),
               (21,371,4),(96,371,9),(196,371,4),(296,371,9),(371,371,4));


var
  x,y,z,p        :integer;
  xx             :integer;
  p1,p2,p3,p4,p5 :integer;
  aantal,zeven   :byte;
  punt           :array[1..10] of integer;
  letter,start   :byte;
  score,
  totaalscore    :integer;
  waarde         :array[1..7] of byte;
  ch             :char;
  woord,s        :string;
  sl             :array[1..7] of string;
  vak            :pointer;
  s1             :word;
  n              :array[1..100] of byte;

procedure spelopnieuw; {***************************************************}

begin
  totaalscore :=0;clean(506,345,585,360,8,0);
  aantal :=100;clean(480,40,520,55,8,0);xx :=21;
  start :=0;
  for p :=1 to 7 do begin
    clean(xx,446,xx+23,469,0,0);inc(xx,50);        { maakt 7 hokjes leeg }
  end;
  for p :=1 to 100 do n[p] :=1;
end;

procedure einde; {*********************************************************}

begin
  vgaraam(100,100,315,190,9,8,17);
  dubbtekst(120,120,'EINDE SPEL',15,7,18,2);
  dubbtekst(130,158,'JA            NEE',0,7,9,0);
  kubes(2,155,150,180,175,65,14,2);
  dubbtekst(160,156,'+',14,7,0,2);dubbtekst(225,156,'+',14,7,0,2);
  setcolor(15);line(158,153,177,153);line(177,153,177,172);
  line(223,153,242,153);line(242,153,242,172);
  setcolor(0);line(158,153,158,172);line(158,172,177,172);
  line(223,153,223,172);line(223,172,242,172);
  x :=155;
  repeat
    repeat
      setcolor(0);rectangle(x,150,x+25,175);delay(10);
      setcolor(14);rectangle(x,150,x+25,175);delay(10);
    until keypressed;
    ch :=readkey;
    if (ch =#77) and (x<220) then begin                   { rechts }
      inc(x,65);
    end;
    if (ch =#75) and (x>155) then begin                    { links }
      dec(x,65);
    end;
  until ch in[#13];
  if x =155 then begin
    setcolor(0);for p :=479 downto 0 do line(0,p,639,p);
    dubbtekst(20,20,'WAT WAS DAT SPANNEND....',7,8,20,2);delay(1000);
    closegraph;halt(0);
  end;
  if x =220 then begin
    clean(20,20,395,395,8,0);
    horlijn(16,20,20,395,25,14);verlijn(16,20,20,395,25,14);
    for p :=1 to 61 do begin                                 { hokjes vullen }
      setfillstyle(1,kleurvakken[p,3]);
      floodfill(kleurvakken[p,1],kleurvakken[p,2],14);
    end;
  end;
  spelopnieuw;
end;

procedure spel; {**********************************************************}

label vervolg,opnieuw;

{ zoek letters ********************************}

begin
  x :=20;p :=1;zeven :=1;randomize;
  repeat
    p1 :=getpixel(x+1,446);
    if p1 =0 then begin
      opnieuw:
      if aantal <1 then goto vervolg;
      letter :=random(100)+1;
      if n[letter]=0 then goto opnieuw;
      s :=aantalletters[letter];waarde[p] :=scoreletters[letter];

      { als er een letter gevonden is }

      setcolor(14);rectangle(x,445,x+25,470);clean(x+1,446,x+24,469,1,0);
      dubbtekst(x+6,451,s,15,7,0,2);
      setcolor(15);line(x+2,447,x+23,447);line(x+23,447,x+23,468);
      line(x+2,447,x+2,468);line(x+2,468,x+23,468);

      n[letter] :=0;dec(aantal);
      clean(480,40,520,55,8,0);str(aantal,s);dubbtekst(480,40,s,15,7,18,2);

      { als alle 7 letters worden geplaats }

      inc(zeven);
      if (zeven =8) and (start =1) then begin
        clean(506,345,585,360,8,0);inc(totaalscore,25);
        str(totaalscore,s);dubbtekst(506,345,s,15,7,18,2);
      end;
    end;
    inc(x,50);inc(p);
  until p =8;start :=1;

  { zoekletter ********************************}

  vervolg:
  x :=20;y :=445;
  repeat
    repeat
      setcolor(0);rectangle(x,445,x+25,470);delay(5);
      setcolor(14);rectangle(x,445,x+25,470);delay(5);
      klok(554,454,15,8);
    until keypressed;

    ch :=readkey;
    if (ch =#77) and (x<446) then begin                   { rechts }
      inc(x,50);
    end;
    if (ch =#75) and (x>21) then begin                    { links }
      dec(x,50);
    end;

    if x<370 then sound(500)
      else sound(3000);
    delay(5);nosound;
  until ch in[#13];

  { nieuwe letters }

  if x =370 then begin
    setcolor(0);line(373,448,392,448);line(392,448,392,467);
    setcolor(15);line(373,448,373,467);line(373,467,392,467);
    delay(300);
    setcolor(15);line(373,448,392,448);line(392,448,392,467);
    setcolor(0);line(373,448,373,467);line(373,467,392,467);
    spel;
  end;

  { nieuw spel }

  if x =420 then begin
    setcolor(0);line(423,448,442,448);line(442,448,442,467);
    setcolor(15);line(423,448,423,467);line(423,467,442,467);

    clean(20,20,395,395,8,0);
    horlijn(16,20,20,395,25,14);verlijn(16,20,20,395,25,14);
    for p :=1 to 61 do begin
      setfillstyle(1,kleurvakken[p,3]);
      floodfill(kleurvakken[p,1],kleurvakken[p,2],14);
    end;
    setcolor(15);line(423,448,442,448);line(442,448,442,467);
    setcolor(0);line(423,448,423,467);line(423,467,442,467);
    spelopnieuw;spel;
  end;
  if x =470 then begin
    einde;spel;
  end;


  { pak een letter ****************************}


  p1 :=getpixel(x+1,y+1);
  if p1<>0 then begin
    s1 :=imagesize(x,y,x+25,y+25);getmem(vak,s1);
    getimage(x,y,x+25,y+25,vak^);
    for p :=1 to 50 do begin
      sound(p*30);delay(2);nosound;delay(1);
    end;
    if x =20 then score :=waarde[1];
    if x =70 then score :=waarde[2];
    if x =120 then score :=waarde[3];
    if x =170 then score :=waarde[4];
    if x =220 then score :=waarde[5];
    if x =270 then score :=waarde[6];
    if x =320 then score :=waarde[7];
  end
    else begin
      sound(200);delay(100);nosound;
      goto vervolg;
    end;


  { zoek plaats voor letter *******************}


  repeat
    ch :=readkey;
    if (ch =#80) and (y<421) then inc(y,25);              { neer }
    if (ch =#72) and (y>21) then dec(y,25);               { boven }
    if (ch =#77) and (x<346) then inc(x,25);              { rechts }
    if (ch =#75) and (x>21) then dec(x,25);               { links }
    sound(x+y);delay(5);nosound;
    putimage(x,y,vak^,1);
  until ch in[#13];

  { zet letter neer ***************************}

  p1 :=getpixel(x+2,y+2);p2 :=getpixel(x+1,y+1);
  if (p1 <>15) and (y<395) then begin
    putimage(x,y,vak^,0);freemem(vak,0);
    for p :=1 to 50 do begin
      sound(p*30);delay(1);nosound;delay(1);
    end;
    if p2 =4 then z :=5*score;
    if p2 =1 then z :=4*score;
    if p2 =13 then z :=3*score;
    if p2 =9 then z :=2*score;
    if p2 =8 then z :=score;

    inc(totaalscore,z);                            { zet score neer }
    clean(506,345,585,360,8,0);
    str(totaalscore,s);dubbtekst(506,345,s,15,7,18,2);

  end
  else begin
    sound(200);delay(100);nosound;
  end;
  goto vervolg;
end;

procedure uitleg; {********************************************************}

begin
  dubbtekst(100,35,'SCRABBLE',15,13,26,3);
  setcolor(7);line(90,28,315,28);line(315,28,315,63);
  setcolor(0);line(90,28,90,63);line(90,63,315,63);
  line(91,29,91,62);line(91,62,314,62);

  dubbtekst(30,80,'VOOR WE BEGINNEN EERST EVEN EEN',15,7,10,0);
  dubbtekst(30,95,'KORTE UITLEG.',15,7,10,0);
  dubbtekst(30,110,'NADAT U OP ENTER HEEFT GEDRUKT KUNT',15,7,10,0);
  dubbtekst(30,125,'U MET DE PIJLTOETSEN EEN LETTER',15,7,10,0);
  dubbtekst(30,140,'KIEZEN, WAARNA U MET DE ENTERTOETS',15,7,10,0);
  dubbtekst(30,155,'DIT BEVESTIGD.',15,7,10,0);
  dubbtekst(30,170,'NU KUNT U WEER MET DE PIJLTOETSEN DE',15,7,10,0);
  dubbtekst(30,185,'LETTER OP DE GOEDE PLAATS ZETTEN.',15,7,10,0);
  dubbtekst(30,200,'NADAT U WEER ENTER HEEFT INGEDRUKT',15,7,10,0);
  dubbtekst(30,215,'WORDT ER EEN SCORE TOEGEKEND',15,7,10,0);
  dubbtekst(30,230,'NAARGELANG U OP EEN GEKLEURD HOKJE',15,7,10,0);
  dubbtekst(30,245,'STAAT.',15,7,10,0);
  dubbtekst(30,260,'MET DIT SPEL WORDT ER ALLEEN MET',15,7,10,0);
  dubbtekst(30,275,'LETTERWAARDES GESPEELD.',15,7,10,0);
  dubbtekst(30,290,'ALS ALLE LETTERS IN EEN KEER WORDEN',15,7,10,0);
  dubbtekst(30,305,'GEPLAATS, KRIJGT MEN 25 BONUSPUNTEN.',15,7,10,0);
  dubbtekst(230,335,'VEEL PLEZIER...',10,2,10,0);

  dubbtekst(250,375,'DRUK OP ENTER',9,2,10,0);
  setcolor(7);line(245,370,382,370);line(382,370,382,388);
  setcolor(0);line(245,370,245,388);line(245,388,382,388);
  line(246,371,246,387);line(246,387,381,387);

  repeat
    repeat
      explosie(random(150)+30,330,8);
    until keypressed;
    ch :=readkey;
  until ch in[#13];

  clean(20,20,395,395,8,0);     { aantalletters en waardetoekenning }
  dubbtekst(36,40,'AANTAL    PUNTEN  AANTAL     PUNTEN',14,2,10,0);
  setcolor(4);line(21,60,394,60);line(200,21,200,394);
  x :=40;y :=70;
  for p :=65 to 90 do begin
    str(toekenning[p,1],s);dubbtekst(x,y,s,14,4,17,2);
    dubbtekst(x+40,y,'x',15,7,0,2);dubbtekst(x+65,y,chr(p),14,6,0,2);
    str(toekenning[p,2],s);dubbtekst(x+120,y,s,11,3,17,2);
    inc(y,23);
    if y =392 then begin
      inc(x,180);y :=70;
    end;
  end;

  dubbtekst(230,375,'DRUK OP ENTER',9,2,10,0);
  setcolor(7);line(225,370,362,370);line(362,370,362,388);
  setcolor(0);line(225,370,225,388);line(225,388,362,388);
  line(226,371,226,387);line(226,387,361,387);

  repeat
    repeat
      klok(554,454,15,8);
    until keypressed;
    ch :=readkey;
  until ch in[#13];

  clean(20,20,395,395,8,0);
  horlijn(16,20,20,395,25,14);verlijn(16,20,20,395,25,14);
  for p :=1 to 61 do begin                                 { hokjes vullen }
    setfillstyle(1,kleurvakken[p,3]);
    floodfill(kleurvakken[p,1],kleurvakken[p,2],14);
  end;
end;

procedure scherm; {********************************************************}

begin
  vgaraam(13,13,402,402,4,0,17);clean(20,20,395,395,8,0);
  vul(1,1,11,1,4);setcolor(1);rectangle(0,0,639,479);
  vgaraam(420,23,610,70,11,8,17);
  setcolor(7);line(430,33,600,33);line(600,33,600,60);
  setcolor(0);line(430,33,430,60);line(430,60,600,60);
  line(431,34,431,59);line(431,59,599,59);
  dubbtekst(438,44,'NOG',14,4,9,0);dubbtekst(530,44,'LETTERS',14,4,9,0);

  kubes(1,430,85,445,100,0,14,4);
  dubbtekst(465,90,'5 x LETTERWAARDE',14,4,9,0);
  kubes(1,430,115,445,130,0,14,1);
  dubbtekst(465,120,'4 x LETTERWAARDE',15,9,9,0);
  kubes(1,430,145,445,160,0,14,13);
  dubbtekst(465,150,'3 x LETTERWAARDE',15,13,9,0);
  kubes(1,430,175,445,190,0,14,9);
  dubbtekst(465,180,'2 x LETTERWAARDE',15,1,9,0);
  kubes(1,430,230,450,250,0,14,2);
  dubbtekst(470,240,'NIEUWE LETTERS',15,2,9,0);
  kubes(1,430,260,450,280,0,14,5);
  dubbtekst(470,270,'NIEUW SPEL',15,5,9,0);

  kubes(10,17,442,48,473,50,11,1);
  kubes(7,20,445,45,470,50,14,0);              { hokjes voor de letters }

  kubes(1,370,445,395,470,0,14,2);setcolor(15);        { nieuwe letters }
  line(373,448,392,448);line(392,448,392,467);
  setcolor(0);line(373,448,373,467);line(373,467,392,467);

  kubes(1,420,445,445,470,0,14,5);                         { nieuw spel }
  setcolor(15);line(423,448,442,448);line(442,448,442,467);
  setcolor(0);line(423,448,423,467);line(423,467,442,467);

  kubes(1,470,445,495,470,0,14,6);setcolor(10);
  outtextxy(472,448,'D');outtextxy(479,455,'O');outtextxy(487,462,'S');
  outtextxy(472,462,'D');outtextxy(487,448,'S');

  kubes(1,544,443,627,472,0,14,8);
  setcolor(7);line(548,448,622,448);line(622,448,622,467);
  setcolor(0);line(548,448,548,467);line(548,467,622,467);
  line(549,449,549,467);line(549,466,621,466);

  vgaraam(477,300,600,380,11,8,17);                   { voor score }
  setcolor(7);line(487,310,590,310);line(590,310,590,370);
  setcolor(0);line(487,310,487,370);line(487,370,590,370);
  line(488,311,488,369);line(488,369,589,369);

  dubbtekst(495,320,'SCORE',15,12,18,2);
  datem(30,415,10,true);datem(31,416,2,true);
  naam(420,413,10);naam(421,414,2);
end;

begin
  x :=detect;initgraph(x,y,'');
  checkbreak :=false;
  scherm;
  uitleg;
  totaalscore :=0;aantal :=100;start :=0;
  for p :=1 to 100 do n[p] :=1;
  spel;
end.