How to resolve the algorithm Rock-paper-scissors step by step in the REXX programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Rock-paper-scissors step by step in the REXX programming language

Table of Contents

Problem Statement

Implement the classic children's game Rock-paper-scissors, as well as a simple predictive   AI   (artificial intelligence)   player. Rock Paper Scissors is a two player game. Each player chooses one of rock, paper or scissors, without knowing the other player's choice. The winner is decided by a set of rules:

If both players choose the same thing, there is no winner for that round. For this task, the computer will be one of the players. The operator will select Rock, Paper or Scissors and the computer will keep a record of the choice frequency, and use that information to make a weighted random choice in an attempt to defeat its opponent.

Support additional choices   additional weapons.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Rock-paper-scissors step by step in the REXX programming language

Source code in the rexx programming language

/*REXX program plays rock─paper─scissors with a human;  tracks what human tends to use. */
!= '────────';  err=! "***error***";    @.=0     /*some constants for this program.     */
prompt= ! 'Please enter one of:     Rock   Paper   Scissors      (or Quit)'
$.p= 'paper' ;  $.s= "scissors";   $.r= 'rock'   /*list of the choices in this program. */
t.p= $.r     ;  t.s= $.p       ;   t.r= $.s      /*thingys that beats  stuff.           */
w.p= $.s     ;  w.s= $.r       ;   w.r= $.p      /*stuff     "    "   thingys.          */
b.p= 'covers';  b.s= "cuts"    ;   b.r= 'breaks' /*verbs:   how the choice wins.        */

  do forever;     say;      say prompt;     say  /*prompt the CBLF; then get a response.*/
  c= word($.p $.s $.r,      random(1, 3) )       /*choose the computer's first pick.    */
  m= max(@.r, @.p, @.s);    c= w.r               /*prepare to examine the choice history*/
  if @.p==m  then c= w.p                         /*emulate JC's:  The Amazing Karnac.   */
  if @.s==m  then c= w.s                         /*   "     "      "     "       "      */
  c1= left(c, 1)                                 /*C1  is used for faster comparing.    */
  parse pull u;             a= strip(u)          /*get the CBLF's choice/pick (answer). */
  upper a c1  ;            a1= left(a, 1)        /*uppercase choices, get 1st character.*/
  ok= 0                                          /*indicate answer isn't OK  (so far).  */
       select                                    /*process/verify the  CBLF's  choice.  */
       when words(u)==0           then           say  err   'nothing entered'
       when words(u)>1            then say  err   'too many choices: '  u
       when abbrev('QUIT',    a)  then do;  say ! "quitting.";      exit;    end
       when abbrev('ROCK',    a) |,
            abbrev('PAPER',   a) |,
            abbrev('SCISSORS',a)  then ok=1      /*Yes?  This is a valid answer by CBLF.*/
       otherwise                  say err  'you entered a bad choice: '    u
       end   /*select*/

  if \ok          then iterate                   /*answer ¬OK?  Then get another choice.*/
  @.a1= @.a1 + 1                                 /*keep a history of the CBLF's choices.*/
  say !  'computer chose: '    c
  if   a1==  c1  then do;  say !  'draw.';   iterate;  end
  if $.a1==t.c1  then say  !  'the computer wins. '    !  $.c1  b.c1  $.a1
                 else say  !  'you win! '              !  $.a1  b.a1  $.c1
  end   /*forever*/                              /*stick a fork in it,  we're all done. */


