PROGRAM RockPaperScissors (Input,Output);

(* Plays "Rocks, scissors, paper" game.
   David Wills
   CSci 3102  Winter 1994   *)

VAR
   Player1, Player2 : Char;
   Winner : Integer;
   PlayAgain : Boolean;


(****************************************************)
(* Input from user valid plays for both players. *)

PROCEDURE GetHands (VAR One, Two : Char);

Var
   Ch : Char;
   Invalid : Boolean;

Begin
   Invalid := True;
   WHILE Invalid DO
    Begin
     Write('Enter player 1s hand: ');
     Readln(Ch);
     IF (Ch='r') OR (Ch='R') THEN
      Begin
       One := 'R';
       Invalid := False;
      End
     ELSE IF (Ch='p') OR (Ch='P') THEN
      Begin
       One := 'P';
       Invalid := False;
      End
     ELSE IF (Ch='s') OR (Ch='S') THEN
      Begin
       One := 'S';
       Invalid := False;
      End
     ELSE     
       Writeln('Not valid input. Please try again.');
    End;

   Invalid := True;
   WHILE Invalid DO
    Begin
     Write('Enter player 2s hand: ');
     Readln(Ch);
     IF (Ch='r') OR (Ch='R') THEN
      Begin
       Two := 'R';
       Invalid := False;
      End
     ELSE IF (Ch='p') OR (Ch='P') THEN
      Begin
       Two := 'P';
       Invalid := False;
      End
     ELSE IF (Ch='s') OR (Ch='S') THEN
      Begin
       Two := 'S';
       Invalid := False;
      End
     ELSE     
       Writeln('Not valid input. Please try again.');
    End;
End;



(****************************************************)
(* Determine which hand wins.
   Rock beats scissors,
   scissors beats paper,
   paper beats rock.     *)
PROCEDURE PlayHands (Hand1, Hand2 : Char;
                     VAR Winner : Integer);
Begin
   IF Hand1 = Hand2 THEN
      Winner := 0
   ELSE IF ((Hand1='R') AND (Hand2='S')) OR (* all the ways Player 1 can win *)
           ((Hand1='P') AND (Hand2='R')) OR
           ((Hand1='S') AND (Hand2='P')) THEN
              Winner := 1
   ELSE
      Winner := 2;
End;



(***************************************************)
FUNCTION Continue : Boolean;
Var
   Answer : Char;
Begin
     Writeln;
     Write('Play again? (Y or N) ');
     Readln(Answer);
     IF (Answer='Y') OR (Answer='y') THEN
        Continue := True
     ELSE
        Continue := False;
End;



(**************************************************)
BEGIN
   PlayAgain := True;

   WHILE PlayAgain DO
    Begin
     GetHands(Player1,Player2);

     PlayHands(Player1,Player2,Winner);

     IF Winner = 0 THEN
       Writeln('Game is a tie.')
     ELSE IF Winner = 1 THEN
       Writeln('Player 1 wins')
     ELSE
       Writeln('Player 2 wins');

     PlayAgain := Continue;
    End;
END.
