Red implementation of Rock, Scissors, Paper












0












$begingroup$


I have implemented the Rosetta Code Rock Paper Scissors game in Red, but I'm sure that there are better ways to do every thing that I did. I would appreciate any feedback on this code, which does work according to spec:




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:




  • Rock beats scissors

  • Scissors beat paper

  • Paper beats rock


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.




Red [
Problem: %http://www.rosettacode.org/wiki/Rock-paper-scissors
Code: %https://github.com/metaperl/red-rosetta/blob/master/rock-paper-scissors.red
]

help1: %https://stackoverflow.com/questions/54272942/how-to-find-the-first-element-of-a-block-of-strings-whose-first-character-matche
help2: %https://stackoverflow.com/questions/54272956/how-to-increment-element-of-block-after-found-element
help3: %https://stackoverflow.com/questions/54273057/two-dimensional-dispatch-table-with-templated-response
help4: %https://stackoverflow.com/questions/54273161/in-red-how-do-i-search-through-a-block-for-a-string-matching-a-pattern/54275072#54275072

games-played: 0

weapons: ["rock" "scissors" "paper"]
matching-weapon: func [abbrev][
foreach weapon weapons [
if (first weapon) = first abbrev [
return weapon
]
]
]
player-choices: ["rock" 0 "scissors" 0 "paper" 0 ]
player-choice-tally: func [choice][player-choices/(choice): player-choices/(choice) + 1]

player-choice: "x"
valid-choice: func [c][find "rpsq" c]

player-wins: [
["rock" "scissors"] "breaks"
["paper" "rock"] "covers"
["scissors" "paper"] "cut"
]

player-wins?: function [player1 player2] [
game: reduce [player1 player2]
winning: player-wins/(game)
]

report-win: func [player1 player2][rejoin [player1 " " (player-wins? player1 player2) " " player2]]


draw: func [player computer][player = computer]

update-stats: func [player-choice][
player-choice-tally player-choice
games-played: games-played + 1
]

make-computer-choice: func [
either games-played >= 3 [
tmp: random games-played
tally: select "rock" player-choices
either tmp <= tally [return "rock"][
tally: tally + select "scissors" player-choices
either tmp <= tally [return "scissors"][
return "paper"
]
]
][random/only weapons]
]

while [not player-choice = "q"][
player-choice: ask "(r)ock, (s)cissors, (p)aper or (q)uit? "
either (player-choice = "q") [
if (valid-choice player-choice) [
computer-choice: random/only weapons
player-choice: matching-weapon player-choice
update-stats player-choice
print rejoin ["Player choice: " player-choice "tally" player-choices "Computer choice:" computer-choice]
either draw player-choice computer-choice [print "Draw"][
tmp: player-wins? player-choice computer-choice
print either tmp [rejoin ["Player wins: " report-win player-choice computer-choice]]
[rejoin ["Computer wins: " report-win computer-choice player-choice]]
]
]
]

]









share|improve this question









