program hangfile(input, output);

{This program is like hangman, but uses a file of words to retrieve   }
{if only one person is playing.           }

const
  blank = ' ';
  spot = #254;
  blankline =
   '                                                                         ';
  numwords = 432; {NOTE: Update to match number of words }
                  {       in HANGWDS.TXT file            }

type
  guess = array[1..80] of char;
  bodyparts = array[1..6] of string[4];
  matrix = array[0..9, 1..15] of char;
  guess_char = array[1..27] of char;
  bodyfig = array[1..6] of string[4];

var
  word, wdisp,
  wordguess     : guess;
  ch_guess      : guess_char;

  ch, response : char;

  i, k, n, p,
  selection,
  numberplayers : integer;

  gameover,
  done,
  finished,
  wordmatch,
  foundone      : boolean;
  ch_used       : boolean;

  piece         : bodyparts;
  getit         : matrix;
  stickpiece    : bodyfig;
  dummy         : string[80];
  infile        : text;

  { EOLN is used, and is a built-in boolean variable }


procedure clrarrays;
  begin
    for i := 1 to 80 do
      begin
        word[i] := blank;
        wdisp[i] := spot;
      end;
    for i := 1 to 27 do ch_guess[i] := blank;
  end;

procedure initbodyparts;
  begin
    piece[1] := 'Head';
    piece[2] := 'Body';
    piece[3] := 'Arm1';
    piece[4] := 'Arm2';
    piece[5] := 'Leg1';
    piece[6] := 'Leg2';
    stickpiece[1] := '( )';
    stickpiece[2] := ' |';
    stickpiece[3] := '-- ';
    stickpiece[4] := '--';
    stickpiece[5] := '/';
    stickpiece[6] := '\';
  end;

procedure showparts(var parts : integer);
  begin
    parts := parts + 1;
    if parts > 5 then
      begin
        GotoXY(52,13);
        Write(stickpiece[6]);
        GotoXY(1, 19);
        write(blankline);
        GotoXY(1,19);
        write('You Lost; you are a hung hombre!!');
        gameover := true;
      end
    else
      begin
        GotoXY(10, 21);
        write('You now have a ');
        for i := 1 to parts do
          write(piece[i],', ');
        for i := 1 to parts do
          case i of
            1 : begin GotoXY(50,10); write(stickpiece[i]); end;
            2 : begin GotoXY(50,11); write(stickpiece[i]); end;
            3 : begin GotoXY(49,12); write(stickpiece[i]); end;
            4 : begin GotoXY(52,12); write(stickpiece[i]); end;
            5 : begin GotoXY(50,13); write(stickpiece[i]); end;
          end; { of case }
      end;
  end;

procedure enterword;
  begin
    i := 0;  { must start at 0 to "throw away" hanging ENTER char }
    GotoXY(1, 23);
    WRITE(blankline);
    GotoXY(1, 22);
    write('Enter word or phrase to guess: ');
    GotoXY(1, 23);
    read(input, ch);
    while not EOLN do
      begin
        word[i] := UPCASE(ch);
        i := i + 1;
        read(input, ch);
      end;
    word[i] := UPCASE(ch);
    word[i+1] := '.';
    GotoXY(1, 22);
    WRITE(blankline);
    GotoXY(1,23);
    WRITE(blankline);
  end;

procedure displayword;
  begin
    i := 1;
    ch := word[i];
    GotoXY(2, 18);
    while ch <> '.' do
      begin
        if ch <> ' ' then
          write(output, wdisp[i])
        else
          begin
            wdisp[i] := ' ';
            write(' ');
          end;
        i := i + 1;
        ch := word[i];
      end;
  end;

