PlayRockPaperScissorsGame 2.8.2 → 2.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/docs/Code.md +2 -2
- data/docs/Comparing_Code.md +7 -7
- data/docs/_config.yml +17 -1
- data/docs/_sass/normalize.scss +1 -1
- data/docs/_sass/pace.sass +2 -1
- data/docs/_site/about.html +1 -1
- data/docs/_site/code.html +3 -3
- data/docs/_site/comparing_code.html +8 -8
- data/docs/_site/how_to_build.html +1 -1
- data/docs/_site/how_to_run.html +1 -1
- data/docs/_site/index.html +1 -1
- data/docs/_site/testing.html +1 -1
- data/docs/other_langs.md +615 -0
- data/lib/rps/version.rb +1 -1
- data/rps.gemspec +2 -2
- metadata +3 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 763a5c51b1bb097612408a1e4a81d678082c1ab2
|
4
|
+
data.tar.gz: 3b1012f1a080d12cd3614ff1cca89d68a0b76560
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9255d2a90ab9f12469c319d042ad8f7bdc57cfcc1bf6c9c524bd9e7ef1688e27be912da0133d334492890a32f39c7a174244dd2c6cc8c8ae30d7e7c68306d5d1
|
7
|
+
data.tar.gz: fe4a82a3cd4d97e3009a1dfa3822a3e2f164ad468cccbdca3e108e3d24227e576829db03c23e82c3ad7d4535d22b9a46f66e3e4fd4764b1889d1a05f4f4292aa
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/docs/Code.md
CHANGED
@@ -35,7 +35,7 @@ Master Code
|
|
35
35
|
class PlayRockPaperScissorsGame
|
36
36
|
|
37
37
|
module RockPaperScissors
|
38
|
-
VERSION = "2.8.
|
38
|
+
VERSION = "2.8.3"
|
39
39
|
end
|
40
40
|
|
41
41
|
# import the colorize gem
|
@@ -141,7 +141,7 @@ class PlayRockPaperScissorsGame
|
|
141
141
|
def final_outcome(pl,co)
|
142
142
|
return :WIN if pl > co
|
143
143
|
return :LOSE if pl < co
|
144
|
-
# there will never be a tie due to the code in the play() method
|
144
|
+
# there will never be a tie fore the final outcome due to the code in the play() method
|
145
145
|
end
|
146
146
|
end
|
147
147
|
end
|
data/docs/Comparing_Code.md
CHANGED
@@ -127,7 +127,7 @@ Subtlety is usually painted all over advanced ruby code. While this does make th
|
|
127
127
|
class PlayRockPaperScissorsGame
|
128
128
|
|
129
129
|
module RockPaperScissors
|
130
|
-
VERSION = "2.8.
|
130
|
+
VERSION = "2.8.3"
|
131
131
|
end
|
132
132
|
|
133
133
|
# import colorize gem
|
@@ -212,11 +212,11 @@ class PlayRockPaperScissorsGame
|
|
212
212
|
def player_choice
|
213
213
|
loop do
|
214
214
|
print ColorizedString["Choose rock (r), paper (p) or scissors (s): "].colorize(:green)
|
215
|
-
choice = gets.chomp.downcase
|
216
|
-
if Constants::NTRY_TO_SYM.key?(choice)
|
217
|
-
return Constants::NTRY_TO_SYM[choice]
|
218
|
-
elsif choice != Constants::VALID_ENTRIES
|
219
|
-
puts ColorizedString["That entry is invalid. Please re-enter."].colorize(:red)
|
215
|
+
choice = gets.chomp.downcase
|
216
|
+
if Constants::NTRY_TO_SYM.key?(choice)
|
217
|
+
return Constants::NTRY_TO_SYM[choice]
|
218
|
+
elsif choice != Constants::VALID_ENTRIES
|
219
|
+
puts ColorizedString["That entry is invalid. Please re-enter."].colorize(:red) entry message
|
220
220
|
else
|
221
221
|
return nil
|
222
222
|
end
|
@@ -231,7 +231,7 @@ class PlayRockPaperScissorsGame
|
|
231
231
|
def final_outcome(pl,co)
|
232
232
|
return :WIN if pl > co
|
233
233
|
return :LOSE if pl < co
|
234
|
-
# there will never be a tie because of the play() method
|
234
|
+
# there will never be a tie for the final outcome because of the play() method
|
235
235
|
end
|
236
236
|
end
|
237
237
|
end
|
data/docs/_config.yml
CHANGED
@@ -18,9 +18,25 @@ exclude:
|
|
18
18
|
- thumbnail.png
|
19
19
|
- LICENSE
|
20
20
|
- script
|
21
|
+
- other_langs.md
|
21
22
|
gems:
|
22
23
|
- github-pages
|
23
24
|
# Sass/SCSS
|
24
25
|
sass:
|
25
26
|
sass_dir: _sass
|
26
|
-
style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
|
27
|
+
style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
|
28
|
+
liquid:
|
29
|
+
error_mode: warn
|
30
|
+
keep_files:
|
31
|
+
- ".git"
|
32
|
+
- ".svn"
|
33
|
+
include:
|
34
|
+
- ".htaccess"
|
35
|
+
destination: ./_site
|
36
|
+
layouts_dir: _layouts
|
37
|
+
includes_dir: _includes
|
38
|
+
defaults:
|
39
|
+
-
|
40
|
+
values:
|
41
|
+
layout: "default"
|
42
|
+
author: "bag3318"
|
data/docs/_sass/normalize.scss
CHANGED
data/docs/_sass/pace.sass
CHANGED
data/docs/_site/about.html
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
8
8
|
<meta name="theme-color" content="#157878"/>
|
9
9
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css' />
|
10
|
-
<link rel="stylesheet" href="/assets/css/style.css?v=
|
10
|
+
<link rel="stylesheet" href="/assets/css/style.css?v=24681c868d0c9f04c3284da474a7c294ed887eef"/>
|
11
11
|
<script src="assets/js/pace.min.js"></script>
|
12
12
|
|
13
13
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png"/>
|
data/docs/_site/code.html
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
8
8
|
<meta name="theme-color" content="#157878"/>
|
9
9
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css' />
|
10
|
-
<link rel="stylesheet" href="/assets/css/style.css?v=
|
10
|
+
<link rel="stylesheet" href="/assets/css/style.css?v=24681c868d0c9f04c3284da474a7c294ed887eef"/>
|
11
11
|
<script src="assets/js/pace.min.js"></script>
|
12
12
|
|
13
13
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png"/>
|
@@ -69,7 +69,7 @@
|
|
69
69
|
<span class="k">class</span> <span class="nc">PlayRockPaperScissorsGame</span>
|
70
70
|
|
71
71
|
<span class="k">module</span> <span class="nn">RockPaperScissors</span>
|
72
|
-
<span class="no">VERSION</span> <span class="o">=</span> <span class="s2">"2.8.
|
72
|
+
<span class="no">VERSION</span> <span class="o">=</span> <span class="s2">"2.8.3"</span>
|
73
73
|
<span class="k">end</span>
|
74
74
|
|
75
75
|
<span class="c1"># import the colorize gem</span>
|
@@ -175,7 +175,7 @@
|
|
175
175
|
<span class="k">def</span> <span class="nf">final_outcome</span><span class="p">(</span><span class="n">pl</span><span class="p">,</span><span class="n">co</span><span class="p">)</span>
|
176
176
|
<span class="k">return</span> <span class="ss">:WIN</span> <span class="k">if</span> <span class="n">pl</span> <span class="o">></span> <span class="n">co</span>
|
177
177
|
<span class="k">return</span> <span class="ss">:LOSE</span> <span class="k">if</span> <span class="n">pl</span> <span class="o"><</span> <span class="n">co</span>
|
178
|
-
<span class="c1"># there will never be a tie due to the code in the play() method</span>
|
178
|
+
<span class="c1"># there will never be a tie fore the final outcome due to the code in the play() method</span>
|
179
179
|
<span class="k">end</span>
|
180
180
|
<span class="k">end</span>
|
181
181
|
<span class="k">end</span>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
8
8
|
<meta name="theme-color" content="#157878"/>
|
9
9
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css' />
|
10
|
-
<link rel="stylesheet" href="/assets/css/style.css?v=
|
10
|
+
<link rel="stylesheet" href="/assets/css/style.css?v=24681c868d0c9f04c3284da474a7c294ed887eef"/>
|
11
11
|
<script src="assets/js/pace.min.js"></script>
|
12
12
|
|
13
13
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png"/>
|
@@ -179,7 +179,7 @@
|
|
179
179
|
<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="k">class</span> <span class="nc">PlayRockPaperScissorsGame</span>
|
180
180
|
|
181
181
|
<span class="k">module</span> <span class="nn">RockPaperScissors</span>
|
182
|
-
<span class="no">VERSION</span> <span class="o">=</span> <span class="s2">"2.8.
|
182
|
+
<span class="no">VERSION</span> <span class="o">=</span> <span class="s2">"2.8.3"</span>
|
183
183
|
<span class="k">end</span>
|
184
184
|
|
185
185
|
<span class="c1"># import colorize gem</span>
|
@@ -264,11 +264,11 @@
|
|
264
264
|
<span class="k">def</span> <span class="nf">player_choice</span>
|
265
265
|
<span class="kp">loop</span> <span class="k">do</span>
|
266
266
|
<span class="nb">print</span> <span class="no">ColorizedString</span><span class="p">[</span><span class="s2">"Choose rock (r), paper (p) or scissors (s): "</span><span class="p">].</span><span class="nf">colorize</span><span class="p">(</span><span class="ss">:green</span><span class="p">)</span>
|
267
|
-
<span class="n">choice</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>
|
268
|
-
<span class="k">if</span> <span class="no">Constants</span><span class="o">::</span><span class="no">NTRY_TO_SYM</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span>
|
269
|
-
<span class="k">return</span> <span class="no">Constants</span><span class="o">::</span><span class="no">NTRY_TO_SYM</span><span class="p">[</span><span class="n">choice</span><span class="p">]</span>
|
270
|
-
<span class="k">elsif</span> <span class="n">choice</span> <span class="o">!=</span> <span class="no">Constants</span><span class="o">::</span><span class="no">VALID_ENTRIES</span>
|
271
|
-
<span class="nb">puts</span> <span class="no">ColorizedString</span><span class="p">[</span><span class="s2">"That entry is invalid. Please re-enter."</span><span class="p">].</span><span class="nf">colorize</span><span class="p">(</span><span class="ss">:red</span><span class="p">)</span> <span class="
|
267
|
+
<span class="n">choice</span> <span class="o">=</span> <span class="nb">gets</span><span class="p">.</span><span class="nf">chomp</span><span class="p">.</span><span class="nf">downcase</span>
|
268
|
+
<span class="k">if</span> <span class="no">Constants</span><span class="o">::</span><span class="no">NTRY_TO_SYM</span><span class="p">.</span><span class="nf">key?</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span>
|
269
|
+
<span class="k">return</span> <span class="no">Constants</span><span class="o">::</span><span class="no">NTRY_TO_SYM</span><span class="p">[</span><span class="n">choice</span><span class="p">]</span>
|
270
|
+
<span class="k">elsif</span> <span class="n">choice</span> <span class="o">!=</span> <span class="no">Constants</span><span class="o">::</span><span class="no">VALID_ENTRIES</span>
|
271
|
+
<span class="nb">puts</span> <span class="no">ColorizedString</span><span class="p">[</span><span class="s2">"That entry is invalid. Please re-enter."</span><span class="p">].</span><span class="nf">colorize</span><span class="p">(</span><span class="ss">:red</span><span class="p">)</span> <span class="n">entry</span> <span class="n">message</span>
|
272
272
|
<span class="k">else</span>
|
273
273
|
<span class="k">return</span> <span class="kp">nil</span>
|
274
274
|
<span class="k">end</span>
|
@@ -283,7 +283,7 @@
|
|
283
283
|
<span class="k">def</span> <span class="nf">final_outcome</span><span class="p">(</span><span class="n">pl</span><span class="p">,</span><span class="n">co</span><span class="p">)</span>
|
284
284
|
<span class="k">return</span> <span class="ss">:WIN</span> <span class="k">if</span> <span class="n">pl</span> <span class="o">></span> <span class="n">co</span>
|
285
285
|
<span class="k">return</span> <span class="ss">:LOSE</span> <span class="k">if</span> <span class="n">pl</span> <span class="o"><</span> <span class="n">co</span>
|
286
|
-
<span class="c1"># there will never be a tie because of the play() method</span>
|
286
|
+
<span class="c1"># there will never be a tie for the final outcome because of the play() method</span>
|
287
287
|
<span class="k">end</span>
|
288
288
|
<span class="k">end</span>
|
289
289
|
<span class="k">end</span>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
8
8
|
<meta name="theme-color" content="#157878"/>
|
9
9
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css' />
|
10
|
-
<link rel="stylesheet" href="/assets/css/style.css?v=
|
10
|
+
<link rel="stylesheet" href="/assets/css/style.css?v=24681c868d0c9f04c3284da474a7c294ed887eef"/>
|
11
11
|
<script src="assets/js/pace.min.js"></script>
|
12
12
|
|
13
13
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png"/>
|
data/docs/_site/how_to_run.html
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
8
8
|
<meta name="theme-color" content="#157878"/>
|
9
9
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css' />
|
10
|
-
<link rel="stylesheet" href="/assets/css/style.css?v=
|
10
|
+
<link rel="stylesheet" href="/assets/css/style.css?v=24681c868d0c9f04c3284da474a7c294ed887eef"/>
|
11
11
|
<script src="assets/js/pace.min.js"></script>
|
12
12
|
|
13
13
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png"/>
|
data/docs/_site/index.html
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
8
8
|
<meta name="theme-color" content="#157878"/>
|
9
9
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css' />
|
10
|
-
<link rel="stylesheet" href="/assets/css/style.css?v=
|
10
|
+
<link rel="stylesheet" href="/assets/css/style.css?v=24681c868d0c9f04c3284da474a7c294ed887eef"/>
|
11
11
|
<script src="assets/js/pace.min.js"></script>
|
12
12
|
|
13
13
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png"/>
|
data/docs/_site/testing.html
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
8
8
|
<meta name="theme-color" content="#157878"/>
|
9
9
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css' />
|
10
|
-
<link rel="stylesheet" href="/assets/css/style.css?v=
|
10
|
+
<link rel="stylesheet" href="/assets/css/style.css?v=24681c868d0c9f04c3284da474a7c294ed887eef"/>
|
11
11
|
<script src="assets/js/pace.min.js"></script>
|
12
12
|
|
13
13
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png"/>
|
data/docs/other_langs.md
ADDED
@@ -0,0 +1,615 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
title: Other Langs - Play Rock Paper Scissors Game
|
4
|
+
permalink: /different_code.html
|
5
|
+
---
|
6
|
+
|
7
|
+
# Other Langs
|
8
|
+
|
9
|
+
## Python
|
10
|
+
|
11
|
+
```python
|
12
|
+
import random
|
13
|
+
import sys
|
14
|
+
|
15
|
+
def makeYourChoice():
|
16
|
+
print "Press R for Rock"
|
17
|
+
print "Press P for Paper"
|
18
|
+
print "Press S for Scissors"
|
19
|
+
print "Press Q to quit!"
|
20
|
+
|
21
|
+
userChoice = raw_input("What do you want to choose?").lower()
|
22
|
+
|
23
|
+
if userChoice == "r":
|
24
|
+
return "Rock"
|
25
|
+
if userChoice == "p":
|
26
|
+
return "Paper"
|
27
|
+
if userChoice == "s":
|
28
|
+
return "Scissors"
|
29
|
+
if userChoice == "q":
|
30
|
+
sys.exit(0)
|
31
|
+
else:
|
32
|
+
makeYourChoice()
|
33
|
+
|
34
|
+
def computerRandom():
|
35
|
+
options = ["Rock","Paper","Scissors"]
|
36
|
+
randomChoice = random.randint(0,2)
|
37
|
+
return options[randomChoice]
|
38
|
+
|
39
|
+
def comparison(humanChoice, computerChoice):
|
40
|
+
if humanChoice == computerChoice:
|
41
|
+
return "Draw"
|
42
|
+
if humanChoice == "Rock" and computerChoice == "Paper":
|
43
|
+
return "Computer Wins"
|
44
|
+
if humanChoice == "Paper" and computerChoice == "Scissors":
|
45
|
+
return "Computer Wins"
|
46
|
+
if humanChoice == "Scissors" and computerChoice == "Rock":
|
47
|
+
return "Computer Wins"
|
48
|
+
else: return "Human Wins"
|
49
|
+
|
50
|
+
#print makeYourChoice()
|
51
|
+
|
52
|
+
while True:
|
53
|
+
humanChoice = makeYourChoice()
|
54
|
+
computerChoice = computerRandom()
|
55
|
+
|
56
|
+
print "You chose", humanChoice
|
57
|
+
print "The computer chose", computerChoice
|
58
|
+
|
59
|
+
result = comparison (humanChoice, computerChoice)
|
60
|
+
|
61
|
+
if result == "Draw":
|
62
|
+
print "Its a draw"
|
63
|
+
elif result == "Computer Wins":
|
64
|
+
print "Unlucky you lost!"
|
65
|
+
else: print "Well done you won!"
|
66
|
+
|
67
|
+
print " "
|
68
|
+
```
|
69
|
+
|
70
|
+
## Perl
|
71
|
+
|
72
|
+
```perl
|
73
|
+
use 5.012;
|
74
|
+
use warnings;
|
75
|
+
use utf8;
|
76
|
+
use open qw(:encoding(utf-8) :std);
|
77
|
+
use Getopt::Long;
|
78
|
+
|
79
|
+
=pod
|
80
|
+
RPS programmed in Perl
|
81
|
+
=cut
|
82
|
+
|
83
|
+
package Game {
|
84
|
+
use List::Util qw(shuffle first);
|
85
|
+
|
86
|
+
my $turns = 0;
|
87
|
+
my %human_choice = ( rock => 0, paper => 0, scissors => 0, );
|
88
|
+
my %comp_choice = ( rock => 0, paper => 0, scissors => 0, );
|
89
|
+
my %what_beats =
|
90
|
+
( rock => 'paper', paper => 'scissors', scissors => 'rock', );
|
91
|
+
my $comp_wins = 0;
|
92
|
+
my $human_wins = 0;
|
93
|
+
my $draws = 0;
|
94
|
+
|
95
|
+
sub save_human_choice {
|
96
|
+
my $ch = lc pop;
|
97
|
+
if ( exists $human_choice{ $ch } ) {
|
98
|
+
++$human_choice{ $ch };
|
99
|
+
}
|
100
|
+
else {
|
101
|
+
die __PACKAGE__ . ":: wrong choice: '$ch'";
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
sub get_comp_choice {
|
106
|
+
my @keys = shuffle keys %human_choice;
|
107
|
+
my $ch;
|
108
|
+
my ( $prob, $rand ) = ( 0, rand );
|
109
|
+
$ch = ( first { $rand <= ( $prob += ( $human_choice{ $_ } / $turns ) ) } @keys )
|
110
|
+
if $turns > 0;
|
111
|
+
$ch //= $keys[0];
|
112
|
+
$ch = $what_beats{ $ch };
|
113
|
+
++$comp_choice{ $ch };
|
114
|
+
return $ch;
|
115
|
+
}
|
116
|
+
|
117
|
+
sub make_turn {
|
118
|
+
my ( $comp_ch, $human_ch ) = ( pop(), pop() );
|
119
|
+
++$turns;
|
120
|
+
if ( $what_beats{ $human_ch } eq $comp_ch ) {
|
121
|
+
++$comp_wins;
|
122
|
+
return 'I win!';
|
123
|
+
}
|
124
|
+
elsif ( $what_beats{ $comp_ch } eq $human_ch ) {
|
125
|
+
++$human_wins;
|
126
|
+
return 'You win!';
|
127
|
+
}
|
128
|
+
else {
|
129
|
+
++$draws;
|
130
|
+
return 'Draw!';
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
sub get_final_report {
|
135
|
+
my $report =
|
136
|
+
"You chose:\n"
|
137
|
+
. " rock = $human_choice{rock} times,\n"
|
138
|
+
. " paper = $human_choice{paper} times,\n"
|
139
|
+
. " scissors = $human_choice{scissors} times,\n"
|
140
|
+
. "I chose:\n"
|
141
|
+
. " rock = $comp_choice{rock} times,\n"
|
142
|
+
. " paper = $comp_choice{paper} times,\n"
|
143
|
+
. " scissors = $comp_choice{scissors} times,\n"
|
144
|
+
. "Turns: $turns\n"
|
145
|
+
. "I won: $comp_wins, you won: $human_wins, draws: $draws\n";
|
146
|
+
return $report;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
sub main {
|
151
|
+
GetOptions( 'quiet' => \my $quiet );
|
152
|
+
greet() if !$quiet;
|
153
|
+
while (1) {
|
154
|
+
print_next_line() if !$quiet;
|
155
|
+
my $input = get_input();
|
156
|
+
last unless $input;
|
157
|
+
if ( $input eq 'error' ) {
|
158
|
+
print "I don't understand!\n" if !$quiet;
|
159
|
+
redo;
|
160
|
+
}
|
161
|
+
my $comp_choice = Game::get_comp_choice();
|
162
|
+
Game::save_human_choice($input);
|
163
|
+
my $result = Game::make_turn( $input, $comp_choice );
|
164
|
+
describe_turn_result( $input, $comp_choice, $result )
|
165
|
+
if !$quiet;
|
166
|
+
}
|
167
|
+
print Game::get_final_report();
|
168
|
+
}
|
169
|
+
|
170
|
+
sub greet {
|
171
|
+
print "Welcome to the Rock-Paper-Scissors game!\n"
|
172
|
+
. "Choose 'rock', 'paper' or 'scissors'\n"
|
173
|
+
. "Enter empty line or 'quit' to quit\n";
|
174
|
+
}
|
175
|
+
|
176
|
+
sub print_next_line {
|
177
|
+
print 'Your choice: ';
|
178
|
+
}
|
179
|
+
|
180
|
+
sub get_input {
|
181
|
+
my $input = <>;
|
182
|
+
print "\n" and return if !$input; # EOF
|
183
|
+
chomp $input;
|
184
|
+
return if !$input or $input =~ m/\A \s* q/xi;
|
185
|
+
return
|
186
|
+
( $input =~ m/\A \s* r/xi ) ? 'rock'
|
187
|
+
: ( $input =~ m/\A \s* p/xi ) ? 'paper'
|
188
|
+
: ( $input =~ m/\A \s* s/xi ) ? 'scissors'
|
189
|
+
: 'error';
|
190
|
+
}
|
191
|
+
|
192
|
+
sub describe_turn_result {
|
193
|
+
my ( $human_ch, $comp_ch, $result ) = @_;
|
194
|
+
print "You chose \u$human_ch, I chose \u$comp_ch. $result\n";
|
195
|
+
}
|
196
|
+
|
197
|
+
main();
|
198
|
+
```
|
199
|
+
|
200
|
+
## C\#
|
201
|
+
|
202
|
+
```csharp
|
203
|
+
using System;
|
204
|
+
using System.Collections.Generic;
|
205
|
+
using System.Linq;
|
206
|
+
|
207
|
+
namespace RockPaperScissors
|
208
|
+
{
|
209
|
+
class Program
|
210
|
+
{
|
211
|
+
static void Main(string[] args)
|
212
|
+
{
|
213
|
+
// There is no limit on the amount of weapons supported by RPSGame. Matchups are calculated depending on the order.
|
214
|
+
var rps = new RPSGame("scissors", "paper", "rock", "lizard", "spock");
|
215
|
+
|
216
|
+
int wins = 0, losses = 0, draws = 0;
|
217
|
+
|
218
|
+
while (true)
|
219
|
+
{
|
220
|
+
Console.WriteLine("Make your move: " + string.Join(", ", rps.Weapons) + ", quit");
|
221
|
+
|
222
|
+
string weapon = Console.ReadLine().Trim().ToLower();
|
223
|
+
|
224
|
+
if (weapon == "quit")
|
225
|
+
break;
|
226
|
+
|
227
|
+
if (!rps.Weapons.Contains(weapon))
|
228
|
+
{
|
229
|
+
Console.WriteLine("Invalid weapon!");
|
230
|
+
continue;
|
231
|
+
}
|
232
|
+
|
233
|
+
int result = rps.Next(weapon);
|
234
|
+
|
235
|
+
Console.WriteLine("You chose {0} and your opponent chose {1}!", weapon, rps.LastAIWeapon);
|
236
|
+
|
237
|
+
switch (result)
|
238
|
+
{
|
239
|
+
case 1: Console.WriteLine("{0} pwns {1}. You're a winner!", weapon, rps.LastAIWeapon);
|
240
|
+
wins++;
|
241
|
+
break;
|
242
|
+
case 0: Console.WriteLine("Draw!");
|
243
|
+
draws++;
|
244
|
+
break;
|
245
|
+
case -1: Console.WriteLine("{0} pwns {1}. You're a loser!", rps.LastAIWeapon, weapon);
|
246
|
+
losses++;
|
247
|
+
break;
|
248
|
+
}
|
249
|
+
|
250
|
+
Console.WriteLine();
|
251
|
+
}
|
252
|
+
|
253
|
+
Console.WriteLine("\nPlayer Statistics\nWins: {0}\nLosses: {1}\nDraws: {2}", wins, losses, draws);
|
254
|
+
}
|
255
|
+
|
256
|
+
class RPSGame
|
257
|
+
{
|
258
|
+
public RPSGame(params string[] weapons)
|
259
|
+
{
|
260
|
+
Weapons = weapons;
|
261
|
+
|
262
|
+
// Creates a new AI opponent, and gives it the list of weapons.
|
263
|
+
_rpsAI = new RPSAI(weapons);
|
264
|
+
}
|
265
|
+
|
266
|
+
// Play next turn.
|
267
|
+
public int Next(string weapon)
|
268
|
+
{
|
269
|
+
string aiWeapon = _rpsAI.NextMove(); // Gets the AI opponent's next move.
|
270
|
+
LastAIWeapon = aiWeapon; // Saves the AI opponent's move in a property so the player can see it.
|
271
|
+
|
272
|
+
_rpsAI.AddPlayerMove(weapon); // Let the AI know which weapon the player chose, for future predictions.
|
273
|
+
return GetWinner(Weapons, weapon, aiWeapon); // Returns -1 if AI win, 0 if draw, and 1 if player win.
|
274
|
+
}
|
275
|
+
|
276
|
+
// Returns matchup winner.
|
277
|
+
public static int GetWinner(string[] weapons, string weapon1, string weapon2)
|
278
|
+
{
|
279
|
+
if (weapon1 == weapon2)
|
280
|
+
return 0; // If weapons are the same, return 0 for draw.
|
281
|
+
|
282
|
+
if (GetVictories(weapons, weapon1).Contains(weapon2))
|
283
|
+
return 1; // Returns 1 for weapon1 win.
|
284
|
+
else if (GetVictories(weapons, weapon2).Contains(weapon1))
|
285
|
+
return -1; // Returns -1 for weapon2 win.
|
286
|
+
|
287
|
+
throw new Exception("No winner found.");
|
288
|
+
}
|
289
|
+
|
290
|
+
/*
|
291
|
+
* Return weapons that the provided weapon beats.
|
292
|
+
* The are calculated in the following way:
|
293
|
+
* If the index of the weapon is even, then all even indices less than it,
|
294
|
+
* and all odd indices greater than it, are victories.
|
295
|
+
* One exception is if it is an odd index, and also the last index in the set,
|
296
|
+
* then the first index in the set is a victory.
|
297
|
+
*/
|
298
|
+
public static IEnumerable<string> GetVictories(string[] weapons, string weapon)
|
299
|
+
{
|
300
|
+
// Gets index of weapon.
|
301
|
+
int index = Array.IndexOf(weapons, weapon);
|
302
|
+
|
303
|
+
// If weapon is odd and the final index in the set, then return the first item in the set as a victory.
|
304
|
+
if (index % 2 != 0 && index == weapons.Length - 1)
|
305
|
+
yield return weapons[0];
|
306
|
+
|
307
|
+
for (int i = index - 2; i >= 0; i -= 2)
|
308
|
+
yield return weapons[i];
|
309
|
+
|
310
|
+
for (int i = index + 1; i < weapons.Length; i += 2)
|
311
|
+
yield return weapons[i];
|
312
|
+
}
|
313
|
+
|
314
|
+
public string LastAIWeapon
|
315
|
+
{
|
316
|
+
private set;
|
317
|
+
get;
|
318
|
+
}
|
319
|
+
|
320
|
+
public readonly string[] Weapons;
|
321
|
+
private RPSAI _rpsAI;
|
322
|
+
|
323
|
+
class RPSAI
|
324
|
+
{
|
325
|
+
public RPSAI(params string[] weapons)
|
326
|
+
{
|
327
|
+
_weapons = weapons;
|
328
|
+
_weaponProbability = new Dictionary<string, int>();
|
329
|
+
|
330
|
+
// The AI sets the probability for each weapon to be chosen as 1.
|
331
|
+
foreach (string weapon in weapons)
|
332
|
+
_weaponProbability.Add(weapon, 1);
|
333
|
+
|
334
|
+
_random = new Random();
|
335
|
+
}
|
336
|
+
|
337
|
+
// Increases probability of selecting each weapon that beats the provided move.
|
338
|
+
public void AddPlayerMove(string weapon)
|
339
|
+
{
|
340
|
+
int index = Array.IndexOf(_weapons, weapon);
|
341
|
+
|
342
|
+
foreach (string winWeapon in _weapons.Except(GetVictories(_weapons, weapon)))
|
343
|
+
if (winWeapon != weapon)
|
344
|
+
_weaponProbability[winWeapon]++;
|
345
|
+
}
|
346
|
+
|
347
|
+
// Gets the AI's next move.
|
348
|
+
public string NextMove()
|
349
|
+
{
|
350
|
+
double r = _random.NextDouble();
|
351
|
+
|
352
|
+
double divisor = _weaponProbability.Values.Sum();
|
353
|
+
|
354
|
+
var weightedWeaponRanges = new Dictionary<double, string>();
|
355
|
+
|
356
|
+
double currentPos = 0.0;
|
357
|
+
|
358
|
+
// Maps probabilities to ranges between 0.0 and 1.0. Returns weighted random weapon.
|
359
|
+
foreach (var weapon in _weaponProbability)
|
360
|
+
{
|
361
|
+
double weightedRange = weapon.Value / divisor;
|
362
|
+
if (r <= currentPos + (weapon.Value / divisor))
|
363
|
+
return weapon.Key;
|
364
|
+
currentPos += weightedRange;
|
365
|
+
}
|
366
|
+
|
367
|
+
throw new Exception("Error calculating move.");
|
368
|
+
}
|
369
|
+
|
370
|
+
Random _random;
|
371
|
+
private readonly string[] _weapons;
|
372
|
+
private Dictionary<string, int> _weaponProbability;
|
373
|
+
}
|
374
|
+
}
|
375
|
+
}
|
376
|
+
}
|
377
|
+
```
|
378
|
+
|
379
|
+
## C++
|
380
|
+
|
381
|
+
```cpp
|
382
|
+
#include <windows.h>
|
383
|
+
#include <iostream>
|
384
|
+
#include <string>
|
385
|
+
|
386
|
+
//-------------------------------------------------------------------------------
|
387
|
+
using namespace std;
|
388
|
+
|
389
|
+
//-------------------------------------------------------------------------------
|
390
|
+
enum choices { ROCK, SPOCK, PAPER, LIZARD, SCISSORS, MX_C };
|
391
|
+
enum indexes { PLAYER, COMPUTER, DRAW };
|
392
|
+
|
393
|
+
//-------------------------------------------------------------------------------
|
394
|
+
class stats
|
395
|
+
{
|
396
|
+
public:
|
397
|
+
stats() : _draw( 0 )
|
398
|
+
{
|
399
|
+
ZeroMemory( _moves, sizeof( _moves ) );
|
400
|
+
ZeroMemory( _win, sizeof( _win ) );
|
401
|
+
}
|
402
|
+
void draw() { _draw++; }
|
403
|
+
void win( int p ) { _win[p]++; }
|
404
|
+
void move( int p, int m ) { _moves[p][m]++; }
|
405
|
+
int getMove( int p, int m ) { return _moves[p][m]; }
|
406
|
+
string format( int a )
|
407
|
+
{
|
408
|
+
char t[32];
|
409
|
+
wsprintf( t, "%.3d", a );
|
410
|
+
string d( t );
|
411
|
+
return d;
|
412
|
+
}
|
413
|
+
|
414
|
+
void print()
|
415
|
+
{
|
416
|
+
string d = format( _draw ),
|
417
|
+
pw = format( _win[PLAYER] ), cw = format( _win[COMPUTER] ),
|
418
|
+
pr = format( _moves[PLAYER][ROCK] ), cr = format( _moves[COMPUTER][ROCK] ),
|
419
|
+
pp = format( _moves[PLAYER][PAPER] ), cp = format( _moves[COMPUTER][PAPER] ),
|
420
|
+
ps = format( _moves[PLAYER][SCISSORS] ), cs = format( _moves[COMPUTER][SCISSORS] ),
|
421
|
+
pl = format( _moves[PLAYER][LIZARD] ), cl = format( _moves[COMPUTER][LIZARD] ),
|
422
|
+
pk = format( _moves[PLAYER][SPOCK] ), ck = format( _moves[COMPUTER][SPOCK] );
|
423
|
+
|
424
|
+
system( "cls" );
|
425
|
+
cout << endl;
|
426
|
+
cout << "+----------+-------+--------+--------+---------+----------+--------+---------+" << endl;
|
427
|
+
cout << "| | WON | DRAW | ROCK | PAPER | SCISSORS | LIZARD | SPOCK |" << endl;
|
428
|
+
cout << "+----------+-------+--------+--------+---------+----------+--------+---------+" << endl;
|
429
|
+
cout << "| PLAYER | " << pw << " | | " << pr << " | " << pp << " | " << ps << " | " << pl << " | " << pk << " |" << endl;
|
430
|
+
cout << "+----------+-------+ " << d << " +--------+---------+----------+--------+---------+" << endl;
|
431
|
+
cout << "| COMPUTER | " << cw << " | | " << cr << " | " << cp << " | " << cs << " | " << cl << " | " << ck << " |" << endl;
|
432
|
+
cout << "+----------+-------+--------+--------+---------+----------+--------+---------+" << endl;
|
433
|
+
cout << endl << endl;
|
434
|
+
|
435
|
+
system( "pause" );
|
436
|
+
|
437
|
+
}
|
438
|
+
|
439
|
+
private:
|
440
|
+
int _moves[2][MX_C], _win[2], _draw;
|
441
|
+
};
|
442
|
+
//-------------------------------------------------------------------------------
|
443
|
+
class rps
|
444
|
+
{
|
445
|
+
private:
|
446
|
+
int makeMove()
|
447
|
+
{
|
448
|
+
int total = 0, r, s;
|
449
|
+
for( int i = 0; i < MX_C; total += statistics.getMove( PLAYER, i++ ) );
|
450
|
+
r = rand() % total;
|
451
|
+
|
452
|
+
for( int i = ROCK; i < SCISSORS; i++ )
|
453
|
+
{
|
454
|
+
s = statistics.getMove( PLAYER, i );
|
455
|
+
if( r < s ) return ( i + 1 );
|
456
|
+
r -= s;
|
457
|
+
}
|
458
|
+
|
459
|
+
return ROCK;
|
460
|
+
}
|
461
|
+
|
462
|
+
void printMove( int p, int m )
|
463
|
+
{
|
464
|
+
if( p == COMPUTER ) cout << "My move: ";
|
465
|
+
else cout << "Your move: ";
|
466
|
+
|
467
|
+
switch( m )
|
468
|
+
{
|
469
|
+
case ROCK: cout << "ROCK\n"; break;
|
470
|
+
case PAPER: cout << "PAPER\n"; break;
|
471
|
+
case SCISSORS: cout << "SCISSORS\n"; break;
|
472
|
+
case LIZARD: cout << "LIZARD\n"; break;
|
473
|
+
case SPOCK: cout << "SPOCK\n";
|
474
|
+
}
|
475
|
+
}
|
476
|
+
|
477
|
+
public:
|
478
|
+
rps()
|
479
|
+
{
|
480
|
+
checker[ROCK][ROCK] = 2; checker[ROCK][PAPER] = 1; checker[ROCK][SCISSORS] = 0; checker[ROCK][LIZARD] = 0; checker[ROCK][SPOCK] = 1;
|
481
|
+
checker[PAPER][ROCK] = 0; checker[PAPER][PAPER] = 2; checker[PAPER][SCISSORS] = 1; checker[PAPER][LIZARD] = 1; checker[PAPER][SPOCK] = 0;
|
482
|
+
checker[SCISSORS][ROCK] = 1; checker[SCISSORS][PAPER] = 0; checker[SCISSORS][SCISSORS] = 2; checker[SCISSORS][LIZARD] = 0; checker[SCISSORS][SPOCK] = 1;
|
483
|
+
checker[LIZARD][ROCK] = 1; checker[LIZARD][PAPER] = 0; checker[LIZARD][SCISSORS] = 1; checker[LIZARD][LIZARD] = 2; checker[LIZARD][SPOCK] = 0;
|
484
|
+
checker[SPOCK][ROCK] = 0; checker[SPOCK][PAPER] = 1; checker[SPOCK][SCISSORS] = 0; checker[SPOCK][LIZARD] = 1; checker[SPOCK][SPOCK] = 2;
|
485
|
+
}
|
486
|
+
void play()
|
487
|
+
{
|
488
|
+
int p, r, m;
|
489
|
+
while( true )
|
490
|
+
{
|
491
|
+
cout << "What is your move (1)ROCK (2)SPOCK (3)PAPER (4)LIZARD (5)SCISSORS (0)Quit ? ";
|
492
|
+
cin >> p;
|
493
|
+
if( !p || p < 0 ) break;
|
494
|
+
if( p > 0 && p < 6 )
|
495
|
+
{
|
496
|
+
p--;
|
497
|
+
cout << endl;
|
498
|
+
printMove( PLAYER, p );
|
499
|
+
statistics.move( PLAYER, p );
|
500
|
+
|
501
|
+
m = makeMove();
|
502
|
+
statistics.move( COMPUTER, m );
|
503
|
+
printMove( COMPUTER, m );
|
504
|
+
|
505
|
+
r = checker[p][m];
|
506
|
+
switch( r )
|
507
|
+
{
|
508
|
+
case DRAW:
|
509
|
+
cout << endl << "DRAW!" << endl << endl;
|
510
|
+
statistics.draw();
|
511
|
+
break;
|
512
|
+
case COMPUTER:
|
513
|
+
cout << endl << "I WIN!" << endl << endl;
|
514
|
+
statistics.win( COMPUTER );
|
515
|
+
break;
|
516
|
+
case PLAYER:
|
517
|
+
cout << endl << "YOU WIN!" << endl << endl;
|
518
|
+
statistics.win( PLAYER );
|
519
|
+
|
520
|
+
}
|
521
|
+
system( "pause" );
|
522
|
+
}
|
523
|
+
system( "cls" );
|
524
|
+
}
|
525
|
+
statistics.print();
|
526
|
+
}
|
527
|
+
|
528
|
+
private:
|
529
|
+
stats statistics;
|
530
|
+
int checker[MX_C][MX_C];
|
531
|
+
};
|
532
|
+
//-------------------------------------------------------------------------------
|
533
|
+
int main( int argc, char* argv[] )
|
534
|
+
{
|
535
|
+
srand( GetTickCount() );
|
536
|
+
rps game;
|
537
|
+
game.play();
|
538
|
+
return 0;
|
539
|
+
}
|
540
|
+
//-------------------------------------------------------------------------------
|
541
|
+
```
|
542
|
+
|
543
|
+
## Go
|
544
|
+
|
545
|
+
```go
|
546
|
+
|
547
|
+
package main
|
548
|
+
import (
|
549
|
+
"fmt"
|
550
|
+
"math/rand"
|
551
|
+
"strings"
|
552
|
+
"time"
|
553
|
+
)
|
554
|
+
|
555
|
+
const rps = "rps"
|
556
|
+
|
557
|
+
var msg = []string{
|
558
|
+
"Rock breaks scissors",
|
559
|
+
"Paper covers rock",
|
560
|
+
"Scissors cut paper",
|
561
|
+
}
|
562
|
+
|
563
|
+
func main() {
|
564
|
+
rand.Seed(time.Now().UnixNano())
|
565
|
+
fmt.Println("Rock Paper Scissors")
|
566
|
+
fmt.Println("Enter r, p, or s as your play. Anything else ends the game.")
|
567
|
+
fmt.Println("Running score shown as <your wins>:<my wins>")
|
568
|
+
var pi string // player input
|
569
|
+
var aScore, pScore int
|
570
|
+
sl := 3 // for output alignment
|
571
|
+
pcf := make([]int, 3) // pcf = player choice frequency
|
572
|
+
var plays int
|
573
|
+
aChoice := rand.Intn(3) // ai choice for first play is completely random
|
574
|
+
for {
|
575
|
+
// get player choice
|
576
|
+
fmt.Print("Play: ")
|
577
|
+
_, err := fmt.Scanln(&pi) // lazy
|
578
|
+
if err != nil || len(pi) != 1 {
|
579
|
+
break
|
580
|
+
}
|
581
|
+
pChoice := strings.Index(rps, pi)
|
582
|
+
if pChoice < 0 {
|
583
|
+
break
|
584
|
+
}
|
585
|
+
pcf[pChoice]++
|
586
|
+
plays++
|
587
|
+
|
588
|
+
// show result of play
|
589
|
+
fmt.Printf("My play:%s%c. ", strings.Repeat(" ", sl-2), rps[aChoice])
|
590
|
+
switch (aChoice - pChoice + 3) % 3 {
|
591
|
+
case 0:
|
592
|
+
fmt.Println("Tie.")
|
593
|
+
case 1:
|
594
|
+
fmt.Printf("%s. My point.\n", msg[aChoice])
|
595
|
+
aScore++
|
596
|
+
case 2:
|
597
|
+
fmt.Printf("%s. Your point.\n", msg[pChoice])
|
598
|
+
pScore++
|
599
|
+
}
|
600
|
+
|
601
|
+
// show score
|
602
|
+
sl, _ = fmt.Printf("%d:%d ", pScore, aScore)
|
603
|
+
|
604
|
+
// compute ai choice for next play
|
605
|
+
switch rn := rand.Intn(plays); {
|
606
|
+
case rn < pcf[0]:
|
607
|
+
aChoice = 1
|
608
|
+
case rn < pcf[0]+pcf[1]:
|
609
|
+
aChoice = 2
|
610
|
+
default:
|
611
|
+
aChoice = 0
|
612
|
+
}
|
613
|
+
}
|
614
|
+
}
|
615
|
+
```
|
data/lib/rps/version.rb
CHANGED
data/rps.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "PlayRockPaperScissorsGame"
|
3
|
-
spec.version = "2.8.
|
4
|
-
spec.date = "2017-05-
|
3
|
+
spec.version = "2.8.3"
|
4
|
+
spec.date = "2017-05-15"
|
5
5
|
spec.summary = "A Rock Paper Scissors Ruby Gem"
|
6
6
|
spec.description = <<-EOF
|
7
7
|
A Ruby-programmed rock paper scissors game.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: PlayRockPaperScissorsGame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.8.
|
4
|
+
version: 2.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bag3318
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
ft+uhriUZSVDBJRLSlrQEH2f0866a9dA4oUmvvFU46Mh6pozDjOcLJIp/tCnbVOc
|
31
31
|
HSdXPrjfOoDbhBPH/4wUd5P0rDoNKN1hxH4SzA==
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2017-05-
|
33
|
+
date: 2017-05-15 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: bundler
|
@@ -171,6 +171,7 @@ files:
|
|
171
171
|
- docs/assets/js/pace.min.js
|
172
172
|
- docs/index.md
|
173
173
|
- docs/jekyll-theme-cayman.gemspec
|
174
|
+
- docs/other_langs.md
|
174
175
|
- docs/script/bootstrap
|
175
176
|
- docs/script/cibuild
|
176
177
|
- docs/script/release
|
metadata.gz.sig
CHANGED
Binary file
|