#python
#python
Вопрос:
Я создаю программу, которая генерирует случайную серию символов канала для создания блока каналов. В конце моей функции ranPipe() есть импровизированный конвертер, который изменяет текст, представляющий символ канала, на символ. По какой-то причине это, похоже, не выполняется — тестирование с помощью print () s как внутри цикла for преобразователя, так и снаружи (только в конце функции), похоже, что это не выполняется (или, по крайней мере, не печатается).
Я не могу просто создать новую функцию для преобразования, поскольку она зависит от переменных, используемых в ranPipe(), и я не очень хорош в объявлениях глобальных переменных, поэтому это вызывает больше проблем, чем решает. Это также должна быть точка ссылки функции ranPipe (), потому что она должна выполняться после проверок, рассмотренных ранее в коде.
Почему это должно быть и как я могу это исправить? (Код ниже)
import random
finCheck = 0
pipeNums = {
##Note: Structure of values is icon, upcon, downcon, leftcon, rightcon
"vertCon": "║1100",
"horiCon": "═0011",
"leftCornUpper": "╔0101",
"rightCornUpper": "╗0110",
"leftCornLower": "╚1001",
"rightCornLower": "╝1010",
"vertConMidL": "╠1101",
"vertConMidR": "╣1110",
"horiConMidN": "╦0111",
"horiConMidS": "╩1011",
"cross": "╬1111"
}
def ranPipe(north, south, left, right):
##Generates a random piece
curPipe = random.choice(list(pipeNums))
##Resets piece check
finCheck = 0
##Start of piece check looop
while finCheck < 3:
##If the piece doesn't match previous piece, regen.
while (curPipe[1] == "1" and prePipe[2] == "0") or (curPipe[3] == "1" and prePipe[4] == "0") or (curPipe[4] == "1" and prePipe[3] == "0"):
curPipe = random.choice(list(pipeNums))
##Adds to check total when this completes
finCheck = 1
##Additional checks for edge pieces.
while True:
if north == 1:
while curPipe[1] == "1":
curPipe = random.choice(list(pipeNums))
return curPipe
elif south == 1:
while curPipe[2] == "1":
curPipe = random.choice(list(pipeNums))
return curPipe
elif left == 1:
while curPipe[3] == "1":
curPipe = random.choice(list(pipeNums))
return curPipe
elif right == 1:
while curPipe[4] == "1":
curPipe = random.choice(list(pipeNums))
return curPipe
break
##Adds to check total when this completes
finCheck = 1
##Runs one more general check. Adds if it passes, otherwise all check points are removed and it repeats.
while True:
if (curPipe[1] == "1" and prePipe[2] == "0") or (curPipe[3] == "1" and prePipe[4] == "0") or (curPipe[4] == "1" and prePipe[3] == "0"):
finCheck = 0
curPipe = random.choice(list(pipeNums))
else:
finCheck = 1
break
##Converts the value of the current pipe to its value rather than its name
conChart = ['║', '═', '╔', '╗', '╚', '╝', '╠', '╣', '╦', '╩', '╬']
for x in range(conChart):
if curPipe == pipeNums[x]:
curPipe = conChart[x]
def digDig(length, width):
print("What length do want your pipes to be?")
length = int(input("Note: The length and width of your creation may vary, as it is counted in number of characters rather than a definite measure.n"))
width = int(input("And the width?n"))
##Start of code, top corner
prePipe = random.choice(list(pipeNums))
print(prePipe)
##Top line
for x in range(length):
print(ranPipe(1, 0, 0, 1))
(Я ценю, что мой код (а) местами не очень похож на python и (б) неполон. Хотя я всегда ценю помощь в повышении эффективности моего кода, я специально прошу помощи в решении проблемы с моим конвертером и предпочел бы, чтобы основное внимание уделялось этому, а не моему запутанному коду).
Комментарии:
1. В коде перед последней частью много
return
s. Если выполняется один из них, выполнение функции на этом заканчивается.2. вы пробовали вызывать
digDig
? глупый вопрос, я знаю … просто хотел убедиться.3. Ваш опубликованный код определяет две переменные и две функции, а затем завершает работу. Код совсем не минимальный, и вы не отследили поток управления ranPipe. Обычно вы выходите из
while True
цикла, выходя из функции, поэтому вы не доходите до кода преобразования.
Ответ №1:
Чтобы ответить на ваш вопрос, вы вызываете ranPipe
с параметром north=1
, поэтому, когда вы переходите к третьему циклу while, у вас есть строка, if north == 1:
которая принимает значение true, что приводит к выполнению возврата и завершению функции.
Просто как дополнение к тому, что я увидел, просматривая ваш код: вы используете prePipe
в своей функции ranPipe
, но не определили ее в этой функции; вы определили ее только в digdigи вы используете for x in range(conChart)
, но range
функция принимает целое число: вам нужно указать len(conChart)
.