procedure makeguess;
  begin
    i := 1;
    foundone := false;
    ch_used := false;
    GotoXY(10,23);
    write('Enter a character: ');
    GotoXY(32, 23);
    readln(ch);
    GotoXY(1, 22);
    WRITE(blankline);
    WHILE ch_guess[i] <> blank DO
      BEGIN
        IF ch = ch_guess[i] THEN
          BEGIN
            ch_used := TRUE;
            GotoXY(10,22);
            WRITE('You''ve already tried ', ch, '. Try again!');
            GotoXY(32, 23);
            READLN(ch);
            GotoXY(10,22);
            Write(blankline);
            i := 1;
          END
        ELSE
          BEGIN
            i := i + 1;
            IF ch_guess[i] = blank THEN ch_used := false;
          END;
      END;
    IF ((ch <> '#') AND (NOT ch_used)) THEN ch_guess[i] := ch;
    i := 1;
    repeat
      if UPCASE(ch) = word[i] then
        begin
          wdisp[i] := word[i];
          i := i + 1;
          foundone := true;
        end
      else
        i := i + 1;
    until word[i] = '.';
    if not (foundone) and (ch <> '#') then
      showparts(n);
  end;

procedure wordtest;
  begin
    wordmatch := true;
    i := 1;
    repeat
      if word[i] = wdisp[i] then
        i := i + 1
      else
        wordmatch := false;
    until (word[i] = '.') or (not wordmatch);
    if wordmatch then
      begin
       GotoXY(1,22);
       WRITE(blankline);
       GotoXY(10, 22);
       write('.....Congratulations; You win!!                ');
      end;
  end;

procedure enterguess;
  begin
    i := 1;
    GotoXY(1,22);
    WRITE(blankline);
    GotoXY(1, 23);
    WRITE(blankline);
    GotoXY(1, 22);
    write('Enter your guess: ');
    GotoXY(1, 23);
    read(ch);
    while not EOLN do
      begin
        wordguess[i] := UPCASE(ch);
        i := i + 1;
        read(input, ch);
      end;
    wordguess[i] := UPCASE(ch);
    wordguess[i+1] := '.';
  end;

procedure guesswordtest;
  begin
    wordmatch := true;
    i := 1;
    repeat
      if wordguess[i] = word[i] then
        i := i + 1
      else
        wordmatch := false;
    until (word[i] = '.') or (not wordmatch);
    if wordmatch then
      begin
        GotoXY(1,22);
        WRITE(blankline);
        GotoXY(10, 22);
        write('.....Congratulations; You win!!                ');
      end
    else
      begin
        GotoXY(1,22);
        WRITE(blankline);
        GotoXY(1,23);
        WRITE(blankline);
        GotoXY(10, 22);
        write('Nope..that is not it.                          ');
        showparts(n);
      end;
  end;

procedure showanswer;
  begin
    i := 1;
    GotoXY(10, 21);
    write('The correct answer was:                              ');
    GotoXY(10, 22);
    while word[i] <> '.' do
      begin
        write(word[i]);
        i := i + 1;
      end;
  end;


procedure selectphrase;
  var
    select, count, i : integer;
  begin
    for i := 1 to 80 do
      word[i] := ' ';
    assign(infile, 'hangwds.txt');
    reset(infile);
    i := 2;
    randomize;
    select := random(numwords);

    WRITE(SELECT);

    for count := 1 to select do
      readln(infile, dummy);
    read(infile, ch);
    word[1] := ch;
    while ch <> '.' do
      begin
        read(infile, ch);
        word[i] := ch;
        i := i + 1;
      end;
    close(infile);
  end;


BEGIN { main program }
REPEAT
  finished := false;
  clrarrays;
  initbodyparts;
  gameover := false;
  n := 0;
  ch := 's';
  clrscr;
  GotoXY(10, 23);
  write('How many players? ');
  readln(numberplayers);
  GotoXY(10, 23);
  write('                  ');
  GotoXY(22,3);
  write('To guess the whole word, enter a "#".');
  {PUT THE DISPLAY ON THE SCREEN FOR THE GAME TO BEGIN}
  if numberplayers = 1 then
    selectphrase
  else
    enterword;
  displayword;
  repeat
    makeguess;
    if (ch <> '#') and (n <= 5) then
      begin
        displayword;
        wordtest;
      end
    else if ch = '#' then
      begin
        enterguess;
        guesswordtest;
      end;
  until (wordmatch) or (gameover);
