Red implementation of Rock, Scissors, Paper
$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]]
]
]
]
]
rock-paper-scissors rebol2
New contributor
$endgroup$
add a comment |
$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]]
]
]
]
]
rock-paper-scissors rebol2
New contributor
$endgroup$
add a comment |
$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]]
]
]
]
]
rock-paper-scissors rebol2
New contributor
$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
rock-paper-scissors rebol2
New contributor
New contributor
edited 34 mins ago
Jamal♦
30.3k11116226
30.3k11116226
New contributor
asked 4 hours ago
Terrence BrannonTerrence Brannon
1011
1011
New contributor
New contributor
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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.
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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