Mini-project # 1 - Rock-paper-scissors-___An Introduction to Interactive Programming in Python"RICE"
Mini-project description — Rock-paper-scissors-lizard-Spock
Rock-paper-scissors is a hand game that is played by two people. The players count to three in unison and simultaneously "throw” one of three hand signals that correspond to rock, paper or scissors. The winner is determined by the rules:
- Rock smashes scissors
- Scissors cuts paper
- Paper covers rock
Rock-paper-scissors is a surprisingly popular game that many people play seriously (see the Wikipedia article for details).
Due to the fact that a tie happens around 1/3 of the time, several variants of Rock-Paper-Scissors exist that include more choices to make ties less likely.
Rock-paper-scissors-lizard-Spock (RPSLS) is a variant of Rock-paper-scissors that allows five choices. Each choice wins against two other choices, loses against two other choices and ties against itself. Much of RPSLS's popularity is that it has been featured
in 3 episodes of the TV series "The Big Bang Theory". The Wikipedia entry for RPSLS gives the complete
description of the details of the game.
In our first mini-project, we will build a Python function rpsls(name)
that
takes as input the string name
, which is one of "rock"
, "paper"
,"scissors"
, "lizard"
,
or "Spock"
. The function then simulates playing a round
of Rock-paper-scissors-lizard-Spock by generating its own random choice from these alternatives and then determining the winner using a simple rule that we will next describe.
While Rock-paper-scissor-lizard-Spock has a set of ten rules that logically determine who wins a round of RPSLS, coding up these rules would require a large number (5x5=25) of if
/elif
/else
clauses
in your mini-project code. A simpler method for determining the winner is to assign each of the five choices a number:
- 0 — rock
- 1 — Spock
- 2 — paper
- 3 — lizard
- 4 — scissors
In this expanded list, each choice wins against the preceding two choices and loses against the following two choices (if rock and scissors are thought of as being adjacent using modular arithmetic).
In all of the mini-projects for this class, we will provide a walk through of the steps involved in building your project to aid its development. A template for your mini-project is available
here. Please work from this template.
Mini-project development process
- Build a helper function
name_to_number(name)
that
converts the stringname
into a number between 0 and
4 as described above. This function should use a sequence ofif
/elif
/else
clauses.
You can use conditions of the formname == 'paper'
,
etc. to distinguish the cases. To make debugging your code easier, we suggest including a finalelse
clause
that catches cases whenname
does not match any of the
five correct input strings and prints an appropriate error message. You can test your implementation ofname_to_number()
using
this name_to_number testing template. (Also available in the Code Clinic tips thread). - Next, you should build a second helper function
number_to_name(number)
that
converts a number in the range 0 to 4 into its corresponding name as a string. Again, we suggest including a finalelse
clause
that catches cases whennumber
is not in the correct
range. You can test your implementation ofnumber_to_name()
using
this number_to_name testing template. - Implement the first part of the main function
rpsls(player_choice)
.
Print out a blank line (to separate consecutive games) followed by a line with an appropriate message describing the player's choice. Then compute the numberplayer_number
between
0 and 4 corresponding to the player's choice by calling the helper functionname_to_number()
usingplayer_choice
. - Implement the second part of
rpsls()
that
generates the computer's guess and prints out an appropriate message for that guess. In particular, compute a random numbercomp_number
between
0 and 4 that corresponds to the computer's guess using the functionrandom.randrange()
.
We suggest experimenting withrandrange
in a separate
CodeSkulptor window before deciding on how to call it to make sure that you do not accidently generate numbers in the wrong range. Then compute the namecomp_choice
corresponding
to the computer's number using the functionnumber_to_name()
and
print an appropriate message with the computer's choice to the console. - Implement the last part of
rpsls()
that
determines and prints out the winner. Specifically, compute the difference betweencomp_number
andplayer_number
taken
modulo five. Then write anif/elif/else
statement whose
conditions test the various possible values of this difference and then prints an appropriate message concerning the winner. If you have trouble deriving the conditions for the clauses of thisif/elif/else
statement,
we suggest reviewing the "RPSLS" video which describes a simple test for determine the winner of RPSLS.
This will be the only mini-project in the class that is not an interactive game. Since we have not yet learned enough to allow you to play the game interactively, you will simply call your rpsls
function
repeatedly in the program with different player choices. You will see that we have provided five such calls at the bottom of the template. Running your program repeatedly should generate different computer guesses and different winners each time. While you
are testing, feel free to modify those calls, but make sure they are restored when you hand in your mini-project, as your peer assessors will expect them to be there.
The output of running your program should have the following form:
Player chooses rock
Computer chooses scissors
Player wins! Player chooses Spock
Computer chooses lizard
Computer wins! Player chooses paper
Computer chooses lizard
Computer wins! Player chooses lizard
Computer chooses scissors
Computer wins! Player chooses scissors
Computer chooses Spock
Computer wins!
Note that, for this initial mini-project, we will focus only on testing whether your implementation of rpsls()
works
correctly on valid input.
Grading rubric — 18 pts total (scaled to 100 pts)
Your peers will assess your mini-project according to the rubric given below. To guide you in determining whether your project satisfies each item in the rubric, please consult the video that demonstrates our implementation of "Rock-paper-scissors-lizard-Spock".
Small deviations from the textual output of our implementation are fine. You should avoid large deviations (such as using the Python function input
to
input your guesses). Whether moderate deviations satisfy an item of the grading rubric is at your peers' discretion during their assessment.
Here is a break down of the scoring:
- 2 pts — A valid CodeSkulptor URL was submitted. Give no credit if solution code was pasted into the submission field. Give 1 pt if an invalid CodeSkulptor URL was submitted.
- 2 pts — Program implements the function
rpsls()
and
the helper functionname_to_number()
with plausible
code. Give partial credit of 1 pt if only the functionrpsls()
has
plausible code. - 1 pt — Running program does not throw an error.
- 1 pt — Program prints blank lines between games.
- 2 pts — Program prints
"Player chooses player_choice"
whereplayer_choice
is
a string of the form"rock"
,"paper"
,"scissors"
,"lizard"
or"Spock"
.
Give 1 pt if program prints out number instead of string. - 2 pts — Program prints
"Computer chooses comp_choice"
wherecomp_choice
is
a string of the form"rock", "paper", "scissors", "lizard"
or"Spock"
.
Give 1 pt if program prints out number instead of string. - 1 pt — Computer's guesses vary between five calls to
rpsls()
in
each run of the program. - 1 pt — Computer's guesses vary between runs of the program.
- 3 pts — Program prints either
"Player and computer
,
tie!""Player wins!"
or"Computer
to report outcome. (1 pt for each message.)
wins!"
- 3 pts — Program chooses correct winner according to RPSLS rules. Please manually examine 5 cases for correctness. If all five cases are correct, award 3 pts; four cases correct award 2 pts; one to three cases correct award 1 pt; no cases correct
award 0 pts.
<span style="font-size:18px;"># Rock-paper-scissors-lizard-Spock template # The key idea of this program is to equate the strings
# "rock", "paper", "scissors", "lizard", "Spock" to numbers
# as follows:
#
# 0 - rock
# 1 - Spock
# 2 - paper
# 3 - lizard
# 4 - scissors
import random
# helper functions def name_to_number(name):
# delete the following pass statement and fill in your code below
if name == 'rock':
return 0
elif name == 'Spock':
return 1
elif name == 'paper':
return 2
elif name == 'lizard':
return 3
elif name == 'scissors':
return 4
else:
print 'wrong number' # convert name to number using if/elif/else
# don't forget to return the result! def number_to_name(number):
# delete the following pass statement and fill in your code below
if number == 0:
return 'rock'
elif number == 1:
return 'Spock'
elif number == 2:
return 'paper'
elif number ==3:
return 'lizard'
elif number ==4:
return 'scissors'
else:
print 'wrong number' # convert number to a name using if/elif/else
# don't forget to return the result! def rpsls(player_choice):
# delete the following pass statement and fill in your code below # print a blank line to separate consecutive games
# print out the message for the player's choice
print 'Player chooses ',player_choice
# convert the player's choice to player_number using the function name_to_number()
player_number = name_to_number(player_choice)
# compute random guess for comp_number using random.randrange()
comp_number = random.randrange(0,4)
# convert comp_number to comp_choice using the function number_to_name()
comp_choice = number_to_name(comp_number)
# print out the message for computer's choice
print 'Computer chooses', comp_choice
# compute difference of comp_number and player_number modulo five
minus_number = comp_number - player_number
result_of_modulo = minus_number % 5
# use if/elif/else to determine winner, print winner message
if result_of_modulo ==0:
print 'Player and computer tie!'
elif result_of_modulo > 2:
print 'Player wins!'
else:
print 'Computer wins!' # test your code - THESE CALLS MUST BE PRESENT IN YOUR SUBMITTED CODE
rpsls("rock")
rpsls("Spock")
rpsls("paper")
rpsls("lizard")
rpsls("scissors") # always remember to check your completed program against the grading rubric
</span>
代码链接:CodeSkulptor
Mini-project # 1 - Rock-paper-scissors-___An Introduction to Interactive Programming in Python"RICE"的更多相关文章
- Mini-project # 4 - "Pong"___An Introduction to Interactive Programming in Python"RICE"
Mini-project #4 - "Pong" In this project, we will build a version of Pong, one of the firs ...
- An Introduction to Interactive Programming in Python (Part 1) -- Week 2_3 练习
Mini-project description - Rock-paper-scissors-lizard-Spock Rock-paper-scissors is a hand game that ...
- 【python】An Introduction to Interactive Programming in Python(week two)
This is a note for https://class.coursera.org/interactivepython-005 In week two, I have learned: 1.e ...
- An Introduction to Interactive Programming in Python (Part 1) -- Week 2_2 练习
#Practice Exercises for Logic and Conditionals # Solve each of the practice exercises below. # 1.Wri ...
- An Introduction to Interactive Programming in Python (Part 1) -- Week 2_1 练习
# Practice Exercises for Functions # Solve each of the practice exercises below. # 1.Write a Python ...
- An Introduction to Interactive Programming in Python
这是在coursera上面的一门学习pyhton的基础课程,由RICE的四位老师主讲.生动有趣,一共是9周的课程,每一周都会有一个小游戏,经历一遍,对编程会产生很大的兴趣. 所有的程序全部在老师开发的 ...
- Quiz 6b Question 8————An Introduction to Interactive Programming in Python
Question 8 We can use loops to simulate natural processes over time. Write a program that calcula ...
- Quiz 6b Question 7————An Introduction to Interactive Programming in Python
Question 7 Convert the following English description into code. Initialize n to be 1000. Initiali ...
- Quiz 6a Question 7————An Introduction to Interactive Programming in Python
First, complete the following class definition: class BankAccount: def __init__(self, initial_bal ...
随机推荐
- sql发邮件
DROP PROCEDURE USP_CheckProductCodeRepeatAndSendMail go ---检查商家是否有重复的商品编号,如果有则发送给系统配置中接收的用户邮箱 CREATE ...
- asp.net 多站点共享FormAuthentication
<authentication mode="Forms"> <forms domain="lizhanglong.com" timeout= ...
- python基础学习笔记6--异常
异常 1.什么是异常? python用异常对象来表示( exception object)异常情况.如果异常没有被处理或扑捉,程序就会所谓的回溯(TraceBack,一种错误信息)而终止执行: 2. ...
- Mybatis入门 digest
http://www.mybatis.org/mybatis-3/zh/configuration.html userDao-mapping.xml相当于是UserDao的实现, 同时也将User实体 ...
- 利用BP神经网络预测水道浅滩演变
论文 <基于现代技术的河道浅滩演变研究> 利用BP神经网络来预测浅滩演变 BP输出因子:浅滩的年平均淤积厚度以及浅滩上最小水深,是反映浅滩变化的两个基本指标,是确定浅滩航道尺度能否满足航行 ...
- iOS开发获取缓存文件的大小并清除缓存
移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...
- poj 1815 Friendship (最小割+拆点+枚举)
题意: 就在一个给定的无向图中至少应该去掉几个顶点才干使得s和t不联通. 算法: 假设s和t直接相连输出no answer. 把每一个点拆成两个点v和v'',这两个点之间连一条权值为1的边(残余容量) ...
- paip. everything exe 文件不能启动的解决
paip. everything exe 文件不能启动的解决 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blo ...
- PDFium-PDF开源之旅(1)-初探代码下载编译
近日,Google和Foxit合作开源了Foxit的PDF源代码. 叫PDFium 相关新闻不少.哈,虽说已经不是程序猿了.只是还是有兴趣跑起来围观看看.废话少说.先说编译代码的步骤(事实上Googl ...
- xcode 不值钱的动画UIImageView
了解 animateWithDuration方法 制作动画变得不值钱 代码创建一个UIImageView 后加入self.view 容器中 调用点击屏幕touchesBegan 方法执行动画 #imp ...