Python 中的马里奥 CS50

Mario CS50 in Python

所以我尝试用 python 而不是 C 编写 CS50 中的马里奥作业来挑战自己,我设法让它发挥作用!我不太明白循环是如何工作的,尤其是数学,因为我只是玩弄以获得我想要的结果。

作业要求如下

  1. 使用哈希创建半金字塔
  2. 确保它正确对齐
  3. 应与用户给出的身高相符
  4. 第一行应以 2"#"s 开头

如能对我的循环进行任何澄清,我们将不胜感激:)

print('Height: ', end='');
h = int(input());

while(h<0 or h > 24):
  print("That is an invalid input")
  print('Height: ', end='');
  h = int(input());

for i in range(h):
    print(" "*(h-i)+"#"*(i+1));

范围(开始,停止[,步骤])

Python range() 函数 returns 从某个下限(默认为零)到(但不包括)某个上限的整数列表,可能以增量(步骤)一些其他数字(一个,默认情况下)。 因此,

range(3) returns a sequence: 0, 1, 2
range(1,3) returns a sequence: 1, 2
range(1,7,2) returns a sequence: 1, 3, 5

首先,只想指出,您的代码并没有打印出整个金字塔;它只打印出一半。您的输出应该类似于(例如,如果我们输入高度为 3):

  # #
 ## ##
### ###

您的代码只打印左侧:

  #
 ##
###

现在,回答你的问题。这是你如何让它工作的:

for i in range(h):
     print(" " * (h - i) + "#" * (i + 1));

描述for循环的条件语句,i从0开始,一直上升到h

要了解您的 print() 语句的工作原理,请将其视为由 space 和散列组成的线段。该段的长度为h。因此,在 h - i 中,您将此 "segment" 的一部分打印为 spaces,而在 i + 1 中,您打印循环的其余部分。

现在,您使用 i + 1 而不仅仅是 i 的原因是因为 for 循环条件; i 从零开始。因此,您一定已经意识到第一行没有散列,因为有 h - 0 space 和 0 散列。这就是为什么需要 i + 1 的原因;如果您仔细检查当前代码,您将在每一行的开头打印一个额外的 space。

一个更容易理解的代码逻辑,结果相同,是:

for i in range(1, h + 1): # The counter's range is toyed with here
    print(" " * (h - i) + "#" * i); # The "i + 1" is removed

在这里,循环的范围被玩弄了;现在它从 1 开始(以便打印第一个散列,并且整个 "segment" 不仅仅是第一行的 spaces),并且它在 h + 1 结束(这样循环范围保持不变)。

删除了i + 1;看到 print() 语句可以更容易理解上面讨论的 "segment" 逻辑。

*澄清一下,我上面提供的替代代码并不是要替代您的代码;我只是将其包括在内以强化我的 "segment" 想法。你的代码非常好,和我的一样好用。

我认为,这不是正确答案。为了理解它,请使用 "_" 或其他符号代替空格。如果height = 1,我们可以看到_#,但必须是#。所以正确答案,可以是:

print('Height: ', end='');
h = int(input());

while(h<0 or h > 24):
  print("That is an invalid input")
  print('Height: ', end='');
  h = int(input());

for i in range(h):
     print("_" * (h - (i+1)) + "#" * (i + 1));

对不起我的英语。

你想把它们分成两部分,这样你就可以看到图片 clearly.From 并排实现会更容易。

left_align_counter =  0
print("Printing  left aligned")
print("Height: ", end="")
height =  int(input())

for h in range(height):
    left_align_counter +=1 
    print("#"*left_align_counter)

print("DONE.")

right_align_counter = 0
print("Printing right align ")

for h in range(height):
    right_align_counter += 1
    print(" "*int(height-right_align_counter), end="")
    print("#"*int(right_align_counter))
    
print("DONE.")

并排打印

left_align_counter =  0
print("Printing  left aligned")
print("Height: ", end="")
height =  int(input())

for h in range(height):
    left_align_counter +=1 
    print("#"*left_align_counter)

print("DONE.")

right_align_counter = 0
print("Printing right align ")

for h in range(height):
    right_align_counter += 1
    print(" "*int(height-right_align_counter), end="")
    print("#"*int(right_align_counter))
    
print("DONE.")

#here we can use any counter for the blocks be it right or left so just use counter variable
counter = 0
for h in range(height):
    counter += 1
    print(" "*int(height-counter), end="")
    print("#"*int(counter), end=' ')
    print("#"*int(counter),end="\n")