if n > 5 then
  showanswer;
GotoXY(1, 23);
WRITE(blankline);
GotoXY(10, 23);
write('     Another game (Y/N)? ');
readln(response);
GotoXY(10, 23);
write('                         ');
if  UPCASE(response) = 'N' then
  finished := true;
UNTIL finished;
GotoXY(10, 23);
write('**** Game Over ****');
END.


========================================================================
Here is a sample HANGWDS.TXT file to use with the program:


ANTIQUE.
APPEALING.
ARMOIRES.
ARTISTS.
ATTRACTIVE.
BASE.
BUDS.
CABINETS.
CABINETMAKERS.
CARE.
CHAIRS.
CHARMING.
CHEST.
COLORS.
CRAFTS.
CUPBOARDS.
DESIGN.
FLORAL.
FLOWERS.
FOLKART.
GLAZE.
HEADBOARDS.
HUTCHES.
KNOWLTON.
PAINT.
PAST.
PERIOD.
RANK.
SALE.
SCENES.
SIDEBOARD.
SIGNS.
STAINING.
STYLE.
TINT.
TONES.
TRIM.
WARM.
ARCH.
BAND.
BORDER.
BUSES.
CABLE.
CAFE.
CENTRAL.
CHAIN.
COAST.
CODE.
COFFEE.
COMEON.
CREDIT.
DANCE.
DIVIDE.
DOUBLE.
DRAW.
ENTER.
FERRY.
FREE.
FUEL.
GAPS.
HIRE.
HURRY.
LANE.
LEAD.
MAIL.
PARADE.
PARK.
PATIENCE.
PENCIL.
PEOPLE.
PERPENDICULAR.
PIER.
POETIC.
PRIVATE.
RESTAURANT.
ROUTE.
SHOW.
SIDE.
SILO.
SINGLE.
SPACE.
SPEED.
SPIRAL.
STRAIGHT.
START.
STRANDS.
STRING.
TAIL.
THIN.
TRAIN.
TURNS.
VALUE.
WIRE.
WORD.
HUMIDITY.
FILAMENTS.
ASTHMA.
BEDS.
BITE.
BLAH.
BLOW.
BOUT.
BREAK.
BURN.
CAST.
DOSE.
EYES.
FEARS.
GUMS.
HEAL.
HEART.
HELP.
HIVES.
HUMOR.
HURT.
HYPOTHERMIA.
IDLE.
INDIGESTION.
LATE.
LIMBS.
LUNGS.
MEDICINE.
MISS.
MOUTH.
NAUSEA.
NECK.
NOSE.
NUMB.
NURSE.
OTITIS.
PAIN.
PETTY.
RANT.
REMEDY.
RESTING.
RUNNY.
SINUS.
SLACK.
SLEEP.
SNEEZE.
SNIFF.
STAID.
STEAM.
STREP.
SWELL.
THERMOMETER.
THROAT.
TIRE.
TURBULENT.
VILE.
VIRUS.
WEAK.
WIND.
WORRY.
AIMS.
BILL.
BONUS.
BORED.
BOSS.
CALLS.
CASH.
CELEBRATE.
CHAMPAGNE.
CHEF.
CLOSED.
COST.
DINE.
DINNER.
EFFORT.
EMPLOYEES.
FEAST.
FEED.
FEST.
FUSS.
GAMES.
GOING.
GREET.
HALL.
HOST.
HOTEL.
HUGS.
IDEAS.
INVITE.
LIBATION.
MEAL.
MEETING.
MENUS.
MUSIC.
NOISE.
OBLIGATION.
OFFICE.
ORCHESTRA.
PLATTER.
PLAY.
POTABLES.
PUBLIC.
PUBS.
RESTAURANT.
ROOM.
SEAT.
SETS.
SING.
TALL.
TEAM.
TIDINGS.
TIMED.
TRAVEL.
TRAYS.
TREE.
ADDITIVE.
ANGLE.
AROMA.
BEAT.
BRAN.
BREAD.
BUNS.
CAKE.
CARAMEL.
CHEMICAL.
COATS.
CREAM.
CRUMPET.
DOUGH.
ECLAIR.
EGGS.
FADS.
FOLD.
FOOD.
FROSTING.
GRAIN.
GRATE.
GREASE.
GUMS.
HEAP.
HERB.
ICING.
JAM.
JELLY.
LARD.
LAYER.
LEAVEN.
NAPOLEON.
OATS.
OVEN.
PANS.
PITA.
PRESERVATIVES.
PUFF.
RACK.
RISE.
ROAST.
ROLL.
SALT.
SAVE.
SEEDS.
SESAME.
SIFT.
SLICE.
SOUFFLE.
SPICE.
STRUDEL.
SUGAR.
TART.
TWIST.
WHEAT.
WRAP.
YEAST.
ANGEL.
ASSIST.
BIRTH.
BORN.
BOWS.
BOXES.
BUSY.
CANDLE.
CARD.
CASH.
CELEBRATE.
CHEER.
CHIMNEY.
CHURCH.
CRANBERRIES.
DATE.
DEAR.
DECEMBER.
DECORATION.
EMBRACE.
ESSENCE.
GAME.
GANG.
GIFTS.
GOODIES.
GOODWILL.
GUEST.
HEAP.
HOPE.
JESUS.
MEAL.
MUGS.
OPEN.
PEACE.
PHONE.
PRAISE.
PRAY.
PRESENT.
RIBBON.
SALE.
SANTA.
SEASON.
SHARE.
SLEIGH.
SNOW.
SURPRISE.
TABLE.
TINSEL.
TOYS.
TREE.
TURKEY.
YEAR.
ACCEPT.
APPOINTED.
CARE.
CHARITY.
CRUSADE.
CUES.
DEVOTED.
EAST.
ENVOY.
FAITH.
FOREIGN.
FRIEND.
GUEST.
HEAL.
HOLY.
HOPE.
HOSPITAL.
HOST.
HURT.
INFORMED.
JOIN.
JOYS.
LIFT.
MEDICAL.
MIDDLE.
MISSION.
MONK.
OVERSEAS.
PAID.
PIONEER.
POOR.
PRIEST.
PROMOTE.
RELIGION.
RIGHTS.
ROLES.
SENT.
SERVE.
SICK.
SISTER.
SPARE.
SPONSOR.
STAGE.
STAKE.
STAY.
TEAMS.
TERM.
THANKS.
TIPS.
TRIP.
USEFUL.
VALUE.
VISION.
YEAR.
ASHTRAY.
BARS.
BOAST.
BODY.
CABLE.
CAPS.
CHIP.
CHROME.
CONSOLE.
CRASH.
DASH.
DEAL.
DOOR.
DRIVE.
ENGINE.
FILTER.
FLAT.
FORM.
GAUGE.
GUARANTEE.
INSPECT.
LAMP.
LEAK.
LIGHT.
MILEAGE.
MINT.
MIRROR.
MODEL.
MOLD.
MUFFLER.
NAME.
OWNER.
PAINT.
PANEL.
PEEL.
PERMIT.
PLUG.
RADIATOR.
RATING.
REPAIR.
RETAIL.
RISK.
RUST.
SCRATCH.
SEATS.
SHOCK.
SPARK.
STARTER.
STEER.
TAILPIPE.
TANK.
TIRE.
TITLE.
TRIM.
TRIAL.
TRUNK.
VISIBLE.
WASH.
WELD.
WOOD.

    Source: geocities.com/siliconvalley/2926/tpsrc

               ( geocities.com/siliconvalley/2926)                   ( geocities.com/siliconvalley)