如何将变量实现到函数名称中

时间:2017-10-17 01:29:53

标签: python

我在python中使用turtle制作一个数独游戏板。现在我在试图找出如何让程序轻松检查我正在查看哪个框时遇到了一些麻烦。我有5个不同位置的网格。游戏会自动选择一个玩。由于每个网格处于不同的位置,我必须小心我的乌龟位置。我有16个函数来计算我希望我的乌龟光标在哪里绘制数字。

#Below is a guide to where each box is relative to its position on the grid. 

#To find center of the box, add 75 to x and 20 to y.
#Box(1,1) = x, y        Box(1,2) = x+150, y        Box(1,3) = x+300, y        Box(1,4) = x+450, y
#Box(2,1) = x, y-150    Box(2,2) = x+150, y-150    Box(2,3) = x+300, y-150    Box(2,4) = x+450, y-150
#Box(3,1) = x, y-300    Box(3,2) = x+150, y-300    Box(3,3) = x+300, y-300    Box(3,4) = x+450, y-300
#Box(4,1) = x, y-450    Box(4,2) = x+150, y-450    Box(4,3) = x+300, y-450    Box(4,4) = x+450, y-450

def box1_1(x, y):
    return(x+75, y+20)

def box1_2(x, y):
    return(x+225, y+20)

def box1_3(x, y):
    return(x+375, y+20)

def box1_4(x, y):
    return(x+525, y+20)

def box2_1(x, y):
    return(x+75, y-130)

def box2_2(x, y):
    return(x+225, y-130)

def box2_3(x, y):
    return(x+375, y-130)

def box2_4(x, y):
    return(x+525, y-130)

def box3_1(x, y):
    return(x+75, y-280)

def box3_2(x, y):
    return(x+225, y-280)

def box3_3(x, y):
    return(x+375, y-280)

def box3_4(x, y):
    return(x+525, y-280)

def box4_1(x, y):
    return(x+75, y-430)

def box4_2(x, y):
    return(x+225, y-430)

def box4_3(x, y):
    return(x+375, y-430)

def box4_4(x, y):
    return((x+525, y-430))

我可以按照我想要的方式绘制电路板,并且也可以正确绘制给定的数字。我希望用户可以选择使用实时校正或传统播放,他们可以输入所有值,游戏将检查他们的解决方案是否正确。我遇到的问题是在用户输入所需号码的部分中。现在我有:

def playSudoku():
    playboard = []
    board1 = [[0,0,0,3],[0,1,0,4],[4,2,0,1],[0,3,4,0]]
    board2 = [[4,3,0,0],[1,0,3,0],[0,0,2,0],[2,1,0,0]]
    board3 = [[0,4,0,1],[3,0,3,0],[1,0,0,4],[0,2,1,0]]
    board4 = [[1,0,3,0],[0,4,2,1],[0,0,0,2],[0,0,4,0]]
    board5 = [[0,4,3,2],[3,0,0,0],[4,0,0,0],[0,0,4,1]]
    boardchoice = random.randint(1,5)
    if boardchoice == 1:
        drawBoard1()
        playboard = board1
        posx = -900
        posy = 850
    elif boardchoice == 2:
        drawBoard2()
        playboard = board2
        posx = -200
        posy = 850
    elif boardchoice == 3:
        drawBoard3()
        playboard = board3
        posx = 500
        posy = 850
    elif boardchoice == 4:
        drawBoard4()
        playboard = board4
        posx = -500
        posy = 100
    else:
        drawBoard5()
        playboard = board5
        posx = 200
        posy = 100
    rtc = turtle.textinput("Sudoku", "Do you want to play with real time correction?")
    if rtc == 'y':
        for i in range (0,3):
            for j in range (0,3):
                if playboard[i][j] != 0:
                    pass
                num = turtle.numinput('Sudoku', 'Enter a number for box[' + str(i) + ',' + str(j) + ']?: ', minval=1, maxval=4)
                turtle.goto(box[i]_[j](posx,posy))
                turtle.write(str(num), move=True, align="center", font=("Times New Roman", 24))

我想特别注意这一行

turtle.goto(box[i]_[j](posx,posy))

每个棋盘具有不同的posx和posy的原因是因为它们位于龟网格上的不同位置。如上所述,我的函数名称为“box A _ B ”,其中A和B是框的位置编号。我知道我写的东西不起作用(我也试过,以防万一),但我想知道是否有一个python函数可以让我做我想要实现的目标。 在我的循环中,无论我和j是什么,我希望我的程序使用box [i] _ [j]。 如果措辞不好,我道歉。如果需要更多说明,我会热切地告诉你。我只是希望那里有人知道我在找什么。

2 个答案:

答案 0 :(得分:1)

你应该像这样定义box函数。

def box(i, j, x, y):
    return (x + 150*j - 75, y - 150*i + 170)

然后只需拨打box(i, j, posx, posy)

答案 1 :(得分:1)

虽然在这种特殊情况下,编写一个通用的box()函数,如另一个答案中所示,这是最好的方法,因为函数的结果可以通过{{1}中相对简单的公式来确定}和i参数。然而,在一般情况下,如果不是这样,您可能希望使用类似字典的内容将不同的可能组合映射到所需的功能。以下是解决问题的方法。

首先添加一个字典,将不同的参数值与相应的函数关联起来:

j

接下来将修改box_map = { (1, 1): box1_1, (1, 2): box1_2, (1, 3): box1_3, (1, 4): box1_4, (2, 1): box2_1, (2, 2): box2_2, (2, 3): box2_3, (2, 4): box2_4, (3, 1): box3_1, (3, 2): box3_2, (3, 3): box3_3, (3, 4): box3_4, (4, 1): box4_1, (4, 2): box4_2, (4, 3): box4_3, (4, 4): box4_4, } 函数以使用它来查找要调用的函数:

playSudoku()