微信公众号开发网站开发,黑色炫酷的监控网站html,佛山网络推广电话,营销策略国内外文献综述#16 钻石 原文#xff1a;http://inventwithpython.com/bigbookpython/project16.html 这个程序的特点是一个小算法#xff0c;用于绘制各种尺寸的 ASCII 艺术画钻石。它包含绘制轮廓或你指定大小的填充式菱形的功能。这些功能对于初学者来说是很好的练习#xff1b;试着理解…#16 钻石 原文http://inventwithpython.com/bigbookpython/project16.html 这个程序的特点是一个小算法用于绘制各种尺寸的 ASCII 艺术画钻石。它包含绘制轮廓或你指定大小的填充式菱形的功能。这些功能对于初学者来说是很好的练习试着理解钻石图背后的图案因为它们的尺寸越来越大。
运行示例
当您运行diamonds.py时输出将如下所示
Diamonds, by Al Sweigart emailprotected/\
\//\
\//\
/ \
\ /\//\
//\\
\\//\//\/ \
/ \
\ /\ /\//\//\\
///\\\
\\\///\\//\/
--snip--工作原理
自己创建这个程序的一个有用的方法是首先在你的编辑器中“画”几个大小的钻石然后随着钻石变大找出它们遵循的模式。这项技术将帮助您认识到菱形轮廓的每一行都有四个部分前导空格数、外部正斜杠、内部空格数和外部反斜杠。实心钻石有几个内部正斜线和反斜线而不是内部空间。破解这个模式就是我写diamonds.py的方法。
rDiamonds, by Al Sweigart emailprotected
Draws diamonds of various sizes.
View this code at https://nostarch.com/big-book-small-python-projects/\ /\/ \ //\\/\ /\ / \ ///\\\/ \ //\\ / \ \\\\
/\ /\ / \ ///\\\ \ / \\\\
/ \ //\\ \ / \\\/// \ / \\\///
\ / \\// \ / \\// \ / \\//\/ \/ \/ \/ \/ \/
Tags: tiny, beginner, artisticdef main():print(Diamonds, by Al Sweigart emailprotected)# Display diamonds of sizes 0 through 6:for diamondSize in range(0, 6):displayOutlineDiamond(diamondSize)print() # Print a newline.displayFilledDiamond(diamondSize)print() # Print a newline.def displayOutlineDiamond(size):# Display the top half of the diamond:for i in range(size):print( * (size - i - 1), end) # Left side space.print(/, end) # Left side of diamond.print( * (i * 2), end) # Interior of diamond.print(\\) # Right side of diamond.# Display the bottom half of the diamond:for i in range(size):print( * i, end) # Left side space.print(\\, end) # Left side of diamond.print( * ((size - i - 1) * 2), end) # Interior of diamond.print(/) # Right side of diamond.def displayFilledDiamond(size):# Display the top half of the diamond:for i in range(size):print( * (size - i - 1), end) # Left side space.print(/ * (i 1), end) # Left half of diamond.print(\\ * (i 1)) # Right half of diamond.# Display the bottom half of the diamond:for i in range(size):print( * i, end) # Left side space.print(\\ * (size - i), end) # Left side of diamond.print(/ * (size - i)) # Right side of diamond.# If this program was run (instead of imported), run the game:
if __name__ __main__:main() 在输入源代码并运行几次之后尝试对其进行实验性的修改。你也可以自己想办法做到以下几点
创建其他形状三角形矩形和菱形。将形状输出到文本文件而不是屏幕。
探索程序
试着找出下列问题的答案。尝试对代码进行一些修改然后重新运行程序看看这些修改有什么影响。
把第 31 行的print(\\)改成print()会怎么样把第 30 行的print( * (i * 2), end)改成print( * (i * 2), end)会怎么样把第 18 行的range(0, 6)改成range(0, 30)会怎么样在第 34 行或第 49 行删除或注释掉for i in range(size):会发生什么
#17 骰子数学 原文http://inventwithpython.com/bigbookpython/project17.html 这个数学测验程序掷出两到六个骰子你必须尽快把它们的边加起来。但是这个程序不仅仅是自动的闪存卡它将骰子的正面画到屏幕上随机的地方。当你练习算术时ASCII 艺术画方面增加了一个有趣的转折。
运行示例
当您运行dicemath.py时输出如下
Dice Math, by Al Sweigart emailprotectedAdd up the sides of all the dice displayed on the screen. You have
30 seconds to answer as many as possible. You get 4 points for each
correct answer and lose 1 point for each incorrect answer.Press Enter to begin...-------| O O || O || O O |--------------------- | O O | -------| O | | | | O || | | O O | | || O | ------- | O |------- -------
Enter the sum: 13
--snip--工作原理
屏幕上的骰子由存储在canvas变量中的字典表示。在 Python 中元组类似于列表但是它们的内容不能改变。该字典的关键字是标记骰子左上角位置的(x, y)元组而值是ALL_DICE中的“骰子元组”之一。您可以在第 28 到 80 行中看到每个骰子元组包含一个字符串列表它以图形方式表示一个可能的骰子面以及骰子面上有多少点数的整数。该程序使用这些信息来显示骰子并计算它们的总和。
第 174 到 177 行将canvas字典中的数据呈现在屏幕上其方式类似于项目 13“康威的生命游戏”在屏幕上呈现单元格的方式。
Dice Math, by Al Sweigart emailprotected
A flash card addition game where you sum the total on random dice rolls.
View this code at https://nostarch.com/big-book-small-python-projects
Tags: large, artistic, game, mathimport random, time# Set up the constants:
DICE_WIDTH 9
DICE_HEIGHT 5
CANVAS_WIDTH 79
CANVAS_HEIGHT 24 - 3 # -3 for room to enter the sum at the bottom.# The duration is in seconds:
QUIZ_DURATION 30 # (!) Try changing this to 10 or 60.
MIN_DICE 2 # (!) Try changing this to 1 or 5.
MAX_DICE 6 # (!) Try changing this to 14.# (!) Try changing these to different numbers:
REWARD 4 # (!) Points awarded for correct answers.
PENALTY 1 # (!) Points removed for incorrect answers.
# (!) Try setting PENALTY to a negative number to give points for
# wrong answers!# The program hangs if all of the dice cant fit on the screen:
assert MAX_DICE 14D1 ([-------,| |,| O |,| |,-------], 1)D2a ([-------,| O |,| |,| O |,-------], 2)D2b ([-------,| O |,| |,| O |,-------], 2)D3a ([-------,| O |,| O |,| O |,-------], 3)D3b ([-------,| O |,| O |,| O |,-------], 3)D4 ([-------,| O O |,| |,| O O |,-------], 4)D5 ([-------,| O O |,| O |,| O O |,-------], 5)D6a ([-------,| O O |,| O O |,| O O |,-------], 6)D6b ([-------,| O O O |,| |,| O O O |,-------], 6)ALL_DICE [D1, D2a, D2b, D3a, D3b, D4, D5, D6a, D6b]print(Dice Math, by Al Sweigart emailprotectedAdd up the sides of all the dice displayed on the screen. You have
{} seconds to answer as many as possible. You get {} points for each
correct answer and lose {} point for each incorrect answer.
.format(QUIZ_DURATION, REWARD, PENALTY))
input(Press Enter to begin...)# Keep track of how many answers were correct and incorrect:
correctAnswers 0
incorrectAnswers 0
startTime time.time()
while time.time() startTime QUIZ_DURATION: # Main game loop.# Come up with the dice to display:sumAnswer 0diceFaces []for i in range(random.randint(MIN_DICE, MAX_DICE)):die random.choice(ALL_DICE)# die[0] contains the list of strings of the die face:diceFaces.append(die[0])# die[1] contains the integer number of pips on the face:sumAnswer die[1]# Contains (x, y) tuples of the top-left corner of each die.topLeftDiceCorners []# Figure out where dice should go:for i in range(len(diceFaces)):while True:# Find a random place on the canvas to put the die:left random.randint(0, CANVAS_WIDTH - 1 - DICE_WIDTH)top random.randint(0, CANVAS_HEIGHT - 1 - DICE_HEIGHT)# Get the x, y coordinates for all four corners:# left# v#top ------- ^# | O | |# | O | DICE_HEIGHT (5)# | O | |# ------- v# -------# DICE_WIDTH (9)topLeftX lefttopLeftY toptopRightX left DICE_WIDTHtopRightY topbottomLeftX leftbottomLeftY top DICE_HEIGHTbottomRightX left DICE_WIDTHbottomRightY top DICE_HEIGHT# Check if this die overlaps with previous dice.overlaps Falsefor prevDieLeft, prevDieTop in topLeftDiceCorners:prevDieRight prevDieLeft DICE_WIDTHprevDieBottom prevDieTop DICE_HEIGHT# Check each corner of this die to see if it is inside# of the area the previous die:for cornerX, cornerY in ((topLeftX, topLeftY),(topRightX, topRightY),(bottomLeftX, bottomLeftY),(bottomRightX, bottomRightY)):if (prevDieLeft cornerX prevDieRightand prevDieTop cornerY prevDieBottom):overlaps Trueif not overlaps:# It doesnt overlap, so we can put it here:topLeftDiceCorners.append((left, top))break# Draw the dice on the canvas:# Keys are (x, y) tuples of ints, values the character at that# position on the canvas:canvas {}# Loop over each die:for i, (dieLeft, dieTop) in enumerate(topLeftDiceCorners):# Loop over each character in the dies face:dieFace diceFaces[i]for dx in range(DICE_WIDTH):for dy in range(DICE_HEIGHT):# Copy this character to the correct place on the canvas:canvasX dieLeft dxcanvasY dieTop dy# Note that in dieFace, a list of strings, the x and y# are swapped:canvas[(canvasX, canvasY)] dieFace[dy][dx]# Display the canvas on the screen:for cy in range(CANVAS_HEIGHT):for cx in range(CANVAS_WIDTH):print(canvas.get((cx, cy), ), end)print() # Print a newline.# Let the player enter their answer:response input(Enter the sum: ).strip()if response.isdecimal() and int(response) sumAnswer:correctAnswers 1else:print(Incorrect, the answer is, sumAnswer)time.sleep(2)incorrectAnswers 1# Display the final score:
score (correctAnswers * REWARD) - (incorrectAnswers * PENALTY)
print(Correct: , correctAnswers)
print(Incorrect:, incorrectAnswers)
print(Score: , score) 在输入源代码并运行几次之后尝试对其进行实验性的修改。标有(!)的注释对你可以做的小改变有建议。你也可以自己想办法做到以下几点
重新设计 ASCII 艺术画骰子面。添加七点、八点或九点的骰子点数。
探索程序
试着找出下列问题的答案。尝试对代码进行一些修改然后重新运行程序看看这些修改有什么影响。
如果把 82 行改成ALL_DICE [D1]会怎么样如果把 176 行的get((cx, cy), )改成get((cx, cy), .)会怎么样如果把 182 行的correctAnswers 1改成correctAnswers 0会怎么样如果删除或注释掉第 93 行的correctAnswers 0会得到什么错误信息
十八、滚动骰子 原文http://inventwithpython.com/bigbookpython/project18.html 地下城龙和其他桌面角色扮演游戏使用特殊的骰子可以有 4、8、10、12 甚至 20 面。这些游戏也有一个特定的符号来指示掷哪个骰子。例如3d6是指掷出三个六面骰子而1d102是指掷出一个十面骰子并在掷骰子时增加两点奖励。这个程序模拟掷骰子以防你忘记带自己的。它还可以模拟物理上不存在的滚动骰子如 38 面骰子。
运行示例
当您运行diceroller.py时输出将如下所示
Dice Roller, by Al Sweigart emailprotected
--snip--3d6
7 (3, 2, 2)1d102
9 (7, 2)2d38-1
32 (20, 13, -1)100d6
364 (3, 3, 2, 4, 2, 1, 4, 2, 4, 6, 4, 5, 4, 3, 3, 3, 2, 5, 1, 5, 6, 6, 6, 4, 5, 5, 1, 5, 2, 2, 2, 5, 1, 1, 2, 1, 4, 5, 6, 2, 4, 3, 4, 3, 5, 2, 2, 1, 1, 5, 1, 3, 6, 6, 6, 6, 5, 2, 6, 5, 4, 4, 5, 1, 6, 6, 6, 4, 2, 6, 2, 6, 2, 2, 4, 3, 6, 4, 6, 4, 2, 4, 3, 3, 1, 6, 3, 3, 4, 4, 5, 5, 5, 6, 2, 3, 6, 1, 1, 1)
--snip--工作原理
这个程序中的大部分代码都致力于确保用户输入的内容格式正确。实际的随机掷骰子本身是对random.randint()的简单调用。这个函数没有偏见传递给它的范围内的每个整数都有可能被返回。这使得random.randint()非常适合模拟掷骰子。
Dice Roller, by Al Sweigart emailprotected
Simulates dice rolls using the Dungeons Dragons dice roll notation.
This code is available at https://nostarch.com/big-book-small-python-programming
Tags: short, simulationimport random, sysprint(Dice Roller, by Al Sweigart emailprotectedEnter what kind and how many dice to roll. The format is the number of
dice, followed by d, followed by the number of sides the dice have.
You can also add a plus or minus adjustment.Examples:3d6 rolls three 6-sided dice1d102 rolls one 10-sided die, and adds 22d38-1 rolls two 38-sided die, and subtracts 1QUIT quits the program
)while True: # Main program loop:try:diceStr input( ) # The prompt to enter the dice string.if diceStr.upper() QUIT:print(Thanks for playing!)sys.exit()# Clean up the dice string:diceStr diceStr.lower().replace( , )# Find the d in the dice string input:dIndex diceStr.find(d)if dIndex -1:raise Exception(Missing the d character.)# Get the number of dice. (The 3 in 3d61):numberOfDice diceStr[:dIndex]if not numberOfDice.isdecimal():raise Exception(Missing the number of dice.)numberOfDice int(numberOfDice)# Find if there is a plus or minus sign for a modifier:modIndex diceStr.find()if modIndex -1:modIndex diceStr.find(-)# Find the number of sides. (The 6 in 3d61):if modIndex -1:numberOfSides diceStr[dIndex 1 :]else:numberOfSides diceStr[dIndex 1 : modIndex]if not numberOfSides.isdecimal():raise Exception(Missing the number of sides.)numberOfSides int(numberOfSides)# Find the modifier amount. (The 1 in 3d61):if modIndex -1:modAmount 0else:modAmount int(diceStr[modIndex 1 :])if diceStr[modIndex] -:# Change the modification amount to negative:modAmount -modAmount# Simulate the dice rolls:rolls []for i in range(numberOfDice):rollResult random.randint(1, numberOfSides)rolls.append(rollResult)# Display the total:print(Total:, sum(rolls) modAmount, (Each die:, end)# Display the individual rolls:for i, roll in enumerate(rolls):rolls[i] str(roll)print(, .join(rolls), end)# Display the modifier amount:if modAmount ! 0:modSign diceStr[modIndex]print(, {}{}.format(modSign, abs(modAmount)), end)print())except Exception as exc:# Catch any exceptions and display the message to the user:print(Invalid input. Enter something like 3d6 or 1d102.)print(Input was invalid because: str(exc))continue # Go back to the dice string prompt. 在输入源代码并运行几次之后尝试对其进行实验性的修改。你也可以自己想办法做到以下几点
添加一个乘法修饰符来补充加法和减法修饰符。增加自动移除最低模具辊的能力。
探索程序
试着找出下列问题的答案。尝试对代码进行一些修改然后重新运行程序看看这些修改有什么影响。
如果删除或注释掉第 69 行的rolls.append(rollResult)会发生什么如果把第 69 行的rolls.append(rollResult)改成rolls.append(-rollResult)会怎么样如果删除或注释掉第 77 行的print(, .join(rolls), end)会怎么样如果不掷骰子而什么都不输入会怎么样
十九、数字时钟 原文http://inventwithpython.com/bigbookpython/project19.html 这个程序显示一个带有当前时间的数字时钟。第六十四个项目的sevseg.py模块“七段显示模块”为每个数字生成图形而不是直接呈现数字字符。这个项目类似于项目 14“倒计时”
运行示例
当您运行digitalclock.py时输出将如下所示 __ __ __ __ __ __
| | |__| * __| __| * __| |__
|__| __| * __| __| * __| |__|Press Ctrl-C to quit.工作原理
数字时钟程序看起来类似于项目 14“倒计时。”他们不仅都导入了sevseg.py模块还必须用splitlines()方法拆分由sevseg.getSevSegStr()返回的多行字符串。这允许我们在时钟的小时、分钟和秒部分的数字之间放置一个由星号组成的冒号。将这段代码与倒计时中的代码进行比较看看有哪些相似之处有哪些不同之处。
Digital Clock, by Al Sweigart emailprotected
Displays a digital clock of the current time with a seven-segment
display. Press Ctrl-C to stop.
More info at https://en.wikipedia.org/wiki/Seven-segment_display
Requires sevseg.py to be in the same folder.
This code is available at https://nostarch.com/big-book-small-python-programming
Tags: tiny, artisticimport sys, time
import sevseg # Imports our sevseg.py program.try:while True: # Main program loop.# Clear the screen by printing several newlines:print(\n * 60)# Get the current time from the computers clock:currentTime time.localtime()# % 12 so we use a 12-hour clock, not 24:hours str(currentTime.tm_hour % 12)if hours 0:hours 12 # 12-hour clocks show 12:00, not 00:00.minutes str(currentTime.tm_min)seconds str(currentTime.tm_sec)# Get the digit strings from the sevseg module:hDigits sevseg.getSevSegStr(hours, 2)hTopRow, hMiddleRow, hBottomRow hDigits.splitlines()mDigits sevseg.getSevSegStr(minutes, 2)mTopRow, mMiddleRow, mBottomRow mDigits.splitlines()sDigits sevseg.getSevSegStr(seconds, 2)sTopRow, sMiddleRow, sBottomRow sDigits.splitlines()# Display the digits:print(hTopRow mTopRow sTopRow)print(hMiddleRow * mMiddleRow * sMiddleRow)print(hBottomRow * mBottomRow * sBottomRow)print()print(Press Ctrl-C to quit.)# Keep looping until the second changes:while True:time.sleep(0.01)if time.localtime().tm_sec ! currentTime.tm_sec:break
except KeyboardInterrupt:print(Digital Clock, by Al Sweigart emailprotected)sys.exit() # When Ctrl-C is pressed, end the program. 探索程序
试着找出下列问题的答案。尝试对代码进行一些修改然后重新运行程序看看这些修改有什么影响。
如果把第 45 行的time.sleep(0.01)改成time.sleep(2)会怎么样如果把第 27、30、33 行的2改成1会怎么样如果删除或注释掉第 15 行的print(\n * 60)会发生什么如果删除或注释掉第 10 行的import sevseg,会得到什么错误信息
二十、数字雨 原文http://inventwithpython.com/bigbookpython/project20.html 这个程序模仿了科幻电影《黑客帝国》中的“数字雨”可视化效果。随机的二进制“雨”珠从屏幕底部流上来创造了一个很酷的、黑客般的可视化效果。不幸的是由于文本随着屏幕向下滚动而移动的方式如果不使用bext这样的模块就不可能让流向下移动。
运行示例
当您运行digitalstream.py时输出将如下所示
Digital Stream Screensaver, by Al Sweigart emailprotected
Press Ctrl-C to quit.0 00 01 0 0 1 1 0 10 0 0 1 0 0 0 0 00 1 0 0 0 1 0 0 1 0 10 1 0 0 1 011 1 1 0 1 00 1 0 0 0 000 11 0 0 1 1 01 1 0 1 0 1 1 110 10 1 0 1 0 1 01 101 0 0 1 000 11 1 1 11 1 1 10 100 1 0 11 00 0 1 01 01 1 001 1 1 0 1 10 0 10 00 0 010 0 1 1 11 11 0 0
--snip--工作原理
像项目 15“深坑”这个程序使用由print()调用引起的滚动来创建动画。在列列表中每一列都由一个整数表示columns[0]是最左边一列的整数columns[1]是右边一列的整数依此类推。程序最初将这些整数设置为0这意味着它打印 一个空格字符串而不是该列中的流。随机地它将每个整数改变为一个在MIN_STREAM_LENGTH和MAX_STREAM_LENGTH之间的值。每打印一行该整数就减少1。只要一列的整数大于0程序就会在该列中打印一个随机的1或0。这会产生您在屏幕上看到的“数字雨”效果。
Digital Stream, by Al Sweigart emailprotected
A screensaver in the style of The Matrix movies visuals.
This code is available at https://nostarch.com/big-book-small-python-programming
Tags: tiny, artistic, beginner, scrollingimport random, shutil, sys, time# Set up the constants:
MIN_STREAM_LENGTH 6 # (!) Try changing this to 1 or 50.
MAX_STREAM_LENGTH 14 # (!) Try changing this to 100.
PAUSE 0.1 # (!) Try changing this to 0.0 or 2.0.
STREAM_CHARS [0, 1] # (!) Try changing this to other characters.# Density can range from 0.0 to 1.0:
DENSITY 0.02 # (!) Try changing this to 0.10 or 0.30.# Get the size of the terminal window:
WIDTH shutil.get_terminal_size()[0]
# We cant print to the last column on Windows without it adding a
# newline automatically, so reduce the width by one:
WIDTH - 1print(Digital Stream, by Al Sweigart emailprotected)
print(Press Ctrl-C to quit.)
time.sleep(2)try:# For each column, when the counter is 0, no stream is shown.# Otherwise, it acts as a counter for how many times a 1 or 0# should be displayed in that column.columns [0] * WIDTHwhile True:# Set up the counter for each column:for i in range(WIDTH):if columns[i] 0:if random.random() DENSITY:# Restart a stream on this column.columns[i] random.randint(MIN_STREAM_LENGTH,MAX_STREAM_LENGTH)# Display an empty space or a 1/0 character.if columns[i] 0:print(random.choice(STREAM_CHARS), end)columns[i] - 1else:print( , end)print() # Print a newline at the end of the row of columns.sys.stdout.flush() # Make sure text appears on the screen.time.sleep(PAUSE)
except KeyboardInterrupt:sys.exit() # When Ctrl-C is pressed, end the program. 在输入源代码并运行几次之后尝试对其进行实验性的修改。标有(!)的注释对你可以做的小改变有建议。你也可以自己想办法做到以下几点
包括除 1 和 0 之外的字符。包括线以外的形状包括矩形、三角形和菱形。
探索程序
试着找出下列问题的答案。尝试对代码进行一些修改然后重新运行程序看看这些修改有什么影响。
如果把第 46 行的print( , end)改成print(., end)会怎么样如果将第 11 行的PAUSE 0.1改为PAUSE -0.1会得到什么错误信息如果把第 42 行的columns[i] 0改成columns[i] 0会怎么样如果把第 42 行的columns[i] 0改成columns[i] 0会怎么样如果把第 44 行的columns[i] - 1改成columns[i] 1会怎么样