/*REXX pgm plays rock─paper─scissors─lizard─Spock with human; tracks human usage trend. */
!= '────────';   err=! "***error***";    @.=0    /*some constants for this REXX program.*/
prompt=! 'Please enter one of:   Rock  Paper  SCissors  Lizard  SPock  (Vulcan)     (or Quit)'
$.p='paper'           ; $.s="scissors"        ; $.r='rock'          ; $.L="lizard"      ; $.v='Spock'              /*names of the thingys*/
t.p= $.r $.v          ; t.s= $.p $.L          ; t.r= $.s $.L        ; t.L= $.p $.v      ; t.v= $.r $.s             /*thingys beats stuff.*/
w.p= $.L $.s          ; w.s= $.v $.r          ; w.r= $.v $.p        ; w.L= $.r $.s      ; w.v= $.L $.p             /*stuff beats thingys.*/
b.p='covers disproves'; b.s="cuts decapitates"; b.r='breaks crushes'; b.L="eats poisons"; b.v='vaporizes smashes'  /*how the choice wins.*/
whom.1= ! 'the computer wins. ' !;     whom.2= ! "you win! " !;       win= words(t. p)

  do forever;   say;   say prompt;     say       /*prompt CBLF; then get a response.    */
  c= word($.p $.s $.r $.L $.v, random(1, 5) )    /*the computer's first choice/pick.    */
  m= max(@.r, @.p, @.s, @.L, @.v)                /*used in examining CBLF's history.    */
  if @.p==m  then c= word(w.p, random(1, 2) )    /*emulate JC's  The Amazing Karnac.    */
  if @.s==m  then c= word(w.s, random(1, 2) )    /*   "     "     "     "       "       */
  if @.r==m  then c= word(w.r, random(1, 2) )    /*   "     "     "     "       "       */
  if @.L==m  then c= word(w.L, random(1, 2) )    /*   "     "     "     "       "       */
  if @.v==m  then c= word(w.v, random(1, 2) )    /*   "     "     "     "       "       */
  c1= left(c, 1)                                 /*C1  is used for faster comparing.    */
  parse pull u;            a= strip(u)           /*obtain the CBLF's choice/pick.       */
  upper a c1  ;           a1= left(a, 1)         /*uppercase the choices, get 1st char. */
  ok=0                                           /*indicate answer isn't  OK  (so far). */
       select                                    /* [↓]  process the CBLF's choice/pick.*/
       when words(u)==0               then say err    'nothing entered.'
       when words(u)>1                then say err    'too many choices: '    u
       when abbrev('QUIT',    a)      then do; say !  'quitting.';   exit;   end
       when abbrev('LIZARD',  a)   |,
            abbrev('ROCK',    a)   |,
            abbrev('PAPER',   a)   |,
            abbrev('VULCAN',  a)   |,
            abbrev('SPOCK',   a,2) |,
            abbrev('SCISSORS',a,2)    then ok=1  /*it's a valid choice for the human.   */
       otherwise                  say err   'you entered a bad choice: '   u
       end   /*select*/

  if \ok          then iterate                   /*answer ¬OK?  Then get another choice.*/
  @.a1= @.a1 + 1                                 /*keep a history of the CBLF's choices.*/
  say ! 'computer chose: '  c
  if a1==c1  then say !  'draw.'                 /*Oh rats!  The contest ended up a draw*/
             else do who=1  for 2                /*either the computer or the CBLF won. */
                  if who==2  then parse value  a1 c1   with   c1 a1
                       do j=1  for win                                  /*see who won.  */
                       if $.a1 \== word(t.c1, j)  then iterate          /*not this 'un. */
                       say whom.who  $.c1  word(b.c1, j)  $.a1          /*notify winner.*/
                       leave                                            /*leave  J loop.*/
                       end   /*j*/
                  end        /*who*/
  end   /*forever*/                              /*stick a fork in it,  we're all done. */


  

You may also check:How to resolve the algorithm Soundex step by step in the C programming language
You may also check:How to resolve the algorithm Sum digits of an integer step by step in the Dc programming language
You may also check:How to resolve the algorithm Apply a callback to an array step by step in the Raku programming language
You may also check:How to resolve the algorithm Continued fraction step by step in the ZX Spectrum Basic programming language
You may also check:How to resolve the algorithm Eban numbers step by step in the AutoHotkey programming language