New contributor




Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$

















    0












    $begingroup$


    I have implemented the Rosetta Code Rock Paper Scissors game in Red, but I'm sure that there are better ways to do every thing that I did. I would appreciate any feedback on this code, which does work according to spec:




    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:




    • Rock beats scissors

    • Scissors beat paper

    • Paper beats rock


    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.




    Red [
    Problem: %http://www.rosettacode.org/wiki/Rock-paper-scissors
    Code: %https://github.com/metaperl/red-rosetta/blob/master/rock-paper-scissors.red
    ]

    help1: %https://stackoverflow.com/questions/54272942/how-to-find-the-first-element-of-a-block-of-strings-whose-first-character-matche
    help2: %https://stackoverflow.com/questions/54272956/how-to-increment-element-of-block-after-found-element
    help3: %https://stackoverflow.com/questions/54273057/two-dimensional-dispatch-table-with-templated-response
    help4: %https://stackoverflow.com/questions/54273161/in-red-how-do-i-search-through-a-block-for-a-string-matching-a-pattern/54275072#54275072

    games-played: 0

    weapons: ["rock" "scissors" "paper"]
    matching-weapon: func [abbrev][
    foreach weapon weapons [
    if (first weapon) = first abbrev [
    return weapon
    ]
    ]
    ]
    player-choices: ["rock" 0 "scissors" 0 "paper" 0 ]
    player-choice-tally: func [choice][player-choices/(choice): player-choices/(choice) + 1]

    player-choice: "x"
    valid-choice: func [c][find "rpsq" c]

    player-wins: [
    ["rock" "scissors"] "breaks"
    ["paper" "rock"] "covers"
    ["scissors" "paper"] "cut"
    ]

    player-wins?: function [player1 player2] [
    game: reduce [player1 player2]
    winning: player-wins/(game)
    ]

    report-win: func [player1 player2][rejoin [player1 " " (player-wins? player1 player2) " " player2]]


    draw: func [player computer][player = computer]

    update-stats: func [player-choice][
    player-choice-tally player-choice
    games-played: games-played + 1
    ]

    make-computer-choice: func [
    either games-played >= 3 [
    tmp: random games-played
    tally: select "rock" player-choices
    either tmp <= tally [return "rock"][
    tally: tally + select "scissors" player-choices
    either tmp <= tally [return "scissors"][
    return "paper"
    ]
    ]
    ][random/only weapons]
    ]

    while [not player-choice = "q"][
    player-choice: ask "(r)ock, (s)cissors, (p)aper or (q)uit? "
    either (player-choice = "q") [
    if (valid-choice player-choice) [
    computer-choice: random/only weapons
    player-choice: matching-weapon player-choice
    update-stats player-choice
    print rejoin ["Player choice: " player-choice "tally" player-choices "Computer choice:" computer-choice]
    either draw player-choice computer-choice [print "Draw"][
    tmp: player-wins? player-choice computer-choice
    print either tmp [rejoin ["Player wins: " report-win player-choice computer-choice]]
    [rejoin ["Computer wins: " report-win computer-choice player-choice]]
    ]
    ]
    ]

    ]









    share|improve this question









    New contributor




    Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$















      0












      0








      0





      $begingroup$


      I have implemented the Rosetta Code Rock Paper Scissors game in Red, but I'm sure that there are better ways to do every thing that I did. I would appreciate any feedback on this code, which does work according to spec:




      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:




      • Rock beats scissors

      • Scissors beat paper

      • Paper beats rock


      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.




      Red [
      Problem: %http://www.rosettacode.org/wiki/Rock-paper-scissors
      Code: %https://github.com/metaperl/red-rosetta/blob/master/rock-paper-scissors.red
      ]

      help1: %https://stackoverflow.com/questions/54272942/how-to-find-the-first-element-of-a-block-of-strings-whose-first-character-matche
      help2: %https://stackoverflow.com/questions/54272956/how-to-increment-element-of-block-after-found-element
      help3: %https://stackoverflow.com/questions/54273057/two-dimensional-dispatch-table-with-templated-response
      help4: %https://stackoverflow.com/questions/54273161/in-red-how-do-i-search-through-a-block-for-a-string-matching-a-pattern/54275072#54275072

      games-played: 0

      weapons: ["rock" "scissors" "paper"]
      matching-weapon: func [abbrev][
      foreach weapon weapons [
      if (first weapon) = first abbrev [
      return weapon
      ]
      ]
      ]
      player-choices: ["rock" 0 "scissors" 0 "paper" 0 ]
      player-choice-tally: func [choice][player-choices/(choice): player-choices/(choice) + 1]

      player-choice: "x"
      valid-choice: func [c][find "rpsq" c]

      player-wins: [
      ["rock" "scissors"] "breaks"
      ["paper" "rock"] "covers"
      ["scissors" "paper"] "cut"
      ]

      player-wins?: function [player1 player2] [
      game: reduce [player1 player2]
      winning: player-wins/(game)
      ]

      report-win: func [player1 player2][rejoin [player1 " " (player-wins? player1 player2) " " player2]]


      draw: func [player computer][player = computer]

      update-stats: func [player-choice][
      player-choice-tally player-choice
      games-played: games-played + 1
      ]

      make-computer-choice: func [
      either games-played >= 3 [
      tmp: random games-played
      tally: select "rock" player-choices
      either tmp <= tally [return "rock"][
      tally: tally + select "scissors" player-choices
      either tmp <= tally [return "scissors"][
      return "paper"
      ]
      ]
      ][random/only weapons]
      ]

      while [not player-choice = "q"][
      player-choice: ask "(r)ock, (s)cissors, (p)aper or (q)uit? "
      either (player-choice = "q") [
      if (valid-choice player-choice) [
      computer-choice: random/only weapons
      player-choice: matching-weapon player-choice
      update-stats player-choice
      print rejoin ["Player choice: " player-choice "tally" player-choices "Computer choice:" computer-choice]
      either draw player-choice computer-choice [print "Draw"][
      tmp: player-wins? player-choice computer-choice
      print either tmp [rejoin ["Player wins: " report-win player-choice computer-choice]]
      [rejoin ["Computer wins: " report-win computer-choice player-choice]]
      ]
      ]
      ]

      ]









      share|improve this question









      New contributor




      Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I have implemented the Rosetta Code Rock Paper Scissors game in Red, but I'm sure that there are better ways to do every thing that I did. I would appreciate any feedback on this code, which does work according to spec:




      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:




      • Rock beats scissors

      • Scissors beat paper

      • Paper beats rock


      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.




      Red [
      Problem: %http://www.rosettacode.org/wiki/Rock-paper-scissors
      Code: %https://github.com/metaperl/red-rosetta/blob/master/rock-paper-scissors.red
      ]

      help1: %https://stackoverflow.com/questions/54272942/how-to-find-the-first-element-of-a-block-of-strings-whose-first-character-matche
      help2: %https://stackoverflow.com/questions/54272956/how-to-increment-element-of-block-after-found-element
      help3: %https://stackoverflow.com/questions/54273057/two-dimensional-dispatch-table-with-templated-response
      help4: %https://stackoverflow.com/questions/54273161/in-red-how-do-i-search-through-a-block-for-a-string-matching-a-pattern/54275072#54275072

      games-played: 0

      weapons: ["rock" "scissors" "paper"]
      matching-weapon: func [abbrev][
      foreach weapon weapons [
      if (first weapon) = first abbrev [
      return weapon
      ]
      ]
      ]
      player-choices: ["rock" 0 "scissors" 0 "paper" 0 ]
      player-choice-tally: func [choice][player-choices/(choice): player-choices/(choice) + 1]

      player-choice: "x"
      valid-choice: func [c][find "rpsq" c]

      player-wins: [
      ["rock" "scissors"] "breaks"
      ["paper" "rock"] "covers"
      ["scissors" "paper"] "cut"
      ]

      player-wins?: function [player1 player2] [
      game: reduce [player1 player2]
      winning: player-wins/(game)
      ]

      report-win: func [player1 player2][rejoin [player1 " " (player-wins? player1 player2) " " player2]]


      draw: func [player computer][player = computer]

      update-stats: func [player-choice][
      player-choice-tally player-choice
      games-played: games-played + 1
      ]

      make-computer-choice: func [
      either games-played >= 3 [
      tmp: random games-played
      tally: select "rock" player-choices
      either tmp <= tally [return "rock"][
      tally: tally + select "scissors" player-choices
      either tmp <= tally [return "scissors"][
      return "paper"
      ]
      ]
      ][random/only weapons]
      ]

      while [not player-choice = "q"][
      player-choice: ask "(r)ock, (s)cissors, (p)aper or (q)uit? "
      either (player-choice = "q") [
      if (valid-choice player-choice) [
      computer-choice: random/only weapons
      player-choice: matching-weapon player-choice
      update-stats player-choice
      print rejoin ["Player choice: " player-choice "tally" player-choices "Computer choice:" computer-choice]
      either draw player-choice computer-choice [print "Draw"][
      tmp: player-wins? player-choice computer-choice
      print either tmp [rejoin ["Player wins: " report-win player-choice computer-choice]]
      [rejoin ["Computer wins: " report-win computer-choice player-choice]]
      ]
      ]
      ]

      ]






      rock-paper-scissors rebol2






      share|improve this question









      New contributor




      Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 9 mins ago









      Jamal

      30.3k11116226




      30.3k11116226






      New contributor




      Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 4 hours ago









      Terrence BrannonTerrence Brannon

      1011




      1011




      New contributor




      Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Terrence Brannon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          0






          active

          oldest

          votes











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });






          Terrence Brannon is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f211884%2fred-implementation-of-rock-scissors-paper%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          Terrence Brannon is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          Terrence Brannon is a new contributor. Be nice, and check out our Code of Conduct.













          Terrence Brannon is a new contributor. Be nice, and check out our Code of Conduct.












          Terrence Brannon is a new contributor. Be nice, and check out our Code of Conduct.
















          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f211884%2fred-implementation-of-rock-scissors-paper%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Сан-Квентин

          8-я гвардейская общевойсковая армия

          Алькесар